Библиотека Globalize строится поверх набора стандартов CLDR (Common Locale Data Repository), где вся локализационная информация представлена в виде структурированных JSON-данных: форматы чисел, валют, дат, календарные системы, правила плюрализации, относительное время и множество других категорий.
Ключевая особенность архитектуры Globalize заключается в том, что библиотека не содержит локали «из коробки». Любая операция форматирования или парсинга требует предварительно загруженных данных. Отсюда возникает центральная проблема: отсутствие необходимых фрагментов локали в рантайме приводит не к мягкому fallback, а к ошибкам выполнения.
Globalize не работает автономно. Он опирается на следующие группы данных:
cldr/supplemental/likelySubtagscldr/supplemental/pluralscldr/supplemental/timeDatacldr/main/{locale}/numberscldr/main/{locale}/ca-gregoriancldr/main/{locale}/currenciescldr/main/{locale}/dateFieldsКаждая функция форматирования требует строго определённого подмножества этих данных. Например:
ca-gregorian +
dateFields + timeZoneNames (частично)numbers +
currenciesdateFields +
timeData + pluralsОтсутствие любого из этих блоков приводит к невозможности корректного выполнения операции.
Сценарий возникает, когда локаль вообще не загружена:
Globalize.locale("fr-FR");
Globalize.formatDate(new Date());
// Ошибка: отсутствуют данные для локали fr-FR
Внутренне Globalize проверяет наличие пакета
cldr/main/fr/. Если он не загружен, создаётся исключение,
поскольку библиотека не может построить форматтер.
Особенность поведения:
enБолее сложный случай — загружены только отдельные части CLDR:
Globalize.load(
require("cldr-data/supplemental/likelySubtags"),
require("cldr-data/main/ru/numbers")
);
Globalize.locale("ru");
Globalize.formatDate(new Date());
Ошибка возникает даже при наличии числовых данных, потому что
отсутствует календарный модуль ca-gregorian.
Поведение Globalize в таких условиях строго детерминировано:
Supplemental-данные — критический слой, который часто упускается при ручной сборке локалей.
Наиболее важные блоки:
likelySubtagspluralsnumberingSystemsПример ошибки при отсутствии plurals:
Globalize.formatMessage("{count, plural, one {# item} other {# items}}", {
count: 3
});
При отсутствии правил множественного числа:
pluralGlobalize не выполняет ленивую подгрузку. Все зависимости должны быть доступны до вызова функций.
Внутренний принцип:
RuntimeErrorПример типичного сценария:
Globalize.load(
require("cldr-data/supplemental/likelySubtags"),
require("cldr-data/supplemental/plurals"),
require("cldr-data/main/ru/numbers")
);
Globalize.locale("ru");
const numberFormatter = Globalize.numberFormatter();
numberFormatter(12345);
Если отсутствует numberingSystems, результат будет
недоступен, даже если числа формально загружены.
Наиболее частая группа проблем связана с датами.
Globalize.load(
require("cldr-data/main/en/numbers"),
require("cldr-data/supplemental/likelySubtags")
);
Globalize.locale("en");
Globalize.formatDate(new Date());
Результат:
Globalize требует наличие структуры:
cldr.main.<locale>.dates.calendars.gregorian
Даже при наличии календаря возможны ошибки в относительном времени:
Globalize.formatRelativeTime(-1, "day");
Без dateFields:
Работа с валютами требует одновременного наличия:
numbers)currencies)Пример проблемной конфигурации:
Globalize.load(
require("cldr-data/main/ja/numbers")
);
Globalize.locale("ja");
Globalize.currencyFormatter("JPY")(1000);
Ошибка возникает из-за отсутствия currencies, даже если
числовой формат присутствует.
Внутреннее поведение:
currencies невозможно определить позицию
символаМножественные числа — один из наиболее чувствительных компонентов CLDR.
Globalize.load(
require("cldr-data/supplemental/likelySubtags")
);
Globalize.locale("en");
Globalize.plural(1);
Без supplemental/plurals невозможна даже базовая
классификация чисел:
Отсутствие этих правил блокирует:
Globalize не предоставляет встроенного диагностического режима, однако состояние можно анализировать через косвенные методы.
try {
Globalize.dateFormatter();
} catch (e) {
console.log(e.message);
}
Типичные сообщения:
Так как CLDR загружается как JSON:
const cldr = Globalize.cldr;
console.log(cldr.main("ru").dates);
При отсутствии данных:
undefined на уровне ключейБазовый набор, необходимый почти для всех сценариев:
supplemental/likelySubtagssupplemental/pluralssupplemental/numberingSystemsmain/{locale}/numbersmain/{locale}/ca-gregorianmain/{locale}/currenciesmain/{locale}/dateFieldsТакой набор обеспечивает стабильную работу большинства API Globalize.
При использовании bundler’ов (Webpack, Rollup, Vite):
Типичный источник ошибок:
numberssupplementalРекомендуемый подход — централизованная загрузка:
import Globalize from "globalize";
import likelySubtags from "cldr-data/supplemental/likelySubtags";
import plurals from "cldr-data/supplemental/plurals";
import numbers from "cldr-data/main/ru/numbers";
import calendar from "cldr-data/main/ru/ca-gregorian";
import currencies from "cldr-data/main/ru/currencies";
import dateFields from "cldr-data/main/ru/dateFields";
Globalize.load(
likelySubtags,
plurals,
numbers,
calendar,
currencies,
dateFields
);
Globalize.locale("ru");
Отсутствие любого элемента приводит к деградации всей цепочки форматирования.
Globalize придерживается строгой модели:
Это означает:
В отличие от библиотек с мягким fallback (например, Intl API браузера), Globalize требует полного соответствия структуре данных CLDR перед выполнением операций.
При переключении локали:
Globalize.locale("en");
Globalize.locale("ru");
данные не «переключаются» автоматически. Они уже должны быть загружены заранее.
Отсутствие данных для одной из локалей приводит к ошибкам только при фактическом вызове форматирования.
Типичная проблема:
enruformatDate → ошибкаАрхитектура Globalize можно рассматривать как систему строгих зависимостей:
Это делает систему детерминированной, но чувствительной к неполноте данных, особенно при ручной конфигурации локалей или оптимизации сборки.