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の理由もあります!
---コメントから更新 ---
Symfony 2.1として、使用する必要があります
{{ app.request.locale }}
または
{{ app.request.getLocale() }}
使用可能な場合はapp.request.locale
を返し、app.request.defaultLocale
が設定されていない場合はapp.request.locale
を返します。
Symfony 2.1はセッションではなくリクエストに「ロケール」を保存するため、これを使用する必要があります。
{{ app.request.getLocale() }}
app.session.localeの代わりに
また、ルーティングを単純化することもできます(1つのルール)。
user_login: パターン:/{_locale}/user/login.html デフォルト:{_controller:SfErrorsAppBundle:User:login}
一部の言語のみを許可する場合は、要件を追加できます。
user_login: パターン:/{_locale}/user/login.html デフォルト:{_controller:SfErrorsAppBundle:User:login} 要件: _locale:fr | en
私の意見では、これは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リリースノート を参照してください