Формат Unicode CLDR

Unicode CLDR (Common Locale Data Repository) представляет собой стандартизированный набор локализационных данных, определяющий единые правила форматирования и интерпретации региональных особенностей: чисел, дат, времени, валют, единиц измерения, множественных форм и языковых предпочтений. Основу репозитория поддерживает Unicode Consortium, обеспечивая согласованность между различными платформами и языковыми экосистемами.

В контексте Globalize CLDR выступает фундаментом, на котором строятся все операции интернационализации. Библиотека не содержит локализационные данные внутри себя, а полностью опирается на внешние CLDR-файлы, что делает структуру данных критически важной для понимания внутренней архитектуры форматирования.


CLDR организован как иерархический набор JSON/XML-данных, разделённых по локалям. Каждая локаль содержит набор правил и шаблонов, определяющих поведение форматирования.

Ключевые блоки данных:

  • main/ — локализованные данные для конкретных языков и регионов
  • supplemental/ — вспомогательные глобальные правила
  • segments/ — правила разбиения текста (редко используется в Globalize напрямую)

В Globalize основное внимание уделяется main и supplemental.


Формат чисел в CLDR

Числовые форматы определяются через шаблоны, которые задают правила отображения:

  • разделители тысяч
  • десятичные символы
  • группировки
  • округления
  • процентные и валютные обозначения

Пример структуры 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
  • timeFormats
  • datetimeFormats
  • calendar patterns

Пример:

{
  "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 использует эти данные для построения локализованных календарных представлений.


Множественные формы (Plural Rules)

Одним из ключевых компонентов 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" });

Поддерживаются категории:

  • one
  • few
  • many
  • other
  • zero (в некоторых языках)

Эти правила критически важны для языков со сложной морфологией.


Формат единиц измерения

CLDR определяет шаблоны для физических величин:

  • длина
  • масса
  • температура
  • скорость

Пример:

{
  "units": {
    "length-meter": {
      "displayName": "метр",
      "unitPattern-count-one": "{0} метр",
      "unitPattern-count-few": "{0} метра",
      "unitPattern-count-many": "{0} метров"
    }
  }
}

Globalize:

Globalize.formatUnit(5, "meter");

Структура supplemental данных

Supplemental содержит глобальные правила, не привязанные к конкретной локали:

  • языковые регионы
  • временные зоны
  • метаданные календарей
  • правила числовых систем

Пример:

{
  "supplemental": {
    "timeData": {
      "001": {
        "preferred": "gregorian"
      }
    }
  }
}

Идентификаторы локалей

CLDR использует BCP 47 теги:

  • en
  • ru
  • en-GB
  • zh-Hans
  • pt-BR

Globalize требует явной загрузки данных для каждой локали:

Globalize.load(
  require("cldr-data/main/ru/numbers"),
  require("cldr-data/main/ru/ca-gregorian"),
  require("cldr-data/supplemental/likelySubtags")
);

Формат символов и шаблонов CLDR

CLDR использует специализированные символы форматирования:

  • # — опциональная цифра
  • 0 — обязательная цифра
  • , — группировка
  • . — десятичный разделитель
  • ¤ — валюта
  • % — процент
  • E — экспоненциальная форма
  • ' — экранирование текста

Эти символы интерпретируются Globalize при построении форматтеров чисел и дат.


Механизм разрешения локалей

CLDR определяет fallback-цепочки локалей. Если данные отсутствуют в конкретной локали, используется:

  1. региональная локаль (ru-KZ)
  2. базовая локаль (ru)
  3. дефолтные данные (en)

Globalize использует эти правила для безопасного формирования данных даже при неполной локализации.


Набор основных категорий CLDR данных

CLDR можно разделить на функциональные группы:

  • numbers (числа и валюты)
  • dates (даты и время)
  • units (единицы измерения)
  • characters (разделение текста)
  • currencies (валютные коды ISO)
  • calendars (системы календарей)
  • plurals (морфология чисел)

Каждая категория имеет собственную структуру и формат хранения, но унифицирована через JSON-дерево.


Интеграционная модель Globalize и CLDR

Globalize работает по принципу внешнего подключения данных:

  • CLDR загружается отдельно
  • данные нормализуются
  • создаются форматтеры
  • выполняется кеширование функций форматирования

Пример архитектурного потока:

  1. загрузка CLDR JSON
  2. инициализация локали
  3. компиляция шаблонов
  4. выполнение форматирования

Значение CLDR-формата в интернационализации

CLDR обеспечивает единый стандарт, исключающий необходимость ручной реализации локальных правил. Globalize, опираясь на эту структуру, получает:

  • предсказуемость поведения
  • совместимость между платформами
  • поддержку десятков языков без переписывания логики
  • расширяемость через обновления CLDR

Эта модель делает формат CLDR центральным элементом всей системы интернационализации в JavaScript-экосистеме.