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