Как получить переменную _locale внутри макета Symfony? - PullRequest
62 голосов
/ 03 августа 2011

Я работаю с 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());

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

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

Ответы [ 4 ]

146 голосов
/ 16 сентября 2011

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

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

{{ app.request.locale }}

или

{{ app.request.getLocale() }}

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

104 голосов
/ 12 октября 2012

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

{{ app.request.getLocale() }}

вместо app.session.locale

5 голосов
/ 25 апреля 2012

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

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

...