阅读文档并在Google上查找后,我会问你。
我想在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% }
答案 0 :(得分:1)
您需要在路由中使用“特殊”_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());
}
通过在Symfony中使用_locale变量,一切都“正常”(即如果您访问/ca_ES/page
该页面上的所有链接都将包含正确的URL)。
同样在路线中使用_locale参数时,$this->get('translator')->setLocale('ca_ES');
是不必要的,因为它会自动发生。
答案 1 :(得分:0)
您的注释路由和Controller参数应为{_locale}和$ _locale。
/**
* @Route("/canviar-idioma/{_locale}", name="change_lang")
* @Template()
*
* @return array
*/
public function canviarIdiomaAction($_locale)
{
// ...