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