4

我对 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 会话有效,但我不知道语言环境请求是否有效,当然翻译也适用于控制器......

有我的文件:

配置.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 的树枝页面中很好地显示了语言环境,但不是翻译...... . (抱歉我的英语不好,感谢您的帮助)

4

2 回答 2

1

由于我的事件侦听器的优先级低,我遇到了同样的问题。语言环境将被 Translator 的 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

于 2015-05-21T18:07:42.923 回答
0

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

在这个页面上看这里

Symfony - 书籍 - 翻译 - 本地和 URL

从 Symfony 2.1 开始,他们就有了这样的逻辑:

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

更好的策略是在 URL 中包含语言环境。路由系统使用特殊的 _locale 参数完全支持这一点:

现在,当您想在本地销售时,这不再起作用

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

你现在可以使用 request insted of session,但是你不能使用 Symfony 2.0 中的 _local 进行会话逻辑,除非你在内核请求上使用事件监听器来模拟它。

于 2013-07-08T04:41:07.540 回答