symfony3 multilenguaje

la idea es tener en un menu, las opciones "ES" y "EN" tal que hacer click
sobre una de ellas cambie el locale de la aplicacion a la seleccionada (ESpañol/ English)

para esto, vamos a crear un listener que tenga un metodo que setee el locale de la aplicacion
segun el valor guardado en la session.
Este metodo se llamara automaticamente antes de ejecutar un action.

Para esto, registramos el listener en app/config/services.yml

 app.lenguaje_loader.listener:
      class: AppBundle\EventListener\LenguajeListener
      arguments: ['@service_container','@logger']
      tags:
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest}

aqui lo importante es:
event: kernel.request (este tipo de evento es el que se dispara antes de ejecutarse un action, el evento que se dispara despues de un action es kernel.controller)
method: metodo del listener que atrapara el evento y realizara algun proceso.


la variable de session que guardara mi locale se llamara "myLocale"

el Listener:

en src/AppBundle/EventListener/lenguajeListener.php

class LenguajeListener
{
    private $container;
    public function __construct(Container $container,LoggerInterface $logger)
    {
        $this->logger = $logger;
        $this->container = $container;
    }
    public function onKernelRequest(GetResponseEvent $event) {
        $request = $event->getRequest();
        $session = $request->getSession();
     
        $locale = $session->get('myLocale');
        if ($locale) {
            $this->logger->debug('service->locale: '.$locale);
         
            $request->setLocale($locale);
            $this->container->get('translator')->setLocale($locale);//setea el locale de la app con el de la session
        }else {
            $this->logger->debug('locale: no existe');
         
        }
    }
}

el controller:

class LenguajeController extends Controller
{
    /**
     * @Route(path = "lenguaje/cambiar/{locale}", name = "cambiar.lenguaje")
     */
    public function enviarAction($locale,Request $request)
    {
        $this->get('logger')->debug('controller->locale: '.$locale);
        $session = $request->getSession();
        $url = $request->getBaseUrl();
        if ($request->headers->has('referer')) {
            $url = $request->headers->get('referer');
        }
        $session->set('myLocale', $locale);//setea la variable de session myLocale con el valor del parametro
        return $this->redirect($url);//redirecciona a la url actual
    }
}


en la vista:

 <li>
       <a href="{{ path('cambiar.lenguaje', {'locale': 'es'}) }}" class="{{ app.request.locale=='es'? 'h3':'h6' }}">Es</a>
     </li>
     <li>
       <a href="{{ path('cambiar.lenguaje', {'locale': 'en'}) }}" class="{{ app.request.locale=='en'? 'h3':'h6' }}">En</a>
     </li>

No hay comentarios:

Publicar un comentario

linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable