Symfony2.2:default_locale始终应用于树枝翻译

时间:2013-04-17 15:18:12

标签: symfony twig symfony-2.2

我对Symfony2.2有一个奇怪的问题。我有一个使用两种语言的项目:en / fr。所以我像往常一样(如Symfony2.0)在Ressources / Views / translations /中创建两个翻译文件“messages.en.yml”和“messages.fr.yml”。但即使我们设置了请求对象和语言环境会话,twig中的翻译也无法改变。转换始终由default_locale(config.php)设置。

示例:如果default_locale = en,即使我在fr(请求和会话)中设置_locale对象,我的所有网站(在twig中)都会在en中进行翻译。当然,如果我手动将default_locale更改为fr,网站自然会在fr ...

但是,_locale会话有效,但我不知道语言环境请求是否有效,当然翻译也适用于控制器......

有我的档案:

config.yml:

framework:
#esi:            ~
translator:      { fallback: %locale% } # = en
# ...
default_locale: %locale% # = en

控制器:

public function indexAction()
{
    $this->get('session')->set('_locale', 'fr');
    $this->getRequest()->setLocale($lang);
    exit($this->getRequest()->getLocale()); // = fr
    exit($this->get('translator')->trans('Symfony2 is great')); // = Symfony2 est génial

    return $this->render('TestBundle:Controller:test.html.twig');

查看:

{% block content %}
<p>lang : {{ app.request.locale }}</p> {#} = "fr", OK{#}
<p>{{ 'Symfony2 is great'|trans }}</p> {#} = "Symfony2 is great", WAIT WHAT?{#}

我必须辞职以强制方法控制器开头的语言环境具有所请求的语言环境(存储在会话中):

控制器:

if($this->get('session')->get('_locale')){
    $lang = $this->get('session')->get('_locale');
    $this->getRequest()->setLocale($lang);
}

换句话说,我确实遇到了请求对象注册的问题...因为最后一个代码在控制器中工作得很好,并且很好地显示了带有app.request.locale的twig页面中的语言环境,但不是翻译...(抱歉我的英文不好,谢谢你的帮助)

2 个答案:

答案 0 :(得分:1)

由于我的事件监听器的优先级较低,我遇到了同样的问题。翻译器的TranslatorListener将覆盖语言环境。提高我的事件监听器的优先级为我做了诀窍:

services:
    app.locale_listener:
        class: AppBundle\EventListener\LocaleListener
        tags:
            - { name: kernel.event_listener, priority: 11, ... }

来源:https://github.com/symfony/symfony/issues/12878#issuecomment-68628808

答案 1 :(得分:0)

路由中的参数_locale保存您的语言环境值。

在此页面上查看

Symfony - Book - Translation - Local and the URL

从Symfony 2.1他们有这样的逻辑:

  

由于您可以在会话中存储用户的语言环境,因此可能很有可能使用相同的URL根据用户的语言环境以多种不同的语言显示资源。例如,http://www.example.com/contact可以显示一个用户的英语内容和另一个用户的法语。不幸的是,这违反了Web的基本规则:无论用户如何,特定URL都返回相同的资源。为了进一步解决这个问题,搜索引擎会将哪个版本的内容编入索引?

     

更好的策略是在URL中包含区域设置。路由系统使用特殊的_locale参数完全支持这一点:

现在,当你想要本地化时,这不再起作用了

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

您现在可以使用会话请求,但除非您在内核请求中使用事件侦听器模拟它,否则您不能使用Symfony 2.0中的_local进行会话逻辑。