استخدم مساعدك المفضل للملخص واستخدم هذه الصفحة والموفر AI الذي تريده
تاريخ الإصدارات
- "النسخة الأولية"v9.5.1026/9/2026
تمت ترجمة محتوى هذه الصفحة باستخدام الذكاء الاصطناعي.
اعرض آخر نسخة المحتوى الأصلي باللغة الإنكليزيةإذا كان لديك فكرة لتحسين هذه الوثيقة، فلا تتردد في المساهمة من خلال تقديم طلب سحب على GitHub.
رابط GitHub للتوثيقنسخ الـ Markdown من المستند إلى الحافظة
كيفية تعريب تطبيق Next.js الخاص بك باستخدام Lingui في عام 2026
جدول المحتويات
ما هو Lingui؟
Lingui هي مكتبة تعريب وتدويل (i18n) مبنية حول وحدات الماكرو (macros) واستخراج الرسائل (message extraction). تقوم بكتابة النص المصدري داخل مكوناتك ( t`Hello` ، <Trans>Hello</Trans>)، ثم يقوم أمر lingui extract بجمع كل رسالة في كتالوجات (ملفات PO افتراضيًا)، ويقوم المترجم بتجميعها إلى كود JavaScript مدمج. تستخدم الرسائل تنسيق ICU MessageFormat، ويدعم Lingui مكونات خادم React (React Server Components) في App Router.
يقوم هذا الدليل بإعداد Lingui في مشروع Next.js 16 App Router، مع:
- ماكرو مجمعة بواسطة SWC، للحفاظ على سرعة Turbopack الفائقة.
- مكونات الخادم والعميل تشترك في نفس واجهة برمجة التطبيقات
TransوuseLingui. - توجيه اللغات عبر
proxy.ts: المسار/aboutللغة الافتراضية، و/fr/aboutللغات الأخرى، مع اكتشاف لغة الزائر في أول زيارة. - التقديم الثابت (Static rendering) لكل لغة باستخدام
generateStaticParams. - تحسين محركات البحث (SEO) الكامل متعدد اللغات: دالة
generateMetadataالمترجمة، والرابط الأساسي (canonical)، وhreflangمعx-default، ولغات Open Graph، و JSON-LD، وsitemap.ts، وrobots.ts، وصفحات 404 المترجمة.
هل تبحث عن مكتبة أخرى؟ راجع دليل next-intl، أو دليل next-i18next، أو دليل Next.js + Intlayer.
هل تستخدم TanStack Start؟ راجع دليل TanStack Start + Lingui. هل تقارن بين المكتبات؟ اقرأ Lingui مقابل Intlayer و next-i18next مقابل next-intl مقابل Intlayer.
ماذا يقول اختبار الأداء والقياس المعياري عن Lingui في Next.js؟
يقوم اختبار قياس i18n بتشغيل نفس تطبيق Next.js المكون من 10 صفحات و10 لغات مع كل مكتبة رئيسية ويقيس ما يقوم المتصفح بتنزيله بالفعل.
تحميل JSON الديناميكي
تحميل الترجمات ببطء في وقت التشغيل
JSON المحدد (أسماء المحيط)
مساحات أسماء الترجمة لكل صفحة
مقياس أداء I18n
ما هو هذا المقياس؟
الحجم الإجمالي المضغوط بتنسيق gzip لحزمة مكتبة التدويل. وهي تتضمن فقط المزود ومنطق استرداد المحتوى بعد تقليل الحجم (tree-shaking) والضغط (minification).
لماذا هو مهم؟
يقلل حجم المكتبة الأصغر من حمولة JavaScript الأولية، مما يؤدي إلى سرعة التنزيل وأوقات التنفيذ على العميل.
عرض كـ
الأرقام الرئيسية لحزمة @lingui/core@6.6.0 على Next.js 16، مقاسة في 2026-09-26 (gzip):
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| الإعداد | حجم المكتبة | حجم JS لكل صفحة | تسريب اللغات الأخرى | تسريب الصفحات الأخرى |
|---|---|---|---|---|
| بدون i18n (التطبيق الأساسي) | - | 141.0 KB | 0% | 0% |
| Lingui، كتالوج واحد لكل لغة | 72.1 KB | 145.4 KB | 2.8% | 89.9% |
@intlayer/lingui (محول التوافق) | 10.7 KB | 221.6 KB | 50% | 90% |
next-intlayer (Intlayer الأصلي) | 4.9 KB | 141.5 KB | 0% | 0% |
أهم الاستنتاجات:
- الكتالوج الفردي لكل لغة لا يزال يسرب رسائل الصفحات الأخرى إلى موفر العميل (Client Provider). احتفظ بأكبر قدر ممكن من النصوص داخل مكونات الخادم، التي ترسل كود HTML المعروض فقط دون الكتالوجات.
- يبلغ وزن بيئة تشغيل Lingui حوالي 72 كيلوبايت (gzip). يقلل محول التوافق
@intlayer/linguiبيئة التشغيل إلى حوالي 11 كيلوبايت، ولكن في هذا الاختبار المعياري، لا يزال إعداد التوافق مع Next.js يرسل كتالوجات كاملة إلى الصفحة. واجهة برمجة تطبيقاتnext-intlayerالأصلية هي الإعداد الوحيد الذي يحافظ على حجم التطبيق الأساسي.
راجع البيانات الكاملة: تقرير القياس المعياري لـ Next.js، ومستودع القياس المعياري.
مقارنة الميزات في Next.js
مقارنة بين Lingui و next-intl و Intlayer في الميزات التي يحتاجها مشروع Next.js App Router عادة:
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| الميزة | next-intlayer (Intlayer) | Lingui | next-intl |
|---|---|---|---|
| الترجمات بجوار المكونات | ✅ المحتوى متجاور مع كل مكون | ⚠️ النص المصدري في المكونات، والكتالوجات مركزية | ❌ ملفات JSON مركزية |
| التكامل مع TypeScript | ✅ أنواع صارمة يتم إنشاؤها تلقائيًا | ⚠️ الماكرو محددة الأنواع، وكتالوجات الرسائل ليست كذلك | ✅ جيد، عبر توسيع AppConfig |
| اكتشاف الترجمات المفقودة | ✅ أخطاء TypeScript وتحذيرات وقت البناء | ⚠️ الرجوع وقت التشغيل إلى النص المصدري | ⚠️ الرجوع وقت التشغيل |
| المحتوى الغني (JSX، Markdown) | ✅ دعم مباشر | ✅ JSX داخل <Trans>، بدون Markdown | ⚠️ وسوم عبر t.rich، بدون Markdown |
| الترجمة بالذكاء الاصطناعي | ✅ مزودك ومفتاح API الخاص بك، مع سياق التطبيق | ❌ لا يوجد | ❌ لا يوجد |
| المحرر المرئي / نظام إدارة المحتوى | ✅ محرر مرئي محلي + CMS اختياري | ❌ عبر منصات خارجية | ❌ عبر منصات خارجية |
| التوجيه المترجم | ✅ مدمج | ❌ يتطلب كتابة proxy.ts الخاص بك | ✅ مقطع [locale] مدمج |
| صيغ الجمع (Pluralization) | ✅ قائم على التعداد | ✅ ICU، ماكرو <Plural> | ✅ ICU |
| تنسيقات المحتوى | ✅ .ts، .tsx، .js، .json، .md، .yaml | ✅ PO، JSON، CSV | ✅ .json، .js، .ts |
| تنسيق ICU MessageFormat | ✅ عبر format: "icu" | ✅ أصلي | ✅ أصلي |
| مساعدات SEO (hreflang، sitemap) | ✅ مساعدات لبيانات التعريف، خريطة الموقع وrobots.txt | ❌ يدوي | ✅ جيد |
| مكونات الخادم | ✅ وصول مباشر في أي مكون خادم | ⚠️ استدعاء setI18n في كل تخطيط وصفحة | ⚠️ استدعاء await getTranslations() لكل مكون |
| تقليم الشجرة لكل مكون | ✅ في وقت البناء (Babel / SWC) | ⚠️ كتالوج واحد لكل لغة، ومستخرج كل صفحة تجريبي | ⚠️ يدوي، باستخدام pick() لكل مسار |
| حجم وقت التشغيل (gzip، المعياري) | 4.9 KB | 72.1 KB | 14.7 KB |
| الترجمات المفقودة في CI | ✅ npx intlayer test | ✅ lingui compile --strict | ⚠️ غير مدمج |
| النظام البيئي / المجتمع | ⚠️ أصغر، ينمو بسرعة | ✅ ناضج | ✅ كبير |
تأتي أحجام وقت التشغيل من اختبار قياس Next.js. للمزيد من التفاصيل، اقرأ Lingui مقابل Intlayer.
أدلة Next.js أخرى: next-intl، وnext-i18next، وIntlayer.
الممارسات التي يجب عليك اتباعها
- تعيين
langوdirفي وسم<html>داخل تخطيط[locale]. - تفضيل مكونات الخادم للنصوص: حيث تقوم بتقديم HTML على الخادم ولا تحتاج إلى إرسال الكتالوج إلى العميل.
- استدعاء
initLingui(locale)في كل تخطيط وصفحة. التخطيطات لا تعيد التقديم عند التنقل، لذا لا يمكن للصفحة الاعتماد على أن التخطيط الخاص بها قد قام بضبط اللغة. - الاحتفاظ بعنوان URL واحد لكل لغة والتقديم المسبق لكل لغة باستخدام
generateStaticParams. - ترجمة بياناتك الوصفية في
generateMetadata، مع الروابط الأساسيةcanonical، وhreflangوx-default. - إنشاء خريطة موقع وملف robots.txt متعددي اللغات باستخدام اصطلاحات
sitemap.tsوrobots.ts. - استخدام روابط حقيقية لمبدل اللغة، حتى تتمكن برامج الزحف من اكتشاف كل لغة.
- تشغيل
lingui extractفي التكامل المستمر (CI) حتى لا يتم نشر أي رسالة جديدة غير مترجمة.
راجع دليلنا حول التدويل وتحسين محركات البحث، ودليل hreflang، ومقارنة SEO متعدد اللغات في Next.js.
دليل خطوة بخطوة لإعداد Lingui في تطبيق Next.js
إليك هيكل المشروع الذي سنقوم بإنشائه:
نسخ الكود إلى الحافظة
تثبيت الاعتماديات
bashنسخ الكودنسخ الكود إلى الحافظة
- @lingui/core / @lingui/react: بيئة التشغيل،
I18nProvider، وsetI18nلمكونات الخادم، ووحدات الماكرو (@lingui/core/macro،@lingui/react/macro). - @lingui/swc-plugin: تجميع وحدات الماكرو داخل خط معالجة SWC الخاص بـ Next.js.
- @lingui/loader: تجميع كتالوجات
.poعند الاستيراد، وبالتالي لا يلزم تشغيلlingui compile. - @lingui/cli: أمر
lingui extractلجمع الرسائل في الكتالوجات.
إضافة
@lingui/swc-pluginهي إضافة WebAssembly مرتبطة بإصدار SWC الخاص بـ Next.js. إذا فشل البناء بعد ترقية Next.js، قم بتحديث الإضافة إلى الإصدار المتوافق المذكور في ملف README الخاص بها.- @lingui/core / @lingui/react: بيئة التشغيل،
مركزية إعدادات اللغات
يقوم ملف واحد بتحديد اللغات ومساعدات الروابط (URLs). وتقرأ منه كل من التوجيه، والبيانات الوصفية، وخريطة الموقع، وLingui.
src/i18n/config.tsنسخ الكودنسخ الكود إلى الحافظة
تكوين Lingui و Next.js
lingui.config.tsنسخ الكودنسخ الكود إلى الحافظة
تقوم إضافة SWC بتجميع الماكرو، ويقوم الـ loader بتجميع ملفات
.po، لكل من Turbopack (الافتراضي في Next.js 16) و webpack:next.config.tsنسخ الكودنسخ الكود إلى الحافظة
أضف نصوص الاستخراج البرمجية (scripts):
package.jsonنسخ الكودنسخ الكود إلى الحافظة
تحميل الكتالوجات وإنشاء نُسخ الخادم
لا تمتلك مكونات الخادم سياق React Context، لذلك يوفر Lingui دالة
setI18nلتسجيل النسخة لعملية التقديم الحالية. يقوم هذا الملف بتحميل كل كتالوج مرة واحدة لكل عملية خادم وينشئ نسخةI18nواحدة لكل لغة. وهو مخصص للخادم فقط (server-only): فلا تصل كتالوجات اللغات الأخرى إلى حزمة العميل أبدًا.src/i18n/appRouterI18n.tsنسخ الكودنسخ الكود إلى الحافظة
src/i18n/initLingui.tsنسخ الكودنسخ الكود إلى الحافظة
لكي يقبل TypeScript استيراد ملفات
.po، قم بتعريف الوحدة مرة واحدة:src/i18n/po.d.tsنسخ الكودنسخ الكود إلى الحافظة
إنشاء موفر العميل (Client Provider)
تقرأ مكونات العميل الترجمات من سياق React context. يتلقى الموفر كتالوج اللغة النشطة من تخطيط الخادم، وينشئ نسخته الخاصة مرة واحدة.
src/components/LinguiClientProvider.tsxنسخ الكودنسخ الكود إلى الحافظة
تعريف مسارات اللغات الديناميكية
يحتوي مقطع
[locale]على التخطيط الجذري. يقومgenerateStaticParamsبتقديم كل لغة مسبقًا في وقت البناء، ويعيدdynamicParams = falseخطأ 404 لأي بادئة أخرى.src/app/[locale]/layout.tsxنسخ الكودنسخ الكود إلى الحافظة
يتلقى موفر العميل الكتالوج الكامل للغة النشطة. وهذا ما يقيسه الاختبار المعياري باسم "تسريب الصفحات الأخرى". إن الاحتفاظ بالنصوص في مكونات الخادم يقلل مما يحتاجه العميل فعليًا. بالنسبة للتطبيقات الكبيرة، يقوم مستخرج Lingui التجريبي لكل صفحة (
experimental.extractorفيlingui.config.ts) بتقسيم الكتالوجات حسب نقطة الدخول.استخدام الترجمات في مكونات الخادم
تستخدم مكونات الخادم نفس وحدات الماكرو مثل مكونات العميل. ويجب تشغيل
initLinguiفي الصفحة أيضًا، لأن التخطيط لا يعيد التقديم عند التنقل بين صفحاته.src/app/[locale]/about/page.tsxنسخ الكودنسخ الكود إلى الحافظة
استخدام الترجمات في مكونات العميل
تستخدم مكونات العميل نفس عمليات الاستيراد. وتقرأ وحدات الماكرو النسخة من
LinguiClientProvider.src/components/Counter.tsxنسخ الكودنسخ الكود إلى الحافظة
استخراج وترجمة رسائلك
قم بتشغيل أمر الاستخراج. يكتب Lingui كل رسالة يتم العثور عليها في
srcداخل كتالوج كل لغة:bashنسخ الكودنسخ الكود إلى الحافظة
ثم قم بترجمة حقل
msgstrلكل مدخل:src/locales/fr/messages.poنسخ الكودنسخ الكود إلى الحافظة
src/locales/es/messages.poنسخ الكودنسخ الكود إلى الحافظة
تحافظ العناصر النائبة
<0>على عناصر JSX الخاصة بـ<Trans>في مكانها، حتى يتمكن المترجمون من نقلها دون تعديل كود العرض.إعداد الوكيل لتوجيه اللغات
اختياريقام Next.js 16 بتغيير اسم
middleware.tsإلىproxy.ts. ينفذ الوكيل استراتيجية البادئة "عند الحاجة":- يتم تقديم
/fr/aboutكما هو؛ - يعيد
/en/aboutالتوجيه إلى/about، بحيث يكون للغة الافتراضية عنوان URL موحد؛ - تتم إعادة كتابة
/aboutداخليًا إلى/en/about، دون تغيير عنوان URL؛ - تعيد الزيارة الأولى للمسار
/توجيه الزائر إلى لغته المفضلة (ملف تعريف الارتباط أولاً، ثمAccept-Language).
src/i18n/negotiateLocale.tsنسخ الكودنسخ الكود إلى الحافظة
src/proxy.tsنسخ الكودنسخ الكود إلى الحافظة
- يتم تقديم
تغيير لغة المحتوى الخاص بك
اختياريترجع
usePathnameعنوان URL الذي يراه المتصفح (/aboutأو/fr/about). قم بإزالة مقطع اللغة، ثم قم ببناء رابط كل لغة. يقوم المبدل بتقديم روابط فعلية حتى تتمكن برامج الزحف من الوصول إلى إصدار كل لغة، ويتذكر ملف تعريف الارتباط الاختيار الصريح للمستخدم.src/components/LocaleSwitcher.tsxنسخ الكودنسخ الكود إلى الحافظة
بناء مكون رابط مترجم
اختياريsrc/components/LocalizedLink.tsxنسخ الكودنسخ الكود إلى الحافظة
يعمل هذا المكون من مكونات الخادم أيضًا، لأنه يتم تقديمه داخل
LinguiClientProvider:tsxنسخ الكودنسخ الكود إلى الحافظة
تعريب بياناتك الوصفية (Metadata)
اختيارييمكن لكل إصدار لغوي أن يتصدر نتائج البحث بمفرده، بشرط أن توفر كل صفحة:
titleوdescriptionمترجمين؛- عنوان URL أساسي (canonical) يشير إلى الصفحة نفسها؛
- رابط
hreflangبديل لكل لغة، بالإضافة إلىx-default؛ - خصائص Open Graph مثل
localeوalternateLocaleوurl؛ - بيانات JSON-LD مع تحديد
inLanguage.
تعمل دالة
generateMetadataخارج شجرة React، لذا فهي تستخدم نسخة الخادم مباشرة مع ماكروmsg:src/i18n/metadata.tsنسخ الكودنسخ الكود إلى الحافظة
src/app/[locale]/about/page.tsxنسخ الكودنسخ الكود إلى الحافظة
يتم تقديم JSON-LD بواسطة الصفحة نفسها. ولا يجوز لملفات الصفحات تصدير سوى حقول Next.js، لذا احتفظ بالمكون في ملفه الخاص:
src/components/WebPageJsonLd.tsxنسخ الكودنسخ الكود إلى الحافظة
src/app/[locale]/about/page.tsxنسخ الكودنسخ الكود إلى الحافظة
تعريب خريطة الموقع (Sitemap)
اختيارييدعم اصطلاح
sitemap.tsخاصيةalternates.languages، والتي يقدمها Next.js كروابط بديلةxhtml:link. اذكر كل عنوان URL لكل لغة:src/app/sitemap.tsنسخ الكودنسخ الكود إلى الحافظة
تعريب ملف robots.txt
اختياريتوجد المسارات الخاصة في كل لغة، لذا يجب أن يغطي
disallowكل مسار مترجم:src/app/robots.tsنسخ الكودنسخ الكود إلى الحافظة
التعامل مع صفحات 404 المترجمة
اختيارييتم تقديم
not-found.tsxداخل تخطيط[locale]، بحيث يمكنه الوصول إلى موفر العميل. يوجه المسار الشامل (catch-all) المسارات غير المعروفة داخل اللغة إليه. ويضيف Next.js تلقائيًا وسمnoindexلاستجابات 404.src/app/[locale]/not-found.tsxنسخ الكودنسخ الكود إلى الحافظة
src/app/[locale]/[...rest]/page.tsxنسخ الكودنسخ الكود إلى الحافظة
الوصول إلى اللغة في إجراءات الخادم (Server Actions)
اختياريلا تتلقى إجراءات الخادم معلمات المسار (route params). الطريقة الأكثر موثوقية هي إرسال اللغة مع النموذج، من الصفحة التي تعرفها:
src/app/[locale]/contact/page.tsxنسخ الكودنسخ الكود إلى الحافظة
src/app/actions/sendContactMessage.tsنسخ الكودنسخ الكود إلى الحافظة
حافظ على وحدات الماكرو وقلل حجم وقت التشغيل مع Intlayer
اختيارييحافظ محول التوافق
@intlayer/linguiعلى الكود المصدري دون أي تعديل: يتم تجميع وحدات الماكرو كما كانت، ويتم توفير استدعاءاتi18n._()وuseLingui()و<Trans>الناتجة عبر قواميس Intlayer. في اختبار قياس Next.js، ينخفض حجم بيئة التشغيل من ~72.1 كيلوبايت إلى ~10.7 كيلوبايت (gzip).في Next.js، يتم ربط المحول عن طريق إنشاء اسم مستعار (alias) لـ
@lingui/coreو@lingui/reactإلى@intlayer/linguiفيnext.config.ts(لكل من webpack و Turbopack)، وتغليف الإعدادات باستخدامwithIntlayerمنnext-intlayer/server. احتفظ بـ@lingui/swc-pluginحتى يتم تجميع وحدات الماكرو أولاً. الإعداد الكامل موجود في دليل توافق Lingui.كما يوضح جدول القياس المعياري، يقلل المحول من حجم وقت التشغيل ولكنه لا يقلل بعد من الكتالوج المرسل إلى كل صفحة على Next.js. من الأفضل استخدامه كجسر للهجرة الانتقالية: بمجرد تشغيله، انقل المكونات واحدًا تلو الآخر إلى واجهة برمجة تطبيقات
useIntlayerالأصلية، والتي ترسل فقط المحتوى الذي يعرضه كل مكون. راجع دليل Next.js + Intlayer، و Lingui مقابل @intlayer/lingui وجميع محولات التوافق.أتمتة ترجماتك باستخدام Intlayer
اختيارييقوم Lingui باستخراج الرسائل، ولكن ملء العشرات من الكتالوجات يدويًا هو المكان الذي يضيع فيه معظم الوقت. يُعد Intlayer مجانيًا ومفتوح المصدر، وتعمل أدواته جنبًا إلى جنب مع Lingui:
- الترجمة باستخدام الذكاء الاصطناعي باستخدام مفتاح API ومزودك الخاص. راجع الملء التلقائي وواجهة سطر الأوامر (CLI).
- الاحتفاظ بملفات PO كمصدر وحيد للحقيقة مع إضافة مزامنة PO.
- اختبار الترجمات المفقودة في التكامل المستمر (CI). راجع اختبار ترجماتك.
- تدقيق موقعك المنشور للتحقق من وسوم
hreflangالمفقودة، وعناوين canonical الخاطئة، وتسريبات اللغات باستخدام أمر scan.
الأسئلة الشائعة
نعم. تدعم حزمة @lingui/react مكونات خادم React (RSC). تقوم مكونات الخادم بتسجيل النسخة باستخدام setI18n من @lingui/react/server، وتقرأ مكونات العميل النسخة من I18nProvider، ويستخدم كلاهما نفس وحدات الماكرو Trans و useLingui.
لا تمتلك مكونات الخادم سياق React Context، لذا يتم تسجيل النسخة لكل عملية تقديم. كما يتم الحفاظ على التخطيطات عبر عمليات التنقل ولا تعيد التقديم، وبالتالي لا يمكن للصفحة الاعتماد على تخطيطها لتعيين اللغة. يضمن استدعاء initLingui(locale) في أعلى كل تخطيط وصفحة استقلاليتها التامة.
استخدم @lingui/swc-plugin. فهو يحافظ على خط معالجة SWC وTurbopack. تؤدي إضافة تكوين Babel إلى تعطيل SWC في Next.js وإبطاء عمليات البناء. القيد الوحيد هو الحفاظ على توافق إصدار الإضافة مع إصدار SWC الخاص بإصدار Next.js لديك.
احصل على نسخة الخادم باستخدام getI18nInstance(locale) وقم بترجمة الواصفات المصرح عنها باستخدام ماكرو msg: i18n._(msg`About us`). وأرجع alternates.canonical، و alternates.languages مع x-default، و openGraph.locale. توفر الخطوة 13 دالة مساعدة قابلة لإعادة الاستخدام.
يقيس القياس المعياري حوالي 72 كيلوبايت (gzip) لبيئة التشغيل. ومع كتالوج واحد لكل لغة، تزن الصفحات حوالي 145 كيلوبايت مقابل 141 كيلوبايت بدون i18n، ولكن كل صفحة لا تزال تتلقى رسائل الصفحات الأخرى عبر موفر العميل.
يناسب Lingui الفرق التي تفضل كتابة النص المصدري داخل المكونات والتعامل مع ملفات PO والمترجمين. يناسب next-intl الفرق التي تفضل كتالوجات JSON وواجهة برمجة تطبيقات t("key") المدمجة بإحكام مع Next.js. يوفر next-i18next النظام البيئي لإضافات i18next. راجع next-i18next مقابل next-intl مقابل Intlayer و اختبار قياس Next.js.
التعليقات
لا توجد تعليقات بعد. كن أول من يشارك أفكاره.
