изменить locale symfony 2.3

Я только начал с symfony. Я пытаюсь создать многоязычный сайт, но у меня есть проблема с изменением языка.

Я прочитал несколько сообщений, и я прочитал документацию об этом, но локаль не изменилась, я пытаюсь:

public function indexAction() { $this->get('session')->set('_locale', 'fr'); $request = $this->getRequest(); $locale = $request->getLocale(); return $this->render('PhoneMainBundle:Default:index.html.twig',array('locale'=>$locale)); } 

но значение в $ locale всегда «en» (мой локаль по умолчанию)

Я также пытаюсь

 public function indexAction() { $this->get('session')->set('_locale', 'fr'); $request = $this->getRequest(); $request->setLocale('fr'); $locale = $request->getLocale(); return $this->render('PhoneMainBundle:Default:index.html.twig',array('locale'=>$locale)); } 

В этом случае $ locale является fr, но переводы всегда происходят из messages.en.yml

Я бы хотел, чтобы в первый раз обнаружил пользовательский язык с помощью $ _SERVER ['HTTP_ACCEPT_LANGUAGE'], возможно, используя listner для каждой актуализации страницы?

и после того, как я создам маршрут для изменения локали

Но я бы хотел найти способ изменить локаль.

Спасибо за вашу помощь

На основании этого и этого ответа.

LanguageListener.php:

 <?php namespace Acme\UserBundle\EventListener; use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\HttpKernel\HttpKernelInterface; class LanguageListener { private $session; public function setSession(Session $session) { $this->session = $session; } public function setLocale(GetResponseEvent $event) { if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) { return; } $request = $event->getRequest(); $request->setLocale($request->getPreferredLanguage(array('en', 'de'))); } } 

services.yml:

 acme.language.kernel_request_listener: class: Acme\UserBundle\EventListener\LanguageListener tags: - { name: kernel.event_listener, event: kernel.request, method: setLocale } 

О неправильном обнаружении локали в веточке может быть много разных причин. Поиск через SO, вы обязательно найдете ответ. Убедитесь, что ваш «_local» var определен правильно, убедитесь, что вы поместили файлы языков в нужное место и т. Д. FInally, прочитайте снова последнюю версию документации: http://symfony.com/doc/current/ книга / translation.html

Однако я добавил это, чтобы сделать его более динамичным

services.yml

  services: acme.language.kernel_request_listener: class: Acme\UserBundle\EventListener\LanguageListener tags: - { name: kernel.event_listener, event: kernel.request, method: setLocale } arguments: [ @router, @service_container ] 

LanguageListener.php:

 <?php namespace Acme\UserBundle\EventListener; use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\HttpKernel\HttpKernelInterface; class LanguageListener { private $session; private $container; private $router; public function __construct($router, $container) { // ... $this->router= $router; $this->container = $container; } public function setSession(Session $session) { $this->session = $session; } public function setLocale(GetResponseEvent $event) { if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) { return; } $request = $event->getRequest(); $request->setLocale($request->getPreferredLanguage($this->container->parameters['jms_i18n_routing.locales'])); } } 

Просто чтобы получить параметры и значения из config.yml.

С уважением, Вик

Если, например, ваш языковой стандарт по умолчанию – французский, за исключением одного контроллера, который вы хотите, чтобы языковой стандарт по умолчанию, установленный на английском, может сделать это:

routing.yml

 desktop_comingsoonpage: resource: "@RemmelComparabusBundle/Controller/ComingsoonpageController.php" defaults: { _locale: en } type: annotation 

Дополнительная информация: Symfony doc