كيفية تذكر اختيار اللغة عبر الجلسات في TanStack Start v1
تخزين اختيار اللغة الصريح للمستخدم
المشكلة
عندما يختار المستخدم لغة معينة بشكل صريح، فإن هذا الاختيار يمثل تفضيلًا متعمدًا يجب أن يستمر إلى ما بعد جلسة المتصفح الحالية. بدون الاستمرارية، ينسى التطبيق هذا التفضيل في كل زيارة، مما يجبر المستخدمين على إعادة اختيار لغتهم بشكل متكرر. يخلق هذا احتكاكًا ويشير إلى أن التطبيق لا يحترم اختيارات المستخدم، مما يقلل من جودة التجربة الشاملة ويمكن أن يتسبب في مغادرة المستخدمين للموقع قبل إكمال المهام المقصودة.
الحل
تخزين اختيار اللغة للمستخدم في ملف تعريف ارتباط (كوكي) دائم عندما يقومون باختيار صريح. في الزيارات اللاحقة، تحقق من هذا التفضيل المخزن قبل الرجوع إلى طرق الكشف التلقائي مثل ترويسات المتصفح. إذا تم العثور على لغة مخزنة صالحة، قم بإعادة توجيه المستخدم من جذر الموقع إلى مسار تلك اللغة، مما يضمن وصولهم مباشرة إلى اللغة المفضلة لديهم دون خطوات إضافية.
الخطوات
1. إنشاء وظيفة خادم لتخزين تفضيل اللغة
تتيح لك وظائف الخادم تحديد المنطق الخاص بالخادم فقط والذي يمكن استدعاؤه من أي مكان في تطبيقك. قم بتعريف وظيفة تكتب اللغة المحلية المحددة إلى ملف تعريف ارتباط.
import { createServerFn } from "@tanstack/react-start";
import { setCookie } from "@tanstack/react-start/server";
const LOCALE_COOKIE = "user_locale";
const COOKIE_MAX_AGE = 60 * 60 * 24 * 365;
export const saveLocalePreference = createServerFn({ method: "POST" })
.validator((locale: string) => locale)
.handler(async ({ data }) => {
setCookie(LOCALE_COOKIE, data, {
maxAge: COOKIE_MAX_AGE,
path: "/",
sameSite: "lax",
});
return { success: true };
});
تستخدم وظيفة الخادم هذه setCookie من @tanstack/react-start/server لتخزين تفضيل اللغة المحلية، مما يجعلها متاحة في الطلبات المستقبلية.
2. استدعاء دالة الحفظ عندما يختار المستخدم لغة
في مكون مبدل اللغة الخاص بك، قم باستدعاء الدالة الخادمية بعد أن يقوم المستخدم بالاختيار.
import { useNavigate } from "@tanstack/react-router";
import { saveLocalePreference } from "./locale-preference";
export function LanguageSwitcher({ currentLocale }: { currentLocale: string }) {
const navigate = useNavigate();
const handleLocaleChange = async (newLocale: string) => {
await saveLocalePreference({ data: newLocale });
navigate({ to: `/${newLocale}` });
};
return (
<select
value={currentLocale}
onChange={(e) => handleLocaleChange(e.target.value)}
>
<option value="en">English</option>
<option value="es">Español</option>
<option value="fr">Français</option>
</select>
);
}
هذا يضمن حفظ التفضيل قبل الانتقال إلى اللغة الجديدة.
3. إنشاء دالة خادمية لقراءة التفضيل المخزن
قم بتعريف دالة تسترجع اللغة المخزنة من ملف تعريف الارتباط (كوكي).
import { createServerFn } from "@tanstack/react-start";
import { getCookie } from "@tanstack/react-start/server";
const LOCALE_COOKIE = "user_locale";
export const getStoredLocale = createServerFn({ method: "GET" }).handler(
async () => {
const stored = getCookie(LOCALE_COOKIE);
return stored || null;
},
);
تقوم دالة getCookie من @tanstack/react-start/server بقراءة قيمة ملف تعريف الارتباط المحددة في الزيارات السابقة.
4. التحقق من التفضيل المخزن في المسار الجذر
استخدم دالة redirect في استدعاء beforeLoad للمسار لإطلاق عملية إعادة توجيه عند العثور على تفضيل مخزن.
import { createFileRoute, redirect } from "@tanstack/react-router";
import { getStoredLocale } from "./locale-preference";
const SUPPORTED_LOCALES = ["en", "es", "fr"];
const DEFAULT_LOCALE = "en";
export const Route = createFileRoute("/")({
beforeLoad: async () => {
const stored = await getStoredLocale();
if (stored && SUPPORTED_LOCALES.includes(stored)) {
throw redirect({ to: `/${stored}` });
}
throw redirect({ to: `/${DEFAULT_LOCALE}` });
},
});
هذا يتحقق من التفضيل المخزن أولاً ويعيد التوجيه إلى تلك اللغة إذا كانت صالحة، وإلا يتم الرجوع إلى اللغة الافتراضية.
5. التحقق من صحة اللغة المخزنة مقابل اللغات المدعومة
أضف التحقق للتأكد من أن القيمة المخزنة هي لغة معترف بها قبل إعادة التوجيه.
import { createFileRoute, redirect } from "@tanstack/react-router";
import { getStoredLocale } from "./locale-preference";
const SUPPORTED_LOCALES = ["en", "es", "fr", "de", "ja"] as const;
function isValidLocale(value: string | null): value is string {
return value !== null && SUPPORTED_LOCALES.includes(value as any);
}
export const Route = createFileRoute("/")({
beforeLoad: async () => {
const stored = await getStoredLocale();
const locale = isValidLocale(stored) ? stored : "en";
throw redirect({ to: `/${locale}` });
},
});
هذا يمنع إعادة التوجيه إلى لغات غير صالحة أو غير مدعومة، مما يحمي من العبث بملفات تعريف الارتباط أو القيم القديمة.