استخدم مساعدك المفضل للملخص واستخدم هذه الصفحة والموفر AI الذي تريده
تمت ترجمة محتوى هذه الصفحة باستخدام الذكاء الاصطناعي.
اعرض آخر نسخة المحتوى الأصلي باللغة الإنكليزيةإذا كان لديك فكرة لتحسين هذه الوثيقة، فلا تتردد في المساهمة من خلال تقديم طلب سحب على GitHub.
رابط GitHub للتوثيقنسخ الـ Markdown من المستند إلى الحافظة
next-intl مقابل @intlayer/next-intl: نفس الواجهة البرمجية، حزمة مختلفة

@intlayer/next-intl هو محول توافقية: يكشف API next-intl (useTranslations، getTranslations، useLocale، t.rich()، ICU plurals، NextIntlClientProvider...) ويقدمه من القواميس المجمعة بواسطة Intlayer. كود التطبيق لا يتغير. الـ bundle يتغير.
تقارن هذه المقالة بين الاثنين على نفس تطبيق Next.js، تم بناؤه مرة مع next-intl ومرة مع المحول. تأتي الأرقام من Benchmark Bloom، مجموعة مفتوحة المصدر تسجل ما يقوم المتصفح بتنزيله فعلياً. إذا كنت تريد مقارنة next-intl مقابل Intlayer كمكتبات، اقرأ next-intl vs Intlayer. هذا يتعلق بما يغيره المحول عندما تحافظ على مكوناتك كما هي.
الخلاصة: في نفس تطبيق Next.js، استبدالnext-intlبـ@intlayer/next-intlقلّل JavaScript لكل صفحة من 153.6 كيلوبايت إلى 147.5 كيلوبايت gzip، ومتوسط المكون من 21.8 كيلوبايت إلى 8.1 كيلوبايت، وتسرب سلاسل الصفحات الأجنبية من ~90% إلى 0%، والترطيب من 14.7 ميلي ثانية إلى 12.8 ميلي ثانية، دون تعديل أي مكون. على TanStack Start، ما يعادلuse-intl(@intlayer/use-intl) قلّل المكونات من 76-87 كيلوبايت إلى 9-11 كيلوبايت وتبديل اللغة من 7-21 ميلي ثانية إلى 4-9 ميلي ثانية. يكلف المحول 8.0 كيلوبايت من وقت التشغيل مقابل 14.7 كيلوبايت لـnext-intlو 5.5 كيلوبايت لـnext-intlayerالأصلي. تمت إعادة تنفيذ التنقل والبرنامج الوسيط على إعدادات التوجيه الخاصة بـ Intlayer؛pathnamesالمحلية هي الميزة الوحيدة التي لم يتم نقلها.
ما هو @intlayer/next-intl
next-intl عبارة عن runtime: getRequestConfig يحمل messages/{locale}.json لكل طلب، NextIntlClientProvider يرسله إلى العميل، و useTranslations("about") يقرأ المفاتيح من هذا الكائن وقت التصيير. كل تحسين (namespaces، pick(messages, [...]) لكل صفحة، التحميل البطيء) يجب أن تكتبه بنفسك.
@intlayer/next-intl يحافظ على الجزء الأول والأخير من هذه السلسلة ويستبدل الجزء الأوسط. مكوناتك لا تزال تستدعي useTranslations("about")؛ ما يتلقونه يأتي من قاموس Intlayer مجمع وقت البناء، محدود النطاق لذلك المكون، في اللغة النشطة فقط.
ثلاث آليات تجعل ذلك يعمل:
- Import aliasing.
createNextIntlPlugin()من@intlayer/next-intl/pluginيغلفwithIntlayerويضيف aliases لـ Webpack / Turbopack بحيث يتم حلnext-intl،next-intl/server،next-intl/navigationوnext-intl/middlewareإلى@intlayer/next-intl. لا يتم إعادة تسمية أي import في codebase الخاص بك. - JSON كمصدر الحقيقة. plugin
syncJSONيقرأmessages/{locale}.jsonالموجودة لديك، يقسم مفاتيحها على المستوى الأعلى إلى قاموس واحد لكل namespace، ويكتب الترجمات مرة أخرى إلى نفس الملفات عند تحديثها من قبل CLI أو CMS. سير العمل الخاص بالمترجمين لديك لم يتغير. - Call-site binding. يقوم تمرير التحسين في Intlayer (Babel أو SWC) بإعادة كتابة
useTranslations("about")إلى استدعاء يتلقى قاموسaboutمباشرة. لا يعود المكون يصل إلى شجرة الرسائل العامة؛ بل يصل إلى محتواه الخاص.
نسخ الكود إلى الحافظة
نسخ الكود إلى الحافظة
إعادة الكتابة هذه هي السبب في أن أعمدة حجم المكون وتسرب الصفحة أدناه تتحرك: تسحب الصفحة فقط قواميس المكونات التي تقدمها، وفقط في اللغة التي يتم تقديمها.
ما يحتفظ به المحول وما يتجاهله وما لا يستبدله
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
next-intl API | مع @intlayer/next-intl |
|---|---|
useTranslations("ns") / getTranslations("ns") | ✅ محفوظ. مرتبط بقاموس ns في وقت البناء. المفاتيح مكتوبة ضد محتواك. |
getTranslations({ locale, namespace }) | ✅ محفوظ |
t("key", { name }), t.rich(), t.markup(), t.raw() | ✅ محفوظ. ICU plurals، select، selectordinal، #، {ts, date, long} تعمل من خلال محلل Intlayer's ICU |
useLocale() / getLocale() / setRequestLocale() / setLocale | ✅ محفوظ |
useFormatter() | ✅ محفوظ. dateTime، number، relativeTime، list، dateTimeRange تربط إلى Intl الأصلي |
NextIntlClientProvider | ✅ محفوظ. يتم قبول props messages و timeZone و now لكن يتم تجاهلها (رسالة تحذير للمطور تخبرك بذلك) |
getMessages() | ✅ محفوظ للتوافقية؛ لم يعد مطلوباً |
getRequestConfig() في src/i18n.ts | ⚠️ غير مطلوب. يتم ترجمة القواميس في وقت البناء؛ لا يوجد تحميل رسائل لكل طلب |
defineRouting() | ✅ محفوظ. يتم قراءة الحقول المحذوفة (locales و defaultLocale و localePrefix) من intlayer.config.ts |
createNavigation(), Link, redirect, usePathname, useRouter | ✅ تم الاحتفاظ به. تم إعادة تنفيذه على أساس إعدادات التوجيه الخاصة بـ Intlayer؛ تم قبول الوسيط routing ولكن يتم تجاهله |
pathnames (أسماء المسارات المترجمة) | ❌ مقبول للكتابة، لا يتم استيفاؤه. احتفظ بأسماء المسارات العادية أو انقل تلك الخريطة إلى Intlayer's rewrite |
createMiddleware() | ✅ تم الاحتفاظ به. يُرجع وكيل Intlayer؛ يضبط ملف تعريف الارتباط NEXT_LOCALE بحيث يستمر useLocale() والمبدل الخاص بك في العمل |
NEXT_LOCALE cookie | ✅ يتم قراءته بشكل افتراضي (ما لم تقم بتكوين routing.storage بنفسك) |
استدعاء useTranslations() بدون namespace | ⚠️ يعمل، لكن موقع الاستدعاء غير مرتبط: يتم حله من خلال سجل runtime. مرر namespace للحصول على مكاسب bundle |
معيار الأداء
ما تم قياسه
تقوم مجموعة Benchmark Bloom ببناء نفس التطبيق مع كل إعداد: 10 صفحات (home، about، blog، careers، contact، FAQ، pricing، products، settings، team)، 10 locales (en، fr، es، de، it، pt، zh، ja، ko، ru)، مكونات متطابقة ومحتوى متطابق. يتم قياس الصفحات في en وfr.
تم بناء next-intl بأربع استراتيجيات تحميل، من الإعداد البسيط (messages/{locale}.json محمل بالكامل) إلى الإعداد الأمثل (namespace واحد لكل route + pick() لكل صفحة). تم بناء المحول على نفس المكونات الخاصة بالإعداد البسيط، مع تغيير next.config.ts و intlayer.config.ts فقط. لا توجد نسخة "scoped": يقوم المترجم بتحديد نطاق المحتوى لكل مكون، لذلك صفوف static و dynamic الخاصة به مشمولة بالفعل.
بالنسبة لكل عملية بناء، تسجل المجموعة:
- حجم المكتبة: حجم gzip لمكون فارغ يستورد مكتبة i18n فقط. التكلفة الثابتة للـ runtime.
- صفحة JS: JavaScript مضغوط تم تحميله لكل صفحة، بمتوسط على جميع الصفحات واللغات.
- نسبة تسرب اللغة %: حصة السلاسل المترجمة الموجودة في ملف JavaScript المحمل التي تنتمي إلى لغة المستخدم ليس يعرضها.
- نسبة تسرب الصفحة %: حصة السلاسل المترجمة الموجودة في ملف JavaScript المحمل التي تنتمي إلى صفحة المستخدم ليس عليها.
- متوسط المكون: متوسط حجم gzip لكل مكون تم ترجمته بشكل منفصل. يظهر مقدار runtime i18n والفهرس الذي يسحبه مكون واحد.
- E2E reactivity: وقت الساعة بين تحديد لغة جديدة وتحديث
html[lang]في DOM (Playwright، 5 تكرارات). - Hydration: مدة مرحلة hydration في React.
الأرقام أدناه تأتي من التشغيل المؤرخ 2026-09-12 معnext-intl/use-intl4.14.2 و@intlayer/*9.5.1. تطبيق الاختبار صغير عن قصد (بضع عشرات من السلاسل لكل locale)، لذا فإن نسب التسرب تصف نمطًا: فهي تنمو مع محتواك بينما تبقى تكلفة وقت التشغيل ثابتة.
النتائج على Next.js
اختر المقاييس والمكتبات التي تهمك:
المقياس
تحميل JSON الديناميكي
تحميل الترجمات ببطء في وقت التشغيل
JSON المحدد (أسماء المحيط)
مساحات أسماء الترجمة لكل صفحة
ما هو هذا المقياس؟
الحجم الإجمالي المضغوط بتنسيق gzip لحزمة مكتبة التدويل. وهي تتضمن فقط المزود ومنطق استرداد المحتوى بعد تقليل الحجم (tree-shaking) والضغط (minification).
لماذا هو مهم؟
يقلل حجم المكتبة الأصغر من حمولة JavaScript الأولية، مما يؤدي إلى سرعة التنزيل وأوقات التنفيذ على العميل.
عرض كـ
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| الإعداد | الاستراتيجية | حجم المكتبة (gz) | متوسط صفحة JS (gz) | تسرب Locale | تسرب الصفحة | متوسط المكون (gz) | التفاعل E2E | الماء (Hydration) |
|---|---|---|---|---|---|---|---|---|
| base (no i18n) | - | 0.0 KB | 141.0 KB | 0.0% | 0.0% | 0.9 KB | 13.4 ms | 11.8 ms |
next-intl | static | 14.7 KB | 153.6 KB | 4.2% | 89.8% | 21.8 KB | 16.0 ms | 14.7 ms |
next-intl | dynamic | 14.7 KB | 153.6 KB | 9.7% | 89.9% | 21.8 KB | 15.6 ms | 14.8 ms |
next-intl | scoped-static | 14.7 KB | 153.6 KB | 0.0% | 0.0% | 80.1 KB | 17.9 ms | 17.4 ms |
next-intl | scoped-dynamic | 14.7 KB | 153.6 KB | 0.0% | 0.0% | 22.9 KB | 17.8 ms | 16.8 ms |
@intlayer/next-intl | static | 8.0 KB | 147.5 KB | 0.0% | 0.0% | 8.1 KB | 14.5 ms | 12.8 ms |
@intlayer/next-intl | dynamic | 8.0 KB | 148.7 KB | 0.0% | 0.0% | 8.1 KB | 11.7 ms | 12.8 ms |
next-intlayer (native) | static | 5.5 KB | 141.3 KB | 0.0% | 0.0% | 8.5 KB | 15.5 ms | 16.9 ms |
next-intlayer (native) | dynamic | 5.5 KB | 141.3 KB | 0.0% | 0.0% | 6.9 KB | 15.3 ms | 15.9 ms |
كيفية قراءتها
- نفس المكونات، 6 KB أقل لكل صفحة. يصل بناء المحول للتطبيق الساذج إلى 147.5 KB، وهو أقل من كل إعداد
next-intlبما في ذلك الإعداد المحسّن بالكامل (153.6 KB). وقت التشغيل نفسه هو الفرق: 8.0 KB مقابل 14.7 KB، يُدفع على كل صفحة. - يختفي التسرب إلى 0% دون لمس أي مكون. إعداد
next-intlالساذج يشحن حوالي 90% من سلاسل الصفحات الأجنبية على كل صفحة. الوصول إلى 0% معnext-intlيعني إعداداتscoped-*: مساحة اسم واحدة لكل مسار، وpick(messages, [...])في كل صفحة. يصل المحول إلى 0% من الكود الساذج لأن عملية التحسين تربط كلuseTranslations("ns")بقاموسها الخاص. - تتقلص المكونات بمعامل 2.7x. يبلغ متوسط المكون المترجم بشكل معزول 21.8 كيلوبايت مع
next-intl(يصل إلى موفر الخدمة وشجرة الرسائل) و 8.1 كيلوبايت مع المحول. في إعدادscoped-staticالخاص بـnext-intl، يرتفع هذا الرقم إلى 80 كيلوبايت، لأن ملف مساحة الاسم لكل مسار يصبح قابلاً للوصول من الصفحة التي تختاره. - الـ Hydration أسرع بمقدار 2 ms (12.8 مقابل 14.7 ms): لا توجد كائن رسائل يجب فكّه من حمولة RSC قبل أن يتمكن React من الـ hydrate.
- المحول ليس وقت التشغيل الأصلي.
next-intlayerيجلس عند 141.3 KB، +0.3 KB فوق تطبيق الأساس، مع وقت تشغيل 5.5 KB. يحمل المحول سطح API الخاص بـnext-intl(useFormatter,t.rich, محلل ICU) فوق نواة Intlayer، وبالتالي 8.0 KB و +6 KB لكل صفحة. إنه الجسر، وليس الوجهة.
الجدول الكامل، لكل مكتبة واستراتيجية، في تقرير قياس أداء Next.js.
النتائج على TanStack Start (use-intl)
use-intl هو النواة المستقلة عن الإطار العمل الخاصة بـ next-intl. محولها، @intlayer/use-intl، يتبع نفس التصميم مع plugin Vite (@intlayer/use-intl/plugin).
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| الإعداد | الإستراتيجية | حجم المكتبة (gz) | متوسط JS الصفحة (gz) | تسرب اللغة | تسرب الصفحة | متوسط المكون (gz) | استجابة E2E | الترطيب |
|---|---|---|---|---|---|---|---|---|
| base (بدون i18n) | - | 0.0 KB | 111.0 KB | 0.0% | 0.0% | 0.7 KB | 8.1 ms | 21.6 ms |
use-intl | static | 14.1 KB | 179.8 KB | 50.0% | 89.8% | 76.0 KB | 6.7 ms | 15.3 ms |
use-intl | dynamic | 14.1 KB | 119.4 KB | 0.0% | 89.8% | 75.9 KB | 7.0 ms | 15.4 ms |
use-intl | scoped-static | 14.1 KB | 128.7 KB | 0.0% | 0.0% | 87.1 KB | 20.9 ms | 24.8 ms |
use-intl | scoped-dynamic | 14.1 KB | 128.7 KB | 0.0% | 0.0% | 87.1 KB | 13.3 ms | 25.9 ms |
@intlayer/use-intl | static | 7.3 KB | 135.8 KB | 49.7% | 0.0% | 10.9 KB | 4.2 ms | 10.5 ms |
@intlayer/use-intl | dynamic | 7.3 KB | 129.7 KB | 0.0% | 0.0% | 9.3 KB | 8.7 ms | 16.1 ms |
intlayer (native) | static | 5.0 KB | 125.8 KB | 50.0% | 0.0% | 8.1 KB | 3.2 ms | 11.5 ms |
intlayer (native) | dynamic | 5.0 KB | 118.6 KB | 0.0% | 0.0% | 6.3 KB | 3.6 ms | 14.1 ms |
كيفية قراءتها
- بايتات كل صفحة متساوية مقابل
use-intlالمُحسّن.@intlayer/use-intlفي وضعdynamic(129.7 KB) ضمن 1 KB منuse-intl'sscoped-dynamic(128.7 KB)، و 10 KB أعلى منuse-intl's العاديdynamic(119.4 KB). هذا الصفdynamicالعادي لا يزال يسرب 90% من النصوص الخارجية؛ عدد البايتات منخفض لأن محتوى تطبيق الاختبار صغير. معدل 0% للمحول هو ما يبقى ثابتاً مع نمو المحتوى. - المكونات أصغر بـ 7-9 مرات. مكونات
use-intlبمتوسط 76-87 KB في كل استراتيجية، لأنuseTranslationsمرتبطة بكائن الرسائل الكامل للمزود. يبلغ متوسط المحول 9-11 KB. - تبديل اللغة أسرع. إعدادات
use-intlالمُحسَّنة تستغرق 13-21 ms لتحديثhtml[lang]؛ المحول يستغرق 4-9 ms. عدد أقل من المكونات يعاد تصيير، ولا شيء يتم اختياره مرة أخرى من شجرة الرسائل. staticيحتفظ بكل لغة. صفstaticفي المحول يُظهر تسرب لغة بنسبة 49.7%، نفس نسبة Intlayer الأصلية في وضعstatic: يتم تجميع جميع اللغات، فقط قواميس الصفحة. سطر واحد من الإعدادات (importMode: 'dynamic') يزيله.
الجدول الكامل في تقرير قياس أداء TanStack Start.
لماذا تتحرك الأرقام

لم يتغير شيء في المكون، لذا تأتي المكاسب بالكامل من ما هو useTranslations مرتبطة به.
مع next-intl، الربط هو مع المزود. يتلقى NextIntlClientProvider كائن messages كاملًا للإعدادات المحلية؛ كل استدعاء useTranslations("about") يقرأ منه. يرى bundler مكونًا واحدًا يستورد hook واحدًا يقرأ سياقًا واحدًا، ولا يمكنه معرفة أن فرع about فقط هو المستخدم. تشارك المسارات أدناه نفس كائن الرسائل، لذلك يقرأ عمود تسرب الصفحة ~90% حتى تقسم الملف بنفسك, ويتزايد الهدر على محورين في وقت واحد، الصفحات واللغات:

نسخ الكود إلى الحافظة
مع @intlayer/next-intl، الربط هو القاموس. يحول syncJSON ملف messages/en.json إلى قاموس واحد لكل مفتاح على المستوى الأعلى؛ يقوم المترجم بحل المكون الذي يستدعي useTranslations("about") وينقل إليه about مباشرة، في اللغة النشطة، كاستيراد يمكن للـ bundler تتبعه وتقسيمه.
نسخ الكود إلى الحافظة
src/i18n.ts والخاصية messages تختفي. كل شيء آخر متطابق.
الترحيل في ثلاث خطوات
التثبيت
bashنسخ الكودنسخ الكود إلى الحافظة
يكتشف الأمر
next-intlويثبتintlayer،next-intlayer،@intlayer/next-intlو@intlayer/sync-json-plugin. احتفظ بـnext-intlمثبتًا: فهو اعتماد نظير للمحول ويوفر الأنواع.وجّه Intlayer نحو رسائلك
intlayer.config.tsنسخ الكودنسخ الكود إلى الحافظة
يبقى
messages/{locale}.jsonفي مكانه. يصبح كل مفتاح على المستوى الأعلى قاموسًا؛useTranslations("about")يُعيّن إلى قاموسabout.تغليف next.config.ts
next.config.tsنسخ الكودنسخ الكود إلى الحافظة
createNextIntlPlugin()ينشئwithIntlayer(مراقبة المحتوى، وتجميع القواموس، وتمرير التحسين) والأسماء المستعارةnext-intl→@intlayer/next-intlلـ Webpack و Turbopack. قم بالبناء، والأرقام في الجداول أعلاه هي لك.
ما يمكنك حذفه بعد ذلك
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| الملف / النمط | السبب |
|---|---|
getRequestConfig في src/i18n.ts | لا توجد عملية تحميل الرسائل لكل طلب. احتفظ بالملف فقط إذا كان يُصدّر أيضًا مساعدات createNavigation |
messages={...} على NextIntlClientProvider | المحول يقرأ المخرجات المجمعة؛ الخاصية يتم تجاهلها وتسجيل تحذير في بيئة التطوير |
await getMessages() في التخطيطات | نفس السبب |
pick(messages, [...]) لكل صفحة | المجمع يقوم بالاختيار، لكل مكون |
ما تحصل عليه بما يتجاوز البايتات
- Typed keys.
useTranslations("about")له نوع مقابل قاموسaboutالمجمع.t("does.not.exist")هو خطأ في TypeScript، وليس بديل في وقت التشغيل. npx intlayer testيفشل في CI عندما تكون هناك مفتاح مفقود في إحدى اللغات.npx intlayer fillيترجم المفاتيح المفقودة باستخدام مزود خدمة من اختيارك (OpenAI, Anthropic, Mistral, Gemini...) باستخدام مفتاحك الخاص، ويكتب النتيجة مباشرة فيmessages/{locale}.json.- محرر مرئي و CMS يعملان على نفس القواميس، لذا يمكن للمطورين غير التقنيين تعديل
messages/fr.jsonمن خلال واجهة مستخدم وسيتم تحديث الملف تلقائياً. - انتقال تدريجي إلى
.content.ts. أي مكون يمكنه التبديل منuseTranslations("about")إلىuseIntlayer("about")باستخدام ملف محتوى مرافق، واحداً تلو الآخر. تتعايش قواموس JSON و.content.tsوتندمج معاً.
الحدود التي يجب أن تعرفها قبل البدء
تحتفظ createNavigation(routing) و createMiddleware(routing) بتوقيعها ولكنها تتجاهل الوسيط: اللغات، واللغة الافتراضية، واستراتيجية البادئة تأتي من إعدادات routing في Intlayer. وإذا كنت تستخدم مسارات pathnames المترجمة في next-intl (/about إلى /a-propos)، فإن المحول لا يستنبطها؛ بينما يغطي routing.rewrite في Intlayer تلك الحالة ولكنه تغيير منفصل.
تحتاج مرحلة التحسين إلى مساحة أسماء ثابتة لمعرفة أي قاموس يجب استيراده. الاستدعاء البسيط بدون مساحة أسماء يستمر في العمل عبر سجل وقت التشغيل الذي يشير إلى كل قاموس، وهو بالضبط التسريب الذي تحاول التخلص منه. قم بتمرير مساحة الاسم.
8.0 كيلوبايت لوقت التشغيل مقابل 5.5 كيلوبايت لـ next-intlayer، و +6-7 كيلوبايت لكل صفحة مقارنة بالبناء الأصلي. هذا هو ثمن توفير واجهة برمجة تطبيقات next-intl. وعندما يتم نقل كل مكون إلى useIntlayer، قم بإزالة المحول.
تعتمد أدوات التنسيق على Intl الأصلي وتؤثر اللغة فقط على مخرجاتها. إذا كنت تعتمد على منطقة زمنية مفروضة أو قيمة now ثابتة لتواريخ مستقرة أثناء الـ Hydration، فتعامل مع ذلك في موضع الاستدعاء. راجع تنسيق التاريخ والوقت والأرقام.
متى تستخدم أيًا منها؟
إذا كان تطبيقك صغيراً، وحجم الحزمة لا يشكل مصدر قلق، وفريقك مرتاح في إدارة مساحات الأسماء و pick() لكل صفحة.
أنت تستخدم next-intl اليوم وتريد مكاسب الحزمة ومنع التسريب والـ Hydration السريع والمفاتيح المكتوبة وأدوات CLI / CMS دون الحاجة إلى إعادة كتابة الكود. هذه هي نقطة البداية الموصى بها لأي قاعدة كود next-intl حالية.
للمشاريع الجديدة، أو بمجرد أن يكمل المحول مهمته الانتقالية. إنه الأخف بين الخيارات الثلاثة (5.5 كيلوبايت، +0.3 كيلوبايت لكل صفحة) ويفعل مكونات الخادم المتزامنة، وملفات .content.ts لكل مكون، وكامل مجموعة الميزات. ابدأ مع Intlayer مع Next.js.
الأسئلة الشائعة
في Next.js، نعم بالنسبة للمكونات: عدل بناء الاختبار next.config.ts و intlayer.config.ts فقط. وتصبح getRequestConfig في src/i18n.ts، وخاصية messages في المزود، واستدعاءات pick() لكل صفحة بمثابة كود غير مستخدم يمكنك حذفه لاحقاً.
تستمر في العمل. يتم حل t("key", { count }) و t.rich() و t.markup() و select و selectordinal و # و {ts, date, long} بواسطة محلل ICU الخاص بـ Intlayer. راجع تنسيق رسائل ICU.
لأنه يحمل واجهة برمجة تطبيقات next-intl فوق نواة Intlayer: useFormatter و t.rich ومحلل ICU ومساعدات التنقل. وهذا يعادل 8.0 كيلوبايت مقابل 5.5 كيلوبايت، و +6 كيلوبايت لكل صفحة. إنه جسر عبور وليس الوجهة النهائية.
نعم. يمكن لأي مكون الانتقال من useTranslations("about") إلى useIntlayer("about") مع ملف .content.ts مجاور له. تتعايش قواميس JSON و .content.ts وتندمج بسلاسة.
ليس من خلال pathnames الخاصة بـ next-intl: يقبلها المحول لغرض التحقق من الأنواع فقط ولكنه لا يستنبطها. استخدم بدلاً من ذلك routing.rewrite من Intlayer.
المقارنات ذات الصلة
نفس سلسلة المحولات:
مقارنة مباشرة بين المكتبات:
وثائق مرجعية:
لفهم أصل هذه المكتبات، اقرأ تاريخ i18n في JavaScript.
الخلاصة
@intlayer/next-intl يفعل شيء واحد: يغير ما يرتبط به useTranslations، من موفر يحتوي على كل رسالة إلى قاموس مترجم لهذا المكون. على نفس تطبيق Next.js الذي يستحق 6 KB لكل صفحة، مكونات أصغر بـ 2.7 مرة، 0% تسرب و 2 ms من المرطوبة، قبل أن يفتح أي شخص ملف مكون. التنقل والبرنامج الوسيط يحتفظان بـ API الخاص بهما على أساس تكوين التوجيه الخاص بـ Intlayer، و runtime next-intlayer الأصلي يبقى أخف وزنا.
جميع البيانات الأولية وتطبيقات الاختبار والبرامج النصية موجودة في مستودع Benchmark Bloom. قم بتشغيلها بنفسك.
راجع وثيقة 'Why Intlayer?' للمزيد من التفاصيل.
التعليقات
لا توجد تعليقات بعد. كن أول من يشارك أفكاره.
