php - 使用 Symfony Messenger 异步发送电子邮件时如何翻译电子邮件?

标签 php symfony symfony-mailer

我将 Symfony 邮件程序配置为使用 Messenger 发送电子邮件。
https://symfony.com/doc/current/mailer.html#sending-messages-async
我有两种语言的电子邮件,我依靠请求来检测语言,但现在电子邮件没有翻译。
我如何才能将消息翻译成请求中检测到的语言?
在我的 Controller 中:

$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
信使配置:
framework:
    messenger:
        # Uncomment this (and the failed transport below) to send failed messages to this transport for later handling.
        # failure_transport: failed

        transports:
            # https://symfony.com/doc/current/messenger.html#transport-configuration
            async: '%env(MESSENGER_TRANSPORT_DSN)%'
            # failed: 'doctrine://default?queue_name=failed'
            # sync: 'sync://'

        routing:
            # Route your messages to the transports
            # 'App\Message\YourMessage': async
            'Symfony\Component\Mailer\Messenger\SendEmailMessage':  async
如果翻译正确,可以更好地查看邮件的主题,邮件的正文不会
如果我删除该行
'Symfony\Component\Mailer\Messenger\SendEmailMessage':  async
在 messegner 配置中,翻译工作。

最佳答案

您遇到的问题是 Symfony Translator 组件从传入的 中获取用户的语言环境。请求 ,并且在实际发送邮件时异步发送邮件时,请求早已完成并消失了,然后是消息使用者(命令行)的上下文,并且没有请求区域设置信息。
对此有两种解决方案:
第一个选项:您传递值 已翻译 到模板(这是您对电子邮件主题所做的)。
例如。像这样:

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

虽然我更喜欢第一个,但使用任一选项都可以让您获得所需的结果。

关于php - 使用 Symfony Messenger 异步发送电子邮件时如何翻译电子邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62560730/

相关文章:

php - 如何在 Symfony Mailer 上通过 Bootstrap 使用模板化电子邮件?

php - 在最佳匹配上订购 SQL 查询

php - PHP 中的 HTML - 显示来自 MYSQL 表的变量

php - 使用 Codeigniter 加入查询

forms - 如何在 Symfony2 中显示月年下拉菜单

php - 使用 Symfony 清理 POST 和 GET 变量

php - 为什么 Assets :install doesn´t copy/Resources/public to/web folder?

php - 使用 Symfony Mailer 时如何获取电子邮件 ID?

php - Yii 1.1.14 与 Composer 自动加载

php - Laravel 10 测试电子邮件与 EsmtpTransport 类的连接