Grails - 更改区域设置行为以使用破折号而不是下划线

时间:2013-09-15 10:36:03

标签: grails web internationalization request locale

我正在写一个Grails应用程序,它是第三方的区域设置,如下所示:

my.app.com?lang= en-US ,因为Grails使用 en_US 会抛出异常Error intercepting locale change: Locale part "en-US" contains invalid characters

如何在PageFragmentCachingFilter之前拦截请求,以便修复语言环境代码?

有更好的方法吗?

2 个答案:

答案 0 :(得分:5)

覆盖默认行为的一种方法是在resources.groovy中将CustomLocaleChangeInterceptor注册为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
    }

答案 1 :(得分:0)

我认为您可以在/ grails-app / conf中添加自己的过滤器,例如:

class LocaleFixingFilters {

    def filters = {
        trace(controller:'*', action:'*') {
            before = {
                params.lang = params.lang?.replaceAll('-', '_')
            }
        }
    }
}