2013-06-21 3 views
5

Я только начал с Symfony Я пытаюсь построить MultiLang сайт, но у меня есть проблема, чтобы изменить языковые настройкиизменения локали Symfony 2,3

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

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

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

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

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

В этом случае $ локаль пт, но переводы всегда с messages.en.yml

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

и после того, как я создам, чтобы изменить маршрут Локаль

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

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

ответ

8

на основе this и this ответов.

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/book/translation.html

+0

Спасибо за вашу помощь, это работает – Ajouve

+0

Что такое функция 'setSession' здесь? – DOZ

1

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

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.

С уважением, Wick

0

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

маршрутизации.YML

desktop_comingsoonpage: 
    resource: "@RemmelComparabusBundle/Controller/ComingsoonpageController.php" 
    defaults: { _locale: en } 
    type:  annotation 
подробнее

: Symfony doc