دعم التدويل
يحتوي Node.js على العديد من الميزات التي تجعل من السهل كتابة البرامج المدولة. بعضها:
الدوال الحساسة للإعدادات المحلية أو المدركة لـ Unicode في مواصفات لغة ECMAScript:
جميع الوظائف الموصوفة في مواصفات واجهة برمجة تطبيقات تدويل ECMAScript (المعروفة أيضًا باسم ECMA-402):
- كائن
Intl
- الطرق الحساسة للإعدادات المحلية مثل
String.prototype.localeCompare()
وDate.prototype.toLocaleString()
- كائن
دعم أسماء النطاقات المدولة (IDNs) لـ محلل عنوان URL الخاص بـ WHATWG
تحرير خطوط REPL أكثر دقة
يستخدم 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
:
الميزة | none | system-icu | small-icu | full-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
، تعمل عمومًا فقط مع اللغة الإنجليزية:
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 الحالي باستخدام:
`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
:
const hasICU = typeof Intl === 'object';
بدلاً من ذلك، يمكن التحقق من process.versions.icu
، وهي خاصية يتم تعريفها فقط عند تمكين ICU:
const hasICU = typeof process.versions.icu === 'string';
للتحقق من دعم لغة غير إنجليزية (مثل full-icu
أو system-icu
)، يمكن أن يكون Intl.DateTimeFormat
عاملاً مميزًا جيدًا:
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
، قد يكون من المفيد العثور على الموارد التالية: