كل مرحلة من إعادة البناء هذه، قبل التدويل، أُنجزت دون أي تبعية جديدة. مستمع تمرير، بحث عن سلسلة فرعية، حركة CSS — مشاكل صغيرة وبسيطة كانت المكتبة فيها مبالغة. فعندما جاءت المرحلة 4 (توجيه اللغات EN ← FR ← AR)، كان الانعكاس نفسه: هل يمكنني بناء هذا بنفسي أيضًا؟
المشكلة والقيود
يحتاج توجيه اللغات لموقع Next.js من نوع App Router إلى ثلاثة أمور تعمل معًا: توجيه عبر بادئة URL يتعايش مع كل عنوان إنجليزي موجود دون تغيير (روابط حقيقية — سيرتي الذاتية، ملفي على LinkedIn، رسائل ترشحي — تشير بالفعل إلى العناوين الحالية بدون بادئة)، تفاوض على اللغة، وتصيير ثابت (static rendering) يبقى صحيحًا عبر كل مسار بمجرد وجود لغة ثانية ثم ثالثة. لا شيء من هذا متاح كأداة أساسية ضمن App Router.
Note
هذا التفصيل هو ما غيّر إجابتي. كل قرار سابق بـ«عدم إضافة تبعية» في هذا المشروع كان يهدف لتجنّب تجريد غير ضروري فوق شيء بسيط فعليًا. توجيه اللغات ليس بسيطًا بالطريقة نفسها — البديل الواقعي عن مكتبة ليس «بضعة أسطر إضافية»، بل إعادة تنفيذ نسخة أصغر وأقل اختبارًا مما توفره مكتبة جاهزة بالفعل.
القرار
استخدمت next-intl لتوجيه اللغات، وقواميس الرسائل، والتنقل الواعي
باللغة، مع localePrefix: "as-needed" — تبقى الإنجليزية بدون بادئة عند
/، /about، إلخ؛ بينما تحصل الفرنسية والعربية على بادئتي /fr و/ar.
كانت هذه النقطة الأخيرة هي العامل الحاسم مقابل localePrefix: "always"،
التي كانت ستنقل الصفحة الرئيسية الإنجليزية إلى /en وتكسر كل رابط قائم.
الشرح الكامل موجود في ADR
0003.
ما الذي كلّفه ذلك فعليًا
إضافة تبعية حقيقية لم تكن مجانية. واجه التثبيت تعارضًا في التبعيات
النظيرة (peer dependencies) — الإصدار المثبَّت في البداية أعلن دعمًا حتى
Next.js 15 فقط، أي إصدارًا رئيسيًا كاملًا خلف Next.js 16.2.10 المستخدَم في
هذا المشروع. ذاكرة تخزين مؤقت قديمة لمسارات .next/ من قبل انتقال بنية
المسارات إلى app/[locale]/... أنتجت خطأ نوع (type error) مربك في
المحاولة التالية. ثم فجوة API خاصة بإصدار محدد: الدالة المساعدة التي بُنيت
عليها i18n/request.ts لم تكن في الواقع مُصدَّرة من الإصدار المثبَّت.
Decision
لم يكن أي من هذه المشاكل خطأً في next-intl نفسها — كانت نتائج تثبيت إصدار بناءً على معرفة عامة بالمكتبة بدلًا من التحقق من سجل npm مقابل إصدار Next.js المثبَّت فعليًا أولًا. بمجرد التحقق من السجل مباشرة والانتقال إلى الإصدار الذي يُعلن دعم Next 16 صراحةً، اختفى تعارض التبعيات وخطأ التصيير المسبق (prerender) في Turbopack الذي كان يسببه بصمت، معًا وبنفس الإصلاح.
ما كنت سأفعله بشكل مختلف
التحقق من نطاق التبعيات النظيرة على السجل قبل تثبيت إصدار معيّن، لا بعد فشل التثبيت — خصوصًا لتبعية تلامس مباشرة خط أنابيب البناء (plugin Next.js) لا مجرد التشغيل وقت التنفيذ. الرواية الكاملة للحادثة، بأخطائها وإصلاحاتها الدقيقة، موجودة في سجل الصيانة الخاص بهذا المشروع.