Spec-Zone.ru › Node.js 14 LTS

Поддержка интернационализации

Node.js обладает множеством функций, которые облегчают написание интернационализированных программ. Некоторые из них:

  • Функции, чувствительные к локали или работающие с Юникодом, в спецификации языка ECMAScript Спецификация языка ECMAScript:
    • String.prototype.normalize()
    • String.prototype.toLowerCase()
    • String.prototype.toUpperCase()
  • Все функциональные возможности, описанные в спецификации ECMAScript Internationalization API Спецификация API интернационализации ECMAScript (также известная как ECMA-402):
    • Объект Intl
    • Локально-чувствительные методы, такие как String.prototype.localeCompare() и Date.prototype.toLocaleString()
  • Поддержка парсера URL WHATWG международных доменных имён (IDN)
  • require('buffer').transcode()
  • Более точное редактирование строки REPL
  • require('util').TextDecoder
  • RegExp Экранирование свойств Юникода

Node.js и базовый движок V8 используют International Components for 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 WHATWG частично (нет поддержки IDN) полностью полностью полностью
require('buffer').transcode() нет (функция не существует) полностью полностью полностью
REPL частично (неточное редактирование строки) полностью полностью полностью
require('util').TextDecoder частично (поддержка основных кодировок) частично/полностью (зависит от ОС) частично (только Юникод) полностью
RegExp Экранирование свойств Юникода нет (ошибка RegExp) полностью полностью полностью

Отметка "(не учитывает локаль)" означает, что функция выполняет свою операцию так же, как и версия функции без учёта локали, если она существует. Например, в режиме 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 "M01" on small-icu
// Should print "enero"

Этот режим обеспечивает баланс между функциями и размером бинарника.

Обеспечение данных ICU во время выполнения

Если используется small-icu вариант, можно дополнительно предоставить данные локали во время выполнения, чтобы методы JS работали со всеми локалями ICU. Предполагая, что файл данных хранится по адресу /some/directory, он может быть предоставлен ICU с помощью:

  • Переменной среды NODE_ICU_DATA:

    env NODE_ICU_DATA=/some/directory node
  • Параметра командной строки --icu-data-dir:

    node --icu-data-dir=/some/directory

(Если оба параметра указаны, параметр командной строки --icu-data-dir имеет приоритет.)

ICU может автоматически находить и загружать различные форматы данных, но данные должны быть подходящими для версии ICU, а файл должен быть правильно назван. Наиболее распространённое имя файла данных — icudt6X[bl].dat, где 6X обозначает целевую версию ICU, а b или l указывает порядок следования байтов в системе.

См. статью «ICU Data» в руководстве пользователя ICU по другим поддерживаемым форматам и дополнительным сведениям о данных ICU в целом. "ICU Data"

Модуль 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 могут быть полезны следующие ресурсы:

  • btest402: обычно используется для проверки того, что Node.js со Intl поддержкой собран правильно.
  • Test262: официальный набор тестовых примеров соответствия ECMAScript включает раздел, посвященный ECMA-402.

© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v14.x/docs/api/intl.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API