Skip to content

دعم الدبلجة

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

تستخدم 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:

الميزة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لا شيء (خطأ 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))
// يطبع "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 الحالي باستخدام:

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.