Локализация в Luxon основана на стандартном механизме ECMAScript
Internationalization API (Intl). Это означает, что
библиотека не реализует собственные словари или таблицы форматов дат, а
делегирует формирование локализованных строк встроенным возможностям
JavaScript-движка.
Ключевая особенность подхода заключается в разделении двух уровней:
Luxon управляет первым уровнем, а второй полностью отдаётся
Intl.DateTimeFormat.
Каждый экземпляр DateTime в Luxon может хранить
информацию о локали. Локаль влияет на отображение месяцев, дней недели,
форматов времени и порядка компонентов даты.
Локаль задаётся строкой в формате BCP 47:
en — английскийru — русскийde — немецкийfr-CA — французский (Канада)Локаль может быть установлена:
Luxon предоставляет глобальную настройку, влияющую на все создаваемые даты.
import { Settings } from "luxon";
Settings.defaultLocale = "ru";
После этого все новые объекты DateTime будут
использовать русскую локаль, если не переопределено явно.
Глобальная локаль влияет на:
toLocaleStringЛокаль может быть задана непосредственно при работе с объектом времени:
import { DateTime } from "luxon";
const dt = DateTime.now().setLocale("de");
Такой подход обеспечивает изоляцию: один и тот же момент времени может быть представлен в разных языках без изменения глобальных настроек.
Пример использования одного значения в разных локалях:
const dt = DateTime.local(2026, 5, 23);
dt.setLocale("en").toLocaleString(DateTime.DATE_FULL);
dt.setLocale("ru").toLocaleString(DateTime.DATE_FULL);
dt.setLocale("de").toLocaleString(DateTime.DATE_FULL);
Luxon предоставляет набор предопределённых форматов через константы
DateTime:
DATE_SHORTDATE_MEDDATE_FULLDATE_HUGETIME_SIMPLEDATETIME_SHORTDATETIME_FULLDATETIME_HUGEКаждый из них адаптируется под локаль автоматически.
Пример:
const dt = DateTime.local(2026, 5, 23, 14, 30);
dt.setLocale("en").toLocaleString(DateTime.DATETIME_FULL);
dt.setLocale("ru").toLocaleString(DateTime.DATETIME_FULL);
Разница проявляется в:
Основной метод локализованного форматирования —
toLocaleString.
Он принимает:
Intl.DateTimeFormatOptionsdt.toLocaleString(DateTime.DATE_FULL);
dt.toLocaleString({
locale: "ru",
weekday: "long",
year: "numeric",
month: "long",
day: "2-digit"
});
Такой режим полностью соответствует
Intl.DateTimeFormat.
Luxon не ограничивает форматирование только готовыми шаблонами. Через объект опций можно контролировать структуру вывода с высокой точностью.
Основные параметры:
year: “numeric” | “2-digit”month: “numeric” | “2-digit” | “long” | “short” |
“narrow”day: “numeric” | “2-digit”hour: “numeric” | “2-digit”minute: “numeric” | “2-digit”second: “numeric” | “2-digit”weekday: “long” | “short” | “narrow”Пример:
dt.toLocaleString({
locale: "ru",
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
hour: "2-digit",
minute: "2-digit"
});
Luxon не хранит названия месяцев внутри себя. Они формируются через
Intl, поэтому полностью зависят от выбранной локали.
Одна и та же дата:
const dt = DateTime.local(2026, 5, 23);
Вывод:
en: May 23, 2026ru: 23 мая 2026 г.de: 23. Mai 2026Различия затрагивают:
Локаль также влияет на систему времени:
en-USru, de,
fr и большинстве европейских локалейПример:
dt.setLocale("en").toLocaleString(DateTime.TIME_SIMPLE);
dt.setLocale("ru").toLocaleString(DateTime.TIME_SIMPLE);
Результат будет различаться не только числом, но и наличием AM/PM.
Локаль можно указать прямо в момент форматирования, не изменяя объект:
dt.toLocaleString({
locale: "ru",
month: "long",
day: "numeric",
year: "numeric"
});
Это полезно при:
При преобразованиях (например, plus, minus,
set) локаль сохраняется:
const dt = DateTime.now().setLocale("ru");
const next = dt.plus({ days: 5 });
next унаследует ту же локаль, что и исходный объект.
Если локаль не задана:
Settings.defaultLocaleen-US)Это приводит к тому, что один и тот же код может давать разные результаты в разных окружениях.
Локаль влияет не только на язык, но и на привычные региональные стандарты:
/, ., -)Пример различий:
05/23/202623/05/202623.05.2026Luxon автоматически подстраивает формат через Intl, без
необходимости ручной конфигурации.
Методы Luxon можно комбинировать, сохраняя локаль:
DateTime.now()
.setLocale("ru")
.setZone("Europe/Moscow")
.toLocaleString(DateTime.DATETIME_FULL);
Локаль остаётся активной на всём протяжении цепочки и применяется на этапе финального форматирования.
Несмотря на гибкость, локализация имеет ограничения, связанные с
зависимостью от Intl:
Luxon не предоставляет собственного слоя исправления этих различий, полностью полагаясь на стандарт ECMAScript Internationalization API.