現在のロケールを変更するにはどうすればよいですか?
controller/action?lang=de
を入れようとしましたが、ロケールはまだen_US
ですこのコードを使用して値をオーバーライドしようとしました:
def key = "org.springframework.web.servlet.DispatcherServlet.LOCALE_RESOLVER"
def localeResolver = request.getAttribute(key)
localeResolver.setLocale(request, response, new Locale("de","DE"))
何も変わっていません。
このコードを使用して値をオーバーライドしようとしました:
import org.springframework.web.servlet.support.RequestContextUtils as RCU;
RCU.getLocaleResolver(request).setLocale(request, response, new Locale("de","DE"))
そして...何も起こらなかった。ロケールをen_US
に設定したままです。
ロケールを変更するアイデアはありますか?
Grailsドキュメントの 10。Internationalization の章によると、Grailsはそのままi18nをサポートしており、lang
パラメーターを使用してロケールを変更できるはずです。
デフォルトでは、ユーザーロケールは着信
Accept-Language
ヘッダーから検出されます。ただし、lang
というパラメーターをリクエストパラメーターとしてGrailsに渡すだけで、ユーザーにロケールを切り替える機能を提供できます。/book/list?lang=de
Grailsは自動的にユーザーロケールを切り替えてCookieに保存するため、後続のリクエストには新しいヘッダーが含まれます。
ただし、すべてのアプリケーションが英語であるとは限らないため、デフォルトの言語を事前設定したい場合があります。これを行うには、以下に示すように、resources.groovy
スプリング構成ファイルにlocaleResolver
を設定するだけです。
beans = {
localeResolver(org.springframework.web.servlet.i18n.SessionLocaleResolver) {
defaultLocale = new Locale("de","DE")
Java.util.Locale.setDefault(defaultLocale)
}
}
さて、詳細がなければ、あなたのケースでlang
パラメーターの使用が機能しない理由を言うことはできません。念のため、ロケールがまだen_USであることをどうやって知ることができますか?.
アプリケーションのルートURL(例:http://localhost:8080/myapp/?lang=de
)のロケールを変更しようとしていますか?
Grailsの基本設定では、アプリケーションのルートURLでロケールを変更しようとしても機能しません。 Grailsは、すべてのコントローラーが呼び出される前に呼び出されるlocalChangeInterceptor
のロケールを変更します。アプリケーションのルートURLにアクセスすると、デフォルトのUrlMappingsに見られるように、コントローラーは呼び出されません。
そのため、アプリケーションのルートURLでロケールを変更しても機能しません。一部のコントローラーでURLを変更しようとすると、機能します。
現在のロケールは、httpセッションのキーorg.springframework.web.servlet.i18n.SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME
に保存されます。そちらで確認できます。
正しい解決策は、ルートURLをUrlMappingsのコントローラーにマップすることです。
ロケール「request.locale」をチェックする方法が間違っていることを私が理解している限り、それはgrails applciationのロケールではなく、ブラウザのロケールを提供します。
"LocaleContextHolder.locale"を使用する必要があります。
2.0.では、パラメータlang=someLocale
を渡すだけでロケールが変更されます。
これはおそらく手遅れですが、参考までに、インデックスページコントローラーでこれを行います。
session['org.springframework.web.servlet.i18n.SessionLocaleResolver.LOCALE'] = new Locale("es", "PR")
同様の問題がありましたが、それはスペースが原因でした。私が持っていた:
[space]messages_de.properties
代わりにmessages_de.properties
古いバージョンのApache2.2をプロキシして、grails(2.3.9)warファイルを使用しているときに、しばらく前にこれに問題がありました。 mod_proxy_html(3.1)/ Apache2.4を使用した方が幸運でした。たぶん、grailsのより高度なバージョンがこれを修正します。