استخدم مساعدك المفضل للملخص واستخدم هذه الصفحة والموفر AI الذي تريده
تمت ترجمة محتوى هذه الصفحة باستخدام الذكاء الاصطناعي.
اعرض آخر نسخة المحتوى الأصلي باللغة الإنكليزيةإذا كان لديك فكرة لتحسين هذه الوثيقة، فلا تتردد في المساهمة من خلال تقديم طلب سحب على GitHub.
رابط GitHub للتوثيقنسخ الـ Markdown من المستند إلى الحافظة
كيفية اختيار مكتبة React i18n المناسبة
لا توفر React أي عنصر أولي (primitive) مدمج للتدويل (i18n). المكتبة التي تختارها من اليوم الأول تحدد كيفية تخزين الترجمات، وكيفية وصولها إلى الحزمة (bundle)، ومقدار العمل اليدوي الذي سيبقى على عاتقك للسنوات القليلة القادمة. تختار معظم الفرق بناءً على الشعبية فقط، ثم تكتشف التنازلات المعمارية عند الوصول إلى 2,000 مفتاح.
يسلك هذا الدليل الاتجاه المعاكس: أجب عن بعض الأسئلة حول مشروعك أولاً، ثم طابق الإجابات مع المكتبات المناسبة. يركز هذا الدليل على تطبيقات React البسيطة (Vite و React Router و TanStack Start). لدى Next.js قيودها الخاصة، والتي تم تناولها في مقارنة Next.js.

جدول المحتويات
ستة أسئلة للإجابة عليها قبل مقارنة المكتبات
جدول المقارنة لا فائدة منه دون معرفة الصفوف التي تهمك فعلاً. راجع هذه الأسئلة أولاً.
- كيف يتم تصيير (render) التطبيق؟ هل هو SPA فقط، أم SSR مع التروية (hydration)، أم React Server Components؟ تعمل خطافات (hooks) السياق (Context-based) في كل مكان في تطبيقات SPA. أما مع RSC، يفرض الـ hook إضافة
"use client"على كل مكون يعرض نصاً، وبالتالي ستحتاج إلى server-side API أيضاً. - من يكتب الترجمات؟ المطورون، أم فريق داخلي يستخدم نظام إدارة الترجمة (TMS)، أم وكالة تسلم ملفات ICU، أم خط أنابيب ذكاء اصطناعي (AI pipeline)؟ يحدد هذا تنسيق الكتالوج أكثر من أي تفصيل في الـ API.
- كم عدد اللغات والصفحات؟ لغتان وخمس صفحات يمكنها تحمل تضمين كل شيء في الحزمة. أما عشر لغات وخمسون مساراً فلا يمكنها ذلك، وتصبح استراتيجية التحميل هي التكلفة الأساسية.
- هل تحتاج إلى أمان الأنواع على المفاتيح (types on keys)؟ الخطأ الإملائي في
t("checkout.totl")يتم تجميعه بنجاح في جميع المكتبات المعتمدة على المفاتيح ما لم تقم بإعداد الأنواع بنفسك. قرر ما إذا كان ذلك مقبولاً لديك. - ماذا يحتوي النص؟ نص عادي، أم صيغ جمع (plurals)، أم جمل تتوسطها روابط
<Link>؟ المحتوى الغني (Rich content) هو النقطة التي تصبح فيها معظم واجهات برمجة التطبيقات معقدة. - كم من الوقت سيستمر المشروع؟ نموذج أولي مدته ثلاثة أشهر لا يحتاج إلى نفس قدر أدوات البناء التي يحتاجها منتج مدته خمس سنوات.
اكتب الإجابات، فكل ما يلي يستند إليها.
المشهد العام في صورة واحدة
خمسة عشر عاماً من JavaScript i18n تتلخص في أربع موجات معمارية، وتأتي مكتبات React التي ستقارن بينها من موجات مختلفة.

كتالوجات JSON يتم تحميلها في الذاكرة، ويتم البحث عن t("a.b") أثناء وقت التشغيل (runtime)، مع تحليل ICU أو صيغة مخصصة في المتصفح. أكبر الأنظمة البيئية، وأثقل أوقات التشغيل، والأنواع (types) اختيارية.
يتم استخراج الرسائل أثناء البناء، وتجميعها في كتالوجات مضغوطة مع وسائط محددة الأنواع. خطوة بناء إضافية (extract و compile) مقابل حزم أصغر حجماً.
مصممة حول SSR و Server Components. يتم التصيير على الخادم، وتروية (hydrate) ما يحتاجه العميل فقط. لا تزال معتمدة على المفاتيح ومركزية.
يتم تجميع المحتوى في دوال قابلة للـ tree-shaking أو قواميس مخصصة لكل مكون. يتم إنشاء الأنواع تلقائياً، والترجمات المفقودة تفشل البناء، وتعمل ترجمة الذكاء الاصطناعي مباشرة من الـ CLI.
يوضح مقال تاريخ JavaScript i18n بالتفصيل كيف عالجت كل موجة مشاكل الموجة السابقة.
القرار الأكثر أهمية: أين يعيش المحتوى ومتى يتم تحميله
تمتلك كل مكتبة React i18n نفس الهيكل الأساسي: مخزن (store)، ومزود (provider)، وخطاف (hook). كل ما يستقبله الـ provider ينتهي به المطاف في حزمة العميل (client bundle) أو في حمولة التروية (hydration payload). لذا فإن الخيارين الهيكليين هما:
- محتوى مركزي أو محدد النطاق (scoped). ملف
en.jsonواحد للتطبيق بأكمله، أو تصريح واحد لكل مكون (أو لكل namespace). - استيراد ثابت (static) أو ديناميكي (dynamic). تجميع كل شيء عند بدء التشغيل، أو جلب اللغة والمسار النشطين عند الطلب.
يوضح الرسم البياني أدناه تقديراً للحمولة لتطبيق نظري يتكون من 1 إلى 10 صفحات، مترجم إلى 1 إلى 10 لغات، مع حوالي 30 كيلوبايت من النصوص لكل صفحة.

المحتوى المركزي ذو الاستيراد الثابت ينمو مع كلا المحورين: 10 صفحات مضروبة في 10 لغات تعني 300 كيلوبايت من النصوص في كل صفحة. الاستيرادات الديناميكية تلغي محور اللغات، وتحديد النطاق (scoping) يلغي محور الصفحات. الدمج بينهما فقط هو ما يبقي الحجم ثابتاً ومسطحاً.
هذه ليست ميزة مكتبة فحسب، بل هي مسألة انضباط برمجي. يمكن تقسيم react-i18next عبر namespaces و lazy backends. ويمكن تقسيم use-intl لكل مسار. ولكن لا يوجد ما يفرض ذلك تلقائياً، ومكون <Button> مشترك يستدعي t("common:cta") يجعل common بهدوء اعتمادية لجميع المسارات. يقيس اختبار الأداء (benchmark) هذا تحت مسمى "التسريب من المسارات الأخرى" و"التسريب من اللغات الأخرى"، وهو مصدر معظم الفجوة بين المكتبات.
إذا كانت إجابتك على السؤال 3 هي "لغات متعددة وصفحات متعددة"، فركز على هذا القسم أكثر من أي تفضيل لواجهة الـ API. يتعمق مقال الـ i18n لكل مكون مقابل المركزي في جانب الصيانة لهذا الخيار.
الخيارات المرشحة
أحجام المكتبات مأخوذة من اختبار أداء TanStack Start: الـ provider بالإضافة إلى الـ hook في مكون فارغ، بعد التجميع والـ tree-shaking والـ minification، لـ 10 صفحات و10 لغات. يتم قياس المحتوى بشكل منفصل.
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| المكتبة | الموجة | نموذج المحتوى | أمان الأنواع على المفاتيح | تنسيق الرسائل | حجم المكتبة |
|---|---|---|---|---|---|
react-i18next | وقت التشغيل | JSON مركزي، namespaces | اختياري (CustomTypeOptions) | i18next (لواحق الجمع) | ~18.4 kB |
react-intl (FormatJS) | وقت التشغيل | JSON مركزي، ICU | اختياري (استخراج + union) | ICU | ~15.3 kB |
use-intl | الخادم أولاً | JSON مركزي، ICU | اختياري (دمج التصريحات) | ICU | ~14.1 kB |
@tolgee/react | وقت التشغيل | مركزي، تحرير مباشر في السياق | لا | ICU | ~11.1 kB |
| Lingui | ماكرو | النص المصدري في الكود، كتالوجات مجمعة | جيد، من المترجم | ICU عبر الماكرو | صغير |
| Paraglide | مترجم | مشروع inlang، دوال مولدة | مُولد | خاص | يقارب الصفر |
| Intlayer | مترجم | .content.ts لكل مكون | مُولد، مفعّل افتراضياً | دوال مساعدة (plural, enu) | الأساس |
الأرقام تمثل لقطة لإصدارات benchmark وتتغير مع التحديثات. قم بتشغيل اختبار الأداء على تطبيقك الخاص قبل اتخاذ القرار بناءً على الحجم وحده.
أمران لا يظهرهما الجدول: لا تشحن Paraglide أي مكتبة تقريباً لأنها تولد الكود داخل مستودعك، مما يعني خطوة إعادة توليد قبل كل commit وتعارضات دمج (merge conflicts) محتملة في الملفات المولدة. كما تتطلب Intlayer إضافة أداة تجميع (vite-intlayer أو ما يعادلها)، لذا لا يمكن تشغيلها في بيئة بدون أدوات بناء (no-build setup).
مطابقة إجاباتك مع المكتبة المناسبة
اختر أبسط حل يعمل وتجنب الاستثمار الزائد. يُعد react-i18next مع ملف JSON واحد لكل لغة كافياً، وستوفر لك إجابات عقد كامل على Stack Overflow الكثير من الوقت. تجنب الـ namespaces حتى تحتاجها فعلاً. إذا تحول النموذج الأولي إلى منتج، خصص وقتاً للانتقال إلى المحتوى المحدد النطاق (scoped)؛ يتيح لك محول التوافق لـ react-i18next القيام بذلك تدريجياً.
تنسيق الكتالوج محدد مسبقاً لك. تدعم react-intl تنسيق ICU بشكل أصلي وأدوات استخراج FormatJS مبنية لهذا المسار. تقرأ use-intl صيغة ICU أيضاً. تحتاج react-i18next إلى إضافة ICU ومفاتيح الجمع الخاصة بها بخلاف ذلك. دعم Intlayer لـ ICU لا يزال جزئياً، لذا إذا كنت تتلقى نصوص ICU اليوم، فاعتبر ذلك عائقاً حتى اكتمال الدعم.
فضل المحتوى محدد النطاق والتحميل الديناميكي افتراضياً، وليس بمجرد اتفاق عرفي. تحقق Lingui و Paraglide ذلك عبر التجميع. وتحقق Intlayer ذلك عبر التصريحات المخصصة لكل مكون، حيث يشحن المترجم فقط ما يعرضه المسار. مع react-i18next أو use-intl، خطط لاستراتيجية الـ namespace والتحميل الكسول (lazy loading) من اليوم الأول وافرضها في مراجعة الكود، لأن الأدوات لن تفرضها تلقائياً.
يمكن إضافة الأنواع إلى كل مكتبة معتمدة على المفاتيح، ولكن لا توفر أي منها ذلك تقريباً بشكل افتراضي. إذا كنت لا ترغب في صيانة دمج التصريحات (declaration merging) التي يجب أن تتوافق مع الـ namespaces المحملة بشكل كسول، فاختر مكتبة يتم فيها إنشاء الأنواع من المحتوى مباشرة: Lingui أو Paraglide أو Intlayer. يقارن مقال اكتشاف الترجمات المفقودة ما تلتقطه كل أداة أثناء وقت البناء.
العقد الغنية (Rich nodes) هي النقطة التي تفشل عندها دالة t() التي ترجع نصاً عادياً. تمتلك react-i18next و Lingui مكون <Trans>، وتمتلك react-intl وسوم النص الغني، وجميعها أكثر تعقيداً من حالة النص العادي. تقبل عقد المحتوى في Intlayer نصوص JSX و markdown والكائنات المتداخلة مباشرة، وهو الخيار الأنسب إذا كان المحتوى يتجاوز مجرد تسميات واجهة المستخدم.
عندها لا يعد ملف JSON المركزي شرطاً لازماً، لعدم وجود نظام TMS للاستيراد إليه. المحتوى المشترك في نفس المكان (Colocated content) مع أداة CLI تملأ اللغات المفقودة هو المسار الأقصر. يعمل أمر fill في Intlayer باستخدام مفتاح API الخاص بك (OpenAI و Anthropic و Mistral و Gemini) ويترجم فقط ما تم تغييره. تقدم Paraglide و Tolgee حلولاً مستضافة مماثلة مع خطط أسعار خاصة بهما.
لا يعبر سياق React حدود الخادم/العميل. ستحتاج المكتبات المبنية على خطاف عميل فقط (react-i18next و react-intl) إلى واجهة برمجة تطبيقات موازية للخادم فور اعتمادك لـ RSC. تمتلك use-intl (باسم next-intl) و Intlayer (باسم next-intlayer) هذا التقسيم بالفعل. اقرأ مقال Next.js i18n قبل اعتماد نمط موحد.
نقاط القصور في كل مكتبة
حدود صريحة، لأن كل خيار ينطوي على عيوب.
react-i18next: الأثقل بين المجموعة، تنسيق جمع خاص بها، الأنواع تتطلب إعداداً يدوياً وصيانة مستمرة، وتتراكم المفاتيح غير المستخدمة دون تنبيه.react-intl: تجربة مطور مطولة (useIntl()ثمformatMessage({ id }))، ومثيل عام مرتبط بعدة عقد.use-intl: سهلة في البداية، وصعبة في التحسين. الـ namespaces والتحميل الديناميكي والأنواع معاً تبطئ عملية التطوير كثيراً.Lingui: خطوة بناء إضافية لـextractوcompile، وعدة صيغ متداخلة (t()، القوالب ذات العلامات،i18n.t()،<Trans>) تربك كلاً من المطورين ومساعدي الذكاء الاصطناعي.Paraglide: ملفات مولدة داخل المستودع، لم يدخل الـ tree-shaking حيز التنفيذ الكامل في اختبار React، ويتم قراءة اللغة من التخزين في كل عقدة بدلاً من قراءتها من المخزن المركزي.Tolgee: لا توجد أنواع للمفاتيح، إعداد أصعب، والتحرير المباشر داخل السياق هو نقطة البيع الأساسية.Intlayer: إضافة بناء إلزامية، نظام بيئي أصغر، دعم جزئي لـ ICU، وتوزيع المحتوى عبر قاعدة الكود يعني أن تصدير ملف JSON واحد للمترجم يتطلب أدوات إضافية.gt-react,lingo.dev: غير موصى بهما في اختبار الأداء: أخطاء حصص الاستخدام (quota) أثناء البناء، والارتباط بمزود معين (vendor lock-in)، ومشاكل تفاعلية تطلبت إجبار الـ provider على إعادة التصيير.
كيف يبدو كل خيار في الكود
نفس المكون، وهو ملخص عربة تسوق مع عنوان وصيغة جمع، مكتوباً بكل خيار مرشح. الجزء المثير للاهتمام ليس المكون نفسه، بل أين يعيش المحتوى وما يعرفه مدقق الأنواع عنه.
نسخ الكود إلى الحافظة
نسخ الكود إلى الحافظة
صيغ الجمع هي مفاتيح لواحق يتم حلها من خلال Intl.PluralRules. الدالة t هي (key: string) => string ما لم تعلن عن CustomTypeOptions، لذا يتم تجميع t("titel") بنجاح دون أخطاء برمجية.
نسخ الكود إلى الحافظة
نسخ الكود إلى الحافظة
تنسيق ICU من البداية إلى النهاية، وهو ما تصدره معظم منصات TMS. تأتي الأنواع على id من خطوة استخراج formatjs بالإضافة إلى union مولد، وليس بشكل جاهز ومباشر.
نسخ الكود إلى الحافظة
نسخ الكود إلى الحافظة
نفس هيكل next-intl بدون ارتباطات Next.js. المفاتيح تصبح محددة الأنواع بمجرد توسيع AppConfig بنوع الرسائل؛ ويبقى تقسيم الـ namespaces مسؤوليتك.
نسخ الكود إلى الحافظة
نسخ الكود إلى الحافظة
اللغة المصدر تعيش داخل المكون؛ واللغات الأخرى تعيش في ملفات .po تحت معرفات مجزأة بعد تشغيل lingui extract. يؤدي نسيان extract أو compile إلى الرجوع بهدوء إلى اللغة الإنجليزية دون تنبيه.
نسخ الكود إلى الحافظة
نسخ الكود إلى الحافظة
كل رسالة عبارة عن دالة مولدة ومحددة الأنواع، لذا فإن المفتاح المفقود هو خطأ في الاستيراد (import error). يتم إنشاء مجلد paraglide/ داخل المستودع وإعادة توليده مع كل تغيير.
نسخ الكود إلى الحافظة
نسخ الكود إلى الحافظة
جميع اللغات في ملف واحد بجانب المكون. يتم إنشاء الأنواع أثناء البناء، لذا يكتمل title تلقائياً ويفشل أي خطأ إملائي في tsc دون الحاجة لدمج التصريحات. حذف المجلد يحذف نصوصه تلقائياً.
هل تستخدم بالفعل react-i18next أو react-intl أو Lingui؟ تتيح محولات التوافق (react-i18next، و react-intl، و Lingui) إنشاء أسماء مستعارة (aliases) للاستيرادات على مستوى أداة التجميع بحيث تستمر واجهة الـ API الحالية في العمل أثناء نقلك للمكونات واحداً تلو الآخر. يغطي دليل الهجرة باقي التفاصيل.
قبل أن تعتمد اختيارك النهائي
يخبرك جدول الميزات بما تفعله المكتبة اليوم. وتوضح لك هذه النقاط كيف ستكون تجربة العمل بها على المدى الطويل.
تحقق من نشاط المستودع.
الالتزامات (commits)، وسرعة الرد على المشكلات (issues)، وما إذا كان آخر إصدار فرعي قد صدر هذا العام. التصميم السليم بدون مسؤول صيانة يعني أنك ستواجه هجرة إجبارية مستقبلاً.
لا تختر بناءً على عدد تنزيلات npm فقط.
المكتبة الأكثر تثبيتاً هي أول مكتبة ظهرت، وليست بالضرورة المكتبة التي تناسب كود React في عام 2026. تقيس التنزيلات التاريخ وليس الملاءمة الحالية.

اسأل من يدعم مسؤول الصيانة، وماذا يبيعون.
تحظى i18next بدعم من Locize. وتدعم Crowdin كلاً من next-intl / use-intl و vue-i18n و svelte-i18n و Lingui. تدير كل من Tolgee و Paraglide (inlang) و Intlayer منصتها الخاصة. المزود الذي يعتمد دخله على الترجمة المستضافة لديه القليل من الدوافع لجعل الترجمة مجانية داخل سلسلة أدواتك. تعد Intlayer الوحيدة في المجموعة التي توفر ترجمة بالذكاء الاصطناعي عبر الـ CLI باستخدام مفتاح API الخاص بك، مع نظام إدارة محتوى (CMS) يمكنك استضافته ذاتياً.
هل المكتبة جاهزة لوكلاء الذكاء الاصطناعي (AI agents)؟
لا يزال الوكلاء يواجهون صعوبات مع التدويل: ينسون اللغات، ويخترعون مفاتيح من عندهم، ويخلطون بين صيغ الرسائل. هل توفر المكتبة Agent Skills أو خادم MCP حتى يتمكن الوكيل من سرد المحتوى وملئه واختباره؟ وهل يتم تحسين تحميل المحتوى افتراضياً، أم يتعين على شخص ما مراجعة الـ namespaces والاستيرادات الكسولة كل ربع سنة؟
أمان الأنواع فور التثبيت.
ليس "يمكن توفير الأنواع مع إعداد إضافي"، بل "المفتاح الخاطئ يفشل tsc في تثبيت جديد". تحقق مما يحدث مع مفتاح غير موجود، ومع لغة تفتقد ترجمة واحدة.
اكتشاف المحتوى غير المستخدم.
الكتالوجات تنمو باستمرار ولا تصغر من تلقاء نفسها. تقوم عملية بناء Intlayer بحذف الحقول غير المستخدمة وتسجيلها (build.purge). وتحقق Paraglide ذلك معمارياً، حيث يتم التخلص من دالة الرسالة غير المستدعاة عبر tree-shaking. أما باقي المكتبات فتترك مهمة تنظيف الكتالوجات عليك.
تجربة المطور (DX).
الوقت المستغرق من الإعداد حتى أول نص مترجم، ووجود LSP أو إضافة VS Code تعرض الترجمة عند التمرير وتنتقل إلى التصريح مباشرة، و CLI للملء والاختبار والرفع، وطريقة لغير المطورين لتحرير المحتوى (المحرر المرئي أو نظام إدارة المحتوى (CMS)) بدون طلب سحب (pull request).
الأسئلة الشائعة
نعم لمعظم الفرق. تمتلك أكبر نظام بيئي وأكبر عدد من الإجابات على الإنترنت. تكاليفها حقيقية ولكن يمكن التنبؤ بها: أثقل وقت تشغيل، وتنسيق جمع مخصص، وأمان الأنواع وتحديد النطاق الذي يجب عليك إعداده وحمايته بنفسك.
فقط إذا كان حجم الحزمة، أو الأنواع المولدة، أو فحوصات المفاتيح المفقودة في وقت البناء من بين متطلباتك. بالنسبة لتطبيق صغير بلغتَين، فإن مكتبة وقت التشغيل أبسط. يشرح مقال الـ i18n المعتمد على المترجم مقابل التصريحي ما تمنحه لك المترجمات وما قد تخطئ فيه.
جزئياً. تشترك المكتبات المعتمدة على المفاتيح في شكل كافٍ يتيح لمحول التوافق تعيين واجهة برمجة تطبيقات إلى أخرى، وهو ما تفعله محولات Intlayer. لا يتم تحويل تنسيقات الرسائل (ICU مقابل i18next مقابل الدوال المساعدة) تلقائياً، لذا فإن صيغ الجمع والاستيفاء (interpolation) هي الأجزاء التي ستقوم بتعديلها.
بشكل غير مباشر. ما تراه روبوتات الفهرسة يتحدد من خلال التوجيه (routing)، و hreflang، و <html lang>، وما إذا كان النص موجوداً في كود HTML المُصيّر على الخادم. توفر بعض المكتبات دوال مساعدة لذلك، بينما تترك معظمها الأمر لك. راجع دليل hreflang.
للمزيد من التفاصيل
- اختبار أداء مكتبات i18n: حجم الحزمة والتسريب وتوقيت تبديل اللغة و تقرير TanStack Start
- React i18n: كيف يعمل نموذج المزود (provider) وتكلفته
- react-i18next مقابل react-intl مقابل Intlayer، ميزة بميزة
- next-i18next مقابل next-intl مقابل Intlayer
- تاريخ JavaScript i18n
- الـ i18n المعتمد على المترجم مقابل التصريحي
- الـ i18n لكل مكون مقابل المركزي
- كيف يعمل تحسين الحزمة في وقت البناء
- إعداد i18n في تطبيق Vite + React
- نفس الدليل لكل من Vue، و Svelte، و Solid
التعليقات
لا توجد تعليقات بعد. كن أول من يشارك أفكاره.
