Как получить переменную _locale внутри макета 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 использовала ее! Поэтому мой вопрос прост: как получить эту переменную внутри шаблона "layout"? В противном случае, есть ли у вас идея изменить шаблон в зависимости от языка?
Причины в том, что я хочу красивые маршруты для всех пользователей, будь то английский или французский... А также по причине SEO!
Ответы
Ответ 1
--- ОБНОВЛЕНО ОТ КОММЕНТАРИЙ ---
Как Symfony 2.1, вы должны использовать
{{ app.request.locale }}
или
{{ app.request.getLocale() }}
который возвращает app.request.locale
, если он доступен, и app.request.defaultLocale
, если app.request.locale
не установлен.
Ответ 2
Поскольку Symfony 2.1 сохраняет "locale" в запросе вместо сеанса, вы должны использовать это:
{{ app.request.getLocale() }}
вместо app.session.locale
Ответ 3
Кроме того, вы можете упростить свою маршрутизацию (одно единственное правило):
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
Ответ 4
На мой взгляд, это самый простой и надежный способ, чтобы автоматически определить язык, не беспокоясь о версии 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 для получения дополнительной информации