Множественные числа в OctoberCMS

Вообще говоря, локализация интерфейса в OctoberCMS такая же как в Laravel. Есть файлы типа lang.php, разложенные по директориям, соответствующим языку, в них есть строки, их можно переводить. Неудобство лично для меня лишь в одном — когда нужно куда-то вставить локализованный текст, не видно самого текста, только идентификатор строки. В остальном, на мой взгляд, система эта несколько удобнее перевода интерфейса в Друпале.

Даже если поддерживать сайт или интерфейс на нескольких языках не нужно, с переводами можно столкнуться, например, при плюрализации, то есть склонении в зависимости от значения числа. Потому что в 2018 году уже как-то стыдно делать сайт, на котором написано «1 предложений», «22 предложений» и т.д. Надо склонять.

В Ларавеле это делается тривиально, для английского языка в lang.php пишем например:

return [
    'count' => [
        'offers' => 'offer|offers',
    ],
];

Тогда при вызове trans_choice('lang.count.offers', 10); выведется слово offers, а при trans_choice('lang.count.offers', 1); — offer.

И для перевода на русский достаточно добавить в соответствующий lang.php перевод:

return [
    'count' => [
        'offers' => 'предложение|предложения|предложений',
    ],
];

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

Но в OctoberCMS есть нюанс. Дело в том, что Ларавел поддерживает единую директорию lang для локализации всего проекта, поэтому туда можно складывать любые строки и обращаться тоже можно к любым строкам. А в Октябре у каждого плагина своя директория переводов, у ядра — своя директория переводов, а у используемой темы её и вовсе нет.

Из-за этого, в первый раз столкнувшись с задачей, можно немного смутиться — а как же сделать плюрализацию для строки, которую я просто в теме вывожу. Документация пока об этом ничего не говорит. А строчка:

Note: For translating front-end content, there are plugins that can be used for this purpose.

и вовсе может навести на мысль, что для перевода строк в теме (каковая и есть фронт-энд) нужно какие-то плагины ставить (нужно, но только для контента, то есть моделей из БД).

На самом деле для обращения к строкам локализации из темы, то есть из шаблонов Twig, есть фильтры. Для обычного перевода — фильтр trans, а для плюрализации — transchoice. Его и нужно применить, чтобы получить склоняемое количество предложений:

{{ "graker.touristic::lang.count.offers"|transchoice(quantity) }}

graker.touristic здесь — это обращение к плагину Touristic за авторством Graker: к сожалению, поскольку у темы нет своего файла локализаций, необходимые строки придется разместить в каком-нибудь плагине.

Комментарии