Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Symfony Messenger异步发送电子邮件时,如何翻译电子邮件?_Php_Symfony_Symfony Mailer - Fatal编程技术网

Php 使用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

我将Symfony邮件程序配置为使用messenger发送电子邮件

我有两种语言的电子邮件,我依靠请求来检测语言,但现在电子邮件没有翻译

如何将消息翻译成请求中检测到的语言

在我的控制器中:

$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 %}