Локализованные паттерны

Локализация в Day.js опирается на систему языковых пакетов (locale) и набор встроенных механизмов форматирования, которые позволяют адаптировать даты к культурным и языковым особенностям. Основная идея заключается в том, что один и тот же объект даты может отображаться по-разному в зависимости от выбранного локаля, при этом логика работы с датой остаётся неизменной.

Day.js хранит локализованные паттерны в виде структур, описывающих названия месяцев, дней недели, правила склонений, форматы времени и правила относительных выражений. Переключение локали влияет не только на вывод format(), но и на поведение таких функций, как calendar(), fromNow() и ряда плагинов.


Каждая локаль в Day.js представляет собой объект, содержащий:

  • полные и короткие названия месяцев
  • названия дней недели
  • форматы даты и времени
  • правила относительных выражений (например, «2 часа назад»)
  • правила календарного представления (например, «Сегодня в 14:00»)

Подключение локали осуществляется явно:

import dayjs from 'dayjs'
import 'dayjs/locale/ru'

dayjs.locale('ru')

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


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

Метод format() использует стандартные токены Day.js, однако локаль влияет на текстовые элементы, такие как названия месяцев и дней недели.

dayjs('2026-05-23').format('DD MMMM YYYY')

Без локали:

23 May 2026

С русской локалью:

23 мая 2026

Локализация применяется только к текстовым компонентам, числовые значения остаются неизменными.


Расширенное форматирование через localizedFormat

Плагин localizedFormat добавляет набор предопределённых паттернов, зависящих от локали. Он позволяет использовать форматы, аналогичные Moment.js, без необходимости вручную задавать токены.

Подключение:

import localizedFormat from 'dayjs/plugin/localizedFormat'
dayjs.extend(localizedFormat)

Использование:

dayjs().format('L')  // локализованная дата
dayjs().format('LL') // расширенный формат даты
dayjs().format('LLL') // дата + время
dayjs().format('LLLL') // полное текстовое представление

Значения этих паттернов зависят от активной локали:

  • L — краткая дата
  • LL — расширенная дата
  • LLL — дата и время
  • LLLL — полное текстовое представление с днём недели

Календарные паттерны

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

import calendar from 'dayjs/plugin/calendar'
dayjs.extend(calendar)

Пример:

dayjs().calendar(dayjs('2026-05-23'))

Локаль определяет, как именно интерпретируются временные рамки:

  • сегодня
  • вчера
  • завтра
  • ближайшие дни недели
  • более отдалённые даты

Пример вывода в русской локали:

Сегодня в 14:30
Вчера в 18:00
23 мая в 12:00

Каждая локаль содержит набор шаблонов для sameDay, nextDay, lastDay, nextWeek, lastWeek, sameElse.


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

Одним из ключевых локализованных паттернов является представление времени в относительном виде.

Подключение:

import relativeTime from 'dayjs/plugin/relativeTime'
dayjs.extend(relativeTime)

Использование:

dayjs().fromNow()

Примеры вывода:

  • «несколько секунд назад»
  • «5 минут назад»
  • «2 часа назад»
  • «через 3 дня»

Локаль содержит правила склонения и формы слов для разных диапазонов времени. Например, для русского языка важно различие между:

  • 1 минута
  • 2–4 минуты
  • 5+ минут

Эти правила задаются внутри локали как массивы форм:

relativeTime: {
  future: 'через %s',
  past: '%s назад',
  s: 'несколько секунд',
  m: 'минуту',
  mm: '%d минут',
  h: 'час',
  hh: '%d часов'
}

Обновление локали через updateLocale

Day.js позволяет модифицировать существующие локали без их полного переопределения.

import updateLocale from 'dayjs/plugin/updateLocale'
dayjs.extend(updateLocale)

Изменение форматов:

dayjs.updateLocale('ru', {
  monthsShort: [
    'янв', 'фев', 'мар', 'апр', 'май', 'июн',
    'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'
  ]
})

Можно изменять:

  • сокращённые и полные названия месяцев
  • дни недели
  • форматы календаря
  • правила относительного времени

Этот механизм используется для тонкой настройки корпоративных интерфейсов или специфических доменных форматов.


Локализованные токены и форматные шаблоны

Day.js использует универсальные токены (YYYY, MM, DD), но локаль влияет на интерпретацию текстовых сегментов.

Особое значение имеют:

  • MMM — сокращённое название месяца
  • MMMM — полное название месяца
  • ddd — сокращённый день недели
  • dddd — полный день недели

Пример:

dayjs('2026-05-23').format('dddd, D MMMM')

В русской локали:

суббота, 23 мая

Особенности склонений и грамматических форм

Некоторые локали, включая русскую, требуют сложной морфологии. Day.js решает это через множественные формы в relativeTime и ordinal.

Пример ordinal:

dayjs.extend(require('dayjs/plugin/advancedFormat'))

Хотя Day.js не включает полноценную грамматику, локаль может задавать правила:

ordinal: function (n) {
  return n + '-й'
}

Это влияет на такие форматы:

dayjs().format('Do')

Результат:

23-й

Множественные локали в одном приложении

Day.js позволяет динамически переключать локали:

dayjs.locale('en')
dayjs.locale('ru')

При этом каждый объект даты наследует активную локаль на момент вызова форматирования, а не на момент создания.

const date = dayjs('2026-05-23')

dayjs.locale('en')
date.format('LL')

dayjs.locale('ru')
date.format('LL')

Результаты будут различаться без изменения исходного объекта.


Кастомные локализованные паттерны

Создание собственной локали позволяет полностью контролировать форматирование:

import dayjs from 'dayjs'

dayjs.locale({
  name: 'custom',
  months: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
  monthsShort: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'],
  weekdays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
  weekdaysShort: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
  relativeTime: {
    future: '+%s',
    past: '-%s',
    s: 'now',
    m: '1m',
    mm: '%dm',
    h: '1h',
    hh: '%dh'
  }
})

Такая конфигурация используется в интерфейсах, где требуется сокращённое или техническое отображение дат.


Взаимодействие локалей с плагинами форматирования

Локализация в Day.js не ограничивается базовым форматированием. Она распространяется на плагины:

  • relativeTime — формирование фраз времени
  • calendar — контекстное отображение дат
  • localizedFormat — предопределённые шаблоны
  • advancedFormat — расширенные токены

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


Поведение локалей при SSR и клиентском рендеринге

При серверном рендеринге важно фиксировать локаль до генерации строки:

dayjs.locale('ru')
const html = dayjs().format('LLLL')

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


Приоритеты локализации

Day.js использует следующий порядок применения локали:

  1. Локаль конкретного объекта (если задана)
  2. Глобальная локаль через dayjs.locale()
  3. Локаль по умолчанию (обычно en)

Это позволяет комбинировать разные языки в рамках одного приложения без конфликтов между форматами.