Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 !

like image 223
Sybio Avatar asked Aug 02 '11 21:08

Sybio


4 Answers

---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.

like image 132
brki Avatar answered Nov 17 '22 23:11

brki


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

like image 40
benske Avatar answered Nov 18 '22 00:11

benske


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
like image 5
Vincent Pazeller Avatar answered Nov 18 '22 01:11

Vincent Pazeller


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

like image 2
shakaran Avatar answered Nov 18 '22 01:11

shakaran