How to get the _locale variable inside in a Symfony layout?

TemplatesLayoutRoutingTranslationSymfony

Templates Problem Overview


I'm working with Symfony 2 on a site which having 2 languages, and I want to change patterns of my routes depending on user locale language !

Example:

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}

Inside a template, this is not difficult, i just have to pass the $this->get('session')->getLocale() from the controller to the template...

To work, I have to call my routes:

$router->generate('user_login_'.$locale, array());

But inside my layouts, I have of course a menu, and sidebars, which have links... So I want to get the locale variable to use it ! So my question is simple: how to get this variable inside a "layout" template ? Otherwise, have you got any idea to change the pattern depending on the language ?

The reasons are that I want beautiful routes for all users, whether they're english or french... And also for a SEO reason !

Templates Solutions


Solution 1 - Templates

---UPDATED FROM THE COMMENTS---

As Symfony 2.1, you must use

{{ app.request.locale }}

or

{{ app.request.getLocale() }}

which returns app.request.locale if available and app.request.defaultLocale if app.request.locale is not set.

Solution 2 - Templates

As Symfony 2.1 stores the "locale" in the Request instead of the session you have to use this:

{{ app.request.getLocale() }}

instead of app.session.locale

Solution 3 - Templates

Also, you might want to simplify your routing (one single rule):

user_login:
pattern:  /{_locale}/user/login.html
defaults: { _controller: SfErrorsAppBundle:User:login }
If you want to allow only some languages you can add a requirement:
user_login:
pattern:  /{_locale}/user/login.html
defaults: { _controller: SfErrorsAppBundle:User:login }
requirements:
_locale: fr|en

Solution 4 - Templates

In my opinion, this is the most easy and maintenable way to autodetect the locale without worrying for Symfony version:

{% 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 %}

Also, if you prefer it you can use a object like notation in Twig template engine:

{% 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 %}

See Symfony 2.1.0 release notes for more info

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSybioView Question on Stackoverflow
Solution 1 - TemplatesbrkiView Answer on Stackoverflow
Solution 2 - TemplatesbenskeView Answer on Stackoverflow
Solution 3 - TemplatesVincent PazellerView Answer on Stackoverflow
Solution 4 - TemplatesshakaranView Answer on Stackoverflow