0

Grails の国際化ドキュメントによると、i18n は次のいずれかによって実現されます。

  • Accept-Languageリクエストにヘッダーを設定します。また
  • langクエリ文字列パラメータへの取り組み

前者の方が HTTP に準拠しているため、私は前者を選択しています。率直に言って、それをクエリ パラメータとして追加するのは好きではありません。

しかし、そもそもどうやって設定Accept-Languageするのでしょうか?!?

要求された TLD によってアプリのロケールが決定されるようにします。は伝統的に英語/米国に関連付けられているため、のリクエストはアプリhttp://myapp.example.comのバージョンを返します。要求された場合、Grails はアプリのバージョンを返す必要があります。等。en_US*.comhttp://myapp.example.frfr_FR

だから私の本当の質問は:

要求された URL/TLD を Grails がサーバーに設定できる変数にマップし、GSP に挿入して、クライアント側の要求が常にAccept-Language特定の URL/TLD に一致するヘッダーを持つようにするにはどうすればよいですか?


アップデート

ここでブラウザー/Grails の動作を確認したい: ユーザーがブラウザーを構成するときに、ブラウザーがAccept-Languageそれに応じてヘッダーを調整すると想定しても安全ですか? もしそうなら、ifAccept-Languageが送信されず、Grails がデフォルトlangで使用するクエリ パラメータとして指定されていないと仮定できますか?en_US

4

1 に答える 1

2

あなたは自分にとって必要以上に物事を難しくしています。サーバーにロケールを設定し、GSP に注入し、クライアント側のリクエストにリクエスト ヘッダーを強制的に変更させようとする試み (これは、ヘッダーがアプリケーションではなく、ユーザーのブラウザーが制御することを目的としていることを考えると恐ろしい考えです) は終わりました。複雑。

localeResolverより単純で正しいアプローチは、Grails アプリケーション内の新しい Bean 内に独自のカスタム ロジックを実装することです。

この Bean は、最初に に基づいて独自のカスタム ルックアップをチェックrequest.getRequestURI()し、ロケールが何に解決されるべきかを決定します。その後、デフォルトの動作にフォールバックすることもできます。

繰り返しますが、これを実装するための鍵は、既存のものlocaleResolverを理解し、それを置き換える方法を理解することです。これを発見するには、Grails (および Spring) の内部を掘り下げる必要があります。

デフォルトの実装を置き換えるには、.xml 内で Bean を再定義するだけですresources.groovy。再実装は完全にあなた次第です。

アップデート

正しい方向に向かうための追加情報。

デフォルトでは、resources.groovyファイルにはプロジェクトのこの Bean 定義は含まれません。フレームワークによって作成されたものを置き換える新しいエントリをそこに作成するのはあなた次第です。

実装する Bean の種類を理解するには、LocaleResolverインターフェースを確認する必要があります。この問題への取り組み方に応じて、このインターフェースを実装するか、Grails 実装を拡張します。

Githubでの i8n プラグインの Grails 実装と、ロケール リゾルバーのセットアップ方法。デフォルトの実装は、 Spring が提供するSessionLocaleResolverであることに気付くでしょう。

お役に立てれば。

于 2014-11-06T19:21:48.360 に答える