Для перевода содержимого обычно требуется больше информации, чем исходное сообщение, например параметры перевода и домен перевода. Чтобы упростить шаблоны, вы можете переводить все сообщения в бэкэнде и передавать переводы в шаблоны.
Однако иногда это обременительно, а также требует внедрения службы переводчика на нескольких уровнях вашего приложения. Другой вариант — передать все данные перевода (сообщение, параметры, домен) в шаблон:
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, которые помогли мне лучше понять эту функцию, чтобы я мог подготовить этот пост в блоге.