Unicode CLDR

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

CLDR поддерживается консорциумом Unicode и описывает правила и шаблоны представления информации для сотен языков и регионов. Он не является библиотекой исполнения, а выступает источником стандартизированных данных, которые интегрируются в реализации международных API, включая ECMAScript Internationalization API (Intl).


Структура локалей и модель LDML

Базовым элементом CLDR является локаль, описываемая через идентификаторы вида language, language-region, language-script-region.

Примеры:

  • en
  • en-GB
  • ru
  • zh-Hans-CN

Каждая локаль наследует данные от более общих локалей. Если специфичное правило отсутствует, используется fallback-цепочка до базовых значений.

Формат описания данных в CLDR основан на Locale Data Markup Language (LDML), который задаёт унифицированную структуру представления локализационных правил. LDML определяет секции для чисел, дат, календарей, единиц измерения и других аспектов форматирования.


Роль CLDR в архитектуре Intl API

ECMAScript Internationalization API не реализует локализационные правила самостоятельно. В большинстве движков JavaScript (V8, SpiderMonkey, JavaScriptCore) Intl построен поверх ICU (International Components for Unicode), а ICU использует CLDR как основной источник локализационных данных.

Таким образом формируется цепочка:

  • CLDR → набор локализационных данных
  • ICU → реализация правил форматирования и алгоритмов
  • Intl API → JavaScript-интерфейс к ICU

Числовые форматы и системы счисления

CLDR определяет поведение форматирования чисел для Intl.NumberFormat.

Ключевые элементы:

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

Пример влияния CLDR:

  • формат 10000001,000,000 (en-US)
  • формат 10000001 000 000 (ru)

Также поддерживаются разные системы счисления:

  • латинская (latn)
  • арабская-индийская
  • восточно-арабская
  • другие региональные системы

Эти системы определяют не только цифры, но и правила их отображения в зависимости от локали.

Compact notation (например, “1M”, “1 млн”) также задаётся через CLDR-даты и шаблоны.


Дата и время

Модуль Intl.DateTimeFormat напрямую опирается на CLDR для формирования шаблонов дат и времени.

CLDR содержит:

  • названия месяцев и дней недели
  • форматы коротких и длинных дат
  • правила календарей
  • обозначения эр (BC/AD и локальные аналоги)
  • форматы времени
  • локализованные временные зоны

Календарные системы:

  • григорианский календарь (основной)
  • исламский календарь
  • буддийский календарь
  • японский календарь эпох

Каждая локаль может использовать собственные правила представления дат, включая порядок компонентов (день/месяц/год), разделители и формат времени (12/24 часа).

CLDR также определяет skeleton patterns — абстрактные шаблоны, которые ICU преобразует в конкретные форматы.


Правила плюрализации

Intl.PluralRules использует CLDR для определения грамматических категорий множественного числа.

CLDR описывает набор категорий:

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

Каждый язык имеет собственные условия выбора формы.

Пример логики:

  • в английском: 1 item vs 2 items
  • в русском: 1 файл, 2 файла, 5 файлов

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


Относительное время

Intl.RelativeTimeFormat использует CLDR для построения выражений вроде:

  • «1 день назад»
  • «через 3 часа»

CLDR предоставляет:

  • шаблоны для единиц времени
  • формы для разных направлений (прошлое/будущее)
  • правила согласования с числами

Например, для разных локалей отличаются конструкции:

  • английский: “in 5 days”
  • русский: “через 5 дней”

Форматирование списков

Intl.ListFormat базируется на CLDR list patterns.

CLDR определяет:

  • разделитель для двух элементов
  • разделитель для нескольких элементов
  • финальный союз

Примеры:

  • English: “A, B, and C”
  • Russian: “A, B и C”

Различаются также стили:

  • long
  • short
  • narrow

Каждый стиль задаёт разный уровень формальности и компактности.


Сравнение строк и правила колlation

Intl.Collator использует данные Unicode Collation Algorithm (UCA), но CLDR предоставляет локализованные настройки collation tailoring.

Это включает:

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

Например:

  • в некоторых локалях «ё» сортируется отдельно от «е»
  • в других — считается эквивалентом

Названия языков, регионов и скриптов

Intl.DisplayNames опирается на CLDR для отображения человекочитаемых названий:

  • языков (ru → «русский»)
  • стран (DE → «Германия»)
  • письменностей (Latn → «латиница»)

CLDR хранит эти данные в стандартизированном виде для сотен локалей, обеспечивая корректное отображение даже редких языков и регионов.


Нормализация локалей и likely subtags

CLDR содержит механизм likelySubtags — вероятных дополнений локали.

Например:

  • enen-Latn-US
  • zhzh-Hans-CN

Это позволяет системе уточнять локаль до полного набора параметров:

  • язык
  • письменность
  • регион

Intl использует это для выбора наиболее подходящих правил форматирования.


Наборы данных и обновления CLDR

CLDR регулярно обновляется и расширяется:

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

Объём данных значителен и включает десятки мегабайт структурированных XML/JSON-подобных описаний.

ICU интегрирует эти данные в бинарные форматы для оптимизации производительности, а JavaScript-движки используют предкомпилированные версии.


Номерные системы и локализационные вариации

CLDR поддерживает различные системы отображения чисел:

  • западные арабские цифры (0–9)
  • восточные арабские
  • индийские варианты
  • локальные символические системы

Это влияет на:

  • отображение чисел в интерфейсе
  • формат валют
  • записи дат

Intl API позволяет переключать систему через параметр numberingSystem, который напрямую связан с CLDR-данными.


Взаимодействие CLDR с форматированием валют и единиц

CLDR содержит:

  • символы валют ($, , )
  • правила размещения символа (до/после числа)
  • правила пробелов и разделителей
  • локальные названия валют

Для единиц измерения:

  • километры / мили
  • градусы
  • весовые единицы

CLDR определяет грамматически корректные формы:

  • “1 kilometer”
  • “2 kilometers”
  • “1 километр”
  • “2 километра”

Интеграция с ECMAScript Internationalization API

Каждый основной объект Intl сопоставляется с соответствующими разделами CLDR:

  • Intl.NumberFormat → числа, валюты, компактные формы, системы счисления
  • Intl.DateTimeFormat → календарные данные, временные зоны, форматы дат
  • Intl.PluralRules → правила множественного числа
  • Intl.RelativeTimeFormat → временные выражения
  • Intl.ListFormat → шаблоны списков
  • Intl.Collator → collation tailoring
  • Intl.DisplayNames → языки, регионы, скрипты

CLDR выступает фундаментом, на котором строится согласованность всех этих API между разными языками и платформами.