64 votes

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

Je travaille avec Symfony 2 sur un site qui avoir 2 langues, et je veux changer les modes de mes itinéraires en fonction de l'utilisateur de la langue locale !

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}

À l'intérieur d'un modèle, ce n'est pas difficile, j'ai juste à passer le $this->get('session')->getLocale() de la manette pour le modèle...

Au travail, je dois appeler mon parcours:

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

Mais à l'intérieur de ma présentation, j'ai bien sûr un menu et des barres de navigation, qui ont des liens... Si je veux obtenir la variable locale pour l'utiliser ! Donc ma question est simple: comment profiter de cette variable à l'intérieur d'une "mise en page" modèle ? 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 en anglais ou en français... Et aussi pour une raison SEO !

152voto

brki Points 572

--- MISE À JOUR DES COMMENTAIRES ---

En tant que Symfony 2.1, vous devez utiliser

 {{ app.request.locale }}
 

ou

 {{ app.request.getLocale() }}
 

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

105voto

benske Points 1507

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

5voto

Vincent Pazeller Points 314

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

Utilisateur en ligne:
    pattern: /{_locale}/user/login.html
    valeurs par défaut: {_controller: SfErrorsAppBundle: User: login}

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

Utilisateur en ligne:
    pattern: /{_locale}/user/login.html
    valeurs par défaut: {_controller: SfErrorsAppBundle: User: login}
    exigences:
       _locale: fr | en

2voto

shakaran Points 2390

À mon avis, il s'agit du moyen le plus simple et le plus facile de maintenir l' auto-détection des paramètres régionaux sans se soucier de la version de 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 %}
 

De même, si vous le préférez, vous pouvez utiliser un objet tel que notation dans le moteur de template 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 %}
 

Consultez les notes de publication de Symfony 2.1.0 pour plus d'informations.

1voto

Problematic Points 10229

À partir de twig, vous pouvez accéder à la chaîne de paramètres régionaux à partir de la variable globale app :

 {{ app.getSession().getLocale() }} // outputs "en", for example
 

Vous pouvez également utiliser le service de traduction et simplement traduire le texte du lien. Consultez en particulier la section sur les traductions dans les modèles .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X