Локализация в Luxon строится вокруг возможностей стандартного API
Intl, поэтому библиотека не содержит встроенных языковых
пакетов и не требует отдельной установки языковых файлов для большинства
сценариев. Поведение форматирования зависит от окружения выполнения и
доступности ICU-данных в JavaScript-движке.
Luxon не реализует собственную систему переводов или наборов локалей.
Вместо этого она делегирует форматирование дат и времени встроенному
объекту Intl.DateTimeFormat.
Это означает:
localeIntl в
среде выполненияЛокаль влияет только на отображение: названия месяцев, дней недели, порядок элементов даты, формат времени и разделители.
Основной способ задания локали — метод 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.
Поведение приоритетов:
setLocale у конкретного DateTimeSettings.defaultLocaleГлобальная настройка удобна для приложений, где интерфейс работает в одном языке.
Локаль начинает влиять на вывод при использовании методов форматирования:
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 г."
Luxon полностью опирается на Intl.DateTimeFormat. Это
означает, что качество локализации зависит от уровня ICU (International
Components for Unicode), встроенного в среду выполнения.
В Node.js возможны три режима:
Если нужная локаль отсутствует, форматирование может откатиться к английскому варианту.
Для проверки доступных локалей используется:
Intl.DateTimeFormat.supportedLocalesOf(["ru", "en", "ja"]);
В среде 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 не требует дополнительных плагинов для локалей, так как не включает статические языковые файлы.
Важно учитывать:
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 проявляются системные ограничения:
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, если он доступен в среде
выполнения.