Новое в Symfony 5.2: Переводимые объекты

Для перевода содержимого обычно требуется больше информации, чем исходное сообщение, например параметры перевода и домен перевода. Чтобы упростить шаблоны, вы можете переводить все сообщения в бэкэнде и передавать переводы в шаблоны.

Однако иногда это обременительно, а также требует внедрения службы переводчика на нескольких уровнях вашего приложения. Другой вариант — передать все данные перевода (сообщение, параметры, домен) в шаблон:

return $this->render('...', [
    'order_status' => [
        'message' => 'order.status_message',
        'params' => ['%status%' => $order->getStatus(), '%order_id%' => $order->getId()],
        'domain' => 'admin',
    ],
]);

Это больше не требует внедрения переводчика, но делает шаблоны более сложными:

{{ order_status.message|trans(order_status.params, order_status.domain) }}

В Symfony 5.2 представляем новый класс TranslatableMessage, который решает эту проблему более простым способом. Сначала создайте объект TranslatableMessage и передайте ему все данные перевода:

use Symfony\Component\Translation\TranslatableMessage;

return $this->render('...', [
    'order_status' => new TranslatableMessage(
        'order.status_message',
        ['%status%' => $order->getStatus(), '%order_id%' => $order->getId()],
        'admin'
    ),
]);

Теперь вы можете перевести этот объект в свой шаблон с помощью того же фильтра трансформации, что и раньше, но гораздо более простым способом:

{{ order_status|trans }}

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

Эта функция также представляет новую функцию t(), которую можно использовать как в шаблонах PHP, так и в Twig, для быстрого создания такого рода объектов. В следующем примере эта функция используется для создания резервного перевода, который использует другие параметры, чем перевод по умолчанию:

{# Before #}
{{ message is defined ? message|trans : fallback|trans({'%param%': value}) }}

{# After #}
{{ message|default(t(fallback, {'%param%': value}))|trans }}

Престижность замечательным людям в чате Symfony Slack, которые помогли мне лучше понять эту функцию, чтобы я мог подготовить этот пост в блоге.