Библиотека Globalize строится на данных CLDR (Unicode Common Locale Data Repository), где все правила форматирования чисел, дат, валют и сообщений задаются локалями. Однако стандартные наборы форматов не всегда покрывают требования конкретного приложения, поэтому используется механизм пользовательских правил форматирования, позволяющий изменять поведение без вмешательства в исходные данные CLDR.
Ключевой принцип: форматирование не ограничивается предустановленными шаблонами, а может быть расширено или заменено на уровне приложения.
Globalize использует внутренние шаблоны для отображения чисел:
Пользовательские правила позволяют создавать альтернативные маски отображения.
Пример расширенного подхода:
1,234.561 234,560Изменение достигается через кастомную конфигурацию формата:
Globalize.load({
numbers: {
"latn": {
"patterns": {
"custom-accounting": "#,##0.000"
}
}
}
});
Использование:
const formatNumber = Globalize("ru").numberFormatter({
raw: "custom-accounting"
});
formatNumber(1234.5);
Пользовательские правила позволяют фиксировать:
Это особенно важно для финансовых и научных приложений, где стандартные локали могут быть недостаточно строгими.
Globalize позволяет переопределять отображение валюты без изменения базовой локали.
Globalize.load({
numbers: {
currencies: {
USD: {
displayName: "US Dollar Custom",
symbol: "US$",
patterns: {
custom: "¤ #,##0.00;(¤ #,##0.00)"
}
}
}
}
});
Форматтер с пользовательским правилом:
const formatCurrency = Globalize("en").currencyFormatter("USD", {
raw: "custom"
});
В некоторых локалях символ валюты располагается относительно числа автоматически. Пользовательские правила позволяют:
Globalize использует CLDR Date Fields (y,
M, d, H, m,
s). Пользовательские правила позволяют создавать
собственные композиции.
Globalize.load({
main: {
"ru": {
dates: {
calendars: {
gregorian: {
dateFormats: {
custom: "dd/MM/yyyy HH:mm"
}
}
}
}
}
}
});
Использование:
const formatDate = Globalize("ru").dateFormatter({
raw: "custom"
});
formatDate(new Date());
В ряде приложений требуется нестандартное отображение времени:
год-день-месяцПользовательские правила позволяют формировать такие представления независимо от локали.
Globalize использует CLDR для определения форм множественного числа, но приложение может добавлять собственные логики.
Globalize.loadMessages({
ru: {
itemCount: {
one: "{count} элемент",
few: "{count} элемента",
many: "{count} элементов",
other: "{count} элемента"
}
}
});
Форматирование:
const message = Globalize("ru").messageFormatter("itemCount");
message({ count: 5 });
Вместо стандартных категорий one, few,
many, other могут применяться дополнительные
логические группы через предварительную обработку значений перед
передачей в message formatter.
Globalize допускает создание пользовательских форматтеров поверх стандартных механизмов.
function customPercentageFormatter(value) {
return (value * 100).toFixed(1) + " %";
}
Globalize.load({
numbers: {
patterns: {
percentageCustom: customPercentageFormatter
}
}
});
Использование:
const format = Globalize("ru").numberFormatter({
raw: "percentageCustom"
});
format(0.256);
Форматтеры могут комбинироваться:
После применения базового форматирования допускается дополнительная обработка результата:
const baseFormatter = Globalize("ru").numberFormatter();
const customFormatter = value =>
"≈ " + baseFormatter(value) + " (оценка)";
Такая схема используется для:
Globalize поддерживает ICU MessageFormat, но пользовательские правила расширяют его за счёт предварительной подготовки данных.
Globalize.loadMessages({
ru: {
balance: "Баланс: {amount} {currency} ({status})"
}
});
Передача вычисленных значений:
const formatMessage = Globalize("ru").messageFormatter("balance");
formatMessage({
amount: Globalize("ru").numberFormatter()(1234.56),
currency: "₽",
status: "активен"
});
При использовании пользовательских правил важно учитывать порядок применения:
Любое нарушение порядка приводит к непредсказуемому отображению, особенно в сложных локализациях.
Несмотря на гибкость, существуют архитектурные ограничения:
Особое внимание требуется при:
В крупных приложениях пользовательские правила обычно выносятся в отдельный слой:
formatters/numberformatters/dateformatters/currencyТакой подход позволяет:
Структура конфигурации часто принимает форму декларативного объекта, описывающего все нестандартные форматы системы.
Пользовательские правила могут применяться поверх динамически загружаемых локалей:
Globalize.load(cldrData);
const g = Globalize("fr");
const customDate = g.dateFormatter({
raw: "custom"
});
В этом случае: