Как получить переменную локали внутри макета 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 ответа:
- - -ОБНОВЛЕНО ИЗ КОММЕНТАРИЕВ - - -
как 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 примечания к выпуску дополнительная информация