Spec-Zone.ru › Node.js 10 LTS

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

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

  • Функции, чувствительные к регионо-языковым параметрам или учитывающие Unicode, в Спецификации языка ECMAScript:

    • String.prototype.normalize()
    • String.prototype.toLowerCase()
    • String.prototype.toUpperCase()
  • Все функциональные возможности, описанные в Спецификации ECMAScript Internationalization API (также известной как 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) использует 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() частичная (не учитывает языковые параметры) частичная/полная (зависит от ОС) частичная (только английский) полная
Парсер URL WHATWG частичная (нет поддержки IDN) полная полная полная
require('buffer').transcode() нет (функция не существует) полная полная полная
REPL частичная (неточное редактирование строки) полная полная полная
require('util').TextDecoder частичная (поддержка основных кодировок) частичная/полная (зависит от ОС) частичная (только Unicode) полная
RegExp Unicode Property Escapes нет (ошибка RegExp) полная полная полная

Отметка «(не учитывает языковые параметры)» означает, что функция выполняет свою операцию так же, как и её версия без учёта языковых параметров, если такая версия существует. Например, в режиме 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, можно предоставить дополнительные данные языковых вариантов во время выполнения, чтобы методы JavaScript работали для всех языковых вариантов 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.

Модуль 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 включает раздел, посвящённый ECMA-402.
END_OF_DOCUMENT_MARKER

© 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-v10.x/docs/api/intl.html

Spec-Zone.ru

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