Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Переводы

Магазин может работать на нескольких языках, поэтому строки интерфейса не пишут в коде «как есть». Их оборачивают в функцию перевода: она ищет перевод для текущего языка и, если его нет, возвращает исходную строку.

В 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;
}

Где переводят

  1. Откройте в панели «Международный → Переводы».
  2. В блоке «Изменить переводы» выберите тип «Переводы установленных модулей», модуль acmehello и язык.
  3. Введите перевод напротив каждой строки и сохраните.

Откройте витрину на этом языке: заголовок блока отзывов сменится на перевод. Переводы сохраняются в базе данных магазина.

На каком языке писать исходные строки

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

В контроллерах

В контроллерах модуля есть такой же метод: $this->trans('Спасибо за отзыв!', [], 'Modules.Acmehello.Shop'). В шаблонах Twig панели используют фильтр: {{ 'Отзывы'|trans({}, 'Modules.Acmehello.Admin') }}.

Частая ошибка

В trans() передают переменную: $this->trans($message, [], 'Modules.Acmehello.Shop'). Страница переводов находит строки, читая исходный код, и переменную прочитать не может — такой строки в списке не будет. Первым аргументом всегда пишите саму строку в кавычках, а изменяемые части передавайте подстановками.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.