Международная поддержка в Pikaday реализована через систему локалей
(language packs), которые представляют собой наборы конфигураций,
определяющих отображение интерфейса календаря: названия месяцев, дней
недели, форматы дат, текстовые метки и поведение отдельных элементов UI.
Основной механизм интеграции — объект i18n, передаваемый в
конфигурацию экземпляра календаря.
Готовые языковые пакеты в библиотеке представляют собой JavaScript-объекты, соответствующие единому интерфейсу, что позволяет подключать их без адаптации структуры. Каждый пакет отвечает только за локализацию текстовых элементов, не затрагивая логику работы календаря.
Любой языковой пакет в Pikaday строится вокруг объекта следующего вида:
{
previousMonth: 'Previous Month',
nextMonth: 'Next Month',
months: [
'January', 'February', 'March', 'April',
'May', 'June', 'July', 'August',
'September', 'October', 'November', 'December'
],
weekdays: [
'Sunday', 'Monday', 'Tuesday', 'Wednesday',
'Thursday', 'Friday', 'Saturday'
],
weekdaysShort: [
'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'
]
}
Каждое поле имеет строго определённую роль:
Дополнительно в некоторых пакетах присутствуют расширенные поля,
такие как midnight или локализованные форматы дат, если
используется расширенная сборка или интеграция с Moment.js.
В стандартной поставке Pikaday готовые локали часто выделяются в отдельные файлы, которые подключаются вручную или через сборщик модулей.
Пример подключения локали:
import Pikaday from 'pikaday';
import ru from 'pikaday/locales/ru';
const picker = new Pikaday({
field: document.getElementById('date'),
i18n: ru
});
В вариантах без сборщика используется глобальное подключение:
<script src="pikaday.js"></script>
<script src="locales/ru.js"></script>
<script>
new Pikaday({
field: document.getElementById('date'),
i18n: PikadayLocales.ru
});
</script>
Подход зависит от архитектуры проекта, но структура локалей остаётся неизменной.
Русский языковой пакет включает полные и сокращённые формы названий, адаптированные под локальные правила.
const ru = {
previousMonth: 'Предыдущий месяц',
nextMonth: 'Следующий месяц',
months: [
'Январь', 'Февраль', 'Март', 'Апрель',
'Май', 'Июнь', 'Июль', 'Август',
'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'
],
weekdays: [
'Воскресенье', 'Понедельник', 'Вторник', 'Среда',
'Четверг', 'Пятница', 'Суббота'
],
weekdaysShort: [
'Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'
]
};
Особенность русской локали заключается в том, что сокращения дней недели обычно формируются из первых двух букв, а названия месяцев не изменяются по падежам внутри компонента, так как Pikaday отображает их в именительном падеже независимо от контекста.
Английская локаль используется как базовая и часто выступает значением по умолчанию:
const en = {
previousMonth: 'Previous Month',
nextMonth: 'Next Month',
months: [
'January', 'February', 'March', 'April',
'May', 'June', 'July', 'August',
'September', 'October', 'November', 'December'
],
weekdays: [
'Sunday', 'Monday', 'Tuesday', 'Wednesday',
'Thursday', 'Friday', 'Saturday'
],
weekdaysShort: [
'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'
]
};
Этот пакет часто используется как fallback в случаях, когда локализация не определена или отсутствует в проекте.
Хотя интерфейс объекта одинаковый, различия между пакетами заключаются не только в переводе строк, но и в особенностях:
Длина строк
Сокращения
Грамматические особенности
Некоторые проекты модифицируют готовые языковые пакеты, добавляя дополнительные поля для кастомного интерфейса:
const ruExtended = {
previousMonth: 'Предыдущий',
nextMonth: 'Следующий',
months: [
'Январь', 'Февраль', 'Март', 'Апрель',
'Май', 'Июнь', 'Июль', 'Август',
'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'
],
weekdays: [
'Воскресенье', 'Понедельник', 'Вторник', 'Среда',
'Четверг', 'Пятница', 'Суббота'
],
weekdaysShort: [
'В', 'П', 'В', 'С', 'Ч', 'П', 'С'
],
today: 'Сегодня',
clear: 'Очистить'
};
Хотя today и clear не являются частью
стандартного API Pikaday, подобные расширения используются при кастомной
отрисовке UI или при обёртке календаря.
В стандартной конфигурации Pikaday формат даты не входит в
i18n, но часто используется совместно:
new Pikaday({
field: document.getElementById('date'),
format: 'DD.MM.YYYY',
i18n: ru
});
Формат даты зависит от реализации (например, через Moment.js или встроенный парсер). Локализация текста и формат даты разделены концептуально, чтобы избежать смешивания UI и логики парсинга.
В современных сборках (Webpack, Vite) локали часто импортируются как отдельные модули:
import en from 'pikaday/i18n/en';
import de from 'pikaday/i18n/de';
import fr from 'pikaday/i18n/fr';
function getLocale(lang) {
switch (lang) {
case 'de': return de;
case 'fr': return fr;
default: return en;
}
}
Такая схема позволяет динамически переключать язык без пересоздания логики календаря, ограничиваясь обновлением конфигурации экземпляра.
Pikaday не всегда поддерживает полноценное динамическое изменение локали “на лету”, поэтому распространённый подход заключается в пересоздании экземпляра:
let picker = new Pikaday({
field: document.getElementById('date'),
i18n: en
});
function changeLanguage(locale) {
picker.destroy();
picker = new Pikaday({
field: document.getElementById('date'),
i18n: locale
});
}
Такой подход обеспечивает консистентность интерфейса и исключает расхождения между отображаемыми строками.
Готовые языковые пакеты можно комбинировать с пользовательскими изменениями. Это особенно полезно при частичной локализации:
import ru from 'pikaday/i18n/ru';
const customRu = {
...ru,
previousMonth: 'Назад',
nextMonth: 'Вперёд'
};
Подобный паттерн позволяет использовать базовую локализацию без необходимости переписывать весь пакет, изменяя только необходимые элементы интерфейса.
При интеграции локалей часто возникают структурные ошибки:
months,
weekdays, weekdaysShort)Такие ошибки приводят к смещению дат, некорректным подписям или поломке навигации календаря.
При масштабных проектах языковые пакеты выносятся в отдельную структуру:
/locales
en.js
ru.js
de.js
fr.js
index.js
Файл index.js обычно агрегирует доступные локали:
import en from './en';
import ru from './ru';
import de from './de';
import fr from './fr';
export default {
en,
ru,
de,
fr
};
Это позволяет централизованно управлять локализацией и подключать новые языки без изменения логики календаря.
Если объект i18n не передан, Pikaday использует
встроенные значения по умолчанию, которые соответствуют английской
локали. Это упрощает интеграцию, но приводит к отсутствию международной
адаптации интерфейса.
При частичной передаче объекта (например, только months)
недостающие поля не заполняются автоматически, поэтому визуально
интерфейс может стать неполным.