دعم الدبلجة
تتميز 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++ الأصلي. توفر Node.js مجموعة بيانات ICU الكاملة افتراضيًا. ومع ذلك، نظرًا لحجم ملف بيانات 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 | لا شيء (خطأ 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))
// يطبع "January"
console.log(spanish.format(january))
// يطبع إما "M01" أو "January" على small-icu، اعتمادًا على إعدادات المنطقة الافتراضية للمستخدم
// يجب أن يطبع "enero"
يوفر هذا الوضع توازنًا بين الميزات وحجم الملف.
توفير بيانات ICU وقت التشغيل
إذا تم استخدام خيار small-icu
، فلا يزال بإمكانك توفير بيانات إقليمية إضافية وقت التشغيل بحيث تعمل طرق JS لجميع مواقع ICU. بافتراض أن ملف البيانات مخزّن في /runtime/directory/with/dat/file
، يمكن جعله متاحًا لـ ICU من خلال:
- خيار التكوين
--with-icu-default-data-dir
: هذا لا يدمج سوى مسار دليل البيانات الافتراضي في الملف الثنائي. سيتم تحميل ملف البيانات الفعلي وقت التشغيل من مسار هذا الدليل. - متغير البيئة
NODE_ICU_DATA
: - معلمة سطر الأوامر
--icu-data-dir
:
عندما يتم تحديد أكثر من واحد منها، فإن لمعلمة سطر الأوامر --icu-data-dir
أعلى أولوية، ثم متغير البيئة NODE_ICU_DATA
، ثم خيار التكوين --with-icu-default-data-dir
.
تستطيع ICU العثور على مجموعة متنوعة من تنسيقات البيانات وتحميلها تلقائيًا، ولكن يجب أن تكون البيانات مناسبة لإصدار ICU، وأن يكون الملف مسمى بشكل صحيح. الاسم الأكثر شيوعًا لملف البيانات هو icudtX[bl].dat
، حيث يشير X
إلى إصدار ICU المقصود، ويشير b
أو l
إلى ترتيب البايتات للنظام. سيفشل 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
، قد تكون الموارد التالية مفيدة: