Symfony2语言环境无法正常工作

时间:2013-05-24 15:23:39

标签: symfony symfony-2.1

阅读文档并在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% }

2 个答案:

答案 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)
{
   // ...