Переводы
Магазин может работать на нескольких языках, поэтому строки интерфейса не пишут в коде «как есть». Их оборачивают в функцию перевода: она ищет перевод для текущего языка и, если его нет, возвращает исходную строку.
В PHP
В классе модуля строки переводит метод trans():
// modules/acmehello/acmehello.php
$title = $this->trans('Отзывы', [], 'Modules.Acmehello.Shop');Первый аргумент — исходная строка, второй — подстановки, третий — домен перевода. Пока перевода нет, метод вернёт саму строку «Отзывы».
Домен
Домен — имя группы строк. По нему движок понимает, какому модулю и какой части магазина принадлежит строка.
| Домен | Для чего |
|---|---|
Modules.Acmehello.Shop | Строки модуля на витрине |
Modules.Acmehello.Admin | Строки модуля в панели управления |
Admin.Actions, Admin.Global | Готовые строки ядра: «Сохранить», «Да», «Нет» |
Shop.Theme.Actions | Готовые строки темы: «В корзину», «Продолжить» |
Домен модуля строится так: Modules, точка, имя модуля с заглавной буквы и без подчёркиваний, точка, Shop или Admin. Для строк из доменов ядра переводы уже есть на всех языках.
В шаблоне
В шаблонах Smarty ту же работу делает функция l:
{* modules/acmehello/views/templates/hook/product-reviews.tpl *}
<section class="acme-reviews">
<h3>{l s='Отзывы' d='Modules.Acmehello.Shop'}</h3>
{if $reviews}
<ul>
{foreach from=$reviews item=review}
<li>{$review.author}: {$review.rating}</li>
{/foreach}
</ul>
{else}
<p>{l s='Отзывов пока нет.' d='Modules.Acmehello.Shop'}</p>
{/if}
</section>Атрибут s — строка, d — домен.
Подстановки
Изменяемую часть строки не склеивают, а подставляют: в разных языках порядок слов разный.
$text = $this->trans('Отзывов: %count%', ['%count%' => 12], 'Modules.Acmehello.Shop');{l s='Здравствуйте, %name%!' sprintf=['%name%' => $customer.firstname] d='Modules.Acmehello.Shop'}Переводчик увидит строку целиком, с меткой %name%, и поставит её в нужное место.
Включение в модуле
Чтобы панель показывала строки модуля на странице переводов, добавьте в главный класс метод:
// modules/acmehello/acmehello.php
public function isUsingNewTranslationSystem(): bool
{
return true;
}Где переводят
- Откройте в панели «Международный → Переводы».
- В блоке «Изменить переводы» выберите тип «Переводы установленных модулей», модуль
acmehelloи язык. - Введите перевод напротив каждой строки и сохраните.
Откройте витрину на этом языке: заголовок блока отзывов сменится на перевод. Переводы сохраняются в базе данных магазина.
На каком языке писать исходные строки
В примерах курса исходные строки русские. В модулях, которые распространяются среди разных магазинов, исходные строки пишут по-английски: английский — язык по умолчанию для каталога переводов, и магазин без перевода покажет английский текст.
В контроллерах
В контроллерах модуля есть такой же метод: $this->trans('Спасибо за отзыв!', [], 'Modules.Acmehello.Shop'). В шаблонах Twig панели используют фильтр: {{ 'Отзывы'|trans({}, 'Modules.Acmehello.Admin') }}.
Частая ошибка
В trans() передают переменную: $this->trans($message, [], 'Modules.Acmehello.Shop'). Страница переводов находит строки, читая исходный код, и переменную прочитать не может — такой строки в списке не будет. Первым аргументом всегда пишите саму строку в кавычках, а изменяемые части передавайте подстановками.