Spec-Zone.ru › Node.js 16 LTS

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

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

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

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 (старая версия) частичная (нет поддержки IDN) полная полная полная
Парсер URL WHATWG частичная (нет поддержки IDN) полная полная полная
require('buffer').transcode() нет (функция не существует) полная полная полная
REPL частичная (неточное редактирование строк) полная полная полная
require('util').TextDecoder частичная (поддержка основных кодировок) частичная/полная (зависит от ОС) частичная (только Unicode) полная
RegExp Unicode Property Escapes нет (ошибка 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 "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"» в руководстве пользователя 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 могут быть полезны следующие ресурсы:

  • 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-v16.x/docs/api/intl.html

Spec-Zone.ru

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