Структура объекта i18n

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

Объект i18n представляет собой плоскую структуру ключ–значение, где каждое поле отвечает за конкретный элемент интерфейса календаря. Типичная форма выглядит следующим образом:

i18n: {
  previousMonth: '',
  nextMonth: '',
  months: [],
  weekdays: [],
  weekdaysShort: [],
  weekdaysMin: []
}

Несмотря на кажущуюся простоту, каждая группа значений играет строго определённую роль в рендеринге календаря и влияет на несколько частей UI одновременно.

Навигационные строки

Ключи previousMonth и nextMonth управляют подписями кнопок переключения месяцев. Эти значения отображаются в заголовке календаря рядом со стрелками навигации.

i18n: {
  previousMonth: 'Предыдущий месяц',
  nextMonth: 'Следующий месяц'
}

Особенность этих полей заключается в том, что они не являются обязательными для функциональности. Если они пустые, интерфейс остаётся рабочим, но теряет текстовую доступность, что критично для screen reader-ов и accessibility.

Названия месяцев

Поле months — это массив из 12 строк, строго соответствующих порядку месяцев от января до декабря. Нарушение порядка приводит к некорректному отображению дат.

i18n: {
  months: [
    'Январь', 'Февраль', 'Март', 'Апрель',
    'Май', 'Июнь', 'Июль', 'Август',
    'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'
  ]
}

Внутренний механизм календаря использует индекс месяца (0–11) как прямой ключ доступа к массиву. Это означает, что структура должна быть фиксированной и не допускает пропусков элементов.

Дни недели: weekdays

Поле weekdays содержит полные названия дней недели, обычно начиная с воскресенья:

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

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

Сокращённые дни недели: weekdaysShort

weekdaysShort используется для компактного отображения в заголовках таблицы календаря. Обычно это 2–3 символа или краткие формы:

i18n: {
  weekdaysShort: [
    'Вс', 'Пн', 'Вт', 'Ср',
    'Чт', 'Пт', 'Сб'
  ]
}

Этот массив отображается в верхней строке сетки календаря и напрямую соответствует индексу дня недели.

Минимальные обозначения: weekdaysMin

Поле weekdaysMin используется для ещё более компактного отображения, часто в узких интерфейсах или мобильных версиях:

i18n: {
  weekdaysMin: [
    'В', 'П', 'В', 'С',
    'Ч', 'П', 'С'
  ]
}

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

Полная конфигурация i18n

Полноценный объект локализации объединяет все перечисленные элементы:

const picker = new Pikaday({
  field: document.getElementById('datepicker'),
  i18n: {
    previousMonth: 'Предыдущий',
    nextMonth: 'Следующий',
    months: [
      'Январь', 'Февраль', 'Март', 'Апрель',
      'Май', 'Июнь', 'Июль', 'Август',
      'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'
    ],
    weekdays: [
      'Воскресенье', 'Понедельник', 'Вторник',
      'Среда', 'Четверг', 'Пятница', 'Суббота'
    ],
    weekdaysShort: [
      'Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'
    ],
    weekdaysMin: [
      'В', 'П', 'В', 'С', 'Ч', 'П', 'С'
    ]
  }
});

Внутренняя модель использования i18n

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

Механизм работы можно описать следующим образом:

  • месяц = months[date.getMonth()]
  • день недели = weekdays[date.getDay()]
  • короткое имя дня = weekdaysShort[date.getDay()]

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

Особенности расширения и переопределения

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

Типичная ошибка при кастомизации — попытка сократить массивы или изменить их порядок под «локальные привычки», что приводит к рассинхронизации отображаемых дат.

Поведение при частичном определении

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

Например:

i18n: {
  months: ['Январь', 'Февраль']
}

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

Связь i18n с форматированием дат

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

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

Роль i18n в accessibility

Локализация через i18n напрямую влияет на доступность интерфейса. Screen reader-ы используют текстовые значения из объекта для озвучивания элементов управления календарём. Особенно критичны:

  • previousMonth
  • nextMonth
  • months
  • weekdays

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