Библиотека Globalize опирается на данные CLDR (Unicode Common Locale Data Repository), которые содержат локализованные правила для чисел, дат, валют, единиц измерения и языковых форм. После загрузки этих данных в рантайм JavaScript-приложения важно понимать, что именно оказалось доступно, в каком объёме и для каких локалей.
Загруженные данные не являются абстрактной сущностью — они формируют конкретное состояние системы интернационализации, которое можно анализировать и проверять. Ошибки локализации чаще всего связаны не с самим API Globalize, а с неполнотой или некорректной загрузкой CLDR-веток.
Globalize использует несколько типов данных CLDR:
После загрузки эти данные не хранятся как единый объект, а распределяются внутри внутреннего слоя CLDR.js, который Globalize использует как адаптер.
Ключевой момент: отсутствие одного сегмента данных может привести к частичной деградации функциональности, например:
Globalize предоставляет доступ к внутреннему CLDR-хранилищу через
интерфейс Globalize.cldr.
Globalize.locale("ru");
console.log(Globalize.cldr.attributes);
Этот объект отражает активную локаль и связанные с ней метаданные. Однако более практичный способ инспекции заключается в проверке загрузки необходимых веток CLDR.
CLDR-данные загружаются вручную через
Globalize.load():
Globalize.load(
require("cldr-data/supplemental/likelySubtags"),
require("cldr-data/main/ru/numbers"),
require("cldr-data/main/ru/currencies"),
require("cldr-data/supplemental/plurals")
);
После загрузки можно проверить, какие части реально доступны, через обращение к внутренним структурам CLDR:
const cldr = Globalize.cldr;
console.log(cldr.main("ru"));
Если доступ к данным отсутствует, вызов приведёт к исключению. Это один из базовых способов диагностики неполной загрузки.
Практическая инспекция чаще всего выполняется не напрямую через CLDR, а через попытку использования функциональности Globalize.
const formatNumber = Globalize.numberFormatter();
console.log(formatNumber(123456.789));
Если отсутствуют данные numbers.json, форматирование
может использовать дефолтные правила или выбросить ошибку.
const formatCurrency = Globalize.currencyFormatter("USD");
console.log(formatCurrency(1000));
Отсутствие currencies.json или numbers.json
приводит к некорректному форматированию или fallback-поведениям.
const formatDate = Globalize.dateFormatter({ datetime: "medium" });
console.log(formatDate(new Date()));
Для корректной работы требуется наличие:
ca-gregoriantimeZoneNamesdateFieldsОдним из наиболее чувствительных к данным компонентов являются plural rules.
const plural = Globalize.pluralGenerator();
console.log(plural(1));
console.log(plural(2));
Если отсутствует supplemental/plurals, функция может
возвращать некорректные категории или использовать упрощённые
fallback-правила (other для всех значений).
Globalize не предоставляет прямого списка загруженных локалей, однако их можно определить косвенно через загруженные CLDR-ветки.
console.log(Globalize.locale().locale);
Смена локали:
Globalize.locale("ru");
Globalize.locale("en");
Если данные для локали не загружены, поведение будет некорректным или произойдёт ошибка при первом обращении к форматтеру.
Сообщения приложения подключаются отдельно:
Globalize.loadMessages({
ru: {
greeting: "Привет",
farewell: "Пока"
}
});
Инспекция доступности сообщений выполняется через их непосредственное извлечение:
const message = Globalize.messageFormatter("greeting");
console.log(message());
Если ключ отсутствует, результатом будет undefined или
fallback-строка.
CLDR внутри Globalize можно рассматривать как дерево JSON-структур. Доступ к нему возможен через путь:
Globalize.cldr.get(["main", "ru", "numbers"]);
или через более прямые обращения:
Globalize.cldr.main("ru").numbers
Такая форма инспекции позволяет проверить:
Типичная проблема — частичная загрузка CLDR. Например, подключены числа и валюты, но отсутствуют даты. В этом случае система работает, но с ограничениями.
Проверка целостности часто сводится к последовательному тестированию ключевых функций:
const checks = {
number: () => Globalize.numberFormatter()(123),
currency: () => Globalize.currencyFormatter("EUR")(123),
date: () => Globalize.dateFormatter()(new Date()),
plural: () => Globalize.plural(1)
};
Object.keys(checks).forEach(key => {
try {
console.log(key, checks[key]());
} catch (e) {
console.log(key, "missing data");
}
});
Такой подход выявляет отсутствующие сегменты данных без анализа внутренней структуры CLDR.
Globalize не всегда явно сообщает о нехватке данных. В зависимости от типа API возможны три сценария:
other для plural
rules)Наиболее критичными являются отсутствующие:
supplemental/pluralsmain/<locale>/numbersmain/<locale>/ca-gregorianНа практике загрузка данных часто разбивается на этапы, что упрощает диагностику:
Globalize.load(
require("cldr-data/supplemental/likelySubtags")
);
Globalize.load(
require("cldr-data/main/ru/numbers")
);
Globalize.loadMessages({
ru: {
hello: "Здравствуйте"
}
});
После каждого этапа можно тестировать соответствующие функции, фиксируя момент, на котором появляется деградация функциональности.
Supplemental-данные CLDR являются связующим слоем между локалями. Их отсутствие особенно сложно диагностировать, поскольку ошибки проявляются не напрямую, а через некорректные результаты вычислений.
Критические supplemental-блоки:
Их отсутствие часто приводит к тому, что локаль существует формально, но не функционирует полноценно.
Инспекция часто основывается на наблюдении поведения API:
Такие признаки указывают на отсутствие ключевых CLDR-веток, даже если ошибки не выбрасываются явно.
Для диагностики можно сравнивать поведение разных локалей:
Globalize.locale("en");
const enFormatter = Globalize.numberFormatter();
Globalize.locale("ru");
const ruFormatter = Globalize.numberFormatter();
console.log(enFormatter(1000), ruFormatter(1000));
Различие в выводе подтверждает корректную загрузку локалей и их данных.
Если результаты совпадают полностью, это часто сигнализирует о fallback-режиме.
Инспекция загруженных данных в Globalize фактически заменяет традиционные unit-тесты локализации. Она позволяет выявлять:
Стабильная работа интернационализации зависит не от количества подключённых локалей, а от полноты и согласованности структуры данных CLDR, лежащей под ними.