Ich möchte das Twig-Vorlagensystem zum Erstellen von Vorlagen für meine E-Mails verwenden. Das Gebietsschema der E-Mail sollte auf einer Benutzereinstellung basieren, nicht auf dem Sitzungs- oder Anforderungsgebietsschema. Wie kann ich das Gebietsschema beim Rendern einer Twig-Vorlage erzwingen?
Das Handbuch erwähnt, wie um das Gebietsschema für den Übersetzer zu erzwingen. Aber ich möchte dieses Gebietsschema an die Methode render() übergeben, damit die Übersetzungen in der Zweigvorlage in diesem Gebietsschema gerendert werden.
Dies unterscheidet sich von der Verwendung hinein in der Vorlage, weil ich denke, dass dies eine Übersetzung innerhalb der Vorlage in einem bestimmten Gebietsschema erzwingt.
Wenn ich das Beispiel von Symfony nehme, suche ich nach so etwas:
public function indexAction($name)
{
$message = \Swift_Message::newInstance()
->setSubject('Hello Email')
->setFrom('[email protected]')
->setTo('[email protected]')
->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(...);
}
Sie könnten also eine andere user_locale-Variable in Ihrer Rendermethode in Ihrem Controller übergeben (oder das gesamte Benutzerobjekt durchlaufen, anstatt name und user_locale separat zu übergeben, oder app.user in Ihrer Vorlage verwenden, wenn der Benutzer angemeldet wird, etc … (abhängig von Ihrer Anwendung natürlich)), dann können Sie in Ihrer E-Mail-Vorlage so etwas haben:
{{ 'greeting' | trans({}, "messages", user_locale) }} {{ name | title }}
{# rest of email template with more translation strings #}
Dann haben Sie in Ihrer Übersetzungsdatei für dieses Gebietsschema (vorausgesetzt, Sie verwenden yaml) einfach so etwas und die Übersetzungen werden im Handumdrehen gut für Sie funktionieren:
# messages.fr.yml
greeting: 'Bonjour'
Marcel Hernández
Holen Sie sich die Translator-Komponente und ändern Sie ihr Gebietsschema, bevor Sie die Vorlage rendern. Diese Lösung tut es nicht erfordern, einen zusätzlichen Wert an das Array der Parameter der Methode render() zu übergeben und all Ihre Twig-Dateien mühsam umzugestalten.
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('[email protected]')
->setTo('[email protected]')
->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(...);
}
Ein gängiger Ansatz für Benutzer-Mailing ist das Speichern des Gebietsschemas des Benutzers in der User-Entität und das direkte Weiterleiten an den Übersetzer, wie in diesem Code-Snippet: