Перевод интерфейса
Чтобы сайт работал на нескольких языках, тексты интерфейса выносят из шаблонов в файлы перевода. В шаблоне остаётся ключ, а компонент 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:
- enfallbacks — язык, из которого берётся строка, если перевода нет.
Язык в адресе
Особый параметр маршрута _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 перед размещением и не склеивайте фразы из кусков: порядок слов в языках разный, переводите предложение целиком с подстановкой значений.