Как получить переменную _locale внутри макета Symfony?

Я работаю с Symfony 2 на сайте с двумя языками, и я хочу изменить шаблоны своих маршрутов в зависимости от языка локали пользователя!

Пример:

user_login_en:
    pattern:  /en/user/login.html
    defaults: { _controller: SfErrorsAppBundle:User:login, _locale: en }

user_login_fr:
    pattern:  /fr/utilisateur/connexion.html
    defaults: { _controller: SfErrorsAppBundle:User:login, _locale: fr}

Внутри шаблона это несложно, мне просто нужно передать $ this-> get ('session') -> getLocale () из контроллера в шаблон ...

Для работы мне нужно называть свои маршруты:

$router->generate('user_login_'.$locale, array());

Но внутри моих макетов, конечно, есть меню и боковые панели, на которые есть ссылки ... Итак, я хочу получить переменную локали, чтобы использовать ее! Итак, мой вопрос прост: как поместить эту переменную в шаблон "макета"? А иначе у вас есть идея изменить узор в зависимости от языка?

Причина в том, что мне нужны красивые маршруты для всех пользователей, будь то английский или французский ... А также по причине SEO!


person Sybio    schedule 02.08.2011    source источник


Ответы (4)


--- ОБНОВЛЕНО ИЗ КОММЕНТАРИЙ ---

В версии Symfony 2.1 вы должны использовать

{{ app.request.locale }}

or

{{ app.request.getLocale() }}

который возвращает app.request.locale, если он доступен, и app.request.defaultLocale, если app.request.locale не установлен.

person brki    schedule 16.09.2011
comment
В Symfony 2.1 вместо этого вы должны использовать app.request.locale. - person Damien; 18.07.2012
comment
@Damien а в шаблоне php? - person DomingoSL; 15.07.2013
comment
@DomingoSL $view['request']->getLocale() - person iizno; 08.03.2014
comment
Также в twig я бы предпочел {{ app.request.getLocale() }}, поскольку он возвращает app.request.locale, если доступно, и app.request.defaultLocale, если app.request.locale не установлен. - person Anticom; 22.10.2014
comment
Обновлен ответ с комментариями Дэмиена и Антиком - person Potherca; 23.10.2014
comment
На самом деле, эти два варианта делают одно и то же. В Twig точечный синтаксис может использоваться для доступа к методам получения, если нет общедоступного свойства с указанным именем (как здесь - свойство locale в запросах защищено). Точные правила работы оператора точки в Twig см. В разделе «Реализация» в разделе twig. sensiolabs.org/doc/templates.html#variables - person Sam; 09.09.2015

Поскольку Symfony 2.1 хранит "локаль" в запросе вместо сеанса, вы должны использовать это:

{{ app.request.getLocale() }}

вместо app.session.locale

person benske    schedule 12.10.2012
comment
этот следует принять, так как другой устарел и, следовательно, вводит в заблуждение - person Gigala; 19.04.2013
comment
Думаю, у меня был тот же опыт, что и у тех людей, которые только что потеряли 5 минут с первым принятым ответом, @Sybio, пожалуйста, измените принятый ответ - person Jean-Christophe Meillaud; 08.01.2014
comment
Возможно, следовало приложить усилия, чтобы обновить принятый ответ этим ;-) - person Potherca; 23.10.2014

Кроме того, вы можете упростить маршрутизацию (одно правило):

user_login:
    pattern:  /{_locale}/user/login.html
    defaults: { _controller: SfErrorsAppBundle:User:login }

Если вы хотите разрешить использование только некоторых языков, вы можете добавить требование:

user_login:
    pattern:  /{_locale}/user/login.html
    defaults: { _controller: SfErrorsAppBundle:User:login }
    requirements:
       _locale: fr|en
person Vincent Pazeller    schedule 24.04.2012
comment
чтобы добавить требование, вы должны использовать ключевое слово requirements. вы пропустили последний s = ›symfony.com/doc/current/book /routing.html#adding-requirements - person Francesco Casula; 13.06.2013

На мой взгляд, это самый простой и поддерживаемый способ автоматически определять языковой стандарт, не беспокоясь о версии Symfony:

{% if not app.session.locale is null %} {# Prior to Symfony 2.1 you must get from session, it will be null if upper #}
    Locale: {{ app.session.locale }}
{% else %} {# With Symfony 2.1 or upper you only can get the locale from request #}
    Locale: {{ app.request.locale }}
{% endif %}

Кроме того, при желании вы можете использовать объектную нотацию в шаблонизаторе Twig. :

{% if not app.getSession().getLocale() is null %} {# Prior to Symfony 2.1 you must get from session, it will be null if upper #}
    Locale: {{ app.getSession().getLocale() }}
{% else %} {# With Symfony 2.1 or upper you only can get the locale from request #}
    Locale: {{ app.getRequest().getLocale() }}
{% endif %}

См. примечания к выпуску Symfony 2.1.0 для получения дополнительной информации.

person shakaran    schedule 24.05.2013