Langsys مع Nuxt
النمط واحد في كل مكان: يجلب الخادم الكتالوج مرة واحدة (ويبقى مفتاح الكتابة على جهة الخادم)، ثم يهيّئ العميل langsys-js-vue انطلاقًا من هذه البيانات الأولية بمفتاح للقراءة فقط — دون جلب مكرر. أما الترجمة نفسها فتتم في المتصفح: إذ يكون HTML الذي يرسله الخادم باللغة الأساسية، وهو ما تفهرسه محركات البحث أيضًا، ثم تتحول الصفحة إلى لغة الزائر أثناء تحميلها.
1 · مسار خادم يعمل كوسيط للكتالوج
يجلب مسار Nitro الكتالوج بحيث يبقى مفتاح الكتابة داخل إعدادات التشغيل الخاصة — فلا يتواصل المتصفح إلا مع مسار /api الخاص بك. يبقى مفتاح الكتابة على الخادم، ويحصل العميل على مفتاح للقراءة فقط. يرى الطرفان الكتالوج نفسه — كل ما في الأمر أن العميل يتخطى الجلب الأولي.
// server/api/langsys.get.ts
export default defineEventHandler(async (event) => {
const config = useRuntimeConfig();
const locale = (getQuery(event).locale as string) ?? 'en-US';
const res = await $fetch<{ data: unknown }>(
`https://api.langsys.dev/api/projects/${config.langsysProjectId}/translations`,
{ query: { locale }, headers: { 'x-Authorization': config.langsysApiKey } }
);
return { locale, translations: res.data };
}); 2 · التهيئة المسبقة أثناء SSR، ثم التهيئة على العميل
يشغّل useAsyncData عملية الجلب على الخادم ويحوّل البيانات إلى تنسيق متسلسل داخل الصفحة، فيبدأ العميل منها دون إعادة الجلب. وتعمل التهيئة داخل onMounted — فالـ SDK مخصص للمتصفح؛ ولا يقدّم الجزء الخاص بالخادم في Nuxt سوى البيانات.
<!-- app.vue -->
<script setup lang="ts">
import { LangsysApp, createLocaleStore } from 'langsys-js-vue';
import type { iCategories } from 'langsys-js-vue';
const { data } = await useAsyncData('langsys', () =>
$fetch('/api/langsys', { query: { locale: 'en-US' } })
);
const store = createLocaleStore(data.value!.locale);
onMounted(() => {
LangsysApp.init({
projectid: useRuntimeConfig().public.langsysProjectId,
key: useRuntimeConfig().public.langsysApiKey, // read-only
UserLocaleStore: store,
initialTranslations: data.value!.translations as iCategories,
initialTranslationsLocale: data.value!.locale,
ssrTokenStrategy: 'client',
});
});
</script>
<template>
<NuxtPage />
</template> 3 · استخدمه في أي مكان أدناه
من هنا يصبح الأمر هو SDK الخاص بـ Vue العادي: استخدم useT() في أي مكوّن، وstore.set() لتبديل اللغة. وإذا كان تطبيقك يمتلك اللغة بالفعل داخل ref (مثل Pinia أو useState)، فكيّفها باستخدام refToLocaleSource من ربط Vue بدلًا من الانتقال إلى createLocaleStore.
<script setup>
import { useT } from 'langsys-js-vue';
const t = useT();
</script>
<template>
<h1>{{ t('Welcome to our store', 'Home') }}</h1>
</template>