Globalize опирается на два фундаментальных слоя: данные CLDR (Unicode Common Locale Data Repository) и набор высокоуровневых API для форматирования, парсинга и интернационализации. Поведение «по умолчанию» формируется сочетанием:
Globalize.locale(...))Переопределение поведения заключается в изменении одного или нескольких из этих слоёв без модификации исходного кода библиотеки.
Ключевой точкой управления поведением является установка глобальной локали:
Globalize.locale("ru");
или переключение на другую локаль:
Globalize.locale("en");
После установки локали изменяется:
Важно: локаль является глобальным состоянием, поэтому любое изменение влияет на все последующие вызовы форматтеров и парсеров.
Библиотека не хранит локализацию внутри себя — она зависит от внешних данных CLDR. Это создаёт возможность «переопределения» через управление загрузкой данных.
Можно загрузить только необходимые части данных, изменяя поведение системы:
Globalize.load(
require("cldr-data/supplemental/likelySubtags"),
require("cldr-data/main/ru/ca-gregorian"),
require("cldr-data/main/ru/numbers")
);
Если исключить некоторые сегменты, поведение форматирования станет ограниченным или будет использовать fallback-правила.
Поведение форматирования чисел можно изменить через параметры форматтера:
const numberFormatter = Globalize.numberFormatter({
minimumFractionDigits: 2,
maximumFractionDigits: 4
});
Это изменяет стандартное поведение, заданное локалью.
const formatter = Globalize.numberFormatter({
useGrouping: false
});
Результат:
1 000 0001000000Форматирование дат зависит от набора шаблонов CLDR, но может быть изменено через опции:
const dateFormatter = Globalize.dateFormatter({
datetime: "medium"
});
или через кастомный формат:
const customFormatter = Globalize.dateFormatter({
skeleton: "yMMMMdHm"
});
Skeleton позволяет переопределить стандартный выбор формата:
Пример:
Globalize.dateFormatter({ skeleton: "Ehm" });
Система сообщений использует ICU MessageFormat. Поведение можно полностью изменить через загрузку собственных сообщений:
Globalize.loadMessages({
ru: {
greeting: "Привет, {name}!"
}
});
Globalize.locale("ru");
const messageFormatter = Globalize.messageFormatter("greeting");
messageFormatter({ name: "Иван" });
Изменение сообщений фактически полностью заменяет поведение встроенной локализации.
Правила plural rules берутся из CLDR, но могут быть «перекрыты» через альтернативные сообщения:
Globalize.loadMessages({
ru: {
items: "{count, plural, one {# элемент} few {# элемента} many {# элементов} other {# элемента}}"
}
});
Это позволяет:
Если данные отсутствуют для текущей локали, Globalize использует fallback на:
en)ru-KZ → ru)Поведение можно контролировать косвенно:
Если не загружать fallback-локаль, система будет ограничена:
Globalize.loadMessages({
en: { hello: "Hello" }
});
Globalize.locale("en");
В некоторых сценариях стандартные форматтеры заменяются обёртками.
function customNumber(value) {
return "≈ " + Globalize.numberFormatter()(value);
}
Здесь изменяется поведение без изменения самой библиотеки.
Globalize кеширует созданные форматтеры, что влияет на поведение при повторных вызовах.
Можно переопределить стратегию, создавая собственный слой кеша:
const cache = new Map();
function getFormatter(locale) {
if (!cache.has(locale)) {
Globalize.locale(locale);
cache.set(locale, Globalize.numberFormatter());
}
return cache.get(locale);
}
Такое переопределение:
Форматтеры можно комбинировать, создавая новый слой поведения поверх стандартного:
const base = Globalize.dateFormatter();
const custom = (value) => "[" + base(value) + "]";
Это полностью заменяет вывод без изменения внутренней логики CLDR.
Архитектура Globalize модульная, поэтому поведение определяется набором подключённых компонентов:
Если часть модулей не загружена, соответствующее поведение становится недоступным или изменяется.
CLDR содержит предустановленные шаблоны, но их можно заменить через пользовательские skeleton и options:
Globalize.dateFormatter({
datetime: "full"
});
или через более строгую настройку:
Globalize.dateFormatter({
skeleton: "yyyyMMddHHmm"
});
Поведение формируется по слоям приоритета:
Любое переопределение на верхнем уровне полностью перекрывает нижележащие уровни.
Локаль может меняться динамически внутри выполнения:
Globalize.locale("ru");
const ruFormatter = Globalize.numberFormatter();
Globalize.locale("en");
const enFormatter = Globalize.numberFormatter();
Таким образом создаются независимые поведенческие контексты, каждый из которых фиксирует собственные правила форматирования.
Хотя валюты зависят от CLDR, поведение можно модифицировать через параметры:
const currencyFormatter = Globalize.currencyFormatter("USD", {
style: "code"
});
или:
Globalize.currencyFormatter("USD", {
minimumFractionDigits: 0
});
Это изменяет стандартное поведение отображения валютных значений.
Парсинг также подчиняется локали, но может быть изменён через настройки:
const parser = Globalize.numberParser({
strict: false
});
Это влияет на:
Можно создать изолированные окружения поведения:
const globalizeRu = new Globalize("ru");
const globalizeEn = new Globalize("en");
Каждый экземпляр:
Сообщения могут расширяться поверх базовых:
Globalize.loadMessages({
ru: {
base: "Базовое сообщение",
extended: "Расширенное: {value}"
}
});
При этом можно строить цепочки логики без изменения ядра.