Языковые константы
В отличие от Б, мы можем добавить на сайт сколько угодно языков. "Из коробки" сразу доступно 2 языка, русский и английский. Но если зайти в админке в раздел "Конфигурация", и нажать на закладку "Языки", можно под списком имеющихся увидеть пустое поле для добавления:
Каждый добавленный язык - это отдельный сайт, переключаться с одного языка на другой в админке можно, используя мало заметную выпадашку в верхнем черном меню справа. Казалось бы по логике, что эта выпадашка должна менять язык админки, но нет - это переключатель между языковыми версиями сайта, а язык админки можно выбрать только в форме логина.
Если переключиться на английский язык, который уже есть, то увидим, что структура сайта пустая, там нет ни одной страницы. Более того, к этой версии сайта не привязан никакой шаблон. Это еще одна засада UMI CMS!
Идем в раздел "Шаблонны сайта" и повторяем процедуру добавления шаблона, которую уже проделывали после установки системы. Господа разработчики, нельзя было сразу создать шаблон для всех языков? Вряд ли кто-то делает отдельные шаблоны для языковых версий сайта, а если и делает - то поправит.
Можем теперь добавить страницы, или скопировать их с русской версии, для чего надо сначала переключиться обратно на русскую версию сайта, и в структуре, выбрав нужные страницы, скопировать их в английскую часть (выбрать, куда копировать, можно в процессе копирования). В сущности, там всё просто, но при копировании возникает ощущение, что ничего не происходит, и есть опасность накопировать страницы много раз подряд. Господа разработчики, может, сообщение выдавать, что страница скопирована???
Итак, мы выделили раздел "Страница 1", жамкнули по крайней правой пиктограмме "Скопировать в", выбрали English - и ничего не произошло! Не спешим жамкать ещё раз, выбираем в верхнем меню English, и видим, что всё скопировалось, жабу им в карму!
Что касается контента страниц, то мы его конечно переведем. Но некоторые слова в нашем шаблоне так и останутся не переведенными. Как это поправить? Очень просто!
Заводим в директории php нашего шаблона раздел i18n, а в нем файлы i18n.ru.php и i18n.en.php. Содержимое файла i18n.en.php такое:
<?php /** Языковые константы для английской версии шаблона */ return [ 'back-to-catalog' => "Go back to <a href='/'>catalog</a> and add items to Shopping Cart.", 'yes' => 'Yes', 'no' => 'No', 'welcome' => 'Welcome,', 'errors' => 'Errors', 'error' => 'Error', 'pay' => 'Pay', ] ?>
Для i18n.ru.php то же самое, но справа - перевод на русский язык. Понятно, что константы используем те, которые нам нужны, не обязательно вышеперечисленные.
Как использовать? Вместо слов в шаблоне пишем:
<?= $this->translate('something is wrong') ?>
Метод translate() находит в нашем языковом файле ключ 'something is wrong' и подставляет значение этого элемента массива. А что делает, если не находит? Или если вообще такого массива нет? Просто выводит этот ключ. Удобно и наглядно. Если видим на сайте что-то не на том языке - просто добавляем элемент в массивы, сразу во все, желательно.
А если надо добавить еще один язык, после добавления его в админке копируем файл i18n.en.php, скажем, в i18n.de.php, и переводим все значения на немецкий.
Осталось рассказать только еще про одну засаду. Языковых файлов в UMI много, они находятся в каждом модуле, и, вообще говоря, они системные. Это значит, что дополнять и исправлять их бесполезно, они будут перезаписаны при обновлениях системы. Часто результат работы модулей содержит такие языковые константы, и если перевод бывает мягко говоря неудовлетворительным, найти и поправить может быть проблематично.