اكتشاف اللغة المفضلة للمستخدم
إعادة توجيه الزوار الجدد إلى اللغة الأكثر ملاءمة لهم
المشكلة
عندما يزور المستخدم الصفحة الرئيسية للتطبيق لأول مرة (مثل /)، يتم عرض اللغة الافتراضية، مثل الإنجليزية. هذا يخلق احتكاكًا فوريًا للمستخدمين الذين يتحدثون لغات أخرى، مما يجبرهم على البحث عن مبدل اللغة يدويًا، على الرغم من أن متصفحهم يرسل بالفعل تفضيلاتهم اللغوية.
الحل
استخدم middleware لاعتراض الطلبات الموجهة إلى المسار الجذر (/). تحقق من رأس HTTP Accept-Language الخاص بالمستخدم لمعرفة لغته المفضلة. إذا كانت هذه اللغة مدعومة من قبل التطبيق، قم بإعادة توجيه المستخدم إلى جذر تلك اللغة (مثل /fr). إذا لم تكن مدعومة، قم بإعادة توجيههم إلى اللغة الافتراضية (مثل /en).
الخطوات
1. تثبيت محلل لغة
يمكن أن يكون رأس Accept-Language معقدًا (مثل fr-CH, fr;q=0.9, en;q=0.8). تساعد مكتبة صغيرة في تحليل هذا الرأس وإيجاد أفضل تطابق من قائمة اللغات المدعومة لدينا.
قم بتشغيل هذا الأمر في الطرفية الخاصة بك:
npm install accept-language-parser
2. تحديد اللغات والافتراضية
قم بإنشاء ملف تكوين مركزي لتخزين قائمة اللغات المدعومة وتحديد الافتراضية. سيتم استخدام هذه الافتراضية إذا كانت تفضيلات متصفح المستخدم لا تتطابق مع أي لغة تدعمها.
// i18n.config.ts
export const locales = ['en', 'es', 'fr'];
export const defaultLocale = 'en';
3. إنشاء middleware
قم بإنشاء ملف middleware.ts في جذر مشروعك. سيتم تشغيل هذا الملف عند استلام الطلبات، مما يتيح لك التحقق من المسار والرؤوس.
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
import parser from 'accept-language-parser';
import { locales, defaultLocale } from './i18n.config';
// دالة مساعدة للعثور على أفضل تطابق لغوي
function getBestLocale(acceptLangHeader: string | null) {
if (!acceptLangHeader) {
return defaultLocale;
}
// استخدام المحلل للعثور على أفضل لغة مدعومة
const bestMatch = parser.pick(locales, acceptLangHeader, {
loose: true,
});
return bestMatch || defaultLocale;
}
export function middleware(request: NextRequest) {
const { pathname } = request.nextUrl;
// 1. التحقق مما إذا كان الطلب للمسار الجذر
if (pathname === '/') {
// الحصول على اللغة المفضلة للمستخدم
const acceptLang = request.headers.get('Accept-Language');
const bestLocale = getBestLocale(acceptLang);
// إعادة التوجيه إلى مسار اللغة الأفضل تطابقًا
request.nextUrl.pathname = `/${bestLocale}`;
return NextResponse.redirect(request.nextUrl);
}
// 2. بالنسبة لجميع المسارات الأخرى، استمر كالمعتاد
return NextResponse.next();
}
export const config = {
matcher: [
// تخطي جميع المسارات التي تبدأ بـ:
// - api (مسارات API)
// - _next/static (الملفات الثابتة)
// - _next/image (ملفات تحسين الصور)
// - favicon.ico (ملف الأيقونة المفضلة)
'/((?!api|_next/static|_next/image|favicon.ico).*)',
],
};
يعمل هذا الكود فقط للمسار الجذر (/). إذا زار المستخدم /، فإنه يتحقق من رأس Accept-Language الخاص به، ويجد أفضل تطابق (مثل es)، ويعيد توجيهه إلى /es. يتم تجاهل جميع الطلبات الأخرى، مثل /en/about، بواسطة هذا المنطق وتمر من خلاله.