استخدم مساعدك المفضل للملخص واستخدم هذه الصفحة والموفر AI الذي تريده
تمت ترجمة محتوى هذه الصفحة باستخدام الذكاء الاصطناعي.
اعرض آخر نسخة المحتوى الأصلي باللغة الإنكليزيةإذا كان لديك فكرة لتحسين هذه الوثيقة، فلا تتردد في المساهمة من خلال تقديم طلب سحب على GitHub.
رابط GitHub للتوثيقنسخ الـ Markdown من المستند إلى الحافظة
كيفية اختيار مكتبة Svelte i18n المناسبة
لا توفر Svelte أي أدوات مدمجة للتدويل (i18n). لا يوجد $t، ولا عنصر أولي للغة (locale primitive)، ولا تنسيق للرسائل. كل خيار هو خيار من طرف ثالث (third-party)، والنظام البيئي لـ Svelte هو المكان الذي ذهب فيه التدويل في وقت التحويل البرمجي (compile-time i18n) إلى أبعد مدى، لذا تختلف الخيارات عن بعضها البعض بشكل أكبر مما هي عليه في React أو Vue.
يسرد هذا الدليل الأسئلة التي يجب الإجابة عليها أولاً، ثم يطابق الإجابات مع svelte-i18n و Paraglide و typesafe-i18n و wuchale و Intlayer، لكل من Vite + Svelte و SvelteKit.

جدول المحتويات
ستة أسئلة للإجابة عليها قبل مقارنة المكتبات
- تطبيق Vite SPA أم SvelteKit؟ في تطبيق SPA، يُعد استخدام store على مستوى الوحدة (module-level store) أمراً صحيحاً: تبويب واحد، مستخدم واحد، لغة واحدة. أما في SvelteKit، تتم مشاركة نفس الـ singleton عبر الطلبات المتزامنة (concurrent requests) على الخادم، مما يؤدي إلى تصيير الطلب B بلغة الطلب A. إما أن توفر لك المكتبة هيكلاً لكل طلب (context أو
locals) أو تترك مسؤولية بنائه عليك. - من يكتب الترجمات؟ المطورون، أم نظام إدارة الترجمة (TMS)، أم وكالة تسلم نصوص ICU، أم خط أنابيب ذكاء اصطناعي (AI pipeline). تدعم
svelte-i18nتنسيق ICU، بينما تستخدم Paraglide وtypesafe-i18nصيغتها الخاصة. طابق بين الأداة ومصدر الترجمات. - كم عدد اللغات والصفحات؟ لغتان وخمس صفحات يمكنها تضمين كل شيء في الحزمة. أما عشر لغات وأربعون مساراً فلا يمكنها ذلك، ويصبح الفرق بين كتالوجات وقت التشغيل (runtime catalogs) والرسائل المترجمة وقت البناء (compiled messages) هو التكلفة الأساسية.
- هل تحتاج إلى أمان الأنواع على المفاتيح (types on keys)؟ كتابة
$_("cart.totl")تؤدي إلى فشل أثناء وقت التشغيل (runtime failure) فيsvelte-i18n. بينما تجعل مكتبات وقت التحويل البرمجي (compile-time) ذلك خطأ في الأنواع (type error) بشكل تلقائي. - مخازن Svelte 4 stores أم Svelte 5 runes؟ تغير الـ runes طريقة كتابة حالة اللغة (locale state)، ولكنها لا تحل مشكلة المشاركة (sharing problem). كما أن
$stateفي ملف.tsيُترجم إلى متغير عادي، لذا يجب أن يكون وقت تشغيل المكتبة (library runtime) متوافقاً مع الـ runes إذا كنت تستخدم Svelte 5. - هل يمكنك قبول وجود ملفات مُنشأة تلقائياً (generated files) في المستودع؟ تنشئ كل من Paraglide و
typesafe-i18nملفات JavaScript أو TypeScript داخل شجرة الشيفرة المصدرية (source tree). بعض الفرق تقبل ذلك، بينما تواجه فرق أخرى تعارضات دمج (merge conflicts) في كل فرع موازٍ.
اكتب الإجابات، فكل ما يلي يستند إليها.
المشهد العام في صورة واحدة
وصل تدويل Svelte لاحقاً مقارنة بـ React أو Vue، وتخطى المراحل الأولى مباشرة إلى موجات وقت التحويل البرمجي (compile-time).

كتالوجات JSON، مع تحليل ICU في المتصفح عبر intl-messageformat، واللغة في stores على مستوى الوحدة ($locale و $_). الأكثر انتشاراً، وموثقة جيداً، وربط التقديم من جانب الخادم (SSR wiring) مسؤوليتك بالكامل.
عملية توليد تراقب كتالوجاتك وتنشئ دوال وصول بأنواع محددة ($LL.cart.total()). نموذج متين، مع ملفات مُنشأة في المستودع، ولم يشهد المستودع نشاطاً كبيراً مؤخراً.
تقوم Paraglide بترجمة كل رسالة كدالة مُصدّرة (exported function) حتى يتمكن أداة الحزم (bundler) من استبعاد الأكواد غير المستخدمة (tree-shaking) للمسارات التي لا تستدعيها. تستخرج wuchale النصوص من كود الواجهة (markup) أثناء البناء. بينما تعلن Intlayer عن المحتوى لكل مكون (per-component) وتنشئ الأنواع والقواميس الخاصة بكل مكون.
يغطي مقال تاريخ JavaScript i18n كل موجة بالتفصيل.
القرار الأكثر أهمية: أين يعيش المحتوى ومتى يتم تحميله
يحدد خياران هيكليان معظم الفرق في حجم الحزمة بين الإعدادات المختلفة:
- المحتوى المركزي أو المخصص لكل مكون (Centralized vs Scoped). ملف
locales/en.jsonواحد للتطبيق بالكامل، أو إعلان محتوى مستقل لكل مكون. - الاستيراد الثابت أو الديناميكي (Static vs Dynamic import). تحميل كل شيء عند بدء التشغيل، أو جلب اللغة النشطة (ومسار الصفحة النشط) عند الطلب.
يوضح الرسم البياني التقديري حجم البيانات المنقولة (payload) لتطبيق نظري يحتوي على 1 إلى 10 صفحات، مترجم إلى 1 إلى 10 لغات، مع حوالي 30 كيلوبايت من النصوص لكل صفحة.

تقع svelte-i18n في أعلى اليسار افتراضياً: يمنحك استخدام register("fr", () => import("./fr.json")) تحميلاً ديناميكياً لكل لغة، ولكن كتالوج اللغة هو كائن واحد يؤدي تحميله إلى تحميل نصوص كل الصفحات. تُعد Paraglide حالة مثيرة للاهتمام: نظراً لأن كل رسالة هي تصدير مستقل، فإن الـ tree-shaking يمنحك ميزة التقسيم حسب الصفحة مجاناً، ويؤكد اختبار أداء Svelte (benchmark) أنها تعمل كما هو معلن مع Vite + Svelte (بينما لم تكن كذلك في اختبارات أداء React و Next.js). وتصل Intlayer إلى نفس النتيجة عبر إعلانات المحتوى لكل مكون.
إذا كانت إجابتك على السؤال الثالث هي "صفحات كثيرة"، فامنح هذا القسم وزناً أكبر من أي تفضيل لـ API. يغطي مقال التدويل لكل مكون مقابل التدويل المركزي جانب الصيانة لنفس المقايضة.
المكتبات المرشحة
أحجام المكتبات مأخوذة من اختبار أداء Svelte (benchmark): حجم الـ store بالإضافة إلى دالة الوصول (accessor) في مكون فارغ، بعد التجميع (bundling) والـ tree-shaking والضغط (minification)، على تطبيق مكون من 10 صفحات و 10 لغات. يتم قياس المحتوى بشكل منفصل.
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| المكتبة | مكان تواجد الرسائل | حالة اللغة (Locale state) | الأنواع على المفاتيح | تنسيق الرسائل | التقسيم لكل مسار (Per-route splitting) | حجم المكتبة |
|---|---|---|---|---|---|---|
svelte-i18n | كتالوجات JSON لكل لغة | Svelte store على مستوى الوحدة | اتحاد يدوي (Manual union) | ICU | لا | ~16.6 kB |
typesafe-i18n | وحدات TS مُنشأة تلقائياً | محول Store | مُنشأة تلقائياً | خاص بها | جزئي | صغير |
| Paraglide | مشروع inlang، مترجم إلى دوال | قراءة لكل استدعاء من cookie أو URL أو storage | مُنشأة تلقائياً | خاص بها | نعم، عبر tree-shaking | شبه منعدم |
wuchale | مستخرجة من الـ markup أثناء البناء | Store | غير متوفر (بدون مفاتيح) | خاص بها | نعم | صغير |
| Intlayer | ملف .content.ts بجانب المكون | Context بالإضافة إلى store، متوافق مع runes | مُنشأة تلقائياً افتراضياً | دوال مساعدة (Helpers) | نعم، لكل مكون | خط الأساس (Baseline) |
الأرقام تمثل لقطة لإصدارات الاختبار. قم بتشغيل الاختبار على تطبيقك الخاص قبل اتخاذ القرار بناءً على الحجم فقط.
حجم مكتبة Paraglide الشبه منعدم هو نتيجة لتصميمها: يتم إنشاء وقت التشغيل (runtime) مباشرة داخل مستودعك. وتحتاج Intlayer إلى vite-intlayer، لذا لا يمكن تشغيلها بدون خطوة بناء (build step).
مطابقة إجاباتك مع المكتبة المناسبة
svelte-i18n. إنه الخيار الأكثر توثيقاً، وقراءة $_ داخل الـ markup تبدو طبيعية، وتغطي دالتا register مع waitLocale() التحميل الكسول (lazy loading) لكل لغة. احرص على حجب العرض الأول (first paint) حتى تنتهي isLoading وإلا ستظهر المفاتيح الخام للمستخدم. إذا كان من المحتمل أن يمتد التطبيق إلى خادم لاحقاً، فضع اللغة في Svelte context منذ اليوم الأول بدلاً من الاعتماد على module store، فلن يكلفك ذلك شيئاً الآن وسيوفر عليك معالجة خطأ يظهر في بيئة الإنتاج فقط لاحقاً.
تحسم مشكلة مشاركة الحالة هذا الاختيار. تعمل svelte-i18n على SvelteKit ولكن الربط لكل طلب (hooks.server.ts و locals و load ثم setContext) يقع على عاتقك لكتابته ومن السهل ارتكاب أخطاء غير ظاهرة فيه. توفر Paraglide تكاملاً مع SvelteKit يتعامل مع التوجيه ويقرأ اللغة عند كل استدعاء، مما يتجنب مشكلة الـ singleton. وتقوم Intlayer بضبط اللغة من بيانات load داخل الـ context. يشرح مقال تدويل SvelteKit الاختيار بين [[lang]] و reroute، وهو قرار يجب اتخاذه قبل اختيار المكتبة.
تدعم svelte-i18n تنسيق ICU بشكل أصلي عبر intl-messageformat، لذا تتكامل مباشرة مع معظم المنصات. تستخدم Paraglide و typesafe-i18n صيغتهما الخاصة وتتطلبان تحويلاً. ويعد دعم Intlayer لتنسيق ICU جزئياً، لذا إذا كنت تتلقى نصوص ICU حالياً، فاعتبر ذلك عائقاً أساسياً.
مكتبات وقت التحويل البرمجي (Compile-time). يعمل الـ tree-shaking في Paraglide بكفاءة مع Vite + Svelte وتكلفة المكتبة شبه منعدمة. تمنحك قواميس Intlayer المخصصة لكل مكون نفس النتيجة بدون ملفات مُنشأة في المستودع. بينما تشحن svelte-i18n محلل ICU مع كامل الكتالوج وتصل إلى حوالي 4.5 أضعاف svelte-intlayer في اختبار الأداء قبل احتساب أي محتوى.
أي خيار باستثناء إعداد svelte-i18n البسيط، حيث النوع الوحيد هو اتحاد مكتوب يدوياً يبتعد عن ملف JSON بسرعة. تنشئ كل من typesafe-i18n و Paraglide و Intlayer الأنواع تلقائياً من المحتوى. تحقق من نشاط مستودع typesafe-i18n قبل اعتماده في قاعدة الشيفرة الخاصة بك. يقارن مقال اكتشاف الترجمات المفقودة ما تلتقطه كل مكتبة أثناء وقت البناء.
يستبعد هذا كلاً من Paraglide و typesafe-i18n. تحتفظ كل من svelte-i18n و Intlayer بمخرجاتهما في node_modules أو مجلد بناء، ومع Intlayer تكون ملفات .content.ts شيفرة مصدرية مكتوبة يدوياً، بينما تعيش القواميس والأنواع المترجمة في .intlayer/ ويتم تجاهلها بواسطة git.
في هذه الحالة لم يعد هناك مستخدم لملفات JSON المركزية لتبرير وجودها. يُعد المحتوى المشترك في الموضع (colocated content) مع واجهة سطر الأوامر (CLI) التي تملأ اللغات المفقودة هو المسار الأقصر. يعمل أمر fill في Intlayer باستخدام مفتاح API الخاص بك (OpenAI و Anthropic و Mistral و Gemini) ويعيد ترجمة ما تم تغييره فقط. بينما يوفر النظام البيئي inlang لـ Paraglide حلولاً مستضافة مماثلة مع خطط تسعير خاصة بها.
نقاط القصور في كل مكتبة
svelte-i18n: الأثقل في المجموعة، لا توفر أنواعاً للمفاتيح، ولا تقسيماً لكل مسار، وتستخدم store على مستوى الوحدة يسرب الحالة عبر الطلبات في SvelteKit ما لم تقم بربط الـ context بنفسك.typesafe-i18n: تتطلب عملية مراقبة (watcher process)، وتنشئ ملفات داخل المستودع، والمستودع لم يشهد نشاطاً كبيراً مؤخراً.- Paraglide: ملفات مُنشأة يتم تضمينها في المستودع وإعادة إنشائها قبل كل push، وتعارضات دمج في الفروع المتوازية، وتتم قراءة اللغة من ملفات تعريف الارتباط أو التخزين في كل استدعاء رسالة بدلاً من قراءتها من store، مما يتطلب جهداً إضافياً عند تغيير اللغة.
wuchale: فكرة استخراج نصوص مثيرة للاهتمام، لكنها لا تزال في مراحلها الأولى. واجه اختبار أداء React مشاكل في التفاعلية تطلبت إعادة تصيير المزود قسراً، كما أن التوثيق محدود.- Intlayer: تتطلب إضافة بناء إلزامية (build plugin)، ولها نظام بيئي أصغر، ودعم جزئي لـ ICU، والمحتوى موزع عبر قاعدة الشيفرة بالتصميم، لذا يتطلب تصدير ملف JSON واحد للمترجم أدوات مخصصة.
كيف تبدو كل مكتبة في الشيفرة البرمجية
المكون نفسه، ملخص عربة التسوق مع عنوان وصيغة جمع، مكتوب بكل مكتبة مرشحة. الجزء المثير للاهتمام ليس كود الواجهة، بل أين يعيش المحتوى، وكيف يتم تخزين اللغة، وما يعرفه فاحص الأنواع (type checker).
نسخ الكود إلى الحافظة
نسخ الكود إلى الحافظة
تنسيق ICU عبر intl-messageformat، واللغة في store على مستوى الوحدة. تقبل دالة $_ أي نص، ونظام الأنواع الوحيد هو اتحاد تكتبه يدوياً.
نسخ الكود إلى الحافظة
نسخ الكود إلى الحافظة
كل رسالة عبارة عن دالة مُنشأة ومحددة الأنواع، يتم استبعادها عبر tree-shaking إذا لم يتم استدعاؤها مطلقاً. يتم إنشاء مجلد paraglide/ داخل المستودع، وتتم قراءة اللغة لكل استدعاء بدلاً من قراءتها من store.
نسخ الكود إلى الحافظة
نسخ الكود إلى الحافظة
دوال وصول محددة الأنواع يتم إنشاؤها عبر عملية مراقبة (watcher process). النموذج متين، وتعيش الملفات المُنشأة داخل المستودع، وقد كان المشروع هادئاً مؤخراً.
نسخ الكود إلى الحافظة
نسخ الكود إلى الحافظة
جميع اللغات في ملف واحد بجانب المكون. تُرجع useIntlayer مخزناً قابلاً للقراءة (readable store)، لذا فإن $content هو الاشتراك التلقائي (auto-subscription) الذي تعرفه بالفعل، ويتم الاحتفاظ باللغة داخل الـ context (مما يجعله آمناً مع SSR) بدلاً من استخدام singleton على مستوى الوحدة.
هل تستخدم svelte-i18n بالفعل؟ يقوم محول التوافق @intlayer/svelte-i18n بإنشاء اسم مستعار (alias) للحزمة على مستوى أداة الحزم (bundler) حتى تستمر $_ و $date و $number ومفاتيحك المسطحة في العمل بينما تتولى Intlayer توفير المحتوى.
قبل أن تلتزم باختيارك
يخبرك جدول الميزات بما تفعله المكتبة اليوم. وتخبرك هذه النقاط بما ستكون عليه تجربة العمل معها على المدى الطويل.
تحقق من نشاط المستودع.
الالتزامات البرمجية (commits)، وسرعة الاستجابة للمشكلات (issues)، وما إذا كان آخر إصدار فرعي قد صدر هذا العام. التصميم المتين بدون مشرف صيانة هو مجرد هجرة مستقبلية مؤجلة.
لا تختر بناءً على عدد مرات التنزيل من npm.
المكتبة الأكثر تنزيلاً هي التي صدرت أولاً، وليست بالضرورة الأنسب لقاعدة شيفرة Svelte في عام 2026. تقيس التنزيلات التاريخ وليس الملاءمة.

اسأل من يمول المشرف، وماذا يبيعون.
تحظى svelte-i18n بدعم من Crowdin، تماماً مثل next-intl و vue-i18n. وتدعم Locize مكتبة i18next. وتدير كل من Tolgee و Paraglide (inlang) و Intlayer منصتها الخاصة. المزود الذي يعتمد دخله على الترجمة المستضافة ليس لديه حافز كبير لجعل الترجمة مجانية داخل أدوات التطوير الخاصة بك. وتُعد Intlayer الوحيدة في المجموعة التي توفر ترجمة بالذكاء الاصطناعي عبر CLI باستخدام مفتاح API الخاص بك، ونظام إدارة محتوى (CMS) يمكنك استضافته ذاتياً.
هل المكتبة جاهزة للعمل مع وكلاء الذكاء الاصطناعي (AI agents)؟
لا يزال وكلاء الذكاء الاصطناعي يواجهون صعوبة مع التدويل: فهم ينسون اللغات، ويخترعون مفاتيح، ويخلطون بين تنسيقات الرسائل. هل توفر المكتبة مهارات الوكيل (Agent Skills) أو خادم MCP حتى يتمكن الوكيل من سرد المحتوى وملئه واختباره؟ وهل تم تحسين تحميل المحتوى افتراضياً، أم يتعين على شخص ما مراجعة مساحات الأسماء والاستيراد الكسول كل ثلاثة أشهر؟
أمان الأنواع مباشرة بعد التثبيت (Type safety out of the box).
ليس "يمكن دعمه بالأنواع عبر إعدادات إضافية" بل "المفتاح الخاطئ يفشل فحص tsc في التثبيت الجديد مباشرة". تحقق مما يحدث مع مفتاح غير موجود، ومع لغة تفتقد إلى ترجمة واحدة.
اكتشاف المحتوى غير المستخدم.
الكتالوجات تنمو دائماً ولا تتقلص تلقائياً. يقوم بناء Intlayer بإزالة الحقول غير المستخدمة وتسجيلها (build.purge). وتحقق Paraglide ذلك معمارياً، حيث يتم استبعاد دوال الرسائل غير المستدعاة عبر tree-shaking. أما باقي الخيارات فتترك مهمة التنظيف لك.
تجربة المطور (Developer experience).
الوقت المستغرق من التثبيت حتى ظهور أول نص مترجم، ووجود LSP أو إضافة VS Code تعرض الترجمة عند التمرير وتنتقل إلى الإعلان، و CLI للملء والاختبار والنشر، وطريقة تتيح لغير المطورين تعديل المحتوى (المحرر المرئي أو CMS) بدون الحاجة إلى pull request.
الأسئلة الشائعة
بالنسبة لتطبيق Vite SPA مع كتالوج صغير، نعم. إنه الخيار الأكثر توثيقاً، والتوافق مع ICU يهم العديد من الفرق. أما في SvelteKit أو عند تجاوز بضع عشرات من الصفحات، تبدأ تكاليفها (غياب الأنواع، غياب تحديد النطاق، مشاركة الـ store) في التراكم.
في Vite + Svelte، نعم، يؤكد اختبار الأداء ذلك. أما في React مع TanStack Start أو Next.js، فلم تظهر هذه النتيجة في نفس الاختبار. تحقق بنفسك في مكدس تقنياتك بدلاً من الاعتماد المطلق على أي من النتيجتين.
تغير طريقة كتابة حالة اللغة الخاصة بك، وليس مشكلة مشاركة الحالة. ما يهم هو ما إذا كان وقت تشغيل المكتبة متوافقاً مع الـ runes في Svelte 5 وما إذا كانت تستخدم الـ context بدلاً من store على مستوى الوحدة. تحقق من الأمرين معاً.
بشكل غير مباشر. تهتم محركات البحث بالتوجيه، ووسم hreflang، و <html lang>، وما إذا كان النص متوفراً في كود HTML المُصيّر على الخادم. راجع دليل hreflang.
للمزيد من التفاصيل
- اختبار أداء Svelte i18n: حجم الحزمة، والتسرب، وتوقيت تبديل اللغة
- تدويل Svelte: المخازن، والـ runes، وفخ مستوى الوحدة و تدويل SvelteKit: التوجيه، و SSR، والحالة المشتركة
- محول التوافق البديل لـ
svelte-i18n - تاريخ JavaScript i18n
- التدويل عبر المترجم مقابل التدويل التصريحي
- التدويل لكل مكون مقابل التدويل المركزي
- كيف يعمل تحسين الحزمة في وقت البناء
- إعداد i18n في تطبيق Vite + Svelte وفي تطبيق SvelteKit
- نفس الدليل لكل من React و Vue و Solid
التعليقات
لا توجد تعليقات بعد. كن أول من يشارك أفكاره.
