التدويل (i18n) في JavaScript (Node.js): مكتبة i18next

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التدويل (i18n) في JavaScript (Node.js): مكتبة i18next

\n\n

التدويل (اختصاراً i18n من الإنجليزية "internationalization"، حيث 18 هو عدد الحروف بين الحرف الأول "i" والحرف الأخير "n") هو عملية تصميم وتطوير البرمجيات لتكييفها مع لغات وخصائص إقليمية مختلفة دون تغيير الكود المصدري. في تطوير الويب الحديث باستخدام Node.js، أصبح إنشاء تطبيقات متعددة اللغات ضرورة للوصول إلى السوق العالمية.

\n\n

واحدة من أشهر وأقوى المكتبات لتنفيذ i18n في نظام JavaScript البيئي (بما في ذلك Node.js) هي i18next. توفر هذه المكتبة بنية مرنة، ودعمًا لتنسيقات متعددة لملفات الترجمة، والإقحام، وصيغ الجمع، والترجمات السياقية. في هذه المقالة، سنشرح بالتفصيل عملية التثبيت والإعداد واستخدام i18next على جانب الخادم.

\n\n

التثبيت والإعداد

\n\n

للبدء مع i18next في مشروع Node.js، قم بتثبيت المكتبة عبر npm:

\n\n
npm install i18next
\n\n

يوصى أيضًا بتثبيت حزمة i18next-fs-backend لتحميل ملفات الترجمة من نظام الملفات:

\n\n
npm install i18next-fs-backend
\n\n

بعد التثبيت، قم بإنشاء ملف تهيئة، على سبيل المثال i18n.js:

\n\n
const i18next = require('i18next');\nconst Backend = require('i18next-fs-backend');\n\ni18next.use(Backend).init({\n  lng: 'ru', // اللغة الافتراضية\n  fallbackLng: 'en', // اللغة الاحتياطية\n  backend: {\n    loadPath: './locales/{{lng}}/{{ns}}.json' // مسار ملفات الترجمة\n  },\n  interpolation: {\n    escapeValue: false // لا تقم بتشفير HTML (لـ Node.js)\n  }\n});\n\nmodule.exports = i18next;
\n\n

هيكل ملفات الترجمة

\n\n

قم بإنشاء مجلد locales في جذر المشروع. بداخله، لكل لغة قم بإنشاء مجلد فرعي (على سبيل المثال، en، ru، de). في كل مجلد فرعي، ضع ملفات JSON التي تحتوي على الترجمات. عادةً ما يتم استخدام ملف واحد translation.json لكل لغة، ولكن يمكن تقسيمها إلى مساحات أسماء (namespaces) لتحقيق النمطية.

\n\n

مثال لملف locales/ru/translation.json:

\n\n
{\n  "welcome": "Добро пожаловать на наш сайт!",\n  "greeting": "Привет, {{name}}!",\n  "items": "{{count}} элемент",\n  "items_plural": "{{count}} элементов",\n  "menu": {\n    "home": "Главная",\n    "about": "О нас",\n    "contact": "Контакты"\n  }\n}
\n\n

مثال لملف locales/en/translation.json:

\n\n
{\n  "welcome": "Welcome to our website!",\n  "greeting": "Hello, {{name}}!",\n  "items": "{{count}} item",\n  "items_plural": "{{count}} items",\n  "menu": {\n    "home": "Home",\n    "about": "About",\n    "contact": "Contact"\n  }\n}
\n\n

الميزات الأساسية لـ i18next

\n\n

الترجمة البسيطة

\n\n

للحصول على الترجمة، استخدم الدالة t() (من "translate"):

\n\n
const i18next = require('./i18n');\n\n// التهيئة غير المتزامنة (في المشروع الحقيقي، انتظر حتى الاكتمال)\ni18next.t('welcome'); // "Добро пожаловать на наш сайт!" (إذا كانت lng: 'ru')
\n\n

إقحام المتغيرات

\n\n

أدخل القيم الديناميكية في النصوص باستخدام الأقواس المزدوجة:

\n\n
i18next.t('greeting', { name: 'Алексей' });\n// النتيجة: "Привет, Алексей!"
\n\n

صيغ الجمع

\n\n

تختار المكتبة تلقائيًا صيغة الجمع الصحيحة بناءً على قواعد اللغة. للقيام بذلك، أضف مفاتيحًا باللاحقة _plural:

\n\n
i18next.t('items', { count: 1 }); // "1 элемент"\ni18next.t('items', { count: 5 }); // "5 элементов"
\n\n

بالنسبة للغة الإنجليزية، القاعدة أبسط (عنصر واحد - item، العديد - items). بالنسبة للغة الروسية، تستخدم i18next قواعد الجمع المدمجة التي تراعي الأرقام 1، 2-4، 5-20، إلخ.

\n\n

المفاتيح المتداخلة ومساحات الأسماء

توصيات