0

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

2 回答 2

1

您需要_locale在路由中使用“特殊”变量,Symfony 将为您的应用程序正确设置语言环境。

您可以在文档中阅读有关此内容的更多信息

您的路线应如下所示:

/**
 * @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');它是不必要的,因为它会自动发生。

于 2013-05-24T15:29:09.220 回答
0

您的注解路由和控制器参数应该是 {_locale} 和 $_locale。

/**
 * @Route("/canviar-idioma/{_locale}", name="change_lang")
 * @Template()
 * 
 * @return array
 */
public function canviarIdiomaAction($_locale)
{
   // ...
于 2013-05-24T15:32:03.210 回答