Визуализация правил форматирования

В основе Intl лежит система декларативных правил, где результат формируется не через ручную сборку строк, а через комбинацию локали, набора опций и встроенных культурных правил. Форматирование в этом контексте представляет собой трансляцию абстрактного значения (числа, даты, списка, текста) в строку согласно многоуровневому набору приоритетов.

Ключевая идея заключается в том, что итоговый вывод определяется не одним параметром, а пересечением нескольких независимых слоёв:

  • локаль (locale)
  • тип форматтера
  • опции пользователя
  • системные правила ICU (International Components for Unicode)
  • fallback-механизмы

Иерархия разрешения локали

Определение локали происходит через алгоритм согласования языков (locale negotiation). Он работает по принципу максимального совпадения предпочтений и доступных реализаций.

Алгоритм включает следующие этапы:

  1. Сбор запрошенных локалей
  2. Проверка поддержки движком
  3. Выбор наиболее близкой локали
  4. Применение fallback (например, en-USen)

Структура результата может быть визуализирована как дерево решений:

Запрошенные локали
        ↓
Поддержка движка
        ↓
Наилучшее совпадение
        ↓
Fallback цепочка
        ↓
Финальная локаль

Важным аспектом является то, что выбор локали влияет не только на язык, но и на:

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

Слои конфигурации форматирования

Любой форматтер Intl строится на наложении слоёв конфигурации. Каждый слой имеет свой приоритет.

Приоритеты слоёв

  1. Явные опции конструктора
  2. Значения локали (locale defaults)
  3. Системные значения ICU
  4. Встроенные fallback-параметры

Итоговое значение определяется как результат «перекрытия» этих уровней.


Числовые форматы и визуализация правил

Intl.NumberFormat демонстрирует наиболее наглядную модель применения правил.

Основные параметры влияния

  • style (decimal, currency, percent)
  • minimumFractionDigits
  • maximumFractionDigits
  • useGrouping
  • notation

Визуальная модель преобразования числа

Число (raw value)
      ↓
Выбор стиля (currency / percent / decimal)
      ↓
Округление (fraction digits rules)
      ↓
Группировка разрядов
      ↓
Применение локальных разделителей
      ↓
Формирование строки

Пример правил округления

Число: 12345.678

Настройка Результат
maximumFractionDigits: 2 12,345.68
minimumFractionDigits: 4 12,345.6780
useGrouping: false 12345.68

Разделители зависят от локали:

  • en-US12,345.68
  • de-DE12.345,68
  • ru-RU12 345,68

Визуализация работы с датами и временем

Intl.DateTimeFormat использует многослойную систему правил, где каждая часть даты форматируется независимо.

Компоненты даты

  • год
  • месяц
  • день
  • час
  • минута
  • секунда
  • часовой пояс

Схема формирования строки

Timestamp (epoch)
      ↓
Разбор на компоненты
      ↓
Применение локального календаря
      ↓
Форматирование каждого компонента
      ↓
Сборка итоговой строки

Влияние опций

Опции определяют степень детализации:

Опции Визуальный результат
dateStyle: “short” 27.05.26
dateStyle: “long” 27 мая 2026 г.
timeStyle: “medium” 14:32:10

Локальные различия

  • порядок компонентов (день/месяц/год)
  • наличие ведущих нулей
  • названия месяцев
  • формат 12/24 часа

Правила множественного числа (PluralRules)

Intl.PluralRules реализует формализацию языковых правил множественности.

Логика выбора категории

Число
  ↓
Нормализация
  ↓
Определение категории
  ↓
one / few / many / other

Пример категорий

Для разных локалей правила отличаются:

  • английский: one, other
  • русский: one, few, many, other
  • арабский: до 6 категорий

Визуальная модель

value → rule engine → category → UI строка

Пример:

const ru = new Intl.PluralRules('ru-RU');
ru.select(1);  // one
ru.select(2);  // few
ru.select(5);  // many

Форматирование списков и структура разделителей

Intl.ListFormat управляет визуализацией перечислений.

Основные режимы

  • conjunction (и)
  • disjunction (или)
  • unit (единицы измерения)

Схема преобразования массива

["A", "B", "C"]
        ↓
локальные правила соединения
        ↓
разделители между элементами
        ↓
финальная строка

Пример визуализации

Локаль Результат
en A, B, and C
ru A, B и C

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

Intl.Collator реализует культурно-зависимую сортировку.

Влияние параметров

  • sensitivity (base, accent, case, variant)
  • numeric
  • ignorePunctuation

Визуальная модель сравнения

Строка A ─┐
          ├─ нормализация → сравнение → порядок
Строка B ─┘

Этапы обработки

  1. Нормализация Unicode
  2. Удаление диакритики (при необходимости)
  3. Учет регистра
  4. Лексикографическое сравнение
  5. Применение локальных правил

Каскад локализационных решений

Форматирование в Intl можно представить как цепочку преобразований, где каждая стадия уточняет результат.

Сырые данные
     ↓
Локаль
     ↓
Тип форматтера
     ↓
Опции
     ↓
ICU правила
     ↓
Финальный вывод

Каждый уровень не заменяет предыдущий, а уточняет его поведение.


Визуализация взаимодействия компонентов Intl

Архитектурная модель:

          +------------------+
          |   Locale Data    |
          +------------------+
                    ↓
+------------------+------------------+
| NumberFormat     | DateTimeFormat   |
| PluralRules      | ListFormat       |
| Collator         |                  |
+------------------+------------------+
                    ↓
          +------------------+
          | ICU Engine       |
          +------------------+
                    ↓
          +------------------+
          | Formatted String |
          +------------------+

Влияние системных правил ICU

ICU задаёт базовые правила, которые невозможно переопределить через API:

  • календарные системы (Gregorian, Islamic и др.)
  • локальные числовые форматы
  • правила переноса и разделения
  • языковые категории множественного числа

Эти правила выступают как фундамент, поверх которого работает JavaScript API.


Приоритет конфликтующих опций

При наличии конфликтов применяется правило «последовательного доминирования»:

явные опции > locale defaults > ICU defaults

Пример:

new Intl.NumberFormat("de-DE", {
  maximumFractionDigits: 2,
  maximumSignificantDigits: 3
});

Конфликт разрешается в пользу наиболее специфичной настройки, в зависимости от типа форматирования.


Абстрактная модель визуализации Intl

Обобщённая схема всех форматтеров:

        Входные данные
              ↓
     Выбор локали и стиля
              ↓
     Применение опций
              ↓
   Нормализация значений
              ↓
  Применение языковых правил
              ↓
      ICU обработка
              ↓
       Строковый вывод

Эта модель повторяется для всех компонентов Intl, отличаясь только типом обрабатываемых данных и набором правил.