العرض الثابت مقابل العرض الديناميكي مع i18n في Next.js
المشكلة مع next-intl
ماذا يحدث؟ عندما تستخدم
useTranslations، أوgetTranslations، أو أي مساعد من next-intl داخل مكون خادم في تطبيق موجه بـ i18n (/en/…،/fr/…)، يقوم Next.js بوضع علامة على المسار بأكمله كـ ديناميكي. ([Next Intl][1])لماذا؟ يبحث next-intl عن اللغة الحالية من خلال رأس خاص بالطلب فقط (
x-next-intl-locale) عبرheaders(). وبما أنheaders()هي واجهة برمجة تطبيقات ديناميكية، فإن أي مكون يستخدمها يفقد التحسين الثابت. ([Next Intl][1]، [Next.js][2])الحل الرسمي (النموذجي)
- تصدير
generateStaticParamsمع كل لغة مدعومة. - استدعاء
setRequestLocale(locale)في كل تخطيط/صفحة قبل استدعاءuseTranslations. ([Next Intl][1]) هذا يزيل الاعتماد على الرأس، لكنك الآن لديك كود إضافي يجب صيانته وواجهة برمجة تطبيقات غير مستقرة في الإنتاج.
- تصدير
كيف يتجنب intlayer المشكلة
خيارات التصميم
- معامل المسار فقط – تأتي اللغة من جزء URL
[locale]الذي يمرره Next.js بالفعل إلى كل صفحة. - حزم وقت الترجمة – تُستورد الترجمات كوحدات ES عادية، لذا يتم تقليلها (tree-shaken) وتضمينها أثناء وقت البناء.
- لا واجهات برمجة تطبيقات ديناميكية –
useT()يقرأ من سياق React، وليس منheaders()أوcookies(). - بدون إعدادات إضافية – بمجرد أن تعيش صفحاتك تحت
app/[locale]/، يقوم Next.js بإنشاء ملف HTML واحد لكل لغة تلقائيًا.