web-dev-qa-db-ja.com

現在のロケールを変更する方法をGrails

現在のロケールを変更するにはどうすればよいですか?

  • 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に設定したままです。

ロケールを変更するアイデアはありますか?

22

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であることをどうやって知ることができますか?.

27
Pascal Thivent

アプリケーションのルート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のコントローラーにマップすることです。

6
Ondra Zahradnik

ロケール「request.locale」をチェックする方法が間違っていることを私が理解している限り、それはgrails applciationのロケールではなく、ブラウザのロケールを提供します。

"LocaleContextHolder.locale"を使用する必要があります。

2.0.では、パラメータlang=someLocaleを渡すだけでロケールが変更されます。

6

これはおそらく手遅れですが、参考までに、インデックスページコントローラーでこれを行います。

session['org.springframework.web.servlet.i18n.SessionLocaleResolver.LOCALE'] = new Locale("es", "PR")
5
jecolon

同様の問題がありましたが、それはスペースが原因でした。私が持っていた:

[space]messages_de.properties代わりにmessages_de.properties

1
chelder

古いバージョンのApache2.2をプロキシして、grails(2.3.9)warファイルを使用しているときに、しばらく前にこれに問題がありました。 mod_proxy_html(3.1)/ Apache2.4を使用した方が幸運でした。たぶん、grailsのより高度なバージョンがこれを修正します。

0
Nathan Dunn