كيفية تذكر اختيار اللغة عبر الجلسات في 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}` });
},
});
يمنع هذا إعادة التوجيه إلى لغات غير صالحة أو غير مدعومة، مما يحمي من التلاعب بملفات تعريف الارتباط أو القيم القديمة.