Langsys مع Next.js
النمط واحد في كل مكان: يجلب الخادم الكتالوج مرة واحدة (ويبقى مفتاح الكتابة على جهة الخادم)، ثم يهيّئ العميل langsys-js-react انطلاقًا من هذه البيانات الأولية بمفتاح للقراءة فقط — دون جلب مكرر. أما الترجمة نفسها فتتم في المتصفح: إذ يكون HTML الذي يرسله الخادم باللغة الأساسية، وهو ما تفهرسه محركات البحث أيضًا، ثم تتحول الصفحة إلى لغة الزائر أثناء تحميلها.
1 · اجلب الفهرس على الخادم
يجلب مكوّن الخادم (Server Component) الكتالوج باستخدام fetch مباشرة — ولا حاجة إلى SDK على الخادم. يبقى مفتاح الكتابة على الخادم، بينما يحصل العميل على مفتاح للقراءة فقط. ويرى الطرفان الكتالوج نفسه — إذ يتخطى العميل عملية الجلب الأولية فقط.
// app/layout.tsx (Server Component)
import type { iCategories } from 'langsys-js-react';
import { LangsysClient } from './LangsysClient';
async function getTranslations(locale: string): Promise<iCategories> {
const res = await fetch(
`https://api.langsys.dev/api/projects/${process.env.LANGSYS_PROJECT_ID}/translations?locale=${locale}`,
{ headers: { 'x-Authorization': process.env.LANGSYS_API_KEY! } }
);
const result = await res.json();
return result.data as iCategories;
}
export default async function RootLayout({ children }: { children: React.ReactNode }) {
const locale = 'en-US'; // from cookie / Accept-Language / route segment
const translations = await getTranslations(locale);
return (
<html lang={locale}>
<body>
<LangsysClient
locale={locale}
translations={translations}
projectId={process.env.LANGSYS_PROJECT_ID!}
apiKey={process.env.NEXT_PUBLIC_LANGSYS_API_KEY!} // read-only
>
{children}
</LangsysClient>
</body>
</html>
);
} 2 · التهيئة على جهة العميل
يقوم غلاف صغير بعلامة 'use client' بتهيئة حزمة SDK في المتصفح باستخدام الفهرس المزروع مسبقًا، فتبدأ العمل دون جلب أي شيء. ويتحول النص من اللغة الأساسية إلى لغة الزائر عند تشغيل هذا التأثير.
// app/LangsysClient.tsx
'use client';
import { useEffect, type ReactNode } from 'react';
import { LangsysApp, useLocaleStore, type iCategories } from 'langsys-js-react';
export function LangsysClient(props: {
locale: string;
translations: iCategories;
projectId: string;
apiKey: string;
children: ReactNode;
}) {
const [, , localeStore] = useLocaleStore(props.locale);
useEffect(() => {
LangsysApp.init({
projectid: props.projectId,
key: props.apiKey,
UserLocaleStore: localeStore,
initialTranslations: props.translations,
initialTranslationsLocale: props.locale,
ssrTokenStrategy: 'client',
});
}, [localeStore, props.projectId, props.apiKey, props.translations, props.locale]);
return <>{props.children}</>;
} 3 · استخدمه في أي مكان أدناه
من هنا يصبح الأمر هو React SDK العادية: استخدم useT() في أي Client Component، مع تبديل اللغة عبر المخزن نفسه. احتفظ بمخزن لغة واحد للتطبيق (يُنشأ في الموضع الذي تستدعي فيه init) ومرّر setLocale إلى المكونات الداخلية، بدلاً من إنشاء مخازن جديدة في أشجار مكونات غير مترابطة.
'use client';
import { useT } from 'langsys-js-react';
export function Hero() {
const t = useT();
return <h1>{t('Welcome to our store', 'Home')}</h1>;
}