Разное поведение Intl.NumberFormat в узле и браузере

#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 анализируются библиотеками во время запуска вашего приложения, но после запуска узла.