亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Symfony Messenger 異步發送電子郵件時如何翻譯電子郵件?

使用 Symfony Messenger 異步發送電子郵件時如何翻譯電子郵件?

PHP
慕碼人8056858 2023-07-01 10:10:09
我將 Symfony 郵件程序配置為使用 Messenger 發送電子郵件。https://symfony.com/doc/current/mailer.html#sending-messages-async我的電子郵件有兩種語言,我依靠請求來檢測語言,但現在電子郵件未翻譯。如何將消息翻譯成請求中檢測到的語言?在我的控制器中:$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配置中,翻譯工作。
查看完整描述

4 回答

?
慕村225694

TA貢獻1880條經驗 獲得超4個贊

您遇到的問題是,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)

            ]

);

然后,您可以在正在使用的過濾器中使用接收到的區域設置,如下所述:


<h2>{{ 'mails.recover.header' | trans({'%name%': user.name}, 'app', requestLocale) }}</h2>

雖然我更喜歡第一個,但使用任何一個選項都應該可以讓您獲得想要的結果。


查看完整回答
反對 回復 2023-07-01
?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

我的解決方案也適用于url_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


查看完整回答
反對 回復 2023-07-01
?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

只要電子郵件內容不需要翻譯,“第二個選項:讓模板系統知道您想要翻譯成的用戶區域設置:”就是最佳解決方案。


如果您有包含大量文本的復雜電子郵件,更好的方法是使用多個模板,并讓應用程序設置區域設置決定必須使用哪個電子郵件模板。


或者在模板電子郵件中。


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


查看完整回答
反對 回復 2023-07-01
?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

雖然這里所有這些答案都很有趣,但它們都不適合我,并且包含“額外”變量,例如需要傳遞到上下文中的語言環境。

就我而言,使用最新的 Symfony 這足以在電子郵件模板中設置:

{% trans_default_domain 'emails' %}

簡單的調用:

{{ 'emails.whatevermessage'|trans|raw }}

奇跡般有效。


查看完整回答
反對 回復 2023-07-01
  • 4 回答
  • 0 關注
  • 214 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號