4 回答

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

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

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

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