Готовые языковые пакеты

Международная поддержка в Pikaday реализована через систему локалей (language packs), которые представляют собой наборы конфигураций, определяющих отображение интерфейса календаря: названия месяцев, дней недели, форматы дат, текстовые метки и поведение отдельных элементов UI. Основной механизм интеграции — объект i18n, передаваемый в конфигурацию экземпляра календаря.

Готовые языковые пакеты в библиотеке представляют собой JavaScript-объекты, соответствующие единому интерфейсу, что позволяет подключать их без адаптации структуры. Каждый пакет отвечает только за локализацию текстовых элементов, не затрагивая логику работы календаря.


Базовая структура i18n-пакета

Любой языковой пакет в 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'
    ]
}

Каждое поле имеет строго определённую роль:

  • previousMonth / nextMonth — подписи навигации по месяцам
  • months — полные названия месяцев
  • weekdays — полные названия дней недели
  • weekdaysShort — сокращённые версии дней недели

Дополнительно в некоторых пакетах присутствуют расширенные поля, такие как 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>

Подход зависит от архитектуры проекта, но структура локалей остаётся неизменной.


Русская локализация (ru)

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

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

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


Английский пакет (en)

Английская локаль используется как базовая и часто выступает значением по умолчанию:

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 в случаях, когда локализация не определена или отсутствует в проекте.


Структурные различия между локалями

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

  1. Длина строк

    • В немецкой и русской локалях текст длиннее, что влияет на верстку
    • В английской и испанской локалях строки компактнее
  2. Сокращения

    • В разных языках сокращения дней недели могут пересекаться (например, “Tu” может означать Tuesday или Thursday в разных системах)
  3. Грамматические особенности

    • Pikaday не поддерживает склонения дат, поэтому локали упрощаются до базовых форм

Пример расширенной локали с адаптацией под UI

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

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)
  • несоответствие длины массивов (должно быть 7 дней и 12 месяцев)
  • нарушение порядка дней недели (Pikaday ожидает Sunday-first)
  • использование строк вместо массивов
  • частичная локализация без fallback-значений

Такие ошибки приводят к смещению дат, некорректным подписям или поломке навигации календаря.


Организация набора локалей в проекте

При масштабных проектах языковые пакеты выносятся в отдельную структуру:

/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
};

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


Поведение Pikaday при отсутствии локали

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

При частичной передаче объекта (например, только months) недостающие поля не заполняются автоматически, поэтому визуально интерфейс может стать неполным.