Перевод модуля

Опубликовано Опубликовано в рубрике prestashop, Руководство разработчика PrestaShop, Русская документация PrestaShop 1.6, Создание модулей PrestaShop

Перевод модуля

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

Короче говоря, PrestaShop реализует свой собственный механизм перевода, используя метод l (lowercase L), используемый для инкапсуляции строк, которые нужно перевести. Этот метод применяется по-разному в зависимости от типа файла.

Строки в файлах PHP должны будут отображаться через вызов метода $this->l('My string.'), который вызывается из Module абстрактного класса и, следовательно, доступен во всех модулях.

mymodule.php (partial)
...
$this->displayName = $this->l('My module');
$this->description = $this->l('Description of my module.');
...

Есть особый контекст, в котором $this->l() не будет работать: когда в вашем модуле имеется контроллер фронт-офиса, строки контроллера должны быть помещены в вызов метода  $this->module->l('My string', 'filename').

Например, в файле /bankwire/controllers/front/validation.php:

die($this->module->l('This payment method is not available.', 'validation'));

Это очень частный случай, и вам не следует часто его использовать. Придерживайтесь $this->l(), чтобы ваш код не перестал работать из-за этого в контексте FrontController.

 

Строки в файле TPL необходимо будет преобразовать в динамический контент, используя {l s='My string' mod='modulename'} Вызов функции, который Smarty заменит переводом для выбранного языка. В нашем примерном модуле файл mymodule.tpl …

mymodule.tpl (частично)
<li>
  <a href="{$base_dir}modules/mymodule/mymodule_page.php" title="Click this link">Click me!</a>
</li>
<!-- Block mymodule -->
<div id="mymodule_block_left" class="block">
  <h4>{l s='Welcome!' mod='mymodule'}</h4>
  <div class="block_content">
    <p>Hello,
       {if isset($my_module_name) && $my_module_name}
           {$my_module_name}
       {else}
           World
       {/if}
       !       
    </p>   
    <ul>
      <li><a href="{$my_module_link}" title="Click this link">Click me!</a></li>
    </ul>
  </div>
</div>
<!-- /Block mymodule -->   

…становится:

mymodule.tpl (частично)
<li>
  <a href="{$base_dir}modules/mymodule/mymodule_page.php" title="{l s='Click this link' mod='mymodule'}">{l s='Click me!' mod='mymodule'}</a>
</li>
<!-- Block mymodule -->
<div id="mymodule_block_left" class="block">
  <h4>{l s='Welcome!' mod='mymodule'}</h4>
  <div class="block_content">
    <p>
      {if !isset($my_module_name) || !$my_module_name}
        {capture name='my_module_tempvar'}{l s='World' mod='mymodule'}{/capture}
        {assign var='my_module_name' value=$smarty.capture.my_module_tempvar}
      {/if}
      {l s='Hello %1$s!' sprintf=$my_module_name mod='mymodule'}   
    </p>   
    <ul>
      <li><a href="{$my_module_link}"  title="{l s='Click this link' mod='mymodule'}">{l s='Click me!' mod='mymodule'}</a></li>
    </ul>
  </div>
</div>
<!-- /Block mymodule -->

…и файлом display.tpl :

display.tpl
Welcome to this page!

…становится:

display.tpl
{l s='Welcome to this page!' mod='mymodule'}

Перевод сложного кода

Как мы видим, основой преобразования файла шаблона является их включение в {l s='The string' mod='name_of_the_module'}. Изменения в display.tpl и в  mymodule.tpl‘s тексты ссылок и заголовков, таким образом, легче понять. Но добавим более сложный блок кода для «Hello World!». Строка: if/else/then и текстовую переменную. Давайте рассмотрим этот код:
Оригинальный код:

Hello,
  {if isset($my_module_name) && $my_module_name}
    {$my_module_name}
  {else}
    World
  {/if}
!

Как вы можете видеть, нам нужно получить строку «Hello World», которая может быть переведена, учитывая, что это переменная. Как поясняется в главе «Переводы в PrestaShop 1.5», переменные должны быть отмечены маркерами sprintf() , такими как %s или %1$s.

Создание «Hello %s!» переводимого слова легко: нам просто нужно использовать код:

{l s='Hello %s!' sprintf=$my_module_name mod='mymodule'}

Но в нашем случае нам также необходимо убедиться, что% s заменится на «Мир» если значение «my_module_name» не существует … и мы должны перевести и «World». Это может быть достигнуто с помощью Smarty функции {capture}, который собирает результат шаблона между тегами в переменную вместо вывода, так что мы можем использовать его позже. Мы будем использовать его, чтобы заменить переменную переведенным «миром», если переменная пуста или отсутствует, используя временную переменную. Вот окончательный код:

{if !isset($my_module_name) || !$my_module_name}
  {capture name='my_module_tempvar'}{l s='World' mod='mymodule'}{/capture}
  {assign var='my_module_name' value=$smarty.capture.my_module_tempvar}
{/if}
{l s='Hello %s!' sprintf=$my_module_name mod='mymodule'}

Обратите внимание, что мы всегда используем параметр mod . Он используется PrestaShop для построения того модуля, которому принадлежит строка. Инструмент перевода нуждается в нем, чтобы соответствовать строке для перевода с ее переводом. Этот параметр mandatory для перевода модуля.

Строки разделяются одинарными кавычками. Если строка содержит одинарные кавычки, они должны быть экранированы с помощью обратной косой черты (\).

Строки могут быть непосредственно переведены в PrestaShop:

  • Перейдите на страницу «Переводы» в меню «Локализация»,
  • В раскрывающемся меню «Изменить переводы» выберите «Установленные переводы модулей»,
  • Выберите язык, на который вы хотите перевести модуль. Язык перевода должен быть установлен для включения перевода.
  • Нажмите кнопку «Изменить».

Загружаемая страница отображает все строки для всех установленных в данный момент модулей. Модули, у которых есть все свои строки, уже переведенные, имеют свой набор полей, тогда как если в переводе модуля отсутствует хотя бы одна строка, ее набор полей развернут.
Чтобы перевести строки вашего модуля (те, которые были «отмечены», с использованием метода l() ), просто найдите свой модуль в списке (используйте поиск по странице в браузере) и заполните пустые поля.

После того, как все строки для вашего модуля будут правильно переведены, нажмите кнопку «Сохранить и остаться» или кнопку «Сохранить» в нижней части списка строк.

PrestaShop затем сохраняет переводы в новом файле, названном с использованием формата languageCode.php (например, /mymodule/fr.php). Файл перевода выглядит так:

fr.php
<?php
global $_MODULE;
$_MODULE = array();
$_MODULE['<{mymodule}prestashop>mymodule_2ddddc2a736e4128ce1cdfd22b041e7f'] = 'Mon module';
$_MODULE['<{mymodule}prestashop>mymodule_d6968577f69f08c93c209bd8b6b3d4d5'] = 'Description du module.';
$_MODULE['<{mymodule}prestashop>mymodule_533937acf0e84c92e787614bbb16a7a0'] = 'Êtes-vous certain de vouloir désinstaller ce module ? Vous perdrez tous vos réglages !';
$_MODULE['<{mymodule}prestashop>mymodule_0f40e8817b005044250943f57a21c5e7'] = 'Aucun nom fourni';
$_MODULE['<{mymodule}prestashop>mymodule_fe5d926454b6a8144efce13a44d019ba'] = 'Valeur de configuration non valide.';
$_MODULE['<{mymodule}prestashop>mymodule_c888438d14855d7d96a2724ee9c306bd'] = 'Réglages mis à jour';
$_MODULE['<{mymodule}prestashop>mymodule_f4f70727dc34561dfde1a3c529b6205c'] = 'Réglages';
$_MODULE['<{mymodule}prestashop>mymodule_2f6e771db304264c8104cb7534bb80cd'] = 'Valeur de configuration';
$_MODULE['<{mymodule}prestashop>mymodule_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer';
$_MODULE['<{mymodule}prestashop>mymodule_630f6dc397fe74e52d5189e2c80f282b'] = 'Retour à la liste';
$_MODULE['<{mymodule}prestashop>display_86e88cbccafa83831b4c6685501c6e58'] = 'Bienvenue sur cette page !';
$_MODULE['<{mymodule}prestashop>mymodule_9a843f20677a52ca79af903123147af0'] = 'Bienvenue !';
$_MODULE['<{mymodule}prestashop>mymodule_f5a7924e621e84c9280a9a27e1bcb7f6'] = 'Monde';
$_MODULE['<{mymodule}prestashop>mymodule_3af204e311ba60e6556822eac1437208'] = 'Bonjour %s !';
$_MODULE['<{mymodule}prestashop>mymodule_c66b10fbf9cb6526d0f7d7a602a09b75'] = 'Cliquez sur ce lien';
$_MODULE['<{mymodule}prestashop>mymodule_f42c5e677c97b2167e7e6b1e0028ec6d'] = 'Cliquez-moi !';

Этот файл не должен редактироваться вручную! Его можно редактировать только с помощью инструмента перевода PrestaShop.

Теперь, когда у нас есть французский перевод, мы можем щелкнуть по французскому флагу в фронт-офисе и получить ожидаемый результат: строки модуля теперь на французском языке.

Они также переведены на французский язык, когда бэк-офис на французском языке.