switch for español php symfony twig

php - español - Forzando la configuración regional Twig



twig switch (4)

Aquí hay una solución (funciona bien, excepto las sub-plantillas (Twig: render (controller (''AppBundle: Invoice / Index: productTotalPartial'')))

<?php namespace Main/BoBundle/Service; use Symfony/Component/Translation/TranslatorInterface; /** * Class LocaleSwitcher * * @package Main/BoBundle/Service */ class LocaleSwitcher { /** * @var TranslatorInterface */ private $translator; /** * @var string */ private $previousLocale; /** * @param TranslatorInterface $translator */ public function __construct(TranslatorInterface $translator) { $this->translator = $translator; } /** * Change the locale * * @param string $locale */ public function setLocale($locale) { $this->previousLocale = $this->translator->getLocale(); $this->translator->setLocale($locale); $this->setPhpDefaultLocale($locale); } /** * Revert the locale */ public function revertLocale() { if ($this->previousLocale === null) { return; } $this->translator->setLocale($this->previousLocale); $this->setPhpDefaultLocale($this->previousLocale); $this->previousLocale = null; } /** * Use temporary locale in closure function * * @param string $locale * @param /Closure $c */ public function temporaryLocale($locale, /Closure $c) { $this->setLocale($locale); $c(); $this->revertLocale(); } /** * Sets the default PHP locale. * Copied from Symfony/Component/HttpFoundation/Request.php * * @param string $locale */ private function setPhpDefaultLocale($locale) { // if either the class Locale doesn''t exist, or an exception is thrown when // setting the default locale, the intl module is not installed, and // the call can be ignored: try { if (class_exists(''Locale'', false)) { /** @noinspection PhpUndefinedClassInspection */ /Locale::setDefault($locale); } } catch (/Exception $e) { } } }

Ejemplo:

if ($this->getLocale()) { $this->localeSwitcher->setLocale($this->getLocale()); } $html = $this->templating->render($templatePath); if ($this->getLocale()) { $this->localeSwitcher->revertLocale(); }

Me gustaría utilizar el sistema de plantillas de Twig para configurar mis correos electrónicos. La configuración regional del correo electrónico debe basarse en una configuración de usuario, no desde la sesión o la configuración regional de la solicitud. ¿Cómo puedo forzar la configuración regional al renderizar una plantilla Twig?

El manual menciona cómo forzar la configuración regional para el traductor . Pero me gustaría pasar esta configuración regional al método render (), para que las traducciones dentro de la plantilla twig se representen en esta configuración regional.

Esto es diferente de usarlo en la plantilla, porque creo que esto fuerza una traducción dentro de la plantilla en una configuración regional específica.

Entonces, tomando el ejemplo de Symfony, estoy buscando algo como esto:

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(...); }


Obtenga un control del componente Traductor y cambie su configuración regional antes de representar la plantilla. Esta solución no requiere pasar un valor extra a la matriz de parámetros del método render () y refactorizar dolorosamente todos sus archivos Twig.

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(...); }

Un enfoque común para el envío de correos del usuario es almacenar la configuración regional del usuario en la entidad del usuario y pasarla directamente al traductor, como en este fragmento de código:

$translator->setLocale($recipientUser->getLocale());


Puede pasar la configuración regional como un argumento cuando usa el filtro trans (vea diff: https://github.com/symfony/symfony/commit/3ea31a02630412b1c732ee1647a0724378f67665 ).

De modo que podría pasar otra variable user_locale en su método de representación en su controlador (o pasar a través del objeto de usuario completo en lugar de pasar el nombre y user_locale por separado, o usar app.user en su plantilla si el usuario va a iniciar sesión, etc. (dependiendo de su aplicación, obviamente)), luego en su plantilla de correo electrónico puede tener algo como esto:

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

Luego, en su archivo de traducción para ese lugar (suponiendo que esté usando yaml) solo tenga algo como esto y las traducciones funcionarán muy bien para usted sobre la marcha:

# messages.fr.yml greeting: ''Bonjour''


Puedes hacer esto: enviar un parámetro (por ejemplo, configuración regional) a la plantilla

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, ''locale'' => ''nl_NL''), ) ) ; $this->get(''mailer'')->send($message); return $this->render(...); }