Библиотека Globalize построена поверх стандарта CLDR (Unicode Common Locale Data Repository), который содержит локализационные данные для различных языков и регионов. Эти данные не встроены в библиотеку по умолчанию, а подключаются явно, что позволяет контролировать объём загружаемых ресурсов и уменьшать размер приложения.
CLDR-данные в Globalize делятся на две ключевые категории:
Разделение обусловлено тем, что supplemental-данные используются сразу несколькими локалями, тогда как main-дата привязана к конкретной культуре.
На практике CLDR-данные чаще всего берутся из npm-пакета:
cldr-data
Он содержит уже подготовленные JSON-файлы, соответствующие стандарту
CLDR. Эти файлы могут импортироваться напрямую через
require или import, в зависимости от
сборщика.
Структура пакета:
cldr-data/
main/
en/
ru/
fr/
supplemental/
Каждая локаль в main содержит набор JSON-файлов,
разбитых по категориям: числа, валюты, даты и т.д.
Globalize не работает без предварительной загрузки CLDR. Основной принцип состоит в том, что сначала загружаются данные, затем инициализируются форматтеры.
const Globalize = require("globalize");
const cldrData = require("cldr-data");
После этого выполняется загрузка supplemental-данных.
Supplemental-данные являются обязательной основой для работы Globalize. Без них невозможна корректная работа с локалями, числами и календарями.
Ключевые компоненты:
Используется для автоматического расширения локали.
Globalize.load(
require("cldr-data/supplemental/likelySubtags")
);
Функция обеспечивает преобразование упрощённых локалей:
en → en-Latn-USru → ru-Cyrl-RUЭто необходимо для унификации обработки данных.
Определяет системы нумерации, используемые в разных культурах.
Globalize.load(
require("cldr-data/supplemental/numberingSystems")
);
Поддерживаются различные системы:
Globalize использует эти данные для корректного отображения чисел.
Эти структуры описывают особенности календарных систем:
Globalize.load(
require("cldr-data/supplemental/timeData"),
require("cldr-data/supplemental/weekData")
);
Содержат информацию о:
Финансовая и грамматическая локализация требует дополнительных данных:
Globalize.load(
require("cldr-data/supplemental/currencyData"),
require("cldr-data/supplemental/plurals")
);
Plurals определяют правила множественного числа, которые отличаются в разных языках.
После загрузки supplemental необходимо подключить конкретные языковые данные. Пример для английской локали:
Globalize.load(
require("cldr-data/main/en/ca-gregorian"),
require("cldr-data/main/en/numbers"),
require("cldr-data/main/en/currencies"),
require("cldr-data/main/en/timeZoneNames")
);
Каждый файл отвечает за отдельный аспект локализации:
ca-gregorian — календарная системаnumbers — форматирование чиселcurrencies — валютыtimeZoneNames — названия временных зонGlobalize поддерживает мультилингвальные приложения, в которых данные загружаются сразу для нескольких языков.
Globalize.load(
require("cldr-data/main/en/numbers"),
require("cldr-data/main/ru/numbers"),
require("cldr-data/main/fr/numbers")
);
Такой подход используется в интерфейсах, где переключение языка происходит динамически без перезагрузки данных.
После загрузки CLDR необходимо задать активную локаль:
Globalize.locale("ru");
Эта операция не загружает данные, а лишь определяет контекст форматирования.
Важно, что без предварительно загруженных CLDR-данных вызов локализации приводит к ошибкам или некорректным результатам.
Корректная последовательность загрузки критична:
const Globalize = require("globalize");
Globalize.load(
require("cldr-data/supplemental/likelySubtags"),
require("cldr-data/supplemental/numberingSystems"),
require("cldr-data/supplemental/timeData"),
require("cldr-data/supplemental/weekData"),
require("cldr-data/supplemental/currencyData"),
require("cldr-data/supplemental/plurals")
);
Globalize.load(
require("cldr-data/main/ru/numbers"),
require("cldr-data/main/ru/currencies"),
require("cldr-data/main/ru/ca-gregorian"),
require("cldr-data/main/en/numbers"),
require("cldr-data/main/en/currencies"),
require("cldr-data/main/en/ca-gregorian")
);
Globalize.locale("ru");
Архитектура CLDR в Globalize ориентирована на ленивую загрузку данных. Это позволяет:
В крупных приложениях используется динамическая подгрузка локалей:
async function loadLocale(locale) {
Globalize.load(
require(`cldr-data/main/${locale}/numbers`),
require(`cldr-data/main/${locale}/currencies`),
require(`cldr-data/main/${locale}/ca-gregorian`)
);
Globalize.locale(locale);
}
CLDR-файлы представляют собой строго структурированные JSON-документы. Пример логики:
Фрагмент условной структуры:
{
"main": {
"en": {
"numbers": {
"defaultNumberingSystem": "latn",
"symbols-numberSystem-latn": {
"decimal": ".",
"group": ","
}
}
}
}
}
Globalize не интерпретирует JSON как код — он лишь индексирует и использует значения.
Если для локали отсутствует конкретный файл, Globalize может использовать fallback через likelySubtags, однако поведение зависит от доступных supplemental-данных.
Типичный сценарий:
en-GBenНеполная или некорректная загрузка CLDR приводит к характерным проблемам:
Наиболее частая причина — отсутствие supplemental-данных, особенно
likelySubtags.
В крупных приложениях используется точечная загрузка:
Пример стратегии:
en + supplementalПосле загрузки CLDR данные становятся основой для всех форматтеров:
Globalize.numberFormatter()Globalize.dateFormatter()Globalize.currencyFormatter()Globalize.plural()Каждый форматтер обращается к CLDR-структурам во время выполнения, а не на этапе сборки, что обеспечивает гибкость, но требует корректной инициализации данных.
Supplemental-слой выполняет роль связующего механизма между локалями:
Без него main-данные остаются изолированными и не могут корректно взаимодействовать между собой в мультилингвальных сценариях.