استخدم مساعدك المفضل للملخص واستخدم هذه الصفحة والموفر AI الذي تريده
تاريخ الإصدارات
- "النسخة الأولية"v9.5.1026/9/2026
تمت ترجمة محتوى هذه الصفحة باستخدام الذكاء الاصطناعي.
اعرض آخر نسخة المحتوى الأصلي باللغة الإنكليزيةإذا كان لديك فكرة لتحسين هذه الوثيقة، فلا تتردد في المساهمة من خلال تقديم طلب سحب على GitHub.
رابط GitHub للتوثيقنسخ الـ Markdown من المستند إلى الحافظة
كيفية تدويل تطبيق TanStack Start الخاص بك باستخدام use-intl في عام 2026
جدول المحتويات
ما هو use-intl؟
use-intl هو النواة المستقلة عن أطر العمل لمكتبة next-intl. توفر واجهات البرمجة نفسها مثل useTranslations و useFormatter و IntlProvider، ودعم ICU MessageFormat، وتكاملاً قوياً مع TypeScript، دون أي اعتماد على Next.js. يجعل ذلك منها أحد أكثر الخيارات شيوعاً لترجمة تطبيقات TanStack Start، وهي المكتبة التي تقترحها أدوات المساعدة بالذكاء الاصطناعي غالباً لهذه الحزمة التقنية.
لا يتضمن TanStack Start طبقة تدويل افتراضية مدمجة. التوجيه واكتشاف لغة المستخدم والبيانات الوصفية لتحسين محركات البحث (SEO) وإنشاء خريطة الموقع (sitemap) كلها أمور تترك لمسؤوليتك. يغطي هذا الدليل كل ذلك بالتفصيل من البداية إلى النهاية:
- التوجيه المراعي للغة باستخدام مقطع مسار اختياري
{-$locale}(مثل/aboutو/fr/about). - تحميل الرسائل لكل مسار على حدة بحيث تقوم الصفحة بتنزيل نطاقات الأسماء (namespaces) واللغة التي تعرضها فقط.
- العرض على الخادم (SSR) والترطيب (Hydration) دون أي تباين في النصوص.
- تحسين شامل لمحركات البحث متعدد اللغات: وسوم
<title>ووصف مترجمة، والرابط الأساسي (canonical URL)، وبدائلhreflangمعx-default، ولغات Open Graph، وبيانات JSON-LD المنظمة، وخريطة موقع مع بدائلxhtml:link، وملفrobots.txt، والعرض المسبق لكل لغة.
هل تبحث عن حزمة تقنية أخرى؟ راجع دليل TanStack Start + Paraglide، أو دليل TanStack Start + Lingui، أو دليل TanStack Start + Intlayer.
هل تستخدم Next.js بدلاً من ذلك؟ راجع دليل next-intl.
ماذا تقول المقارنة المعيارية (Benchmark) عن use-intl على TanStack Start
يقوم الاختبار المعياري للتدويل (i18n benchmark) بتشغيل التطبيق نفسه المكون من 10 صفحات و 10 لغات على TanStack Start باستخدام جميع المكتبات الرئيسية، ويقيس ما يقوم المتصفح بتنزيله بالفعل.
تحميل JSON الديناميكي
تحميل الترجمات ببطء في وقت التشغيل
JSON المحدد (أسماء المحيط)
مساحات أسماء الترجمة لكل صفحة
مقياس أداء I18n
ما هو هذا المقياس؟
الحجم الإجمالي المضغوط بتنسيق gzip لحزمة مكتبة التدويل. وهي تتضمن فقط المزود ومنطق استرداد المحتوى بعد تقليل الحجم (tree-shaking) والضغط (minification).
لماذا هو مهم؟
يقلل حجم المكتبة الأصغر من حمولة JavaScript الأولية، مما يؤدي إلى سرعة التنزيل وأوقات التنفيذ على العميل.
عرض كـ
الأرقام الرئيسية للإصدار use-intl@4.14.2، تم قياسها في 2026-09-26 (مضغوطة بصيغة gzip):
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| الإعداد | حجم المكتبة | كود JS لكل صفحة | تسريب اللغات الأخرى | تسريب الصفحات الأخرى |
|---|---|---|---|---|
| بدون تدويل (التطبيق الأساسي) | - | 111.0 KB | 0% | 0% |
use-intl (إعداد هذا الدليل) | 75.9 KB | 128.7 KB | 0% | 0% |
@intlayer/use-intl (طبقة التوافق) | 6.7 KB | 129.4 KB | 0% | 0% |
react-intlayer (Intlayer الأصلي) | 4.5 KB | 126.8 KB | 0% | 0% |
النقاط الأساسية المستفادة:
- تقسيم الرسائل حسب الصفحة وتحميلها لكل لغة. هذا يزيل كلا نوعي التسريب، وهو ما تطبقه الخطوات الموضحة أدناه.
- بيئة التشغيل (runtime) نفسها تظل ثقيلة (~76 KB بصيغة gzip)، لأن محلل ICU يتم شحنه إلى العميل. توفر طبقة التوافق
@intlayer/use-intl(الخطوة 17) واجهة البرمجة نفسها تماماً مع بيئة تشغيل بحجم ~7 KB فقط.
للاطلاع على البيانات الكاملة: راجع تقرير الاختبار المعياري لـ TanStack Start، ومستودع الاختبار المعياري.
مقارنة الميزات على TanStack Start
مقارنة بين use-intl والمكتبات الأخرى الشائعة الاستخدام في TanStack Start:
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| الميزة | react-intlayer (Intlayer) | use-intl | Paraglide JS | Lingui |
|---|---|---|---|---|
| الترجمات بالقرب من المكونات | ✅ في نفس الموضع (Co-located) | ❌ ملفات JSON مركزية | ❌ ملف JSON واحد لكل لغة | ⚠️ النص المصدر داخل المكونات |
| التكامل مع TypeScript | ✅ أنواع يتم إنشاؤها تلقائياً | ✅ عبر AppConfig | ✅ دوال رسائل محددة الأنواع | ⚠️ وحدات ماكرو فقط |
| اكتشاف الترجمات المفقودة | ✅ أخطاء أثناء الكتابة والتحزيم | ⚠️ قيمة احتياطية في بيئة التشغيل | ⚠️ الرجوع إلى اللغة الأساسية | ⚠️ الرجوع إلى النص المصدر |
| المحتوى الغني (JSX، Markdown) | ✅ دعم مباشر | ⚠️ وسوم عبر t.rich | ⚠️ سلاسل نصية | ✅ JSX داخل <Trans> |
| التوجيه المترجم (Localized routing) | ✅ مدمج | ❌ يدوي عبر {-$locale} | ✅ urlPatterns + إعادة كتابة الموجه | ❌ يدوي عبر {-$locale} |
| تغيير اللغة بدون إعادة تحميل الصفحة | ✅ نعم | ✅ نعم | ❌ إعادة تحميل الصفحة بالكامل | ✅ نعم |
| صيغ الجمع (Pluralization) | ✅ معتمد على التعداد (Enumeration) | ✅ ICU | ✅ متغيرات (Variants) | ✅ ICU |
| ICU MessageFormat | ✅ عبر format: "icu" | ✅ أصلي | ⚠️ عبر إضافة inlang | ✅ أصلي |
| صيغ المحتوى | ✅ .ts, .json, .md, .yaml... | ⚠️ .json | ⚠️ inlang JSON | ✅ PO, JSON, CSV |
| الترجمة بالذكاء الاصطناعي | ✅ باستخدام المزود والمفتاح الخاصين بك | ❌ لا | ❌ لا | ❌ لا |
| المحرر المرئي / نظام إدارة المحتوى (CMS) | ✅ محرر محلي + CMS اختياري | ❌ منصات خارجية | ⚠️ تطبيقات بيئة inlang | ❌ منصات خارجية |
| مساعدات تحسين محركات البحث (hreflang، خريطة الموقع) | ✅ مدمجة | ❌ يدوية | ⚠️ عناوين URL مترجمة، والباقي يدوي | ❌ يدوية |
| حجم بيئة التشغيل (gzip، الاختبار المعياري) | 4.5 KB | 75.9 KB | 1.8 KB | 56.7 KB |
| التسريب، أفضل إعداد (اللغة / الصفحة) | 0% / 0% | 0% / 0% | 49.7% / 0% | 8.6% / 0% |
| الترجمات المفقودة في التكامل المستمر (CI) | ✅ npx intlayer test | ⚠️ غير مدمج | ⚠️ غير مدمج | ✅ lingui compile --strict |
أرقام حجم بيئة التشغيل ونسبة التسريب مأخوذة من الاختبار المعياري لـ TanStack Start. تم قياس التسريب بناءً على أفضل إعداد لكل مكتبة.
أدلة TanStack Start الأخرى: Lingui، وParaglide JS، وIntlayer.
أفضل الممارسات التي ينبغي اتباعها
- تعيين
langوdirعلى وسم<html>لضمان إمكانية الوصول وقارئات الشاشة ومحركات البحث. - الحفاظ على عنوان URL مخصص لكل لغة. استخدم بادئة اللغة في المسار (
/fr/about) بدلاً من التبديل المعتمد على ملفات تعريف الارتباط فقط، بحيث تكون كل صفحة مترجمة قابلة للفهرسة والمشاركة. - تقسيم الرسائل بحسب نطاقات الأسماء (
common،home،about) وتحميلها لكل مسار. - تحميل اللغة النشطة فقط. تجنب استيراد ملفات كل اللغات في وحدة نمطية يتم شحنها إلى المتصفح.
- تثبيت المنطقة الزمنية في
IntlProvider. وإلا سيتم تنسيق التواريخ في المنطقة الزمنية للخادم أثناء العرض على الخادم (SSR) وفي المنطقة الزمنية للزائر أثناء الترطيب، مما يؤدي إلى حدوث أخطاء عدم تطابق الترطيب (hydration mismatches). - ترجمة البيانات الوصفية الخاصة بك، والتصريح عن
canonicalوhreflangوx-defaultفي كل صفحة. - إنشاء خريطة موقع sitemap وملف robots.txt متعددي اللغات، مع تقديم عرض مسبق (pre-rendering) لكل لغة.
- استخدام روابط حقيقية لمبدل اللغة، وليس عنصر
<select>، حتى تتمكن برامج الزحف من اكتشاف جميع اللغات. - تحديد أنواع رسائلك بواسطة TypeScript بحيث يفشل أي مفتاح مفقود في وقت الترجمة البرمجية (compile time).
راجع دليلنا حول التدويل وتحسين محركات البحث (SEO) ودليل hreflang.
دليل خطوة بخطوة لإعداد use-intl في تطبيق TanStack Start
إليك هيكل المشروع الذي سنقوم بإنشائه:
نسخ الكود إلى الحافظة
تثبيت التبعيات
ابدأ من مشروع TanStack Start، ثم قم بإضافة
use-intl:bashنسخ الكودنسخ الكود إلى الحافظة
- use-intl: توفر
IntlProviderوuseTranslationsوuseFormatterوcreateTranslator(قابلة للاستخدام خارج React، على سبيل المثال في دالةhead()).
- use-intl: توفر
مركزة إعدادات اللغات
قم بإنشاء مصدر وحيد وموحد لجميع إعدادات اللغات والدوال المساعدة لعناوين URL. تستورد جميع الملفات الأخرى (المسارات، SEO، خريطة الموقع، العرض المسبق) من هنا، مما يجعل إضافة لغة جديدة تعديلاً في سطر واحد فقط.
تبقى اللغة الافتراضية بدون بادئة في المسار (
/about)، بينما تضاف البادئة إلى اللغات الأخرى (/fr/about). هذه هي استراتيجية "عند الحاجة": عنوان URL واحد لكل صفحة لكل لغة، وعناوين URL قصيرة لجمهورك الرئيسي.src/i18n/config.tsنسخ الكودنسخ الكود إلى الحافظة
إنشاء ملفات الترجمة الخاصة بك
قم بتنظيم الرسائل بحسب اللغة ونطاق الأسماء (namespace). يحتوي
commonعلى ما تحتاجه كل صفحة (شريط التنقل، التذييل)، وتخصص لكل صفحة ملفها الخاص، بما في ذلك بياناتها الوصفية.تعتمد use-intl على ICU MessageFormat، لذا يتم تضمين صيغ الجمع والشروط والوسائط المنسقة داخل الرسالة نفسها.
messages/en/common.jsonنسخ الكودنسخ الكود إلى الحافظة
messages/en/about.jsonنسخ الكودنسخ الكود إلى الحافظة
messages/fr/common.jsonنسخ الكودنسخ الكود إلى الحافظة
messages/fr/about.jsonنسخ الكودنسخ الكود إلى الحافظة
قم بإنشاء
home.jsonبالطريقة نفسها، مع كائنmetadataومحتوى الصفحة.تحميل الرسائل لكل نطاق أسماء ولكل لغة
تعد دالة التحميل هذه الملف الأكثر أهمية للأداء. تطلب
import.meta.globمن Vite توليد كتلة برمجية منفصلة (chunk) لكل ملف JSON. المسار الذي يطلب["about"]باللغة الفرنسية يقوم بتنزيلmessages/fr/about.jsonفقط دون أي شيء آخر، وهو ما يتيح للاختبار المعياري الوصول إلى 0% تسريب للغات و 0% تسريب للصفحات.src/i18n/messages.tsنسخ الكودنسخ الكود إلى الحافظة
تحديد أنواع الرسائل في TypeScript
يوفر توسيع الوحدات النمطية (Module augmentation) ميزة الإكمال التلقائي عند استدعاء
useTranslations("about")وt("counter.label")، بالإضافة إلى إظهار خطأ أثناء التجميع عند حدوث أي خطأ إملائي أو حذف مفتاح.src/i18n/use-intl.d.tsنسخ الكودنسخ الكود إلى الحافظة
تأكد من تفعيل خيار
resolveJsonModuleفي ملفtsconfig.jsonالخاص بك.إنشاء المستند الجذري (Root Document)
يعرض المسار الجذري وسم
<html>. يقرأ معلمة اللغة الاختيارية لتعيينlangوdir، لتكون هذه الخصائص صحيحة في كود HTML المُنشأ على الخادم قبل تشغيل أي كود JavaScript.src/routes/__root.tsxنسخ الكودنسخ الكود إلى الحافظة
إنشاء مسار قالب اللغة (Locale Layout Route)
يقوم المجلد
{-$locale}بإنشاء مقطع مسار اختياري: يتطابق كل من/aboutو/fr/aboutمع/{-$locale}/about. يقوم هذا القالب بما يلي:- رفض البادئات غير المدعومة (
/xx/aboutينتج عنه خطأ 404). - تحميل نطاق الأسماء
commonللغة الحالية فقط. - توفير الرسائل عبر
IntlProvider.
يتم تسلسل نتيجة المحمل داخل كود HTML وإعادة استخدامها أثناء الترطيب (hydration)، بحيث لا يقوم العميل بتنزيل
common.jsonمرة ثانية. كما أن خيارstaleTime: Infinityيبقيها مخزنة مؤقتاً عبر عمليات التنقل من جانب العميل.src/routes/{-$locale}/route.tsxنسخ الكودنسخ الكود إلى الحافظة
لا يقوم
IntlProviderبدمج الرسائل من مزود أب تلقائياً. تضيف الخطوة التالية مكوناً بسيطاً يتولى هذه المهمة، بحيث يمكن لكل صفحة إضافة نطاق الأسماء الخاص بها فوق نطاقcommon.- رفض البادئات غير المدعومة (
تحديد نطاق رسائل الصفحة
تقوم كل صفحة بتحميل نطاق الأسماء الخاص بها في المحمل التابع لها، ثم تغلف محتواها بالمكون
ScopedMessages، الذي يدمج نطاق أسماء الصفحة مع رسائل المكون الأب.src/components/ScopedMessages.tsxنسخ الكودنسخ الكود إلى الحافظة
استخدام الترجمات داخل صفحاتك
يجلب محمل الصفحة نطاق الأسماء
aboutللغة الحالية، وتقوم دالةhead()بإنشاء بيانات وصفية مترجمة ومتكاملة لمحركات البحث (انظر الخطوة 13)، ثم يعرض المكون المحتوى المطلوب.src/routes/{-$locale}/about.tsxنسخ الكودنسخ الكود إلى الحافظة
استخدام الترجمات ودوال التنسيق في المكونات
يمكن لأي مكون يقع تحت المزودات استدعاء
useTranslationsوuseFormatter. يتم التعامل مع صيغ الجمع عبر ICU، وتنسيق الأرقام وفقاً للغة النشطة.src/components/Counter.tsxنسخ الكودنسخ الكود إلى الحافظة
بناء مكون رابط مترجم (Localized Link)
اختيارينظراً لأن جميع المسارات تتواجد تحت
{-$locale}، يجب أن يحمل الرابط معلمة اللغة الحالية. يحافظ هذا الغلاف على خاصيةtoالمحددة الأنواع في TanStack Router ويقوم بحقن اللغة نيابة عنك.src/components/LocalizedLink.tsxنسخ الكودنسخ الكود إلى الحافظة
src/components/Header.tsxنسخ الكودنسخ الكود إلى الحافظة
تغيير لغة المحتوى الخاص بك
اختيارياعرض مبدل اللغة في صورة روابط بدلاً من عنصر
<select>. الروابط قابلة للزحف والفهرسة، مما يتيح لمحركات البحث العثور على جميع إصدارات اللغات، كما أنها تعمل بدون JavaScript. تحافظ الخاصيةto="."على الصفحة الحالية وتستبدل معلمة اللغة فقط. يقوم ملف تعريف الارتباط بحفظ الاختيار الصريح للمستخدم للاستفادة منه في البرمجية الوسيطة لإعادة التوجيه في الخطوة 16.src/components/LocaleSwitcher.tsxنسخ الكودنسخ الكود إلى الحافظة
تدويل البيانات الوصفية (Metadata)
اختياريهنا تتجلى الفائدة الكبرى للتدويل: يمكن لكل إصدار لغوي أن يتصدر نتائج البحث بشكل مستقل. يجب أن توفر كل صفحة:
- وسوم
<title>ووصف مترجمة؛ - عنوان URL أساسي (canonical) يشير إلى الصفحة نفسها (وليس إلى اللغة الافتراضية)؛
- رابط
hreflangبديل لكل لغة، بالإضافة إلىx-defaultللغات غير المتطابقة؛ - وسوم Open Graph مثل
og:localeوog:locale:alternateوog:url، والمستخدمة في معاينات الشبكات الاجتماعية؛ - بيانات JSON-LD مع السمة
inLanguage، والتي تساعد محركات البحث ومساعدي الذكاء الاصطناعي على نسبة لغة الصفحة بدقة.
تقوم دالة مساعدة واحدة ببناء كل هذا، مما يحافظ على بساطة وإيجاز كود الصفحات:
src/i18n/seo.tsنسخ الكودنسخ الكود إلى الحافظة
استخدم هذه الدالة في
head()بكل صفحة، كما هو موضح في الخطوة 9. بالنسبة للصفحة الرئيسية، مررpath: "/".- وسوم
تدويل خريطة الموقع (Sitemap)
اختياريتسرد خريطة الموقع متعددة اللغات كل عنوان URL لكل لغة، ويعلن كل مدخل عن جميع بدائله باستخدام
xhtml:link. تستخدم Google هذه التعليقات التوضيحية تماماً مثل وسومhreflangفي الصفحة، مما يجعلها خياراً احتياطياً موثوقاً به عندما نادراً ما يتم الزحف إلى صفحة معينة.تتيح لك مسارات خادم TanStack Start تقديمها مباشرة من مسار ملف:
src/routes/sitemap[.]xml.tsنسخ الكودنسخ الكود إلى الحافظة
تدويل ملف robots.txt
اختياريتوجد المسارات الخاصة في جميع اللغات، لذا يجب أن تغطي قواعد
Disallowجميع البادئات اللغوية. قم بإزالةpublic/robots.txtإذا تم إنشاؤه بواسطة قالب البداية، ثم قم بتقديمه عبر مسار:src/routes/robots[.]txt.tsنسخ الكودنسخ الكود إلى الحافظة
إعادة توجيه الزوار لأول مرة إلى لغتهم المفضلة
اختياريتقوم برمجية وسيطة للطلب بتوجيه الزائر الذي يصل إلى
/إلى لغته المفضلة، بالاعتماد على ملف تعريف الارتباط للغة أولاً، ثم ترويسةAccept-Language. تتم إعادة التوجيه للمسار/فقط: لا يتم تعديل الروابط المباشرة والعميقة مطلقاً، حتى تحصل الروابط المشتركة وبرامج الزحف على الصفحة المطلوبة بدقة دائماً.src/i18n/negotiateLocale.tsنسخ الكودنسخ الكود إلى الحافظة
src/start.tsنسخ الكودنسخ الكود إلى الحافظة
الزائر الذي يختار الإنجليزية صراحة في مبدل اللغة يحصل على
locale=enفي ملف تعريف الارتباط، وبالتالي لن تتم إعادة توجيهه مرة أخرى. في عمليات النشر الثابتة بالكامل (الخطوة 18)، يتم تقديم/كملف ولا تعمل هذه البرمجية الوسيطة، وهو أمر ممتاز وطبيعي: تظل الصفحة متاحة ويتولى مبدل اللغة بقية العمل.الحفاظ على واجهة برمجة use-intl مع تقليص بيئة التشغيل عبر Intlayer
اختياريتوضح المقارنة المعيارية أن الجزء الأكثر ثقلاً في إعداد use-intl هو بيئة التشغيل نفسها (~76 KB بصيغة gzip). توفر أداة التوافق
@intlayer/use-intlالواجهة البرمجية نفسها (useTranslations،useFormatter،IntlProvider،createTranslator، صيغ جمع ICU، وt.rich)، لكنها تقدمها من قواميس Intlayer المجمعة: ~6.7 KB بدلاً من ~75.9 KB، مع 0% تسريب للغات و 0% تسريب للصفحات، ودون أي تعديل على مكوناتك.bashنسخ الكودنسخ الكود إلى الحافظة
تقوم إضافة Vite بإنشاء اسم مستعار (alias) يحول
use-intlإلى المحول، حتى تستمر عمليات الاستيراد الحالية في العمل بسلاسة:vite.config.tsنسخ الكودنسخ الكود إلى الحافظة
تظل ملفات JSON الخاصة بك المصدر الوحيد للحقيقة بفضل إضافة مزامنة JSON:
intlayer.config.tsنسخ الكودنسخ الكود إلى الحافظة
يوفر هذا المحول أيضاً مسار انتقال سلساً وتدريجياً: بمجرد تشغيله، يمكنك نقل المكونات واحداً تلو الآخر إلى واجهة
useIntlayerالأصلية. راجع دليل Intlayer مع TanStack Start.العرض المسبق (Pre-render) لكل لغة
اختياريتعد ملفات HTML الثابتة أسرع الصفحات التي يمكنك تقديمها وأسهلها في الفهرسة. قم بإدراج كل مسار مترجم حتى يقوم TanStack Start بالعرض المسبق لجميع إصدارات اللغات في وقت البناء، بالإضافة إلى ملفات خريطة الموقع وملف robots:
vite.config.tsنسخ الكودنسخ الكود إلى الحافظة
نظراً لأن مبدل اللغة يعرض روابط حقيقية، فإن الخيار
crawlLinks: trueيكتشف أيضاً الصفحات التي نسيت إدراجها.التعامل مع صفحات 404 المترجمة
اختيارييقوم قالب الخطوة 7 بالفعل بإطلاق
notFound()لأي بادئات لغوية غير معروفة. أضف مساراً شاملاً (catch-all) بحيث تعرض المسارات غير المعروفة داخل لغة معينة صفحة 404 المترجمة، مع وسمها بـnoindex: حيث يقوم React 19 برفع وسم<meta>تلقائياً إلى<head>.src/components/NotFound.tsxنسخ الكودنسخ الكود إلى الحافظة
src/routes/{-$locale}/$.tsxنسخ الكودنسخ الكود إلى الحافظة
الوصول إلى اللغة في دوال الخادم (Server Functions)
اختياريلا تستقبل دوال الخادم معلمات المسار مباشرة. اقرأ ملف تعريف الارتباط للغة، مع الرجوع إلى ترويسة
Accept-Languageكخيار احتياطي، لإرسال بريد إلكتروني مترجم أو حفظ تفضيل اللغة:src/server/getServerLocale.tsنسخ الكودنسخ الكود إلى الحافظة
للترجمة داخل دالة الخادم، اجمع بينها وبين
loadMessagesوcreateTranslatorمنuse-intl.أتمتة ترجماتك باستخدام Intlayer
اختياريتقوم use-intl بعرض الترجمات، لكنها لا تساعدك في إنشائها وإدارتها. Intlayer مكتبة مجانية ومفتوحة المصدر، وتسد هذه الفجوة حتى لو واصلت استخدام use-intl:
- اختبار الترجمات المفقودة في CI أو في اختبارات الوحدة. راجع اختبار ترجماتك.
- الترجمة بالذكاء الاصطناعي باستخدام مفتاح API ومزود الخدمة الخاص بك: يقوم الأمر
npx intlayer fillبترجمة المفاتيح المفقودة مع فهم سياق تطبيقك. راجع الملء التلقائي وواجهة سطر الأوامر CLI. - الحفاظ على ملفات JSON كمصدر وحيد للحقيقة باستخدام إضافة مزامنة JSON.
- تحرير المحتوى بصرياً باستخدام المحرر المرئي ونظام إدارة المحتوى CMS، مما يتيح لغير المطورين تحديث الترجمات بسهولة.
- تزويد وكيل الذكاء الاصطناعي الخاص بك بالسياق عبر خادم MCP ومهارات الوكيل (Agent Skills).
- فحص موقعك المنشور للتأكد من عدم وجود وسوم
hreflangمفقودة أو روابط أساسية خاطئة أو تسريبات لغوية عبر أمر الفحص scan.
لاستكشاف جميع الميزات، راجع لماذا Intlayer.
الأسئلة الشائعة
نعم، إذا كنت ترغب في استخدام واجهة برمجة next-intl خارج Next.js. يمنحك ذلك رسائل ICU ودوال التنسيق ودعماً ممتازاً لـ TypeScript، ويتجنب القيود الخاصة بـ Next.js مثل setRequestLocale. المأخذ الوحيد هو الحجم: يقيس الاختبار المعياري حوالي ~76 KB بصيغة gzip لبيئة التشغيل، وفي الإعداد البسيط يتم إرسال جميع اللغات والصفحات إلى المتصفح. احرص على تحميل نطاقات الأسماء لكل مسار ولكل لغة، كما هو موضح في هذا الدليل، لتجنب التسريبات.
use-intl هي النواة الأساسية لـ next-intl. تضيف next-intl تكاملات Next.js فوقها: برمجية وسيطة، ومساعدات تنقل، ودالة getTranslations لمكونات الخادم Server Components، وإعدادات الطلبات. في TanStack Start، تستخدم use-intl مباشرة وتنفذ التوجيه باستخدام TanStack Router، كما هو موضح أعلاه.
استخدم بادئة في عنوان URL. يمنح ذلك كل إصدار لغوي عنوان URL خاصاً به يمكن لمحركات البحث فهرسته وللمستخدمين مشاركته. لا يزال ملف تعريف الارتباط مفيداً لحفظ الاختيار الصريح للمستخدم، وهو ما تقوم به برمجية إعادة التوجيه الوسيطة في الخطوة 16.
يقوم الخادم والمتصفح بتنسيق التواريخ في مناطق زمنية مختلفة. مرر قيمة صريحة لـ timeZone إلى IntlProvider (أو المنطقة الزمنية للزائر المحفوظة في ملف تعريف ارتباط)، بحيث ينتج كلا الجانبين النص نفسه تماماً.
أولاً، قسّم الرسائل بحسب نطاقات الأسماء وقم بتحميلها لكل مسار ولكل لغة باستخدام import.meta.glob، مما يزيل تسريبات اللغات والصفحات. بعد ذلك، إذا كان حجم بيئة التشغيل مهماً بالنسبة لك، انتقل إلى محول @intlayer/use-intl: نفس واجهة البرمجة بحجم ~6.7 KB بدلاً من ~75.9 KB في الاختبار المعياري.
استدعِ دالة createTranslator داخل دالة head() للمسار مع الرسائل التي يرجعها محمل المسار، ثم أرجع title و description وروابط canonical و hreflang. توفر الخطوة 13 دالة مساعدة قابلة لإعادة الاستخدام.
التعليقات
لا توجد تعليقات بعد. كن أول من يشارك أفكاره.
