استخدم مساعدك المفضل للملخص واستخدم هذه الصفحة والموفر 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
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| الإعداد | الاستراتيجية | حجم المكتبة (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 لكل صفحة. إنه الجسر، وليس الوجهة.
النتائج على 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') يزيله.
لماذا تتحرك الأرقام
لم يتغير شيء في المكون، لذا تأتي المكاسب بالكامل من ما هو 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وتندمج معاً.
الحدود التي يجب أن تعرفها قبل البدء
- يتم نقل إعدادات التوجيه إلى
intlayer.config.ts. تحتفظ دوالcreateNavigation(routing)وcreateMiddleware(routing)بتوقيعها لكنها تتجاهل الوسيط: تأتي locales واللغة الافتراضية واستراتيجية البادئة من إعداداتroutingفي Intlayer. إذا كنت تستخدمpathnamesالموضعية فيnext-intl(/about→/a-propos)، فإن المحول لا يقوم بالاستيفاء؛routing.rewriteفي Intlayer يغطي هذه الحالة لكنها تغيير منفصل. useTranslations()بدون مساحة اسم غير مرتبط. تحتاج مرحلة التحسين إلى مساحة اسم ثابتة لمعرفة أي قاموس يجب استيراده. لا يزال الاستدعاء الأساسي يعمل، من خلال سجل وقت التشغيل الذي يشير إلى كل قاموس، وهو بالضبط التسرب الذي كنت تحاول إزالته. مرر مساحة الاسم.- المحول ليس مجانيًا. 8.0 كيلوبايت من وقت التشغيل مقابل 5.5 كيلوبايت لـ
next-intlayer، و+6-7 كيلوبايت لكل صفحة فوق البناء الأصلي. يغطي سطح APInext-intl. إذا وصلت إلى نقطة حيث تم نقل كل مكون إلىuseIntlayer، أسقط المحول. messages,timeZone,nowعلى المزود يتم تجاهلها. يتم دعم المنسقات بواسطةIntlالأصلي والإعدادات المحلية فقط تؤثر على مخرجاتها؛ إذا كنت تعتمد على منطقة زمنية مفروضة أوnowثابتة لتواريخ مستقرة من حيث الترطيب، فتعامل معها في موقع الاستدعاء.
متى تستخدم أيًا منها؟
- ابقَ على
next-intlإذا كان تطبيقك صغيرًا، والحزمة ليست مصدر قلق، وفريقك مرتاح لامتلاك المساحات والقيام بـpick()لكل صفحة. - استخدم
@intlayer/next-intlإذا كنت تستخدمnext-intlحالياً وتريد تحسينات الحزمة والتسرب والتنويم، والمفاتيح المكتوبة بشكل صحيح وأدوات CLI / CMS دون إعادة كتابة. هذه هي نقطة الدخول الموصى بها لأي codebasenext-intlموجود. - استخدم المحلل الأصلي (
next-intlayer) للمشاريع الجديدة، أو بعد انتهاء المحول من مهمته. إنها الأخف من بين الثلاثة (5.5 KB، +0.3 KB لكل صفحة) وتفتح مكونات الخادم المتزامنة وملفات.content.tsلكل مكون ومجموعة الميزات الكاملة.
المقارنات ذات الصلة
- next-intl vs Intlayer (المكتبات، نفس المعيار)
- i18next vs @intlayer/i18next (نفس سلسلة المحول)
- Lingui vs @intlayer/lingui (نفس سلسلة المحول)
- vue-i18n vs @intlayer/vue-i18n (نفس سلسلة المحول)
- دليل الهجرة: next-intl إلى Intlayer
- مرجع محول التوافقية: next-intl
الخلاصة
@intlayer/next-intl يفعل شيء واحد: يغير ما يرتبط به useTranslations، من موفر يحتوي على كل رسالة إلى قاموس مترجم لهذا المكون. على نفس تطبيق Next.js الذي يستحق 6 KB لكل صفحة، مكونات أصغر بـ 2.7 مرة، 0% تسرب و 2 ms من المرطوبة، قبل أن يفتح أي شخص ملف مكون. التنقل والبرنامج الوسيط يحتفظان بـ API الخاص بهما على أساس تكوين التوجيه الخاص بـ Intlayer، و runtime next-intlayer الأصلي يبقى أخف وزنا.
جميع البيانات الأولية وتطبيقات الاختبار والبرامج النصية موجودة في مستودع Benchmark Bloom. قم بتشغيلها بنفسك.
راجع وثيقة 'Why Intlayer?' للمزيد من التفاصيل.
التعليقات
لا توجد تعليقات بعد. كن أول من يشارك أفكاره.
