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 !
---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.
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
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
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With