Grails - 更改语言环境行为,使用破折号代替下划线

3

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

my.app.com?lang=en-US,由于Grails使用的是en_US,因此会引发异常Error intercepting locale change: Locale part "en-US" contains invalid characters

我该怎么样在PageFragmentCachingFilter之前拦截请求,以便修复语言环境代码?

是否有更好的方法?

2个回答

6

覆盖默认行为的一种方法是在resources.groovy中注册一个CustomLocaleChangeInterceptor作为bean:

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

GIST
这个想法是覆盖默认的localeChangeInterceptor, 这是i18n grails插件中的默认拦截器,以处理请求URL参数中的连字符化locale字符串。在自定义本地化拦截器中需要考虑的主要逻辑如下:

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
    }

0

我认为你可以在/grails-app/conf中添加自己的过滤器,类似于:

class LocaleFixingFilters {

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

1
谢谢回复,然而过滤器是在错误之后被调用的(对你的努力加1)。 - Shlomi Schwartz
很奇怪,因为它对我有效,但也许这取决于所有“before”拦截器的执行顺序。 - Kamil Mikolajczyk
这是我收到的错误信息:“拦截语言环境更改时出错:语言环境部分“de-DE”包含无效字符”。 - Shlomi Schwartz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接