2016-07-02 2 views
3

Я хочу создать ссылку, которая изменит код locale в коде ниже.Symfony3 ссылка для изменения locale

/** 
* 
* @Route("/changelanguage", defaults={"_locale" = "eu"}, name="changelanguage") 
* @Method("GET") 
*/ 
public function changelanguageAction(Request $request) { 


    $locale = $request->getLocale(); 
    if ($locale == "eu") { 
     $request->setLocale('es'); 
     $request->getSession()->set('_locale', 'es'); 
    } else { 
     $request->setLocale('eu'); 
     $request->getSession()->set('_locale', 'eu'); 
    } 

    return $this->redirect($request->headers->get('referer')); 

} 

то, на мой прутик базового вида я использую это:

<ul class="nav navbar-nav navbar-right">   
    <li><a href="#">{{ app.request.locale }}</a></li> 
    {% if app.request.locale == "eu"%} 
     <li><a href="{{ path('changelanguage', {'_locale':'es'}) }}"><img src="{{ asset('bundles/app/img/espanol.png') }}" alt="Castellano"> Castellano</a></li> 
    {% else %} 
     <li><a href="{{ path('changelanguage', {'_locale':'eu'}) }}"><img src="{{ asset('bundles/app/img/euskara.png') }}" alt="Euskaraz"> Euskara</a></li> 
    {% endif %} 
    <li>&nbspp;</li> 
</ul> 

Проблема заключается в том, что она продолжает говорить мне, что app.request.locale всегда 'eu'. Я что-то упускаю? Язык по умолчанию

+0

Я смущен вашим кодом. Вы пытаетесь заставить «es»? –

+0

Я хочу изменить между es и eu locales. Например, покажите страницу с индексом «es» и со ссылкой, которая отобразит одну и ту же страницу, но изменит локаль пользователя и останется. –

ответ

1

Добавить в объект пользователя, а затем создать запрос прослушиватель, проверьте язык по умолчанию для пользователя и изменить его ...

Эту работа для меня

Создать слушатель

<?php 

namespace UserBundle\EventListener; 

use Symfony\Component\DependencyInjection\ContainerInterface; 
use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpKernel\HttpKernelInterface; 

class LanguageListener 
{ 
    private $token_storage; 

    private $securityContext; 

    private $container; 

    public function __construct(ContainerInterface $containerInterface) 
    { 
     $this->container = $containerInterface; 
     $this->securityContext = $this->container->get('security.authorization_checker'); 
     $this->token_storage = $this->container->get('security.token_storage');; 

    } 

    public function setLocale(GetResponseEvent $event) 
    { 

     if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) { 
      return; 
     } 


     if ($this->securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) { 
      $userLocale = $this->token_storage->getToken()->getUser() 
       ->getCustomer()->getDefaultCodeLanguage(); 

      if ($userLocale) { 
       $request = $event->getRequest(); 
       $request->setLocale($userLocale); 
       $translator = $this->container->get('translator'); 
       $translator->setLocale($userLocale); 
      } 
     } 


    } 
} 

services.yml

services: 
    language.kernel_request_listener: 
     class: UserBundle\EventListener\LanguageListener 
     arguments: 
      - "@service_container" 
     tags: 
      - { name: kernel.event_listener, event: kernel.request, method: setLocale } 
+0

он не работает для меня, он постоянно держится в одном и том же регионе –

Смежные вопросы