Даты и периоды
Даты не переводятся моделью — их формируют из частей. Для диапазонов есть готовый хелпер:
use mrLexndr\Translate\DateHelper;
echo DateHelper::formatRange('2026-03-01', '2026-03-09');
Он разбирает обе даты, собирает читаемый период и берёт название месяца из словаря на языке текущей страницы.
Некорректная дата на входе не роняет страницу: метод вернёт пустую строку.
Откуда берутся названия месяцев
Из словаря, по кодам вида MONTH_SHORT_1, MONTH_SHORT_2 и так далее. Если
кода нет, он заводится с русским названием, и дальше вы переводите его как
обычную фразу.
Отсюда одна особенность, о которой стоит знать заранее: эти коды собираются в коде из номера месяца, а значит индексатор их не видит. Двенадцать фраз будут постоянно числиться неиспользуемыми и попадать в список кандидатов на удаление в «Мусорщике». Удалять их нельзя.
Это общее свойство динамических кодов, не особенность дат — см. Индексация.
Если нужен свой формат
Хелпер решает одну частую задачу — период вида «1–9 марта». Всё остальное собирайте сами из фраз словаря, по тому же принципу: не склеивайте предложение из кусков, а заводите фразу целиком с подстановками.
// Плохо: в другом языке порядок слов другой
LANG_VAR('FROM') . ' ' . $a . ' ' . LANG_VAR('TO') . ' ' . $b;
// Хорошо: фраза «с #FROM# по #TO#» переводится целиком
LANG_VAR('PERIOD', ['#FROM#' => $a, '#TO#' => $b]);
Подробнее про подстановки — Lang::get и LANG_VAR.