Symfony2.2: default_locale всегда применяется в переводах twig

У меня странная проблема с Symfony2.2. У меня есть проект на двух языках: en/fr. Поэтому я создаю, как обычно (как в Symfony2.0), два файла перевода «messages.en.yml» и «messages.fr.yml» в Ressources/Views/translations/. Но переводы в twig не могли измениться, даже если мы установили объект запроса и сеанс локали. Перевод всегда задается default_locale (config.php).

Пример: если default_locale = en, весь мой веб-сайт (в ветке) переводится на en, даже если я устанавливаю объект _locale на fr (запрос и сеанс). Конечно, если я вручную изменю 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, но не переводы.. , (извините за мой плохой английский и спасибо за помощь)


person Benji_X80    schedule 17.04.2013    source источник
comment
Не уверен, что это может быть связано, но вы очистили кеш?   -  person cheesemacfly    schedule 17.04.2013
comment
Я в dev, но да, я пытался очистить кеш, безрезультатно...   -  person Benji_X80    schedule 18.04.2013


Ответы (2)


У меня была такая же проблема из-за низкого приоритета моего прослушивателя событий. Языковой стандарт будет переопределен 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

person Jonny    schedule 21.05.2015

Параметр _locale в маршрутизации содержит значение вашей локали.

Посмотрите здесь на этой странице

Symfony — Книга — Перевод — Локальный и URL< /а>

Начиная с Symfony 2.1 у них такая логика:

Поскольку вы можете сохранить языковой стандарт пользователя в сеансе, может возникнуть соблазн использовать один и тот же URL-адрес для отображения ресурса на многих разных языках в зависимости от языкового стандарта пользователя. Например, http://www.example.com/contact может отображать контент на английском языке для одного пользователя и Французский для другого пользователя. К сожалению, это нарушает фундаментальное правило Интернета: определенный URL-адрес возвращает один и тот же ресурс независимо от пользователя. Чтобы еще больше запутать проблему, какая версия контента будет проиндексирована поисковыми системами?

Лучшей политикой является включение языкового стандарта в URL-адрес. Это полностью поддерживается системой маршрутизации с использованием специального параметра _locale:

Теперь, когда вы хотите продавать местные, это больше не работает.

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

Теперь вы можете использовать запрос вместо сеанса, но у вас не может быть сеансовой логики с _local из Symfony 2.0, если вы не имитируете его с помощью прослушивателя событий по запросу ядра.

person edo.schatz    schedule 08.07.2013