Метод setLocale и reconfigure

В библиотеке Luxon работа с датами и временем тесно связана с понятием локали. Локаль влияет на формат вывода дат, названия месяцев и дней недели, правила отображения времени и чисел. Управление локалью может осуществляться как на уровне отдельного объекта даты, так и глобально для всего приложения.


Локаль в DateTime: основная концепция

Каждый экземпляр DateTime в Luxon содержит информацию о локали. Это не просто строка форматирования, а часть внутреннего состояния объекта, которая определяет:

  • язык отображения дат и времени;
  • форматирование месяцев и дней недели;
  • правила вывода чисел (в связке с numbering system);
  • поведение при форматировании через toLocaleString и toFormat.

Ключевой момент: локаль не изменяет саму дату, а только её представление.


Метод setLocale

Метод setLocale используется для изменения локали конкретного экземпляра DateTime.

Особенности метода

  • возвращает новый объект DateTime;
  • не мутирует исходный экземпляр;
  • влияет только на отображение и форматирование;
  • сохраняет временную зону и само значение даты.

Сигнатура

DateTime.setLocale(locale: string): DateTime

Пример использования

import { DateTime } from "luxon";

const dt = DateTime.now();

const ru = dt.setLocale("ru");
const en = dt.setLocale("en");
const fr = dt.setLocale("fr");

console.log(ru.toLocaleString(DateTime.DATETIME_FULL));
console.log(en.toLocaleString(DateTime.DATETIME_FULL));
console.log(fr.toLocaleString(DateTime.DATETIME_FULL));

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


Поведение setLocale в цепочках вызовов

Поскольку setLocale возвращает новый экземпляр, его удобно использовать в цепочках:

const formatted = DateTime.now()
  .setLocale("de")
  .plus({ days: 2 })
  .toLocaleString(DateTime.DATE_FULL);

Локаль сохраняется на всём протяжении цепочки, пока не будет явно изменена другим вызовом setLocale.


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

Локаль особенно заметна при использовании стандартных шаблонов:

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

Результат:

  • месяцы и дни недели на русском языке;
  • локализованный порядок слов;
  • адаптация формата под региональные стандарты.

Глобальная конфигурация Luxon

Помимо локальной настройки через setLocale, Luxon позволяет задавать глобальные параметры через объект Settings.

Метод Settings.reconfigure

Settings.reconfigure изменяет поведение библиотеки на уровне всего приложения.

Назначение

Позволяет задать значения по умолчанию для:

  • локали;
  • временной зоны;
  • системы нумерации;
  • календарной системы.

Сигнатура

Settings.reconfigure(options: object): void

Пример использования

import { Settings } from "luxon";

Settings.reconfigure({
  locale: "ru",
  zone: "Europe/Moscow"
});

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


Какие параметры поддерживает reconfigure

locale

Устанавливает локаль по умолчанию:

Settings.reconfigure({
  locale: "fr"
});

Это влияет на все новые DateTime, если локаль не переопределена вручную.


zone

Задает временную зону по умолчанию:

Settings.reconfigure({
  zone: "UTC"
});

Используется при создании дат без явного указания зоны.


numberingSystem

Определяет систему счисления:

Settings.reconfigure({
  numberingSystem: "latn"
});

Например, арабская, латинская или индийская системы цифр.


outputCalendar

Позволяет изменить календарную систему:

Settings.reconfigure({
  outputCalendar: "islamic"
});

Это влияет на отображение дат в соответствующей календарной системе.


Взаимодействие setLocale и глобальных настроек

При одновременном использовании локальных и глобальных настроек действует приоритет:

  1. Локальные настройки (setLocale) имеют более высокий приоритет.
  2. Глобальные настройки (Settings.reconfigure) используются по умолчанию.

Пример конфликта

Settings.reconfigure({
  locale: "ru"
});

const dt = DateTime.now().setLocale("en");

console.log(dt.locale); // "en"

Даже при глобальной русской локали объект будет использовать английскую локаль.


Практическая модель применения

Локальный контроль

Используется, когда разные части интерфейса требуют разных языков:

const adminDate = DateTime.now().setLocale("en");
const userDate = DateTime.now().setLocale("ru");

Глобальная конфигурация

Используется для унификации поведения приложения:

Settings.reconfigure({
  locale: "ru",
  zone: "Europe/Moscow"
});

Поведение при форматировании строк

Методы форматирования учитывают локаль автоматически:

  • toLocaleString
  • toFormat
  • toRelative
  • toRelativeCalendar
DateTime.now()
  .setLocale("es")
  .toRelative();

Результат будет зависеть от испанской локали (например, «hace 2 horas»).


Особенности неизменяемости

И setLocale, и reconfigure подчиняются общей архитектуре Luxon:

  • DateTime неизменяем;
  • любые изменения создают новый объект;
  • глобальные настройки не изменяют уже созданные экземпляры.

Частые сценарии использования

Многоязычные интерфейсы

function formatDate(dt, lang) {
  return dt.setLocale(lang).toLocaleString(DateTime.DATE_MED);
}

Серверная стандартизация

Settings.reconfigure({
  locale: "en",
  zone: "UTC"
});

Пользовательские настройки

const userLocale = getUserLocale();

const dt = DateTime.now().setLocale(userLocale);

Ограничения и нюансы

  • setLocale влияет только на представление, но не на внутреннее значение времени;
  • reconfigure влияет только на новые экземпляры;
  • локаль может быть переопределена в любой момент;
  • некорректные коды локалей могут приводить к fallback-значениям;
  • временная зона и локаль — независимые настройки.