В основе Intl лежит система декларативных правил, где
результат формируется не через ручную сборку строк, а через комбинацию
локали, набора опций и встроенных культурных правил. Форматирование в
этом контексте представляет собой трансляцию абстрактного значения
(числа, даты, списка, текста) в строку согласно многоуровневому набору
приоритетов.
Ключевая идея заключается в том, что итоговый вывод определяется не одним параметром, а пересечением нескольких независимых слоёв:
locale)Определение локали происходит через алгоритм согласования языков (locale negotiation). Он работает по принципу максимального совпадения предпочтений и доступных реализаций.
Алгоритм включает следующие этапы:
en-US →
en)Структура результата может быть визуализирована как дерево решений:
Запрошенные локали
↓
Поддержка движка
↓
Наилучшее совпадение
↓
Fallback цепочка
↓
Финальная локаль
Важным аспектом является то, что выбор локали влияет не только на язык, но и на:
Любой форматтер Intl строится на наложении слоёв конфигурации. Каждый слой имеет свой приоритет.
Итоговое значение определяется как результат «перекрытия» этих уровней.
Intl.NumberFormat демонстрирует наиболее наглядную
модель применения правил.
style (decimal, currency, percent)minimumFractionDigitsmaximumFractionDigitsuseGroupingnotationЧисло (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-US → 12,345.68de-DE → 12.345,68ru-RU → 12 345,68Intl.DateTimeFormat использует многослойную систему
правил, где каждая часть даты форматируется независимо.
Timestamp (epoch)
↓
Разбор на компоненты
↓
Применение локального календаря
↓
Форматирование каждого компонента
↓
Сборка итоговой строки
Опции определяют степень детализации:
| Опции | Визуальный результат |
|---|---|
| dateStyle: “short” | 27.05.26 |
| dateStyle: “long” | 27 мая 2026 г. |
| timeStyle: “medium” | 14:32:10 |
Intl.PluralRules реализует формализацию языковых правил
множественности.
Число
↓
Нормализация
↓
Определение категории
↓
one / few / many / other
Для разных локалей правила отличаются:
one, otherone, few, many,
othervalue → 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 реализует культурно-зависимую
сортировку.
Строка A ─┐
├─ нормализация → сравнение → порядок
Строка B ─┘
Форматирование в Intl можно представить как цепочку
преобразований, где каждая стадия уточняет результат.
Сырые данные
↓
Локаль
↓
Тип форматтера
↓
Опции
↓
ICU правила
↓
Финальный вывод
Каждый уровень не заменяет предыдущий, а уточняет его поведение.
Архитектурная модель:
+------------------+
| Locale Data |
+------------------+
↓
+------------------+------------------+
| NumberFormat | DateTimeFormat |
| PluralRules | ListFormat |
| Collator | |
+------------------+------------------+
↓
+------------------+
| ICU Engine |
+------------------+
↓
+------------------+
| Formatted String |
+------------------+
ICU задаёт базовые правила, которые невозможно переопределить через API:
Эти правила выступают как фундамент, поверх которого работает JavaScript API.
При наличии конфликтов применяется правило «последовательного доминирования»:
явные опции > locale defaults > ICU defaults
Пример:
new Intl.NumberFormat("de-DE", {
maximumFractionDigits: 2,
maximumSignificantDigits: 3
});
Конфликт разрешается в пользу наиболее специфичной настройки, в зависимости от типа форматирования.
Обобщённая схема всех форматтеров:
Входные данные
↓
Выбор локали и стиля
↓
Применение опций
↓
Нормализация значений
↓
Применение языковых правил
↓
ICU обработка
↓
Строковый вывод
Эта модель повторяется для всех компонентов Intl,
отличаясь только типом обрабатываемых данных и набором правил.