Encodera

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

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

Оглавление

Перевод интерфейса

Чтобы сайт работал на нескольких языках, тексты интерфейса выносят из шаблонов в файлы перевода. В шаблоне остаётся ключ, а компонент Translation подставляет строку на языке посетителя.

Файлы перевода

Переводы лежат в папке translations, по файлу на язык:

# translations/messages.ru.yaml
nav:
    home: Главная
    blog: Блог
welcome: 'Добро пожаловать, %name%!'
# translations/messages.en.yaml
nav:
    home: Home
    blog: Blog
welcome: 'Welcome, %name%!'

Вывод в шаблоне

<a href="{{ path('home') }}">{{ 'nav.home'|trans }}</a>
 
<h1>{{ 'welcome'|trans({'%name%': user.name}) }}</h1>

Фильтр trans находит строку по ключу. Вложенные ключи записывают через точку, значения подставляются на место слов в знаках процента.

Перевод в коде

use Symfony\Contracts\Translation\TranslatorInterface;
 
public function publish(TranslatorInterface $translator): Response
{
    $this->addFlash('success', $translator->trans('post.published'));
 
    // …
}

Язык по умолчанию

# config/packages/translation.yaml
framework:
    default_locale: ru
    translator:
        default_path: '%kernel.project_dir%/translations'
        fallbacks:
            - en

fallbacks — язык, из которого берётся строка, если перевода нет.

Язык в адресе

Особый параметр маршрута _locale переключает язык запроса:

#[Route('/{_locale}/blog', name: 'blog_index', requirements: ['_locale' => 'ru|en'])]
public function index(): Response
{
    // …
}

Адрес /en/blog покажет страницу на английском. В ссылках текущий язык подставляется сам, а для переключателя его указывают явно:

<a href="{{ path('blog_index', {_locale: 'en'}) }}">English</a>

Множественное число

Формы слова описывают в формате ICU. Имя такого файла содержит +intl-icu:

# translations/messages+intl-icu.ru.yaml
posts_count: '{count, plural, one {# статья} few {# статьи} many {# статей} other {# статьи}}'
{{ 'posts_count'|trans({count: posts|length}) }}

Для 1 получится «1 статья», для 3 — «3 статьи», для 25 — «25 статей».

Сообщения проверки и формы

Подписи полей формы и сообщения ограничений переводятся автоматически: достаточно указать в них ключ и добавить его в файл перевода. Сообщения проверки ищутся в файле validators.ru.yaml.

Поиск пропущенных строк

php bin/console debug:translation en
php bin/console translation:extract --force ru

Первая команда показывает ключи без перевода и неиспользуемые строки, вторая собирает ключи из шаблонов и кода в файл.

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

Если перевода нет, Symfony не сообщает об ошибке, а выводит сам ключ — на странице появляется nav.home. Такие места легко пропустить на редко открываемых страницах. Запускайте debug:translation перед размещением и не склеивайте фразы из кусков: порядок слов в языках разный, переводите предложение целиком с подстановкой значений.

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

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