强制Twig Locale

rol*_*dow 30 php symfony twig

我想使用Twig模板系统来模拟我的电子邮件.电子邮件的区域设置应基于用户设置,而不是基于会话或请求区域设置.在渲染Twig模板时如何强制语言环境?

该手册确实提到了如何强制翻译器的语言环境.但我想将此区域设置传递给render()方法,以便在此区域设置中呈现树枝模板内的翻译.

这是使用不同的模板,因为我觉得这迫使在特定的语言环境的模板中的转换.

所以,以Symfony为例,我正在寻找这样的东西:

public function indexAction($name)
{
    $message = \Swift_Message::newInstance()
        ->setSubject('Hello Email')
        ->setFrom('send@example.com')
        ->setTo('recipient@example.com')
        ->setBody(
            $this->renderView(
                'HelloBundle:Hello:email.txt.twig',
                array('name' => $name),
                'nl_NL' // <-- This would be nice!
            )
        )
    ;
    $this->get('mailer')->send($message);

    return $this->render(...);
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ark 35

使用trans过滤器时,可以将语言环境作为参数传递(请参阅diff:https://github.com/symfony/symfony/commit/3ea31a02630412b1c732ee1647a0724378f67665).

因此,您可以在控制器的render方法中传递另一个user_locale变量(或者传递整个用户对象,而不是单独传递name和user_locale,或者如果用户将登录等,则在模板中使用app.user ... (显然取决于您的应用程序)),然后在您的电子邮件模板中,您可以使用以下内容:

{{ 'greeting' | trans({}, "messages", user_locale) }} {{ name | title }}
{# rest of email template with more translation strings #}
Run Code Online (Sandbox Code Playgroud)

然后在你的语言环境的翻译文件中(假设你正在使用yaml)只是有这样的东西,翻译将在飞行中很好地为你工作:

# messages.fr.yml    
greeting: 'Bonjour'
Run Code Online (Sandbox Code Playgroud)


Mar*_*dez 18

获取转换器组件并在呈现模板之前更改其区域设置.该解决方案并没有需要传递一个额外的价值,以它们的参数数组渲染()方法,并痛苦地重构你的所有的树枝文件.

public function indexAction($name)
{
    $translator = $this->get('translator');

    // Save the current session locale
    // before overwriting it. Suppose its 'en_US'
    $sessionLocale = $translator->getLocale();

    $translator->setLocale('nl_NL');

    $message = \Swift_Message::newInstance()
        ->setSubject('Hello Email')
        ->setFrom('send@example.com')
        ->setTo('recipient@example.com')
        ->setBody(
            $this->renderView(
                'HelloBundle:Hello:email.txt.twig',
                array('name' => $name)
            )
        )
    ;

    $this->get('mailer')->send($message);

    // Otherwise subsequent templates would also
    // be rendered in Dutch instead of English
    $translator->setLocale($sessionLocale);

    return $this->render(...);
}
Run Code Online (Sandbox Code Playgroud)

用户邮件的常用方法是将用户的区域设置存储在用户实体中,并将​​其直接传递给翻译器,例如在此代码段中:

$translator->setLocale($recipientUser->getLocale());
Run Code Online (Sandbox Code Playgroud)

  • 包含的子模板不受影响 (4认同)