Skip to content

دعم التدويل

يحتوي Node.js على العديد من الميزات التي تجعل من السهل كتابة البرامج المدولة. بعضها:

يستخدم Node.js ومحرك V8 الأساسي مكونات Unicode العالمية (ICU) لتنفيذ هذه الميزات في كود C/C++ الأصلي. يتم توفير مجموعة بيانات ICU الكاملة بواسطة Node.js افتراضيًا. ومع ذلك، نظرًا لحجم ملف بيانات ICU، يتم توفير العديد من الخيارات لتخصيص مجموعة بيانات ICU إما عند إنشاء Node.js أو تشغيله.

خيارات لإنشاء Node.js

للتحكم في كيفية استخدام ICU في Node.js، تتوفر أربعة خيارات configure أثناء الترجمة. توجد تفاصيل إضافية حول كيفية تجميع Node.js في BUILDING.md.

  • --with-intl=none/--without-intl
  • --with-intl=system-icu
  • --with-intl=small-icu
  • --with-intl=full-icu (افتراضي)

نظرة عامة على ميزات Node.js و JavaScript المتوفرة لكل خيار configure:

الميزةnonesystem-icusmall-icufull-icu
String.prototype.normalize()لا شيء (الدالة لا تعمل)كاملكاملكامل
String.prototype.to*Case()كاملكاملكاملكامل
Intlلا شيء (الكائن غير موجود)جزئي/كامل (يعتمد على نظام التشغيل)جزئي (باللغة الإنجليزية فقط)كامل
String.prototype.localeCompare()جزئي (غير مدرك للإعدادات المحلية)كاملكاملكامل
String.prototype.toLocale*Case()جزئي (غير مدرك للإعدادات المحلية)كاملكاملكامل
Number.prototype.toLocaleString()جزئي (غير مدرك للإعدادات المحلية)جزئي/كامل (يعتمد على نظام التشغيل)جزئي (باللغة الإنجليزية فقط)كامل
Date.prototype.toLocale*String()جزئي (غير مدرك للإعدادات المحلية)جزئي/كامل (يعتمد على نظام التشغيل)جزئي (باللغة الإنجليزية فقط)كامل
محلل عنوان URL القديمجزئي (لا يدعم IDN)كاملكاملكامل
محلل عنوان URL WHATWGجزئي (لا يدعم IDN)كاملكاملكامل
require('node:buffer').transcode()لا شيء (الدالة غير موجودة)كاملكاملكامل
REPLجزئي (تحرير غير دقيق للسطر)كاملكاملكامل
require('node:util').TextDecoderجزئي (دعم الترميزات الأساسية)جزئي/كامل (يعتمد على نظام التشغيل)جزئي (Unicode فقط)كامل
RegExp مهربات خصائص Unicodeلا شيء (خطأ RegExp غير صالح)كاملكاملكامل
يشير مصطلح "(غير مدرك للإعدادات المحلية)" إلى أن الدالة تنفذ عمليتها تمامًا مثل الإصدار غير Locale من الدالة، إذا كان موجودًا. على سبيل المثال، في الوضع none، تكون عملية Date.prototype.toLocaleString() مطابقة لعملية Date.prototype.toString().

تعطيل جميع ميزات التدويل (none)

إذا تم اختيار هذا الخيار، فسيتم تعطيل ICU وستكون معظم ميزات التدويل المذكورة أعلاه غير متاحة في ملف node الثنائي الناتج.

الإنشاء باستخدام ICU مثبت مسبقًا (system-icu)

يمكن لـ Node.js الارتباط بإنشاء ICU مثبت بالفعل على النظام. في الواقع، تأتي معظم توزيعات Linux بالفعل مع تثبيت ICU، وسيجعل هذا الخيار من الممكن إعادة استخدام نفس مجموعة البيانات المستخدمة من قبل المكونات الأخرى في نظام التشغيل.

الوظائف التي تتطلب مكتبة ICU نفسها فقط، مثل String.prototype.normalize() و محلل عنوان URL الخاص بـ WHATWG، مدعومة بالكامل تحت system-icu. الميزات التي تتطلب بيانات لغة ICU بالإضافة إلى ذلك، مثل Intl.DateTimeFormat قد تكون مدعومة بالكامل أو جزئيًا، اعتمادًا على مدى اكتمال بيانات ICU المثبتة على النظام.

تضمين مجموعة محدودة من بيانات ICU (small-icu)

يجعل هذا الخيار الملف الثنائي الناتج يرتبط بمكتبة ICU بشكل ثابت، ويتضمن مجموعة فرعية من بيانات ICU (عادةً اللغة الإنجليزية فقط) داخل ملف node القابل للتنفيذ.

الوظائف التي تتطلب مكتبة ICU نفسها فقط، مثل String.prototype.normalize() و محلل عنوان URL الخاص بـ WHATWG، مدعومة بالكامل تحت small-icu. الميزات التي تتطلب بيانات لغة ICU بالإضافة إلى ذلك، مثل Intl.DateTimeFormat، تعمل عمومًا فقط مع اللغة الإنجليزية:

js
const january = new Date(9e8);
const english = new Intl.DateTimeFormat('en', { month: 'long' });
const spanish = new Intl.DateTimeFormat('es', { month: 'long' });

console.log(english.format(january));
// Prints "January"
console.log(spanish.format(january));
// Prints either "M01" or "January" on small-icu, depending on the user’s default locale
// Should print "enero"

يوفر هذا الوضع توازنًا بين الميزات وحجم الملف الثنائي.

توفير بيانات ICU في وقت التشغيل

إذا تم استخدام خيار small-icu، فلا يزال بإمكان المرء توفير بيانات لغة إضافية في وقت التشغيل حتى تعمل طرق JS لجميع لغات ICU. بافتراض أن ملف البيانات مخزن في /runtime/directory/with/dat/file، يمكن إتاحته لـ ICU من خلال أي مما يلي:

  • خيار التهيئة --with-icu-default-data-dir: هذا يقوم فقط بتضمين مسار دليل البيانات الافتراضي في الملف الثنائي. سيتم تحميل ملف البيانات الفعلي في وقت التشغيل من مسار هذا الدليل.
  • متغير البيئة NODE_ICU_DATA:
  • معلمة CLI --icu-data-dir:

عند تحديد أكثر من واحد منهم، يكون لمعلمة CLI --icu-data-dir الأسبقية القصوى، ثم متغير البيئة NODE_ICU_DATA، ثم خيار التهيئة --with-icu-default-data-dir.

تستطيع ICU العثور على مجموعة متنوعة من تنسيقات البيانات وتحميلها تلقائيًا، ولكن يجب أن تكون البيانات مناسبة لإصدار ICU، وأن يكون اسم الملف صحيحًا. الاسم الأكثر شيوعًا لملف البيانات هو icudtX[bl].dat، حيث يشير X إلى إصدار ICU المقصود، وتشير b أو l إلى اتجاه النهاية (Endianness) للنظام. سيفشل Node.js في التحميل إذا تعذر قراءة ملف البيانات المتوقع من الدليل المحدد. يمكن حساب اسم ملف البيانات المقابل لإصدار Node.js الحالي باستخدام:

js
`icudt${process.versions.icu.split('.')[0]}${os.endianness()[0].toLowerCase()}.dat`;

راجع مقالة "بيانات ICU" في دليل مستخدم ICU للحصول على تنسيقات أخرى مدعومة والمزيد من التفاصيل حول بيانات ICU بشكل عام.

يمكن لوحدة npm full-icu تبسيط تثبيت بيانات ICU إلى حد كبير عن طريق اكتشاف إصدار ICU للملف التنفيذي node قيد التشغيل وتنزيل ملف البيانات المناسب. بعد تثبيت الوحدة من خلال npm i full-icu، سيكون ملف البيانات متاحًا في ./node_modules/full-icu. يمكن بعد ذلك تمرير هذا المسار إما إلى NODE_ICU_DATA أو --icu-data-dir كما هو موضح أعلاه لتمكين دعم Intl الكامل.

تضمين ICU بالكامل (full-icu)

يجعل هذا الخيار الملف الثنائي الناتج يرتبط بـ ICU بشكل ثابت ويتضمن مجموعة كاملة من بيانات ICU. لا يحتوي الملف الثنائي الذي يتم إنشاؤه بهذه الطريقة على أي تبعيات خارجية أخرى ويدعم جميع اللغات، ولكنه قد يكون كبيرًا إلى حد ما. هذا هو السلوك الافتراضي إذا لم يتم تمرير علامة --with-intl. يتم أيضًا إنشاء الملفات الثنائية الرسمية في هذا الوضع.

الكشف عن دعم التدويل

للتحقق من تمكين ICU على الإطلاق (system-icu أو small-icu أو full-icu)، يكفي ببساطة التحقق من وجود Intl:

js
const hasICU = typeof Intl === 'object';

بدلاً من ذلك، يمكن التحقق من process.versions.icu، وهي خاصية يتم تعريفها فقط عند تمكين ICU:

js
const hasICU = typeof process.versions.icu === 'string';

للتحقق من دعم لغة غير إنجليزية (مثل full-icu أو system-icu)، يمكن أن يكون Intl.DateTimeFormat عاملاً مميزًا جيدًا:

js
const hasFullICU = (() => {
  try {
    const january = new Date(9e8);
    const spanish = new Intl.DateTimeFormat('es', { month: 'long' });
    return spanish.format(january) === 'enero';
  } catch (err) {
    return false;
  }
})();

لإجراء اختبارات أكثر تفصيلاً لدعم Intl، قد يكون من المفيد العثور على الموارد التالية:

  • btest402: يستخدم بشكل عام للتحقق مما إذا كان Node.js مع دعم Intl قد تم إنشاؤه بشكل صحيح.
  • Test262: تتضمن مجموعة اختبار التوافق الرسمية لـ ECMAScript قسمًا مخصصًا لـ ECMA-402.