Spec-Zone.ru › Node.js 18 LTS

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

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

  • Функции, чувствительные к региону или Unicode, в спецификации языка ECMAScript ECMAScript Language Specification:
    • String.prototype.normalize()
    • String.prototype.toLowerCase()
    • String.prototype.toUpperCase()
  • Все функциональные возможности, описанные в спецификации ECMAScript Internationalization API ECMAScript Internationalization API Specification (также известной как ECMA-402):
    • Объект Intl
    • Регионально-чувствительные методы, такие как String.prototype.localeCompare() и Date.prototype.toLocaleString()
  • Поддержка парсера URL WHATWG для международных доменных имён (IDN)
  • require('node:buffer').transcode()
  • Более точное редактирование строки в REPL REPL
  • require('node: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('node:buffer').transcode() отсутствует (функция не существует) полный полный полный
REPL частичный (неточное редактирование строки) полный полный полный
require('node:util').TextDecoder частичный (поддержка основных кодировок) частичный/полный (зависит от ОС) частичный (только Unicode) полный
RegExp Unicode Property Escapes отсутствует (ошибка 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 either "M01" or "January" on small-icu, depending on the user’s default locale
// Should print "enero" copy

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

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

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

  • Переменную среды NODE_ICU_DATA:

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

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

(Если оба параметра указаны, параметр командной строки --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'; copy

Альтернативно, проверка наличия process.versions.icu, свойства, определённого только при включённом ICU, тоже работает:

const hasICU = typeof process.versions.icu === 'string'; copy

Для проверки поддержки неанглийского региона (т. е. 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;
  }
})(); copy

Для более подробных тестов поддержки 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-v18.x/docs/api/intl.html

Spec-Zone.ru

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