2013-05-24 2 views
0

После прочтения документации и поиска ее с помощью Google я должен вас спросить.Язык интерфейса Symfony2 не работает должным образом

Я хочу, чтобы переключаться между 3-х языках: ca_ES, es_ES и en_GB

Так что я сделал контроллер, как это:

/** 
* @Route("/canviar-idioma/{locale}", name="change_lang") 
* @Template() 
* 
* @return array 
*/ 
public function canviarIdiomaAction($locale){ 
    $request = $this->getRequest(); 
    if ($locale == 'cat'){ 
     $this->get('translator')->setLocale('ca_ES'); 
     return new Response('ca'); 
    } else if ($locale == 'es'){ 
     $this->get('translator')->setLocale('es_ES'); 
     return new Response('es'); 
    } else if ($locale == 'eng'){ 
     $this->get('session')->set('_locale', 'en_GB'); 
     return new Response('en'); 
    } 

    return new Response(null); 
} 

Этот контроллер вызывается с помощью AJAX, когда пользователь нажимает флаг с языком. Я получаю «ca» или «es» или «en» правильно, поэтому контроллер «работает» каким-то образом. Как вы можете видеть, я попытался использовать его по сеансу или получить переводчика. Оба пути имеют одинаковые результаты.

Но, я сделал этот контроллер, чтобы проверить, если мой языковой стандарт действительно изменился:

/** 
* @Route("/quinlocaletinc", name="quinlocaletinc") 
* @Template() 
* 
* @return array 
*/ 
public function quinlocaletincAction(){ 
    $request = $this->getRequest(); 
    return new Response($request->getLocale()); 
} 

И эта локаль ВСЕГДА дает «ca_ES», как это один определенный в моих параметрах файла:

locale: ca_ES 

И мой config.yml:

default_locale: %locale% 
translator:  { fallback: %locale% } 

ответ

1

Y ou нужно использовать «специальную» переменную _locale на маршруте, затем Symfony правильно установит локаль для вашего приложения.

Вы можете прочитать об этом в documentation

Ваш маршрут должен выглядеть следующим образом:

/** 
* @Route("/canviar-idioma/{_locale}", requirements={"_locale" = "ca_ES|es_ES|en_GB"}, name="change_lang") 
* @Template() 
* 
* @return array 
*/ 
public function canviarIdiomaAction() { 
    $locale = $request->getLocale(); 

    // ... 

Ваш второй маршрут также будет нужно параметр

/** 
* @Route("/quinlocaletinc/{_locale}", name="quinlocaletinc") 
* @Template() 
* 
* @return array 
*/ 
public function quinlocaletincAction() { 
    $request = $this->getRequest(); 
    return new Response($request->getLocale()); 
} 

Хорошая конвенция для префикса всех маршрутов с использованием языкового стандарта, а не постфикса

/** 
* @Route("/{_locale}/quinlocaletinc", name="quinlocaletinc") 
* @Template() 
* 
* @return array 
*/ 
public function quinlocaletincAction() { 
    $request = $this->getRequest(); 
    return new Response($request->getLocale()); 
} 

Используя переменную _locale в Symfony, все просто «работает» (т. если вы посетите /ca_ES/page, все ссылки на этой странице будут содержать правильный URL-адрес).

Также при использовании параметра _locale на вашем маршруте $this->get('translator')->setLocale('ca_ES'); не требуется, так как это произойдет автоматически.

+0

см. Мой ответ на пример. – nifr

+0

Итак, я думаю, что на каждом контроллере я должен установить эту аннотацию? Таким образом, все маршруты теперь изменились бы на .../ca? – Reinherd

+0

Да, вам нужно будет поместить параметр _locale в каждый маршрут вашего приложения (ну и каждый маршрут, который нуждается в переводах) –

0

Аргумент аннотации маршрутизации и контроллера должен быть {_locale} и $ _locale.

/** 
* @Route("/canviar-idioma/{_locale}", name="change_lang") 
* @Template() 
* 
* @return array 
*/ 
public function canviarIdiomaAction($_locale) 
{ 
    // ... 
Смежные вопросы