web-dev-qa-db-ja.com

Symfonyレイアウト内で_locale変数を取得する方法は?

Symfony 2で2つの言語を使用するサイトで作業しており、ユーザーのロケール言語に応じてルートのパターンを変更したい!

例:

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}

テンプレート内では、これは難しくありません。コントローラーからテンプレートに$ this-> get( 'session')-> getLocale()を渡すだけです...

動作するには、ルートを呼び出す必要があります。

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

しかし、レイアウト内には、もちろんメニューと、リンクのあるサイドバーがあります...だから、使用するロケール変数を取得したいのです!だから私の質問は簡単です:「レイアウト」テンプレート内でこの変数を取得する方法は?それ以外の場合、言語に応じてパターンを変更するアイデアはありますか?

理由は、英語でもフランス語でも、すべてのユーザーに美しいルートが必要だからです...そして、SEOの理由もあります!

62
Sybio

---コメントから更新 ---

Symfony 2.1として、使用する必要があります

{{ app.request.locale }}

または

{{ app.request.getLocale() }}

使用可能な場合はapp.request.localeを返し、app.request.defaultLocaleが設定されていない場合はapp.request.localeを返します。

147
brki

Symfony 2.1はセッションではなくリクエストに「ロケール」を保存するため、これを使用する必要があります。

{{ app.request.getLocale() }}

app.session.localeの代わりに

104
benske

また、ルーティングを単純化することもできます(1つのルール)。

 user_login:
パターン:/{_locale}/user/login.html
デフォルト:{_controller:SfErrorsAppBundle:User:login} 

一部の言語のみを許可する場合は、要件を追加できます。

 user_login:
パターン:/{_locale}/user/login.html
デフォルト:{_controller:SfErrorsAppBundle:User:login} 
要件:
 _locale:fr | en 
5

私の意見では、これは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 %}

また、必要に応じて、 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 %}

詳細については、 Symfony 2.1.0リリースノート を参照してください

2
shakaran