#node.js #icu
#node.js #отделение интенсивной терапии
Вопрос:
Если я запускаю этот код в браузере и узле, я получаю два разных результата:
const moneyFormatter = new Intl.NumberFormat('it-IT', {
style: 'currency',
currency: 'EUR',
minimumFractionDigits: 2
});
moneyFormatter.format(1);
Браузер: 1,00 €
Узел: €1.00
Ответ №1:
Отделение интенсивной терапии и узел
Эта проблема вызвана отсутствием данных ICU в сборке узла по умолчанию.
Документы Nodejs хорошо объясняют, как работает функция интернационализации:
Node.js (и его базовый движок V8) использует ICU для реализации этих функций в собственном коде C / C . Однако некоторым из них требуется очень большой файл данных ICU для поддержки всех локализаций мира.
В то же время это объясняет ограничения, которые у вас есть при сборке узла по умолчанию:
Поскольку ожидается, что большинство Node.js пользователи будут использовать только небольшую часть функциональности ICU, только подмножество полного набора данных ICU предоставляется Node.js по умолчанию.
И так:
Предусмотрено несколько опций для настройки и расширения набора данных ICU при сборке или запуске Node.js .
Быстрое решение
Установите full-icu
пакет npm, и все готово: все языковые стандарты будут установлены и будут доступны в вашем коде. Просто запустите приложение с выделенной переменной env, указывающей на путь установки набора данных icu:
NODE_ICU_DATA=node_modules/full-icu node YOURAPP.js
Или, используя параметр конкретного узла:
node --icu-data-dir=node_modules/full-icu YOURAPP.js
Единственным недостатком этого решения является пространство, необходимое для полного набора данных icu: ~ 27 МБ.
Медленное, но оптимизированное по объему решение
Скомпилируйте узел из исходных текстов, связав его только с определенным ICU.
Проверка доступных локализаций
Intl.NumberFormat.supportedLocalesOf('it')
Возвращает пустой массив []
, если языковой стандарт не поддерживается.
Он возвращает массив с идентификатором локали ['it']
, если локаль поддерживается.
Комментарии:
1. У меня возникли проблемы с выполнением быстрого решения. является YOURAPP.js например server.js или src/server.js ? У меня ничего из этого не работает. NODE_ICU_DATA должно быть определено в файле .env правильно?
2. @ Lull вам нужно проверить, где находится ваш основной js-файл в исходных текстах вашего приложения. Это может называться index, app или как угодно еще. Попробуйте поискать это в ваших скриптах package.json. Да, NODE_ICU_DATA — это переменная среды, но, вероятно, вам нужно передать ее в команде, потому что она должна быть прочитана узлом, а не из вашего приложения (узел запускается, затем загружает и выполняет ваше приложение). Обычно файлы .env анализируются библиотеками во время запуска вашего приложения, но после запуска узла.