4 回答

TA貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊
您遇到的問題是,Symfony Translator 組件從傳入請(qǐng)求中獲取用戶的區(qū)域設(shè)置,并且在實(shí)際發(fā)送郵件時(shí)異步發(fā)送郵件時(shí),請(qǐng)求早已完成并消失,然后消息使用者的上下文(命令行)并且沒有請(qǐng)求區(qū)域設(shè)置信息。
對(duì)此有兩種解決方案:
第一個(gè)選項(xiàng):您將已翻譯的值傳遞到模板(這就是您對(duì)電子郵件主題所做的操作)。
例如這樣的事情:
$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 %}
這將是我的首選方法,因?yàn)樗鼓0灞M可能愚蠢并且易于在不同上下文中重用。模板本身不需要知道與其內(nèi)容的實(shí)際呈現(xiàn)無關(guān)的任何內(nèi)容。
第二個(gè)選項(xiàng):讓模板系統(tǒng)知道您想要轉(zhuǎn)換為的用戶區(qū)域設(shè)置:
$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)
]
);
然后,您可以在正在使用的過濾器中使用接收到的區(qū)域設(shè)置,如下所述:
<h2>{{ 'mails.recover.header' | trans({'%name%': user.name}, 'app', requestLocale) }}</h2>
雖然我更喜歡第一個(gè),但使用任何一個(gè)選項(xiàng)都應(yīng)該可以讓您獲得想要的結(jié)果。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
我的解決方案也適用于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

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊
只要電子郵件內(nèi)容不需要翻譯,“第二個(gè)選項(xiàng):讓模板系統(tǒng)知道您想要翻譯成的用戶區(qū)域設(shè)置:”就是最佳解決方案。
如果您有包含大量文本的復(fù)雜電子郵件,更好的方法是使用多個(gè)模板,并讓應(yīng)用程序設(shè)置區(qū)域設(shè)置決定必須使用哪個(gè)電子郵件模板。
或者在模板電子郵件中。
{% 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 %}

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
雖然這里所有這些答案都很有趣,但它們都不適合我,并且包含“額外”變量,例如需要傳遞到上下文中的語言環(huán)境。
就我而言,使用最新的 Symfony 這足以在電子郵件模板中設(shè)置:
{% trans_default_domain 'emails' %}
簡(jiǎn)單的調(diào)用:
{{ 'emails.whatevermessage'|trans|raw }}
奇跡般有效。
- 4 回答
- 0 關(guān)注
- 228 瀏覽
添加回答
舉報(bào)