Установка локали

Локализация в Luxon строится вокруг возможностей стандартного API Intl, поэтому библиотека не содержит встроенных языковых пакетов и не требует отдельной установки языковых файлов для большинства сценариев. Поведение форматирования зависит от окружения выполнения и доступности ICU-данных в JavaScript-движке.

Luxon не реализует собственную систему переводов или наборов локалей. Вместо этого она делегирует форматирование дат и времени встроенному объекту Intl.DateTimeFormat.

Это означает:

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

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

Установка локали через setLocale

Основной способ задания локали — метод setLocale у объекта DateTime.

import { DateTime } from "luxon";

const dt = DateTime.now().setLocale("ru");
console.log(dt.toLocaleString(DateTime.DATE_FULL));

В этом примере локаль применяется только к конкретному объекту. Это важно: Luxon использует иммутабельную модель, поэтому каждый вызов возвращает новый экземпляр.

Локаль может быть задана как:

  • "ru" — русский язык
  • "en" — английский
  • "de" — немецкий
  • "fr" — французский
  • "en-GB" — английский (Великобритания)
  • "en-US" — английский (США)

Формат соответствует стандарту BCP 47.

Глобальная локаль и поведение по умолчанию

Помимо локальной установки существует глобальная настройка:

import { Settings } from "luxon";

Settings.defaultLocale = "ru";

После этого все создаваемые даты используют указанную локаль, если она явно не переопределена через setLocale.

Поведение приоритетов:

  1. setLocale у конкретного DateTime
  2. Settings.defaultLocale
  3. локаль окружения (браузер / Node.js)

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

Форматирование дат с учётом локали

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

DateTime.now().setLocale("ru").toLocaleString(DateTime.DATE_FULL);

Примеры форматов:

  • DATE_FULL — полный формат даты
  • DATE_HUGE — расширенный формат с названием дня недели
  • DATETIME_MED — средний формат даты и времени
  • TIME_SIMPLE — упрощённое время

При смене локали меняется не только язык, но и структура строки:

DateTime.now().setLocale("en").toLocaleString(DateTime.DATE_FULL);
// "May 23, 2026"

DateTime.now().setLocale("ru").toLocaleString(DateTime.DATE_FULL);
// "23 мая 2026 г."

Работа Intl и зависимость от ICU

Luxon полностью опирается на Intl.DateTimeFormat. Это означает, что качество локализации зависит от уровня ICU (International Components for Unicode), встроенного в среду выполнения.

В Node.js возможны три режима:

  • small-icu — ограниченный набор локалей
  • full-icu — полная поддержка всех языков
  • system-icu — системная ICU (в зависимости от сборки Node.js)

Если нужная локаль отсутствует, форматирование может откатиться к английскому варианту.

Для проверки доступных локалей используется:

Intl.DateTimeFormat.supportedLocalesOf(["ru", "en", "ja"]);

Загрузка локалей в Node.js

В среде Node.js иногда требуется установка полного ICU-пакета:

npm install full-icu

И запуск приложения с указанием:

NODE_ICU_DATA=node_modules/full-icu node app.js

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

Работа в браузере и бандлерах

В браузерах локали зависят от движка (V8, SpiderMonkey, JavaScriptCore). В современных версиях Chrome, Firefox и Safari Intl уже содержит широкий набор локалей.

При использовании сборщиков (Webpack, Vite, Rollup) Luxon не требует дополнительных плагинов для локалей, так как не включает статические языковые файлы.

Важно учитывать:

  • локаль не увеличивает размер бандла
  • все вычисления выполняются через runtime API
  • результат может различаться между браузерами старых версий

Форматы локалей и особенности

Luxon поддерживает стандарт BCP 47, что позволяет использовать расширенные идентификаторы:

  • ru-RU — русский (Россия)
  • pt-BR — португальский (Бразилия)
  • zh-CN — китайский (упрощённый)
  • zh-TW — китайский (традиционный)

При этом более специфичная локаль имеет приоритет над общей:

DateTime.now().setLocale("ru-RU");

Если региональная локаль недоступна, происходит fallback к базовой (ru).

Изменение локали после создания объекта

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

const dt = DateTime.now();

dt.setLocale("en").toLocaleString(DateTime.DATE_FULL);
dt.setLocale("ru").toLocaleString(DateTime.DATE_FULL);

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

Частые ограничения и особенности поведения

При работе с локалями в Luxon проявляются системные ограничения:

  • отсутствие локали в ICU приводит к fallback на английский
  • локаль не влияет на внутреннее хранение времени (оно всегда в UTC-основе)
  • не все форматы одинаково поддерживаются во всех браузерах
  • кастомные форматы через toFormat не переводят названия месяцев автоматически

Пример ограничения:

DateTime.now().setLocale("ru").toFormat("DDDD");

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

Использование локали в цепочках преобразований

Локаль сохраняется в цепочке методов:

const result = DateTime
  .now()
  .setLocale("ru")
  .plus({ days: 2 })
  .toLocaleString(DateTime.DATETIME_FULL);

Каждое последующее преобразование сохраняет выбранный язык, если он не был переопределён.

Влияние локали на относительное время

Luxon поддерживает относительное форматирование через toRelative:

DateTime.now().plus({ days: 1 }).setLocale("ru").toRelative();

Вывод зависит от локали:

  • "in 1 day" (en)
  • "через 1 день" (ru)

Эта функциональность также полностью опирается на Intl.RelativeTimeFormat, если он доступен в среде выполнения.