您遇到的问题是 Symfony Translator 组件从传入的数据中获取用户的区域设置request,并且当异步发送邮件时,当邮件实际发送时,请求早已完成并消失,然后消息使用者的上下文(命令行)并且没有请求区域设置信息。
对此有两种解决方案:
第一个选项:您传递值已经翻译了到模板(这就是您对电子邮件主题所做的操作)。
例如。像这样的东西:
$mailer->send(
$user->email,
$this->translator->trans('mails.recover.subject'),
'email/client/password-recovery.html.twig',
[
'user' => $user,
'hash' => $hash,
'target' => $target,
'labels' => [
'header' => $this->translator
->trans('mails.recover.subject', [ 'name' => $user->getName()]),
'text1' => $this->translator
->trans('mails.recover.text1', ['url', => $defaulUrl])
]
);
然后在模板中直接使用这些值:
{% extends 'email/base.html.twig' %}
{% block content %}
<h2>{{ texts.header }}</h2>
<p style="margin: 25px 0;">{{ texts.text1 }}</p>
{% endblock %}
这将是我的首选方法,因为它使模板尽可能愚蠢并且易于在不同上下文中重用。模板本身不需要知道与其内容的实际呈现无关的任何内容。
第二个选项:让模板系统知道您想要转换为的用户区域设置:
$mailer->send(
$user->email,
$this->translator->trans('mails.recover.subject'),
'email/client/password-recovery.html.twig',
[
'user' => $user,
'hash' => $hash,
'target' => $target,
'requestLocale' => $locale
// get the locale from the request
// (https://symfony.com/doc/current/translation/locale.html)
]
);
然后,您可以在正在使用的过滤器中使用收到的区域设置,如下所述here:
<h2>{{ 'mails.recover.header' | trans({'%name%': user.name}, 'app', requestLocale) }}</h2>
虽然我更喜欢第一个,但使用任何一个选项都应该能让你得到你想要的结果。