Библиотека Globalize строится поверх стандарта Unicode CLDR (Common Locale Data Repository). Вся работа с локализацией — форматирование дат, чисел, валют, единиц измерения, сообщений и правил множественного числа — зависит от данных CLDR. Без этих данных Globalize не способен выполнять интернационализацию.
CLDR представляет собой крупнейшее хранилище локализационных данных, поддерживаемое консорциумом Unicode. В него входят:
Globalize не содержит встроенного полного набора локализационных данных. Вместо этого библиотека использует внешние JSON-файлы CLDR, подключаемые отдельно.
Каждая версия CLDR содержит:
Версии CLDR выходят независимо от версий Globalize. Это означает, что:
Структурно данные CLDR распространяются через набор npm-пакетов:
cldr-core
cldr-dates-modern
cldr-numbers-modern
cldr-units-modern
cldr-cal-buddhist-modern
Каждый пакет соответствует отдельному разделу локализационной информации.
Первые версии CLDR содержали ограниченное количество локалей и сравнительно простую структуру данных. В старых релизах:
Globalize 0.x работал преимущественно с ранними XML-структурами CLDR.
Период активной стандартизации структуры JSON-данных.
Основные изменения:
Именно в этот период Globalize начал переходить к более стабильной интеграции с JSON-данными CLDR.
Наиболее важный этап развития для современных приложений.
Появились:
Многие современные версии Globalize ориентированы именно на эти поколения CLDR.
Новые версии CLDR сосредоточены на:
Для приложений с долгосрочной поддержкой рекомендуется использовать актуальные версии CLDR.
Старые версии Globalize:
Поддержка таких версий сегодня практически отсутствует.
Globalize 1.x полностью перешёл на архитектуру CLDR JSON.
Для корректной работы требуется:
Globalize.load(require("cldr-data").entireSupplemental());
Globalize.load(require("cldr-data").entireMainFor("en"));
В этой архитектуре:
Пакеты CLDR обычно публикуются отдельно от Globalize.
Пример:
npm install cldr-data
Или:
npm install cldr-core
npm install cldr-dates-modern
npm install cldr-numbers-modern
Версии могут выглядеть так:
{
"cldr-core": "^43.1.0",
"globalize": "^1.7.0"
}
Важно понимать, что:
CLDR распространяется в двух основных вариантах.
Содержит:
Пример:
cldr-dates-modern
Преимущества:
Недостаток — отсутствие редких локалей.
Содержит полный набор локалей.
Пример:
cldr-dates-full
Особенности:
Одной из главных проблем при обновлении CLDR являются изменения структуры JSON.
Например, путь:
main.en.numbers
может сохраняться, но внутренние свойства изменяются.
Некоторые версии CLDR:
Из-за этого старые приложения могут неожиданно ломаться после обновления данных.
Версию CLDR можно определить несколькими способами.
{
"dependencies": {
"cldr-core": "43.1.0"
}
}
const pkg = require("cldr-core/package.json");
console.log(pkg.version);
npm list cldr-core
Plural rules могут изменяться между версиями.
Пример:
const pluralGenerator =
Globalize("ru").pluralGenerator();
console.log(pluralGenerator(1));
Результат может отличаться между версиями CLDR.
CLDR регулярно обновляет:
Например:
const formatter =
Globalize("en").currencyFormatter("USD");
console.log(formatter(10));
Формат отображения может измениться после обновления CLDR.
Некоторые временные зоны:
Это особенно критично для:
Наиболее безопасный подход:
{
"cldr-core": "43.1.0"
}
Вместо:
{
"cldr-core": "^43.1.0"
}
Фиксированная версия предотвращает неожиданные изменения после установки зависимостей.
После обновления CLDR необходимо проверять:
Особенно важно тестировать:
Крупные приложения часто:
Новые версии CLDR обычно содержат больше данных.
Это влияет на:
Пример загрузки только необходимых данных:
Globalize.load(
require("cldr-data/main/en/numbers.json"),
require("cldr-data/main/en/ca-gregorian.json"),
require("cldr-data/supplemental/numberingSystems.json")
);
Подход selective loading значительно уменьшает bundle size.
Для автоматической загрузки конкретных версий CLDR используется пакет:
npm install cldr-data-downloader
Пример:
const downloader =
require("cldr-data-downloader");
downloader({
cldrVersion: "43.1.0"
});
Это полезно для:
Полезная практика — snapshot testing.
Пример:
const result =
Globalize("fr").formatNumber(12345.67);
expect(result).toBe("12 345,67");
После обновления CLDR тесты позволяют быстро обнаружить изменения.
Особую роль играют supplemental datasets:
supplemental/plurals.json
supplemental/timeData.json
supplemental/weekData.json
Именно эти данные чаще всего меняются между версиями CLDR.
Они определяют:
Новые версии CLDR активно используют locale aliases.
Например:
zh-CN
может автоматически сопоставляться с:
zh-Hans-CN
Такие изменения способны влиять на:
Каждая новая версия CLDR добавляет:
Например:
Globalize автоматически получает поддержку этих локалей после загрузки соответствующих данных.
Полный CLDR может занимать десятки мегабайт.
Поэтому в production-приложениях применяются:
Пример динамической загрузки:
async function loadLocale(locale) {
const data =
await import(
`cldr-data/main/${locale}/numbers.json`
);
Globalize.load(data.default);
}
CLDR часто используется совместно с ICU (International Components for Unicode).
Связь между ними:
Во многих средах:
Из-за различий версий результаты форматирования могут отличаться.
Для современных проектов рекомендуется:
const Globalize = require("globalize");
Globalize.load(
require("cldr-data/supplemental/likelySubtags.json"),
require("cldr-data/supplemental/numberingSystems.json"),
require("cldr-data/supplemental/plurals.json"),
require("cldr-data/main/en/numbers.json"),
require("cldr-data/main/en/ca-gregorian.json")
);
Globalize.locale("en");
const formatter =
Globalize.numberFormatter();
console.log(formatter(12345.67));
В этой конфигурации: