Подтвердить что ты не робот

Как получить переменную _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!

4b9b3361

Ответ 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 для получения дополнительной информации