Поддержка интернационализации
Node.js обладает множеством функций, которые облегчают написание интернационализированных программ. Некоторые из них:
- Функции, чувствительные к локали или работающие с Юникодом, в спецификации языка ECMAScript Спецификация языка ECMAScript:
- Все функциональные возможности, описанные в спецификации ECMAScript Internationalization API Спецификация API интернационализации ECMAScript (также известная как ECMA-402):
- Объект
Intl - Локально-чувствительные методы, такие как
String.prototype.localeCompare()иDate.prototype.toLocaleString()
- Объект
- Поддержка парсера URL WHATWG международных доменных имён (IDN)
require('buffer').transcode()- Более точное редактирование строки REPL
require('util').TextDecoderRegExpЭкранирование свойств Юникода
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 могут быть полезны следующие ресурсы:
© 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