Доступность Intl

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

Ключевой фундамент: объекты Intl.DateTimeFormat, Intl.NumberFormat, Intl.RelativeTimeFormat, а также частично Intl.PluralRules. Именно через них Luxon выполняет форматирование и интерпретацию локализованных значений.

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


Зависимость Luxon от возможностей Intl

Luxon не реализует собственную систему локализации. Вместо этого используется делегирование:

  • форматирование дат → Intl.DateTimeFormat
  • локализация чисел → Intl.NumberFormat
  • относительное время → Intl.RelativeTimeFormat
  • языковые правила множественного числа → Intl.PluralRules

Такой подход даёт компактность кода и актуальность локалей без обновления библиотеки.

Минимальные требования

Для корректной работы базовых функций требуется:

  • наличие Intl.DateTimeFormat
  • поддержка IANA time zone identifiers (в большинстве современных сред)

Отсутствие хотя бы одного компонента приводит к деградации функциональности или ошибкам форматирования.


Поведение в разных окружениях

Современные браузеры

В актуальных версиях Chrome, Firefox, Safari и Edge Intl реализован полноценно:

  • поддержка локалей с региональными вариациями
  • корректная работа с временными зонами
  • расширенные форматы (long/short/full styles)

Luxon в таких условиях использует системный ICU без ограничений.


Старые браузеры

В устаревших средах возможны ограничения:

  • отсутствует Intl.RelativeTimeFormat
  • ограниченный набор локалей
  • нет поддержки некоторых time zone features

В подобных случаях Luxon продолжает работать, но часть API деградирует до базовых строковых представлений.


Node.js и ICU: ключевой источник различий

В Node.js поведение Intl зависит от сборки ICU (International Components for Unicode).

Small-ICU

Минимальная сборка Node:

  • ограниченный набор локалей (обычно английский)
  • сокращённая база временных зон
  • сниженная точность форматирования

Luxon в этом режиме функционирует, но локализация может быть неполной.

Full-ICU

Полная сборка Node:

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

Активируется через:

  • сборку Node с full-icu
  • или подключение ICU data пакетов

Влияние Intl на локализацию в Luxon

Локали

Luxon использует строковые идентификаторы локалей:

  • en
  • ru
  • de
  • ja-JP

Фактическое форматирование зависит от:

  • доступности локали в Intl
  • поддержки соответствующих правил форматирования

Если локаль недоступна, происходит fallback на базовую локаль среды выполнения.


Форматирование дат

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

  • порядок компонентов даты
  • разделители
  • форму месяца (short, long, numeric)
  • стиль времени (12/24 часа)

Luxon передаёт параметры напрямую в Intl.DateTimeFormat.

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

  • DateTime.toLocaleString(DateTime.DATE_FULL)
  • трансформируется в набор опций Intl

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

Функции вроде:

  • «2 часа назад»
  • «через 5 дней»

используют Intl.RelativeTimeFormat.

При отсутствии поддержки:

  • используется ручной fallback Luxon
  • формат становится упрощённым текстовым выражением

Временные зоны и Intl

IANA time zones

Luxon опирается на IANA идентификаторы:

  • Europe/Moscow
  • Asia/Almaty
  • America/New_York

Поддержка зависит от:

  • Intl.supportedValuesOf('timeZone') (в современных средах)
  • системной базы временных зон

Ограничения окружений

В старых системах возможны:

  • отсутствие полного списка зон
  • некорректные DST переходы
  • fallback на UTC

Luxon при этом сохраняет объектную модель времени, но точность отображения может снижаться.


Проверка доступности Intl

Внутренне проверяются ключевые возможности:

  • наличие Intl
  • наличие Intl.DateTimeFormat
  • поддержка локалей через resolvedOptions()
  • поддержка time zones через timeZone опции

Типовая логика деградации:

  1. полноценный Intl → полный функционал
  2. частичный Intl → ограниченное форматирование
  3. отсутствует Intl → базовые строковые представления

Политика деградации Luxon

При недостатке Intl Luxon не прекращает работу, но:

  • отключает сложное локализованное форматирование
  • заменяет некоторые методы на упрощённые версии
  • может возвращать ISO-строки вместо локализованных значений

Цель — сохранить консистентность данных даже при ограничениях среды.


Polyfills и расширение Intl

Для унификации поведения в разных окружениях применяются полифилы:

  • @formatjs/intl-datetimeformat
  • @formatjs/intl-relativetimeformat
  • @formatjs/intl-locale
  • full-icu для Node.js

Полифилы обеспечивают:

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

Взаимодействие с bundlers и сборкой

В сборках через Webpack, Vite или Rollup Intl может:

  • подхватываться из окружения браузера
  • заменяться полифилами
  • tree-shake-иться частично (в зависимости от конфигурации)

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


Ограничения архитектуры на базе Intl

Использование Intl накладывает системные ограничения:

  • невозможность полностью контролировать форматирование
  • зависимость от ОС и версии ICU
  • различия между браузерами и Node.js
  • невозможность гарантировать идентичный вывод на всех платформах

Luxon сознательно принимает эти ограничения в обмен на:

  • минимальный размер библиотеки
  • актуальные локали без обновлений
  • соответствие стандартам ECMAScript

Практические последствия для поведения API

Форматирование, основанное на Intl, влияет на:

  • строки вывода (toLocaleString)
  • сортировку дат в UI
  • отображение временных зон
  • относительное время

Даже одинаковый код Luxon может давать разные строки при смене окружения, если отличаются ICU или системные локали.


Итоговая модель зависимости

Поведение Luxon можно представить как слой над Intl:

  • ядро: неизменяемые структуры DateTime
  • промежуточный слой: преобразования и арифметика времени
  • внешний слой: Intl-форматирование

Стабильность результата определяется не только логикой библиотеки, но и полнотой реализации Internationalization API в конкретной среде выполнения.