التدويل (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\nnpm install i18next\n\nيوصى أيضًا بتثبيت حزمة i18next-fs-backend لتحميل ملفات الترجمة من نظام الملفات:
npm install i18next-fs-backend\n\nبعد التثبيت، قم بإنشاء ملف تهيئة، على سبيل المثال i18n.js:
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) لتحقيق النمطية.
مثال لملف locales/ru/translation.json:
{\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 "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"):
const i18next = require('./i18n');\n\n// التهيئة غير المتزامنة (في المشروع الحقيقي، انتظر حتى الاكتمال)\ni18next.t('welcome'); // "Добро пожаловать на наш сайт!" (إذا كانت lng: 'ru')\n\nإقحام المتغيرات
\n\nأدخل القيم الديناميكية في النصوص باستخدام الأقواس المزدوجة:
\n\ni18next.t('greeting', { name: 'Алексей' });\n// النتيجة: "Привет, Алексей!"\n\nصيغ الجمع
\n\nتختار المكتبة تلقائيًا صيغة الجمع الصحيحة بناءً على قواعد اللغة. للقيام بذلك، أضف مفاتيحًا باللاحقة _plural:
i18next.t('items', { count: 1 }); // "1 элемент"\ni18next.t('items', { count: 5 }); // "5 элементов"\n\nبالنسبة للغة الإنجليزية، القاعدة أبسط (عنصر واحد - item، العديد - items). بالنسبة للغة الروسية، تستخدم i18next قواعد الجمع المدمجة التي تراعي الأرقام 1، 2-4، 5-20، إلخ.
\n\n