3

次のように、サードパーティからロケールを取得する Grails アプリケーションを作成しています。

my.app.com?lang= en-US Grails はen_USを使用するため、例外がスローされますError intercepting locale change: Locale part "en-US" contains invalid characters

ロケール コードを修正するために、PageFragmentCachingFilter の前にリクエストをインターセプトするにはどうすればよいですか?

より良いアプローチはありますか?

4

2 に答える 2

6

デフォルトの動作をオーバーライドする 1 つの方法は、CustomLocaleChangeInterceptorを Bean としてresources.groovy登録することです。

beans = {
    localeChangeInterceptor(your.package.CustomLocaleChangeInterceptor) {
        paramName = "lang"
    }
}

GISTアイデアは、リクエストの url パラメータでハイフンでつながれたロケール文字列を処理するために、i18n grails プラグインのデフォルトのインターセプターである
デフォルトをオーバーライドすることです。localeChangeInterceptorカスタム ロケール インターセプターで確認する主なロジックは次のとおりです。

try {
        // choose first if multiple specified
        if (localeParam.getClass().isArray()) {
            localeParam = ((Object[])localeParam)[0]
        }

        //If locale hyphenated, then change to underscore
        if(localeParam.toString()?.contains('-')){
            localeParam = StringUtils.replace(localeParam.toString(), "-", "_")
        }

        def localeResolver = RequestContextUtils.getLocaleResolver(request)
        def localeEditor = new LocaleEditor()
        localeEditor.setAsText localeParam.toString()
        localeResolver?.setLocale request, response, (Locale)localeEditor.value
        return true
    }
    catch (Exception e) {
        return true
    }
于 2013-09-17T20:28:05.847 に答える
0

/grails-app/conf に次のような独自のフィルターを追加できると思います。

class LocaleFixingFilters {

    def filters = {
        trace(controller:'*', action:'*') {
            before = {
                params.lang = params.lang?.replaceAll('-', '_')
            }
        }
    }
}
于 2013-09-15T22:44:36.030 に答える