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


Я работаю с Symfony 2 на сайте, который имеет 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());

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

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

4 55

4 ответа:

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

как Symfony 2.1, вы должны использовать

{{ app.request.locale }}

или

{{ app.request.getLocale() }}

возвращает app.request.locale если и app.request.defaultLocale Если app.request.locale не установлено.

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

{{ app.request.getLocale() }}

вместо приложения.сессия.язык

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

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

по-моему, это и есть самый простой и ремонтопригодный способ для автоматического определения локали, не беспокоясь за 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 %}

кроме того, если вы предпочитаете его вы можете использовать объект нотации на веточка шаблонизатора:

{% 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 примечания к выпуску дополнительная информация