Создание пользовательской локали

Moment.js предоставляет мощные возможности для работы с датами и временем, включая поддержку локалей. Локали позволяют адаптировать отображение дат, месяцев, дней недели и форматов времени под конкретный язык и регион. Создание пользовательской локали особенно важно для приложений, ориентированных на специфические аудитории или нестандартные форматы отображения времени.


Определение новой локали

Для создания новой локали используется метод moment.defineLocale(name, config). Здесь:

  • name — строка, идентификатор локали, например 'ru-custom'.
  • config — объект с параметрами локали, включающий форматы дат, имена месяцев, дней недели и другие настройки.

Пример базового определения локали:

moment.defineLocale('ru-custom', {
    months: 'Январь_Февраль_Март_Апрель_Май_Июнь_Июль_Август_Сентябрь_Октябрь_Ноябрь_Декабрь'.split('_'),
    monthsShort: 'Янв_Фев_Мар_Апр_Май_Июн_Июл_Авг_Сен_Окт_Ноя_Дек'.split('_'),
    weekdays: 'Воскресенье_Понедельник_Вторник_Среда_Четверг_Пятница_Суббота'.split('_'),
    weekdaysShort: 'Вс_Пн_Вт_Ср_Чт_Пт_Сб'.split('_'),
    weekdaysMin: 'Вс_Пн_Вт_Ср_Чт_Пт_Сб'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY г.',
        LLL: 'D MMMM YYYY г., HH:mm',
        LLLL: 'dddd, D MMMM YYYY г., HH:mm'
    },
    calendar: {
        sameDay: '[Сегодня в] LT',
        nextDay: '[Завтра в] LT',
        nextWeek: 'dddd [в] LT',
        lastDay: '[Вчера в] LT',
        lastWeek: '[Прошлый] dddd [в] LT',
        sameElse: 'L'
    },
    relativeTime: {
        future: 'через %s',
        past: '%s назад',
        s: 'несколько секунд',
        m: 'минута',
        mm: '%d минут',
        h: 'час',
        hh: '%d часов',
        d: 'день',
        dd: '%d дней',
        M: 'месяц',
        MM: '%d месяцев',
        y: 'год',
        yy: '%d лет'
    },
    week: {
        dow: 1, // Первый день недели — понедельник
        doy: 7  // Первая неделя года должна содержать 7 января
    }
});

В этом примере локаль 'ru-custom' полностью настраивает названия месяцев, дней недели, форматы отображения дат и правила относительного времени.


Настройка форматов даты и времени

Объект longDateFormat определяет, как Moment.js будет выводить дату в различных сценариях:

  • LT — время без секунд.
  • LTS — время с секундами.
  • L — краткий формат даты.
  • LL — полный формат даты с месяцем прописью.
  • LLL — полный формат даты с временем.
  • LLLL — полная дата с днем недели и временем.

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

moment.locale('ru-custom');
console.log(moment().format('LLLL')); // Воскресенье, 21 мая 2026 г., 14:35

Настройка календаря

Объект calendar позволяет задать шаблоны для вывода дат относительно текущего дня. Например:

  • sameDay — для сегодняшней даты.
  • nextDay — для завтрашней.
  • nextWeek — для следующей недели.
  • lastDay — для вчерашней.
  • lastWeek — для прошлой недели.
  • sameElse — для всех остальных случаев.

Каждое значение может содержать текст и формат времени через LT.


Настройка относительного времени

Объект relativeTime используется при вызове moment().fromNow() или moment().to(). Возможные ключи:

  • future и past — шаблоны для будущего и прошлого.
  • s, m, mm, h, hh, d, dd, M, MM, y, yy — единицы измерения времени.

Пример:

moment.locale('ru-custom');
console.log(moment().add(3, 'days').fromNow()); // через 3 дня
console.log(moment().subtract(2, 'hours').fromNow()); // 2 часов назад

Дни недели и первый день года

Объект week задает поведение календаря:

  • dow (day of week) — первый день недели (0 — воскресенье, 1 — понедельник и т.д.).
  • doy (day of year) — день года, который определяет первую неделю года. Обычно 4 соответствует ISO-8601, но можно изменять под региональные стандарты.

Использование пользовательской локали

После определения локали её нужно активировать:

moment.locale('ru-custom');

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


Наследование локали

Moment.js позволяет создавать локали на основе существующих, чтобы избежать повторного задания всех настроек. Для этого используется moment.defineLocale с указанием родительской локали через parentLocale:

moment.defineLocale('ru-custom-short', {
    parentLocale: 'ru-custom',
    longDateFormat: {
        LLLL: 'D MMM YYYY, HH:mm'
    }
});

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


Особенности и рекомендации

  • Все строки с месяцами и днями недели необходимо разделять через _ и превращать в массив методом split('_').
  • Форматы времени LT, LTS и т.д. должны соответствовать стандарту Moment.js.
  • Локаль можно временно активировать только для одного объекта даты через moment().locale('ru-custom'), не меняя глобальную локаль.
  • Для сложных сценариев отображения, например с падежами в русских месяцах, можно использовать функции вместо строк в объекте months и relativeTime.

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