我正在写一个Grails应用程序,它是第三方的区域设置,如下所示:
my.app.com?lang= en-US ,因为Grails使用 en_US 会抛出异常Error intercepting locale change: Locale part "en-US" contains invalid characters
如何在PageFragmentCachingFilter之前拦截请求,以便修复语言环境代码?
有更好的方法吗?
答案 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('-', '_')
}
}
}
}