Библиотека date-fns строит работу с локализацией на основе набора заранее подготовленных языковых пакетов (locale). Каждый такой пакет содержит правила отображения компонентов даты: названий месяцев, дней недели, форматов времени, грамматических особенностей.
Ключевая идея заключается в том, что форматирование даты отделено от
языковых данных. Функции вроде format получают отдельный
объект локали, который определяет, как именно будут отображаться
элементы даты.
Каждая локаль в date-fns — это объект, содержащий:
Подключение локали выполняется через импорт:
import { format } from 'date-fns';
import { ru } from 'date-fns/locale';
После подключения локаль передаётся в опции функций форматирования:
format(new Date(2026, 0, 1), 'PPPP', { locale: ru });
Без передачи локали используется английский язык как значение по умолчанию.
Названия месяцев в date-fns хранятся в локали в нескольких форматах:
В русской локали используются формы:
| Месяц | Полное название |
|---|---|
| Январь | январь |
| Февраль | февраль |
| Март | март |
| Апрель | апрель |
| Май | май |
| Июнь | июнь |
| Июль | июль |
| Август | август |
| Сентябрь | сентябрь |
| Октябрь | октябрь |
| Ноябрь | ноябрь |
| Декабрь | декабрь |
При форматировании через format библиотека автоматически
подставляет нужное значение в зависимости от токена:
MMMM — полное название месяцаMMM — сокращённоеПример использования:
import { format } from 'date-fns';
import { ru } from 'date-fns/locale';
const date = new Date(2026, 4, 22);
format(date, 'MMMM', { locale: ru });
// "май"
Сокращённый вариант:
format(date, 'MMM', { locale: ru });
// "май" (для русского часто совпадает с полной формой)
Дни недели в date-fns также представлены в локали в виде массива значений.
В русской локали порядок следующий:
Полные формы:
| День | Название |
|---|---|
| Sunday | воскресенье |
| Monday | понедельник |
| Tuesday | вторник |
| Wednesday | среда |
| Thursday | четверг |
| Friday | пятница |
| Saturday | суббота |
Форматирование осуществляется через токены:
EEEE — полное название дня неделиEEE — сокращённоеПример:
format(new Date(2026, 4, 22), 'EEEE', { locale: ru });
// "пятница"
Сокращённая форма:
format(new Date(2026, 4, 22), 'EEE', { locale: ru });
// "пт"
Функция format внутри date-fns не содержит встроенных
языковых строк. Она работает по следующему принципу:
'PPPP',
'EEEE', 'MMMM')Упрощённо можно представить логику так:
locale.months.formatting.long[monthIndex]
locale.weekdays.formatting.long[dayIndex]
Таким образом, перевод не «вшит» в функцию форматирования, а полностью делегирован объекту локали.
Локали date-fns различают контексты использования слов:
В некоторых языках (например, немецком или французском) это различие критично, поскольку формы слов меняются в зависимости от грамматики.
Пример структуры:
months: {
format: {
wide: [...],
abbreviated: [...]
},
standalone: {
wide: [...],
abbreviated: [...]
}
}
Для русского языка различия минимальны, поэтому значения часто совпадают.
Хотя основная задача локализации — перевод, важным элементом остаётся настройка календарной логики.
В русской локали:
Это влияет на функции:
startOfWeekgetWeekПример:
import { startOfWeek } from 'date-fns';
import { ru } from 'date-fns/locale';
startOfWeek(new Date(2026, 4, 22), { locale: ru });
Локаль применяется не только в format, но и в других
функциях:
formatDistance — «5 минут назад»formatRelative — «вчера в 14:00»formatDistanceToNowПример:
import { formatDistance } from 'date-fns';
import { ru } from 'date-fns/locale';
formatDistance(new Date(2026, 4, 23), new Date(2026, 4, 22), {
locale: ru
});
// "1 день"
В этих функциях локаль определяет не только слова, но и грамматические формы чисел.
date-fns позволяет создавать собственные локали или модифицировать существующие.
Структура минимальной локали:
const customLocale = {
code: 'custom',
formatDistance: () => {},
formatLong: {},
formatRelative: () => {},
localize: {
month: (n) => ['Янв', 'Фев', 'Мар'][n],
day: (n) => ['Вс', 'Пн', 'Вт'][n]
},
options: {
weekStartsOn: 1
}
};
Такой подход используется при:
Основные токены, связанные с переводом:
MMMM — месяц (полный)MMM — месяц (сокращённый)EEEE — день недели (полный)EEE — день недели (сокращённый)i — ISO-день недели (в некоторых контекстах
локализуется)Пример комбинированного форматирования:
format(new Date(2026, 4, 22), 'EEEE, d MMMM yyyy', { locale: ru });
// "пятница, 22 май 2026"
Русский язык в date-fns имеет ряд характерных особенностей:
Эти особенности упрощают реализацию локали, но сохраняют совместимость с международной системой форматирования.
При использовании tree-shaking в современных сборщиках:
Пример оптимального импорта:
import { ru } from 'date-fns/locale';
Избыточный импорт всех локалей:
import * as locales from 'date-fns/locale';
также возможен, но увеличивает размер итоговой сборки.
Система перевода месяцев и дней недели в date-fns строится на трёх уровнях:
format)Эта архитектура обеспечивает независимость логики работы с датами от языковой специфики и позволяет масштабировать поддержку новых языков без изменения ядра библиотеки.