it-swarm.com.de

Wie erhält man die Variable _locale in einem Symfony-Layout?

Ich arbeite mit Symfony 2 auf einer Website mit zwei Sprachen und möchte die Routenmuster in Abhängigkeit von der Sprache des Benutzergebietsschemas ändern.

Beispiel:

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}

Innerhalb eines Templates ist das nicht schwierig, ich muss nur das $ this-> get ('session') -> getLocale () vom Controller an das Template übergeben ...

Um zu arbeiten, muss ich meine Routen anrufen:

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

Aber in meinen Layouts habe ich natürlich ein Menü und Seitenleisten, die Links haben ... Also möchte ich die Locale-Variable bekommen, um sie zu verwenden! Meine Frage ist also einfach: Wie bekomme ich diese Variable in eine "Layout" -Vorlage? Haben Sie sonst eine Idee, das Muster je nach Sprache zu ändern?

Die Gründe sind, dass ich schöne Routen für alle Benutzer haben möchte, egal ob sie Englisch oder Französisch sind ... Und auch aus SEO-Gründen!

62
Sybio

---AKTUALISIERT AUS DEN KOMMENTAREN ---

Als Symfony 2.1 müssen Sie verwenden

{{ app.request.locale }}

oder

{{ app.request.getLocale() }}

was zurückgibt app.request.locale falls verfügbar und app.request.defaultLocale ob app.request.locale ist nicht gesetzt.

147
brki

Da Symfony 2.1 das "Gebietsschema" in der Anfrage anstelle der Sitzung speichert, müssen Sie Folgendes verwenden:

{{ app.request.getLocale() }}

anstelle von app.session.locale

104
benske

Möglicherweise möchten Sie auch Ihr Routing vereinfachen (eine einzige Regel):

 user_login: 
 pattern: /{_locale}/user/login.html
 default: {_controller: SfErrorsAppBundle: User: login} 

Wenn Sie nur einige Sprachen zulassen möchten, können Sie eine Anforderung hinzufügen:

 Benutzeranmeldung: 
 Muster: /{_locale}/user/login.html
 Standard: {_controller: SfErrorsAppBundle: Benutzer: login} 
 Anforderungen: 
 _locale: fr | en 
5

Meiner Meinung nach ist dies die einfachste und wartbarste Möglichkeit , das Gebietsschema automatisch zu erkennen, ohne sich um Symfony zu sorgen:

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

Wenn Sie es vorziehen, können Sie auch ein Objekt wie eine Notation verwenden 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 %}

Weitere Informationen finden Sie unter Versionshinweise zu Symfony 2.1.

2
shakaran