web-dev-qa-db-fra.com

Comment insérer la variable _locale dans une mise en page Symfony?

Je travaille avec Symfony 2 sur un site ayant 2 langues et je souhaite modifier les schémas de mes itinéraires en fonction de la langue de l'utilisateur!

Exemple:

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}

Dans un template, ce n’est pas difficile, je dois juste passer le $ this-> get ('session') -> getLocale () du contrôleur au template ...

Pour travailler, je dois appeler mes itinéraires:

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

Mais à l'intérieur de mes mises en page, j'ai bien sûr un menu, et des barres latérales, qui ont des liens ... Donc, je veux obtenir la variable locale pour l'utiliser! Ma question est donc simple: comment insérer cette variable dans un modèle "layout"? Sinon, avez-vous une idée pour changer le modèle en fonction de la langue?

Les raisons sont que je veux de beaux itinéraires pour tous les utilisateurs, qu'ils soient anglais ou français ... Et aussi pour une raison de référencement!

62
Sybio

---MISE À JOUR DES COMMENTAIRES ---

En tant que Symfony 2.1, vous devez utiliser

{{ app.request.locale }}

ou

{{ app.request.getLocale() }}

qui retourne app.request.locale si disponible et app.request.defaultLocale si app.request.locale n'est pas défini.

147
brki

Comme Symfony 2.1 stocke les "paramètres régionaux" dans la demande au lieu de la session, vous devez utiliser ceci:

{{ app.request.getLocale() }}

au lieu de app.session.locale

104
benske

Aussi, vous voudrez peut-être simplifier votre routage (une seule règle):

 user_login: 
 pattern: /{_locale}/user/login.html
 par défaut: {_controller: SfErrorsAppBundle: Utilisateur: login} 

Si vous ne souhaitez autoriser que certaines langues, vous pouvez ajouter une exigence:

 user_login: 
 pattern: /{_locale}/user/login.html
 par défaut: {_controller: SfErrorsAppBundle: Utilisateur: login} 
 configuration requise: 
 _locale: fr | en 
5
Vincent Pazeller

À mon avis, c’est le moyen le plus simple et le plus facile à maintenir de détecter automatiquement les paramètres régionaux sans se soucier de 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 %}

En outre, si vous le préférez, vous pouvez utiliser un objet similaire à la notation dans Twig moteur de gabarit:

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

Voir Notes de publication de Symfony 2.1. pour plus d'informations.

2
shakaran