我正在编写一个Grails应用程序,它从第三方获取区域设置,如下所示:
my.app.com?lang=en-US,由于Grails使用的是en_US,因此会引发异常Error intercepting locale change: Locale part "en-US" contains invalid characters
我该怎么样在PageFragmentCachingFilter之前拦截请求,以便修复语言环境代码?
是否有更好的方法?
我正在编写一个Grails应用程序,它从第三方获取区域设置,如下所示:
my.app.com?lang=en-US,由于Grails使用的是en_US,因此会引发异常Error intercepting locale change: Locale part "en-US" contains invalid characters
我该怎么样在PageFragmentCachingFilter之前拦截请求,以便修复语言环境代码?
是否有更好的方法?
覆盖默认行为的一种方法是在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
}
我认为你可以在/grails-app/conf中添加自己的过滤器,类似于:
class LocaleFixingFilters {
def filters = {
trace(controller:'*', action:'*') {
before = {
params.lang = params.lang?.replaceAll('-', '_')
}
}
}
}