Globalize опирается на данные CLDR (Unicode Common Locale Data Repository), поэтому понятие «поддерживаемая локаль» в контексте этой библиотеки не является фиксированным списком, встроенным в рантайм. Поддержка локалей определяется исключительно тем, какие наборы данных были загружены и зарегистрированы в процессе инициализации.
Архитектура локализации строится вокруг принципа «данные отдельно от логики». Это означает:
Таким образом, проверка покрытия локалей — это проверка состояния загруженного CLDR-контекста.
Состояние покрытия локали в Globalize определяется наличием следующих групп данных:
Если хотя бы один критический набор отсутствует, локаль считается неполноценной.
Перед проверкой локалей необходимо понимать, что они становятся «доступными» только после загрузки:
import Globalize from "globalize";
import likelySubtags from "cldr-core/supplemental/likelySubtags.json";
import numbers from "cldr-numbers-full/main/ru/numbers.json";
import currencies from "cldr-numbers-full/main/ru/currencies.json";
import caGregorian from "cldr-dates-full/main/ru/ca-gregorian.json";
import timeZoneNames from "cldr-dates-full/main/ru/timeZoneNames.json";
Globalize.load(
likelySubtags,
numbers,
currencies,
caGregorian,
timeZoneNames
);
Globalize.locale("ru");
Фактически, наличие локали «ru» в системе означает, что соответствующие CLDR-данные загружены.
Текущая локаль отражает только выбранный контекст, а не покрытие:
Globalize.locale(); // "ru"
Этот вызов полезен для диагностики, но не подтверждает наличие всех необходимых данных.
Наиболее надёжный способ проверки покрытия локали — попытка выполнить операции форматирования. Если данные отсутствуют, библиотека выбросит ошибку.
const formatNumber = Globalize.numberFormatter();
formatNumber(12345.67);
Если локаль не покрыта, ошибка возникает на этапе инициализации formatter.
const formatCurrency = Globalize.currencyFormatter("USD");
formatCurrency(100);
Отсутствие currencies.json или связанных данных делает
форматирование невозможным.
const formatDate = Globalize.dateFormatter({ datetime: "medium" });
formatDate(new Date());
Недостаток ca-gregorian или timeZoneNames
приводит к исключениям.
CLDR содержит вспомогательные структуры, которые позволяют определить потенциально поддерживаемые локали.
На практике используется следующий подход:
cldr-dataПример ручного реестра:
const loadedLocales = new Set(["ru", "en", "de"]);
function isLocaleSupported(locale) {
return loadedLocales.has(locale);
}
Это упрощённая модель, применяемая в приложениях поверх Globalize.
CLDR содержит механизм likelySubtags, который позволяет
определять расширенные локали (например, en →
en-Latn-US).
Если данные likelySubtags загружены, можно проверить
расширяемость локали:
import Globalize from "globalize";
Globalize.load(require("cldr-core/supplemental/likelySubtags.json"));
const resolved = Globalize.locale("en").locale;
Это позволяет оценить, может ли локаль быть корректно «развернута» в полноценный набор правил.
Хотя это не часть Globalize, часто применяется как вспомогательный механизм:
Intl.DateTimeFormat.supportedLocalesOf(["ru", "fr", "xx"]);
Результат:
В реальных приложениях покрытие локали оценивается по трём уровням:
Типичные симптомы отсутствия данных:
Пример защитной проверки:
function assertLocaleReady(locale) {
try {
Globalize.locale(locale);
Globalize.numberFormatter()(1);
Globalize.dateFormatter()(new Date());
return true;
} catch (e) {
return false;
}
}
В крупных системах формируется таблица поддержки:
Пример структуры:
const localeCoverage = {
ru: { numbers: true, dates: true, currencies: true },
en: { numbers: true, dates: true, currencies: true },
fr: { numbers: true, dates: false, currencies: true }
};
Это позволяет управлять деградацией интерфейса без ошибок выполнения.
Globalize не реализует автоматическую «магическую» подмену локалей. При неполных данных поведение выражается в:
В сборочных пайплайнах часто применяется проверка:
Пример псевдологики:
const requiredLocales = ["ru", "en", "de"];
requiredLocales.forEach(locale => {
if (!isLocaleSupported(locale)) {
throw new Error(`Locale missing: ${locale}`);
}
});
Покрытие локалей в Globalize — это не свойство библиотеки, а характеристика загруженного набора данных CLDR. Проверка строится вокруг: