使用Symfony 2.1更改语言环境

6

在Symfony 2.1网站上更改区域设置时遇到了一些问题。

我找不到一种方法,可以在不在每个路由中使用_locale的情况下更改语言。我知道这违反了基本规则,但是此内容例如仅限会员访问,因此不会被引擎索引。

通常,我想要一种简单的方法来能够在请求(自版本2.1起)或会话中轻松地更改区域设置,但是无法顺利地做到这一点。 我也想避免使用Listener。

config.yml文件:

framework:
    translator:      { fallback: %locale% }
    session:

routing.yml文件:

route_change_lang:
    pattern:   /changelang/{newlang}
    defaults:  { _controller: AcmeCoreBundle:Default:switchLanguage, newlang: en }
    requirements:
        newlang: en|fr|de

更新路由器语言环境的简单操作:

public function switchLanguageAction($newlang)
{

    $request = $this->getRequest();

    $request->setLocale($newlang);

    $referer_url = $this->get('request')->headers->get('referer');
    if ($referer_url != null) {
        return $this->redirect($referer_url);
    } else {
        return $this->redirect($this->generateUrl('route_home'));
    }
}

什么是问题?我猜测它与主配置文件中设置的default_locale有关,但文档并不是很清楚,需要帮助/提示。

我遇到了完全相同的问题。请问你找到解决方案了吗? - Lukas Lukac
3个回答

1
我遇到了同样的问题,因为我们不能在URL中使用区域设置(会影响SEO)。此外,我们使用像en_US这样的区域设置,并将其存储在直接框架访问之外的配置中。 我的解决方法是注册一个事件监听器,并挂钩到onKernelRequest事件上。在那里,我检查会话中是否设置了语言环境,如果没有,则将其添加到请求和会话中。 这样,框架就可以像2.1之前一样继续运行。 如果您需要更多关于如何实现此功能的信息,请在评论中提出,我会在这里编辑一些示例 :-)

0

@Webda2I 我尝试了这个解决方案,但似乎无法使其正常工作。我创建了监听器,但似乎没有改变任何东西。你成功让它工作了吗? - fkoessler
你是否已经在自己的Bundle中正确创建了它,并在service.xml或其他文件中声明了它? - webda2l
@Webda2I,我在这里提了一个新问题:https://dev59.com/Z2nWa4cB1Zd3GeqP3sCa,如果您能看一下就太好了。 - fkoessler

-1

如果您在请求中设置了语言环境,那么它仅适用于当前请求。下次发出请求时,将使用默认语言环境。即使现在(2.1)语言环境是在请求而不是会话中设置的,“也可以将语言环境存储在会话中,而不是每个请求基础上。如果这样做,每个后续请求都将具有此语言环境。”(来自文档)。因此,您需要执行以下操作:

$this->get('session')->set('_locale', $newlang);

1
谢谢你的尝试,我也花了很长时间仔细阅读文档,但不幸的是,它根本不起作用。区域设置从未更改,或者总是被设置回默认语言环境。这可能实际上是一个错误,但Symfony 2.1版本还很年轻,所以我不知道,还有其他提示吗? - Jean-Christophe Meillaud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接