استخدم مساعدك المفضل للملخص واستخدم هذه الصفحة والموفر AI الذي تريده
تمت ترجمة محتوى هذه الصفحة باستخدام الذكاء الاصطناعي.
اعرض آخر نسخة المحتوى الأصلي باللغة الإنكليزيةإذا كان لديك فكرة لتحسين هذه الوثيقة، فلا تتردد في المساهمة من خلال تقديم طلب سحب على GitHub.
رابط GitHub للتوثيقنسخ الـ Markdown من المستند إلى الحافظة
vue-i18n مقابل @intlayer/vue-i18n: نفس الواجهة البرمجية، حزمة مختلفة
@intlayer/vue-i18n هو محول توافقي: يعرّض واجهة برمجية (API) من vue-i18n (createI18n، useI18n، t()، d()، n()، $t، v-t، i18n.global.locale...) ويقدمها من القواميس المترجمة بواسطة Intlayer. ملفات .vue الخاصة بك لا تتغير. ما يرتبط به t("footer.github") هو ما يتغير.
تقيس هذه المقالة هذا التبديل على نفس تطبيق Vite + Vue 3، تم بناؤه مرة واحدة باستخدام vue-i18n ومرة أخرى باستخدام المحول. تأتي الأرقام من Benchmark Bloom. لمقارنة vue-i18n و Intlayer كمكتبات، اقرأ vue-i18n vs Intlayer وvue-i18n vs Intlayer benchmark. هذا يتعلق بما يغيره المحول عندما تحتفظ بمكوناتك كما هي.
ملخص سريع: على نفس تطبيق Vite + Vue 3، استبدالvue-i18nبـ@intlayer/vue-i18nأخذ JavaScript لكل صفحة من 134.9 KB إلى 47.0 KB gzip (التطبيق بدون i18n يزن 41.3 KB)، وقت التشغيل من 24.3 KB إلى 7.9 KB، متوسط المكون من 196 KB إلى 8.4 KB، وتسرب السلاسل النصية للصفحات الأجنبية من 90% إلى 0%، بدون تعديل أي ملف.vue.createI18n({ messages })يستمر في العمل كخيار بديل؛ أزل استيراد JSON للحصول على الأرقام أعلاه. كتل SFC<i18n>وsetLocaleMessage()في وقت التشغيل هما الميزتان اللتان لا تنتقلان.
ما هو @intlayer/vue-i18n
vue-i18n هي runtime. createI18n({ messages: { en, fr, ... } }) تبني instance عام يحتفظ بكل رسالة من كل locale؛ useI18n() تربط كل component بها؛ t("footer.github") تمشي عبر الشجرة في وقت rendering. هذا التصميم هو ما يجعل SFC <i18n> blocks و setLocaleMessage() ممكنة، وهو أيضاً السبب في أن dependency graph لكل component يتضمن الشجرة بأكملها.
@intlayer/vue-i18n تحافظ على API وتستبدل الشجرة:
- Import aliasing.
vueI18nVitePlugin()من@intlayer/vue-i18n/pluginتغلفvite-intlayerوتضيفresolve.aliasبحيث أنvue-i18nيتم حلها إلى@intlayer/vue-i18n. لم يتم إعادة تسمية أي import. - JSON كمصدر الحقيقة. يقرأ plugin
syncJSONملفlocales/{locale}.jsonالموجود لديك باستخدامformat: "vue-i18n"(لذلك يتم تحليل استيفاء{name}،{0}list والجمع بين الأنابيب"car | cars"بشكل صحيح) ويكتب الترجمات مرة أخرى عندما يحدثها CLI أو CMS. - ربط موقع الاستدعاء. تعيد مرحلة تحسين Intlayer كتابة مواقع استدعاء
useI18n()بحيث يحصل المكون على القواميس الخاصة به مفاتيح الأسماء، في الإعدادات المحلية النشطة، كواردات يمكن للـ bundler تتبعها وتقسيمها.
نسخ الكود إلى الحافظة
نسخ الكود إلى الحافظة
لم تعد المكون تصل إلى شجرة الرسائل العامة. تصل إلى footer. هذا هو السبب في انخفاض عمود حجم المكون أدناه من 196 كيلوبايت إلى 8 كيلوبايت.
ما يحافظ عليه المحول وما يتجاهله وما لا يستبدله
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
vue-i18n API | مع @intlayer/vue-i18n |
|---|---|
useI18n() → { t, d, n, te, tm, rt, locale, availableLocales } | ✅ تم الاحتفاظ به. مفاتيح t مُكتوبة ضد قاموسك |
t("key", { name }), t("key", [a, b]), t("key", count) | ✅ تم الاحتفاظ به. يتم حل {name}، {0} والجمع الفاصل بينها كما هو الحال من قبل |
d(date, "long"), n(value, "currency") | ✅ تم الاحتفاظ به. يتم احترام datetimeFormats / numberFormats من createI18n()، مدعومة بـ Intl الأصلي |
i18n.global.locale.value = "fr" | ✅ تم الحفاظ عليه. WritableComputedRef مدعوم بـ Intlayer الخاص بالعميل؛ التفاعلية تتصرف كما هي |
$t, $tc, $te, $tm, $rt, $d, $n, $i18n (Options API) | ✅ تم الحفاظ عليه. تم تسجيله على app.config.globalProperties بواسطة app.use(i18n) |
v-t directive | ✅ تم الحفاظ عليه |
legacy: true | ✅ مقبول |
createI18n({ messages }) | ⚠️ يتم استخدام messages كـ fallback في وقت التشغيل مع تحذير في بيئة التطوير. قم بإزالة استيرادات JSON للحصول على مكاسب في حجم الحزمة |
setLocaleMessage(), mergeLocaleMessage() | ❌ تحذير وعدم القيام بأي شيء. يتم استبدال تحميل الرسائل في وقت التشغيل بقواميس build-time |
كتل <i18n> المخصصة في SFC | ❌ لا يتم قراءتها. انقل تلك الرسائل إلى JSON اللغة (أو .content.ts بجانب المكون) |
@nuxtjs/i18n | ⚠️ محول منفصل، انظر وثائق توافق Nuxt |
المعايير
ما تم قياسه
تبني مجموعة Benchmark Bloom نفس تطبيق Vite + Vue 3 مع كل إعداد: 10 صفحات (الرئيسية، حول، مدونة، الوظائف، اتصل، الأسئلة الشائعة، التسعير، المنتجات، الإعدادات، الفريق)، 10 لغات (en، fr، es، de، it، pt، zh، ja، ko، ru)، مكونات متطابقة وأمتعة متطابقة. تُقاس الصفحات في en و fr.
تم بناء كليهما في الإعداد الثابت، الذي تشحنه معظم مشاريع Vue: بالنسبة لـ vue-i18n، يتم استيراد JSON لكل لغة وتمريره إلى createI18n({ messages })؛ بالنسبة للمحول، نفس المكونات مع تغيير vite.config.ts و intlayer.config.ts وإزالة استيراد messages. يتم تضمين vue-intlayer الأصلي للمرجع.
لكل بناء، تسجل المجموعة:
- حجم المكتبة: حجم gzip (والمصغر) لمكون فارغ يستورد فقط مكتبة i18n.
- صفحة JS: JavaScript بصيغة gzip يتم تنزيله لكل صفحة، بمتوسط على جميع الصفحات والإعدادات المحلية.
- تسرب الإعدادات المحلية %: حصة السلاسل المترجمة في JavaScript المُنزَّل التي تنتمي إلى إعداد محلي لا يعرضه المستخدم.
- تسرب الصفحة %: حصة السلاسل المترجمة في JavaScript المُنزَّل التي تنتمي إلى صفحة لا يوجد عليها المستخدم.
- متوسط المكون: متوسط حجم gzip لكل مكون تم تجميعه بشكل منفصل.
- تفاعلية E2E: وقت الساعة الحائط بين تحديد إعداد محلي جديد وتحديث
html[lang]في DOM (Playwright، 5 تكرارات). - تحميل الصفحة:
PerformanceNavigationTiming.duration.
الأرقام أدناه تأتي من التشغيل بتاريخ 2026-09-12 معvue-i18n11.4.0 و@intlayer/vue-i18n9.5.1. تطبيق الاختبار صغير عن قصد (عدة عشرات من السلاسل النصية لكل locale)، لذا فإن نسب تسرب الـ locale تصف نمطًا: فهي تزداد مع محتواك بينما تبقى تكلفة التشغيل ثابتة.
النتائج على Vite + Vue 3
اختر المقاييس والمكتبات التي تهمك:
المقياس
تحميل JSON الديناميكي
تحميل الترجمات ببطء في وقت التشغيل
JSON المحدد (أسماء المحيط)
مساحات أسماء الترجمة لكل صفحة
ما هو هذا المقياس؟
الحجم الإجمالي المضغوط بتنسيق gzip لحزمة مكتبة التدويل. وهي تتضمن فقط المزود ومنطق استرداد المحتوى بعد تقليل الحجم (tree-shaking) والضغط (minification).
لماذا هو مهم؟
يقلل حجم المكتبة الأصغر من حمولة JavaScript الأولية، مما يؤدي إلى سرعة التنزيل وأوقات التنفيذ على العميل.
عرض كـ
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| الإعداد | الإستراتيجية | حجم المكتبة (gz) | حجم المكتبة (min) | متوسط صفحة JS (gz) | تسرب Locale | تسرب الصفحة | متوسط المكون (gz) | استجابة E2E | تحميل الصفحة |
|---|---|---|---|---|---|---|---|---|---|
| base (no i18n) | - | 0.0 KB | 0.0 KB | 41.3 KB | 0.0% | - | 1.1 KB | 1.8 ms | 10.8 ms |
vue-i18n | static | 24.3 KB | 83.2 KB | 134.9 KB | 50.0% | 90.0% | 196.0 KB | 2.8 ms | 13.6 ms |
@intlayer/vue-i18n | static | 7.9 KB | 23.2 KB | 47.0 KB | 15.0% | 0.0% | 8.4 KB | 1.5 ms | 9.3 ms |
vue-intlayer (native) | static | 3.9 KB | 11.1 KB | 57.1 KB | 56.8% | 0.0% | 7.7 KB | 4.5 ms | 13.8 ms |
vue-intlayer (native) | dynamic | 3.9 KB | 11.1 KB | 59.8 KB | 50.0% | 0.0% | 6.5 KB | 4.0 ms | 15.8 ms |
عمود تسرب الصفحة في تطبيق الأساس مترك فارغاً: بدون مكتبة i18n، يلتقط بصمة الأصابع السلاسل المشفرة في الأجزاء المشتركة والرقم ليس ذا معنى.
كيفية قراءته
- 88 KB أقل لكل صفحة، نفس المكونات. يأخذ
vue-i18nتطبيق 41.3 KB إلى 134.9 KB. يصل بناء المحول للمكونات نفسها إلى 47.0 KB، 5.7 KB فوق تطبيق الأساس. معظم الفرق هو 74.9 KB منsrc/localesالتي يسحبهاcreateI18n({ messages })إلى كل صفحة والمحول لا يجمعها أبداً كتكتل. - Runtime ينكمش 3 مرات. مكون فارغ يستورد فقط
vue-i18nيكلف 24.3 KB gzip / 83.2 KB minified:@intlify/core-base، مترجم الرسائل والـ runtime. المحول يكلف 7.9 KB / 23.2 KB، معظمها نواة Intlayer بالإضافة إلى سطح APIvue-i18n. - المكونات: أصغر 23 مرة. مكون
useI18n()مترجم بشكل معزول يبلغ متوسطه 196 KB، لأنtمرتبط بالمثيل الذي يحتفظ بكل رسالة من كل locale. مع المحول، نفس المكون يبلغ متوسطه 8.4 KB: فهو يصل إلى قاموسه الخاص. - تسرب البيانات. يشحن
vue-i18nكل locale وسلاسل كل صفحة على كل صفحة: تسرب locale بنسبة 50% (على locale المرقمة الاثنين؛ مع عشرة locales مجمعة فإن الهدر الفعلي أعلى)، تسرب صفحة بنسبة 90%. يقلل المحول تسرب الصفحة إلى 0% لأن كل مكون يستورد فقط قاموسه الخاص. يجلس تسرب Locale عند 15% في هذا التشغيلstatic؛importMode: 'dynamic'هو الإعداد الذي يزيله، وكان هذا التكوين ليس جزءاً من تشغيل Vue هذا. - التفاعلية وتحميل الصفحة. تبديل Locale رخيص لكليهما (1.5-2.8 ms)؛ نظام التفاعلية في Vue يجعل الأمر كذلك بمجرد أن تكون الرسائل في الذاكرة. يذهب تحميل الصفحة من 13.6 ms إلى 9.3 ms، متماشياً مع 88 KB أقل من JavaScript للتحليل.
- حول الصفوف الأصلية.
vue-intlayerفي هذا التشغيل جمعت كل اللغة في وضعstaticوحققت 57.1 كيلوبايت مع وقت تشغيل 3.9 كيلوبايت؛ قاموس المحول المتزامن حمل سلاسل لغات أجنبية أقل، وبالتالي الرقم الأقل لكل صفحة. وقت التشغيل الأصلي يبقى الأخف من بين الثلاثة، وموديل.content.tsالخاص به هو حيث تجد كتل SFC<i18n>معادلتها.
الجدول الكامل، كل مكتبة وكل استراتيجية، في تقرير قياس أداء Vue.
لماذا تتحرك الأرقام

لم يتغير شيء في src/components/، لذا الفوائد تأتي من ما ترتبط به useI18n.
مع vue-i18n, الربط هو المثيل العام. createI18n({ messages: { en, fr, ... } }) هو استيراد واحد يحتوي على كل شيء؛ كل مكون يستدعي useI18n() يمكنه الوصول إلى كل شيء، لذلك لا يمكن للـ bundler أن ينقسم دون المثيل. التحسين يعني أنت تقسم en.json حسب المسار، تستدعي setLocaleMessage() في حارس التوجيه، وتحافظ على خريطة المسار إلى الملف صحيحة عند تحرك المكونات. يتزايد الهدر على محورين في آن واحد، الصفحات واللغات:

نسخ الكود إلى الحافظة
مع @intlayer/vue-i18n، الربط هو القاموس. syncJSON يحول كل مفتاح من المستوى الأعلى في en.json إلى قاموس؛ تمرير التحسين يسلم المكون الذي يسمي مفاتيحه، حيث يتتبع bundler الواردات ويقسمها حسب الصفحة.
نسخ الكود إلى الحافظة
سطر messages المستورد في i18n.ts هو السطر الوحيد الذي يجب حذفه. هذا هو 88 كيلوبايت.
الهجرة في ثلاث خطوات
التثبيت
bashنسخ الكودنسخ الكود إلى الحافظة
يكتشف الأمر
vue-i18n، ويثبتintlayer، وvue-intlayer، و@intlayer/vue-i18nو@intlayer/sync-json-plugin، ويملأintlayer.config.tsمسبقاً. احتفظ بـvue-i18nمثبتاً: فهو peer dependency ويوفر الأنواع.وجّه Intlayer إلى ملفات اللغة الخاصة بك
intlayer.config.tsنسخ الكودنسخ الكود إلى الحافظة
يبقى
locales/{locale}.jsonفي مكانه. كل مفتاح على المستوى الأعلى (footer,hero...) يصبح قاموس.أضف الـ plugin وحذف استيراد الرسائل
vite.config.tsنسخ الكودنسخ الكود إلى الحافظة
src/i18n.tsنسخ الكودنسخ الكود إلى الحافظة
vueI18nVitePlugin()يغلفvite-intlayer(مراقبة المحتوى، تجميع القاموس، عملية التحسين) ويقوم بإنشاء alias لـvue-i18nإلى الـ adapter. إزالة استيرادmessagesهو ما يقلل 88 KB؛ تركه في الكود يبقي التطبيق يعمل لكنه يشحن الاثنين معاً.
ما يمكنك حذفه لاحقًا
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| الملف / النمط | السبب |
|---|---|
import en from "./locales/en.json" والملفات المشابهة | يُستخدم فقط كآلية احتياطية من قِبل adapter. هنا كان موقع 88 كيلوبايت |
setLocaleMessage() في route guards | عملية بلا تأثير. تحميل لكل مسار هو وظيفة المترجم الآن |
@intlify/unplugin-vue-i18n | غير مطلوب: فهو يقوم بتجميع الرسائل وكتل SFC التي لا يقرأها adapter |
كتل <i18n> في المكونات أحادية الملف (SFC) | لا تُقرأ؛ انقلها إلى ملفات JSON المحلية أو إلى .content.ts لكل مكون |
ما الذي تكسبه بعيداً عن البايتات
- مفاتيح مكتوبة.
t("footer.github")مكتوب مقابل قاموسfooterالمترجم؛ المسار الخاطئ هو خطأ في TypeScript بدلاً من عرض المفتاح كنص. npx intlayer testيفشل في CI عند وجود مفتاح مفقود في أي محلية.npx intlayer fillيترجم الناقصة باستخدام مفتاح مزود خاص بك (OpenAI أو Anthropic أو Mistral أو Gemini...) ويكتبها مرة أخرى فيlocales/{locale}.json.- محرر مرئي و CMS يعملان على نفس JSON، لذا يقوم المطورون بعدم التحرير من خلال واجهة المستخدم وتحديث الملفات.
- الانتقال التدريجي إلى
.content.ts. يمكن لأي مكون الانتقال منuseI18n()إلىuseIntlayer("footer")مع ملف محتوى مرافق. قواميس JSON و.content.tsموجودة وتندمج معاً.
الحدود التي يجب معرفتها قبل البدء
إذا كانت رسائلك موجودة داخل المكونات، فيجب نقلها إلى ملفات اللغات، أو إلى ملف .content.ts، وهو نفس المفهوم مع أنواع محددة مسبقًا.
setLocaleMessage() و mergeLocaleMessage() يقومان بإصدار تحذير والعودة. تتطلب الترجمات التي يتم جلبها من نظام إدارة المحتوى (CMS) في وقت التشغيل استخدام Intlayer CMS، أو أوامر intlayer pull / push.
الحفاظ على استيراد JSON في createI18n() يبقي الـ 75 كيلوبايت في الحزمة. احذفها بمجرد اجتياز intlayer test بنجاح.
7.9 كيلوبايت مقابل 3.9 كيلوبايت لـ vue-intlayer. بمجرد انتقال كل مكون إلى useIntlayer، قم بإزالته.
متى تستخدم أي منها؟
يعتمد تطبيقك على كتل SFC <i18n>، أو تدفقات setLocaleMessage() في وقت التشغيل، أو أن حجم 90 كيلوبايت لكل صفحة لا يمثل مصدر قلق لجمهورك.
أنت تستخدم vue-i18n وتريد توفير 88 كيلوبايت، ومكونات أصغر بـ 23 مرة، وتسرب صفحات بنسبة 0%، ومفاتيح مطبوعة وفحوصات CI دون تعديل أي ملف .vue. هذه هي نقطة الدخول لقاعدة كود vue-i18n الحالية.
للمشاريع الجديدة، أو بمجرد أن يؤدي المحول وظيفته. يتميز بأخف وقت تشغيل (3.9 كيلوبايت) ونموذج .content.ts لكل مكون يحل محل كتل <i18n> بمحتوى ذي أنواع محددة. ابدأ مع Intlayer مع Vue أو مع Nuxt.
الأسئلة الشائعة
لا. أدى بناء الاختبار القياسي إلى تعديل vite.config.ts و intlayer.config.ts وسطر واحد فقط في src/i18n.ts وهو استيراد messages. ظل كل موضع استدعاء لـ useI18n() و $t و v-t و Options API كما كان تمامًا.
لأن useI18n() يتوقف عن الوصول إلى النسخة العامة. يحتفظ createI18n({ messages }) بجميع الرسائل لكل لغة، لذلك يسحب المكون المترجم بمفرده 196 كيلوبايت. مع المحول فإنه يصل فقط إلى قاموسه الخاص: 8.4 كيلوبايت.
تم الحفاظ عليه. يتم احترام إعدادات datetimeFormats و numberFormats التي تم تمريرها إلى createI18n()، وهي مدعومة بواسطة واجهة Intl الأصلية. راجع تنسيق التاريخ والوقت والأرقام.
@intlayer/vue-i18n يستهدف Vite + Vue. بالنسبة لـ @nuxtjs/i18n، استخدم محول التوافق Nuxt i18n، وراجع Intlayer مع Nuxt للإعداد الأصلي.
نعم. يمكن لأي مكون التبديل من useI18n() إلى useIntlayer("footer") باستخدام ملف محتوى مجاور له. يتعايش قاموسا JSON و .content.ts ويتم دمجهما بسلاسة.
المقارنات ذات الصلة

نفس سلسلة المحولات:
مقارنة المكتبات جنبًا إلى جنب:
وثائق مرجعية:
لفهم أصل هذه المكتبات، اقرأ تاريخ i18n في JavaScript.
الخلاصة
يغير @intlayer/vue-i18n ما يرتبط به useI18n(): من مثيل عام يحمل كل رسالة من كل locale إلى قاموس مُجمّع لتلك المكون. في نفس تطبيق Vite + Vue 3 الذي هو 88 KB أقل لكل صفحة، وقت تشغيل أصغر 3 مرات، مكونات أصغر 23 مرة وتسرب صفحة 0%، لملف إعدادات وسطر plugin وواحد استيراد محذوف. كتل SFC <i18n> وتحميل الرسائل في وقت التشغيل هما الشيئان اللذان لا يحملهما، وبقي runtime vue-intlayer الأصلي نصف حجمه.
جميع البيانات الأولية وتطبيقات الاختبار والسكريبتات موجودة في مستودع Benchmark Bloom. قم بتشغيلها بنفسك.
راجع وثيقة 'Why Intlayer?' للحصول على مزيد من التفاصيل.
التعليقات
لا توجد تعليقات بعد. كن أول من يشارك أفكاره.
