Php 使用Symfony Messenger异步发送电子邮件时,如何翻译电子邮件?
我将Symfony邮件程序配置为使用messenger发送电子邮件 我有两种语言的电子邮件,我依靠请求来检测语言,但现在电子邮件没有翻译 如何将消息翻译成请求中检测到的语言 在我的控制器中:Php 使用Symfony Messenger异步发送电子邮件时,如何翻译电子邮件?,php,symfony,symfony-mailer,Php,Symfony,Symfony Mailer,我将Symfony邮件程序配置为使用messenger发送电子邮件 我有两种语言的电子邮件,我依靠请求来检测语言,但现在电子邮件没有翻译 如何将消息翻译成请求中检测到的语言 在我的控制器中: $mailer->send( $user->email, $this->translator->trans('mails.recover.subject'), 'email/client/password-re
$mailer->send(
$user->email,
$this->translator->trans('mails.recover.subject'),
'email/client/password-recovery.html.twig',
compact('user', 'hash', 'target')
);
模板:
{% extends 'email/base.html.twig' %}
{% block content %}
<h2>{{ 'mails.recover.header' | trans({'%name%': user.name}) }}</h2>
<p style="margin: 25px 0;">
{{ 'mails.recover.text1' | trans({'%url%': url('default')}) | raw }}
</p>
// More code
如果翻译正确,邮件的主题看起来会更好,邮件的正文则不会
如果我拆下这条线
'Symfony\Component\Mailer\Messenger\SendEmailMessage': async
在Messener配置中,翻译工作。您遇到的问题是,Translator组件从请求中获取用户的区域设置,并且当在邮件实际发送时异步发送邮件时,请求早已完成并消失,上下文是消息使用者之一,没有请求区域设置信息 有两种解决方案: 第一个选项:将已翻译的值传递给模板(这就是您处理电子邮件主题所做的)。 例如,类似这样的事情:
$mailer->send(
$user->email,
$this->translator->trans('mails.recover.subject'),
'email/client/password recovery.html.twig',
[
“用户”=>$user,
“哈希”=>$hash,
'target'=>$target,
“标签”=>[
'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 %}
然后在正在使用的筛选器中使用接收到的区域设置,如下所述:
{{'mails.recover.header'| trans({'%name%':user.name},'app',requestLocale)}
虽然我更喜欢第一个选项,但使用其中任何一个选项都可以获得您想要的结果。我的解决方案也适用于小树枝中的
url\u absolute
$message = (new TemplatedEmail())
...
$renderer = new BodyRenderer($this->twig);
$renderer->render($message);
$this->mailer->send(new RawMessage($message->toString()),Envelope::create($message));
使用Environment$twig
和MailerInterface$mailer
“第二个选项:让模板系统知道您要翻译的用户区域设置:”是最好的解决方案,只要电子邮件内容不需要翻译
如果您有包含大量文本的复杂电子邮件,更好的方法是使用多个模板,并让应用程序集语言环境决定必须使用哪个电子邮件模板
或者在模板电子邮件中
{% if language is defined %}
{# Language still specified #}
{% else %}
{% set language = 'ne' %}
{% endif %}
{% if language == "en" %}
<h1>Ticket for - <code>{{ activity.name }}</code> by participant <code>{{ buyer.name }}</code> </h1>
{% else %}
<h1>Kaartje voor - <code>{{ activity.name }}</code> door deelnemer <code>{{ buyer.name }}</code> </h1>
{% endif %}
似乎邮件是首先生成的,异步部分只通过SMTP发送已经“呈现”的内容,因此它的工作原理类似于直接发送邮件。如何翻译?是否使用翻译组件?是的,我的模板如下所示:{{{'mails.base.about.header'| trans}你能展示更多的代码吗?特别是你发送的php部分message@Jakumi我已经更新了这个问题。我有点不知所措,通常MailerInterface::send()最多接收2个参数(RawMessage和信封)。显然,您使用了一些helper类或其他东西。我假设helper类生成TemplatedEmail或其他东西,并且异步服务使用“新鲜”细枝来实际呈现电子邮件正文,因此仅使用默认语言。请尝试使用
$this->renderView(模板,上下文)
(控制器默认函数)呈现正文回答得很好,我只想指出,您还可以使用trans函数并将区域设置:{%trans with{'%name%':user.name}从'app'传递到requestLocale%}邮件中。recover.header{%endtrans%}
源代码:
$message = (new TemplatedEmail())
...
$renderer = new BodyRenderer($this->twig);
$renderer->render($message);
$this->mailer->send(new RawMessage($message->toString()),Envelope::create($message));
{% if language is defined %}
{# Language still specified #}
{% else %}
{% set language = 'ne' %}
{% endif %}
{% if language == "en" %}
<h1>Ticket for - <code>{{ activity.name }}</code> by participant <code>{{ buyer.name }}</code> </h1>
{% else %}
<h1>Kaartje voor - <code>{{ activity.name }}</code> door deelnemer <code>{{ buyer.name }}</code> </h1>
{% endif %}