Перевод названий дней недели

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

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


Основной механизм перевода дней недели реализуется через объект конфигурации i18n, который передаётся при инициализации календаря. Он включает несколько массивов, связанных с временными сущностями, но для дней недели используются три ключевых поля:

  • weekdays
  • weekdaysShort
  • weekdaysMin

Каждый из этих массивов содержит 7 строковых значений, соответствующих дням недели в порядке, который ожидает библиотека.

Типичная структура:

i18n: {
  previousMonth: 'Предыдущий месяц',
  nextMonth: 'Следующий месяц',
  months: [
    'Январь', 'Февраль', 'Март', 'Апрель',
    'Май', 'Июнь', 'Июль', 'Август',
    'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'
  ],
  weekdays: [
    'Воскресенье', 'Понедельник', 'Вторник',
    'Среда', 'Четверг', 'Пятница', 'Суббота'
  ],
  weekdaysShort: [
    'Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'
  ],
  weekdaysMin: [
    'Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'
  ]
}

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


Согласование с началом недели (firstDay)

Параметр firstDay определяет, с какого дня начинается неделя в календарной сетке. Он принимает числовое значение от 0 до 6:

  • 0 — воскресенье
  • 1 — понедельник
  • 6 — суббота

При изменении firstDay визуальный порядок дней в заголовке календаря смещается, но массивы i18n.weekdays* остаются в «классическом» порядке. Это означает, что библиотека сама выполняет сдвиг индексов при рендеринге.

Пример конфигурации, ориентированной на европейский формат недели:

firstDay: 1,
i18n: {
  weekdays: [
    'Воскресенье', 'Понедельник', 'Вторник',
    'Среда', 'Четверг', 'Пятница', 'Суббота'
  ],
  weekdaysShort: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
  weekdaysMin: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб']
}

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


Уровни сокращений и их назначение

Разделение на три массива существует не формально, а функционально, поскольку каждый уровень используется в разных частях интерфейса:

weekdays

Полные названия дней недели. Используются:

  • во всплывающих подсказках
  • при доступных aria-label атрибутах
  • в расширенных режимах отображения

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(), где:

  • 0 — воскресенье
  • 1 — понедельник
  • 2 — вторник
  • 3 — среда
  • 4 — четверг
  • 5 — пятница
  • 6 — суббота

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


Влияние на доступность интерфейса

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

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


Совместимость с кастомными форматами отображения

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

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


Обобщённая модель соответствия

Внутреннее соответствие можно представить как трёхуровневую систему:

  • числовой индекс (0–6) — логика даты
  • i18n.weekdays* — строковая локализация
  • firstDay — визуальный сдвиг отображения

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