Языковые константы

Материал из Wiki from ADT Web Solutions
Перейти к навигации Перейти к поиску

В отличие от Б, мы можем добавить на сайт сколько угодно языков. "Из коробки" сразу доступно 2 языка, русский и английский. Но если зайти в админке в раздел "Конфигурация", и нажать на закладку "Языки", можно под списком имеющихся увидеть пустое поле для добавления:

Screenshot 2020-10-30 UMI CMS - Языки.png

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

Если переключиться на английский язык, который уже есть, то увидим, что структура сайта пустая, там нет ни одной страницы. Более того, к этой версии сайта не привязан никакой шаблон. Это еще одна засада 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 много, они находятся в каждом модуле, и, вообще говоря, они системные. Это значит, что дополнять и исправлять их бесполезно, они будут перезаписаны при обновлениях системы. Часто результат работы модулей содержит такие языковые константы, и если перевод бывает мягко говоря неудовлетворительным, найти и поправить может быть проблематично.