Локализация календаря в Pikaday опирается на набор параметров i18n и конфигурацию отображения дней недели, где ключевую роль играет согласованность между порядком дней, начальной точкой недели и набором строковых представлений для разных уровней сокращения.
Внутреннее представление дней недели в календарных компонентах подобного типа обычно базируется на числовой шкале от 0 до 6, где каждый индекс соответствует конкретному дню. В Pikaday это отражается через массивы локализации, которые должны строго соответствовать выбранной системе начала недели, иначе возникает рассинхронизация отображения и логики навигации по календарю.
Основной механизм перевода дней недели реализуется через объект
конфигурации i18n, который передаётся при инициализации
календаря. Он включает несколько массивов, связанных с временными
сущностями, но для дней недели используются три ключевых поля:
weekdaysweekdaysShortweekdaysMinКаждый из этих массивов содержит 7 строковых значений, соответствующих дням недели в порядке, который ожидает библиотека.
Типичная структура:
i18n: {
previousMonth: 'Предыдущий месяц',
nextMonth: 'Следующий месяц',
months: [
'Январь', 'Февраль', 'Март', 'Апрель',
'Май', 'Июнь', 'Июль', 'Август',
'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'
],
weekdays: [
'Воскресенье', 'Понедельник', 'Вторник',
'Среда', 'Четверг', 'Пятница', 'Суббота'
],
weekdaysShort: [
'Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'
],
weekdaysMin: [
'Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'
]
}
Ключевой момент заключается в том, что порядок элементов массива имеет не декоративное, а функциональное значение. Индекс массива напрямую соотносится с вычисляемым днём недели.
Параметр firstDay определяет, с какого дня начинается
неделя в календарной сетке. Он принимает числовое значение от 0 до
6:
0 — воскресенье1 — понедельник6 — субботаПри изменении firstDay визуальный порядок дней в
заголовке календаря смещается, но массивы i18n.weekdays*
остаются в «классическом» порядке. Это означает, что библиотека сама
выполняет сдвиг индексов при рендеринге.
Пример конфигурации, ориентированной на европейский формат недели:
firstDay: 1,
i18n: {
weekdays: [
'Воскресенье', 'Понедельник', 'Вторник',
'Среда', 'Четверг', 'Пятница', 'Суббота'
],
weekdaysShort: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
weekdaysMin: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб']
}
В таком режиме понедельник становится первым отображаемым днём, но индексная база остаётся неизменной. Это критично при синхронизации локализации с логикой вычисления дат.
Разделение на три массива существует не формально, а функционально, поскольку каждый уровень используется в разных частях интерфейса:
Полные названия дней недели. Используются:
Сокращённые формы средней длины. Применяются:
Минимальные формы (обычно 2 буквы). Используются:
Различие между weekdaysShort и weekdaysMin
не фиксировано библиотекой жёстко, но концептуально предполагает баланс
между читаемостью и плотностью интерфейса.
При отрисовке заголовка календаря Pikaday использует вычисление
индекса дня недели относительно firstDay. Упрощённо это
выглядит как циклический сдвиг:
displayIndex = (dayIndex + 7 - firstDay) % 7
Где:
dayIndex — исходный индекс дня (0–6)firstDay — начало неделиЭто означает, что перевод названий дней не должен учитывать сдвиг вручную. Все локализованные массивы должны оставаться в исходной «нормализованной» последовательности.
Одной из типичных проблем при настройке переводов дней недели
является попытка «подогнать» массивы под визуальный порядок недели при
использовании firstDay ≠ 0.
Например, ошибочная конфигурация:
firstDay: 1,
weekdays: ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье']
Такая настройка приводит к смещению логики, поскольку библиотека уже выполняет перестановку. В результате названия дней перестают соответствовать фактическим датам.
Корректный подход всегда предполагает сохранение исходного порядка воскресенье–суббота независимо от отображения.
Хотя перевод дней недели в Pikaday не связан напрямую с
форматированием выбранной даты, он влияет на отображение дней в
заголовках и навигации. При интеграции с внешними библиотеками
форматирования (например, Date.toLocaleDateString или
Moment-подобными решениями) важно избегать двойной локализации.
Если внешняя система уже возвращает локализованное имя дня недели, а
Pikaday одновременно использует i18n.weekdays, может
возникнуть несогласованность языков интерфейса.
Pikaday не предоставляет полноценного встроенного механизма
реактивной смены локали, поэтому перевод дней недели обычно реализуется
через пересоздание экземпляра календаря с новым i18n
объектом.
Пример концептуального подхода:
const ruLocale = {
weekdays: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'],
weekdaysShort: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
weekdaysMin: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб']
};
const enLocale = {
weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
weekdaysMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']
};
При переключении языка календарь пересоздаётся с новым объектом, что гарантирует согласованность всех визуальных элементов.
Каждый элемент массива дней недели соответствует фиксированному
значению Date.getDay(), где:
Это соответствие является фундаментальным и не изменяется при локализации. Перевод влияет только на строковое представление, но не на семантику индексов.
Переводы дней недели также используются в контексте доступности. При
навигации с клавиатуры или использовании скринридеров полные формы из
weekdays могут подставляться в ARIA-атрибуты, обеспечивая
корректное произношение и понимание структуры календаря.
Сокращённые формы при этом служат исключительно визуальной оптимизацией и не должны заменять полные названия в контекстах, связанных с доступностью.
При использовании кастомных рендеров заголовков дней недели важно
учитывать, что Pikaday не ограничивает формат строк. В
weekdays* массивах допустимы любые символы Unicode, включая
составные строки, однако длина и визуальная плотность напрямую влияют на
поведение сетки календаря.
Чрезмерно длинные значения могут приводить к переполнению ячеек, особенно при использовании фиксированной ширины компонентов без адаптивной верстки.
Внутреннее соответствие можно представить как трёхуровневую систему:
0–6) — логика датыi18n.weekdays* — строковая локализацияfirstDay — визуальный сдвиг отображенияЭти три слоя работают независимо, но синхронно формируют итоговое представление календаря, где перевод названий дней недели является только одним из элементов общей системы локализации.