3

我正在编写一个 Grails 应用程序,它从第 3 方获取它的语言环境,如下所示:

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

覆盖默认行为的一种方法是将CustomLocaleChangeInterceptorresources.groovy注册为bean

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

GIST
这个想法是覆盖默认值localeChangeInterceptor,即 i18n grails 插件中的默认拦截器,以便处理请求 url 参数中的连字符语言环境字符串。在自定义语言环境拦截器中查看的主要逻辑是:

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 回答