Unicode CLDR (Common Locale Data Repository) представляет собой стандартизированный набор локализационных данных, определяющий единые правила форматирования и интерпретации региональных особенностей: чисел, дат, времени, валют, единиц измерения, множественных форм и языковых предпочтений. Основу репозитория поддерживает Unicode Consortium, обеспечивая согласованность между различными платформами и языковыми экосистемами.
В контексте Globalize CLDR выступает фундаментом, на котором строятся все операции интернационализации. Библиотека не содержит локализационные данные внутри себя, а полностью опирается на внешние CLDR-файлы, что делает структуру данных критически важной для понимания внутренней архитектуры форматирования.
CLDR организован как иерархический набор JSON/XML-данных, разделённых по локалям. Каждая локаль содержит набор правил и шаблонов, определяющих поведение форматирования.
Ключевые блоки данных:
В Globalize основное внимание уделяется main и
supplemental.
Числовые форматы определяются через шаблоны, которые задают правила отображения:
Пример структуры CLDR:
{
"main": {
"en": {
"numbers": {
"defaultNumberingSystem": "latn",
"minimumGroupingDigits": 1,
"symbols-numberSystem-latn": {
"decimal": ".",
"group": ","
},
"decimalFormats-numberSystem-latn": {
"standard": "#,##0.###"
}
}
}
}
}
В Globalize эти данные используются для построения форматтеров:
Globalize.formatNumber(12345.67, { style: "decimal" });
Шаблон #,##0.### задаёт правила:
# — необязательная цифра0 — обязательная цифра, — разделитель групп. — десятичный разделительCLDR определяет валютные шаблоны отдельно от числовых:
{
"currencyFormats-numberSystem-latn": {
"standard": "¤#,##0.00",
"accounting": "¤#,##0.00;¤-#,##0.00"
}
}
Символ ¤ заменяется на знак валюты, например USD, EUR,
KZT.
В Globalize:
Globalize.formatCurrency(1000, "KZT");
Форматирование учитывает:
CLDR содержит сложную систему шаблонов для дат и времени, включающую:
Пример:
{
"dateFormats": {
"short": "dd/MM/yy",
"medium": "d MMM y",
"long": "d MMMM y",
"full": "EEEE, d MMMM y"
}
}
В Globalize:
Globalize.formatDate(new Date(), { date: "long" });
Дополнительно используются символы:
y — годM — месяцd — деньE — день неделиH — часы (24-часовой формат)h — часы (12-часовой формат)CLDR поддерживает несколько календарных систем:
Каждая локаль может переопределять календарные правила.
Пример:
{
"ca-gregorian": {
"months": {
"format": {
"wide": ["январь", "февраль", "..."]
}
}
}
}
Globalize использует эти данные для построения локализованных календарных представлений.
Одним из ключевых компонентов CLDR являются правила множественного числа. Они определяют, как слово изменяется в зависимости от числа.
Пример:
{
"plurals": {
"pluralRule-count-one": "i = 1 and v = 0",
"pluralRule-count-few": "i = 2..4 and v = 0"
}
}
В Globalize:
Globalize.plural(3, { type: "cardinal" });
Поддерживаются категории:
Эти правила критически важны для языков со сложной морфологией.
CLDR определяет шаблоны для физических величин:
Пример:
{
"units": {
"length-meter": {
"displayName": "метр",
"unitPattern-count-one": "{0} метр",
"unitPattern-count-few": "{0} метра",
"unitPattern-count-many": "{0} метров"
}
}
}
Globalize:
Globalize.formatUnit(5, "meter");
Supplemental содержит глобальные правила, не привязанные к конкретной локали:
Пример:
{
"supplemental": {
"timeData": {
"001": {
"preferred": "gregorian"
}
}
}
}
CLDR использует BCP 47 теги:
Globalize требует явной загрузки данных для каждой локали:
Globalize.load(
require("cldr-data/main/ru/numbers"),
require("cldr-data/main/ru/ca-gregorian"),
require("cldr-data/supplemental/likelySubtags")
);
CLDR использует специализированные символы форматирования:
# — опциональная цифра0 — обязательная цифра, — группировка. — десятичный разделитель¤ — валюта% — процентE — экспоненциальная форма' — экранирование текстаЭти символы интерпретируются Globalize при построении форматтеров чисел и дат.
CLDR определяет fallback-цепочки локалей. Если данные отсутствуют в конкретной локали, используется:
Globalize использует эти правила для безопасного формирования данных даже при неполной локализации.
CLDR можно разделить на функциональные группы:
Каждая категория имеет собственную структуру и формат хранения, но унифицирована через JSON-дерево.
Globalize работает по принципу внешнего подключения данных:
Пример архитектурного потока:
CLDR обеспечивает единый стандарт, исключающий необходимость ручной реализации локальных правил. Globalize, опираясь на эту структуру, получает:
Эта модель делает формат CLDR центральным элементом всей системы интернационализации в JavaScript-экосистеме.