Spec-Zone.ru › Node.js 8 LTS

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

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

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

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

Примечание: Пометка «(не учитывает локаль)» означает, что функция выполняет свою операцию так же, как и нелокализованная версия функции, если она существует. Например, в режиме none, операция Date.prototype.toLocaleString() идентична операции Date.prototype.toString().

Отключить все функции интернационализации (none)

Если выбран этот параметр, большинство функций интернационализации, упомянутых выше, будут недоступны в двоичном файле 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"

Этот режим обеспечивает хороший баланс между функциональностью и размером двоичного файла и является по умолчанию, если не указан флаг --with-intl . Официальные двоичные файлы также создаются в этом режиме.

Обеспечение данных 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, а файл должен быть правильно назван. Наиболее распространённое имя файла данных — icudt5X[bl].dat, где 5X обозначает целевую версию 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. Двоичный файл, созданный таким образом, не имеет дополнительных внешних зависимостей и поддерживает все языковые локали, но может быть довольно большим. См. BUILDING.md о том, как скомпилировать двоичный файл с использованием этого режима.

Обнаружение поддержки интернационализации

Чтобы убедиться, что 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 включает раздел, посвящённый ECMAScript-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-v8.x/docs/api/intl.html

Spec-Zone.ru

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