Документация Shopkeeper 4.x

Мульти-язычность

Основная локаль (язык) сайта всегда - "en". Этот параметр можно изменить в конфигурационном файле config/packages/translation.yaml (translator.fallbacks). Текущая локаль сайта (по умолчанию) задается в параметре "Локаль" в настройках. Изменить этот параметр можно в интерфейсе администратора в разделе "Настройки". Переводы текстов, которые используются в шаблонах и коде сайта, находятся в папке "translations". В шаблонах для перевода можно использовать фильтр "trans" или "transchoice".

Примеры:

{% trans %}Hello %name%{% endtrans %}

{{ message|trans }}

{{ message|transchoice(5) }}

{{ message|trans({'%name%': 'Fabien'}, 'app') }}

{{ message|transchoice(5, {'%name%': 'Fabien'}, 'app') }}

Аргументы фильтров:

  1. Параметры, которые используются в переводе.
  2. Домен перевода, например "validators". Домен по умолчанию - "messages".

Пример использования фильтра "transchoice" для перевода текста со склонениями по падежам:

{{ '%count% product found|%count% products found' | transchoice(totalItems, {}, 'local') }}

В файле translations/local.ru.yaml должен быть перевод:

'%count% product found|%count% products found': 'Найден %count% товар|Найдено %count% товара|Найдено %count%  товаров'

В Shopkeeper есть возможность динамически изменять язык сайта. Текущий язык сохраняется в сессии посетителя сайта. Для изменения локали можно использовать ссылку: {{ path('locale_switch', {locale: 'ru'}) }}. Пример выпадающего списка с языками:

<div class="dropdown">
    <button class="btn btn-sm btn-outline-secondary text-white dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
        <img src="/img/flag_{{ app.request.locale }}.png">
    </button>
    <div class="dropdown-menu dropdown-menu-right border-secondary" aria-labelledby="dropdownMenuButton">
        <a class="dropdown-item rounded-0{% if app.request.locale == 'ru' %} active{% endif %}" href="{{ path('locale_switch', {locale: 'ru'}) }}">
            <img src="/img/flag_ru.png" alt="Русский">
            Русский
        </a>
        <a class="dropdown-item rounded-0{% if app.request.locale == 'en' %} active{% endif %}" href="{{ path('locale_switch', {locale: 'en'}) }}">
            <img src="/img/flag_en.png" alt="English">
            English
        </a>
    </div>
</div>

Пример перевода текста в PHP-коде контроллера:

use Symfony\Component\Translation\TranslatorInterface;

public function index(TranslatorInterface $translator)
{
    $translated = $translator->trans('Symfony is great');

    // ...
}

Перевод содержимого полей документов из базы данных

В настройках можно задать список всех доступных языков - параметр "Список языков (через запятую)". Пример значения: "ru,en". Эти локали будут выводиться в виде переключателя в нижней части окна создания/редактирования контента. Первая локаль в списке используется как локаль по умолчанию. При переключении можно задать значения текстовых полей для другой локали. Из базы данных автоматически будут выведены только те документы, для которых есть перевод для текущего языка, проверяется по заголовку документа (имя чанка для поля - header).

Дополнительные материалы