1、国际化解决方案SPRING MVC国际化问题解决方案1解决途径(1) 将所有包含中文的资源文件(包括 JS、图片、JSP等),翻译成多套;(2) 使用属性文件(Properties文件)配置JSP文件的语言,JS和图片等资源使用多套;第一种解决方案较为简单,但对于业务逻辑变动较频繁的应用来说不是很适用;第二种 解决方案,虽然会对开发进度有一定的影响,但相对比较灵活。本文以第二种解决方案为主线进行讨论。2网络解决方案对于SPRING MVC国际化的问题,网络上提供的解决方案大致如下:一、 基于浏览器语言的国际化配置使用Spring的MVC并且配置中有配置 Resource文件。vproperty
2、 n ame=base name value=message-i nfo /其 中,message-info 是 properties 文件的通用名。如: 我 的配置文件叫 message- info.properties,message-info_zh_CN.properties 等等,只要有了这个配置,然后配置 JSP 渲染器为 JSTL支持的,那么在你的 JSP文件中使用fmt标记就可以实现客户浏览器语言国际化了。如: 其中的info.login.title 和你的资源文件对应.另外一种方式是使用 spri ng自带的标签显示国际化信息,如:in put type=butto n val
3、ue=/二、 基于动态加载的国际化配置1、基于请求的国际化配置基于请求的国际化配置是指,在当前请求内,国际化配置生效,否则自动以浏览器为主。配置方式如下:首先配置拦截器这个配置呢,是不论请求级别的国际化, 还是Cookie级别的国际化,再或者Session级别的国际化,都必需有配置这个拦截器,否则会不能使用。配好上面的拦截器之后,就将拦截器注入到你的 UrlHandlerMapping 中,例如:1这个时候,但凡有了符合 UrlMapping的请求,就会被拦截,并且开始配置国际化参数 默认的参数名为locale主意大小写。里面放的就是你的提交参数。如 :en_US, zh_CN之类的,这个时候
4、,你在页面上加一句 简体中文如果你的资源中,饱含建议中文的配置,那么就会变成你确定的简体中文啦。2、 基于Session的国际化配置拦截器和基于请求的相同Session的配置如下:在你的处理的 Controller 中,将提交上来的locale 字段信息生成真正的 Locale对象,然后将对象保存在 Session 中,默认保存的 ID 是 SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME这样,当你的Session不过期,那么语言种类始终保持正确的说。我一直是这样子用的,我觉得还是 Session的好,老外们用了很满意。3、 基于Cooki
5、e的国际化配置三、注意事项如果不用默认的浏览器语言国际化方式,那么拦截器一定要配置,如果你有多个 UrlMapping,那么就每个都配上拦截器。至于配置的LocaleResolver 的名字,一定要用上面的配置中的名字 localeResolver 当然了,这个是默认的名字来的,自己设置成别的也可以,但是就是麻烦,反正我用默认的就感觉不错。3网络解决方案的BUG及局限性对于网络解决方案中提到的“基于请求的国际化配置”,与基于浏览器语言的国际化配置是等价的。通过分析AcceptHeaderLocaleResolver 的源码,发现“基于请求的国际化配置”调用的并不是浏览器上传递的locale参数
6、,而是request.getLocale()方法,即浏览器的语言配置。事实上,当按照“基于请求的国际化配置”的方法进行配置后,在浏览器端传递locale参数时,系统会提示如下错误:Cannot cha nge HTTP accept header - use a differe nt locale resoluti on strategy 此异常是由 AcceptHeaderLocaleResolver 的 setLocale 方法抛出的。由此可见,设置 AcceptHeaderLocaleResolver 起不到任何效果,不如直接使用基于浏览器端的国际化配置比较好此外,对于上面几种解决方案来
7、说,重点解决的是显示层面的国际化问题, 即通过locale 参数来控制国际化语言, session 和 cookie 只是存储 locale 参数的介质。有些需求,通过上面提到的解决方案则无法解决。(1)系统安装时,选择一个默认安装语言。不论浏览器语言的版本如何,默认均显示此 语言;且通过 locale 参数,可以手动调整显示的语言;(2)系统安装时,为不同语言的版本配置不同的 URL;当访问此URL时,不管浏览器语言的设置如何,均显示此 URL 对应的语言版本;4 SPRING MVC国际化解决方案前言:前面提供的网络解决方案也为 SPRING MVC 的国际化解决方案,但具有一定的 局限性
8、;接下来本文探讨一种基于 Spring 的 i18n 包实现的国际化解决方案。4.1Spring DispatcherServlet 工作原理DispatcherServlet 为 Spring 的神经中枢,所有的请求与分发均要通过此 Servlet 。此 Servlet 会加载 WEB 以及 applicationContext 中的配置,以初始化相应的相应的参数。对 于 Spring 应 用 的 国 际 化 来 说 , 最 重 要 的 参 数 有 三 个 : localeResolver 、 localeChangeInterceptor 以及 messageSource 。 Locale
9、 Resolver 在 i18n 中是一个接口, 具有 setLocale() 和 resolverLocale() 两个方法, setLocale() 方法用于在 locale 发生变化的时 候调用, 而 localeChangeInterceptor 用于监听浏览器端 locale 的变化(第一次访问此应用 时,会调用此方法来设置 locale; 之后,如果 locale 有变化,则会调用 setLocale() 方法), resolveLocale() 方法主要用于获得当前的 locale (如果为空,则返回浏览器端的 locale ), 在多个地方均会 调用此方法获得当前的 local
10、e , 其中对于页面显示最重要的一处为 DispatcherServlet 的 render() 方法。这个地方获得的 locale 直接决定浏览器端页面显示的 语言,通过 resolveLocale() 得到的 locale 即为 setLocale() 方法设置的值。 Spring 中, AcceptHeaderLocaleResolver, SessionLocaleResolver, CookieLocaleResolver 分别是LocaleResolver 的三种实现,这在前面的网络解决方案中已经讨论,这里不再赘述当 spring 配 置 文 件 中 , 没 有 配 置 local
11、eResolver 时 , spring 会 默 认 的 使 用 org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver ( 缺 省 策 略 )。 AcceptHeaderLocaleResolver 表示接受浏览器端的语言设置,即根据浏览器端的语言来 setLocale() 。也就是说,如果不设置 localeResolver , render() 时调用 resolverLocale() 方 法获得的 locale 始终是浏览器端的语言。 在 render 之前通过 filter,interceptors 以及 ser
12、vlet 等对 locale 进行修改也无济于事。因为在 spring MVC 中,当所有的 filter,interceptors 以 及 servlet 执行完毕后, DispatcherServlet 的 render() 方法此时会调用 localeResolver 的 resolveLocale 方法,获得当前的 locale 对象。然后 set 到 response 中去。因此,要想控制页面浏览器端页面的显示,必须配置 localeResolver 。而采用 Spring 自带的 LocaleResolver 接口的实现, 无法满足上述提及的需求, 且无法处理诸如图片类的资 源文件
13、。4.2实现思路自 定 义 类 实 现 LocaleResolver 接 口 的 setLocale() 和 resolveLocale() , 编 写 LanguageRequest 抽 象 类 ( 包 括 getLocale() 方 法 ) 及 其 相 应 的 实 现 类 ( LanguageRequestFromAppconfig 、 LanguageRequestFromHostName 、 LanguageRequestFromRequestHeader 、LanguageRequestFromUserSelection ),用于表示国际化解决方案的不同配置。编写过滤器,用于拦截请求
14、,并对设置的资源文件进行处 理。 resolveLocale() 直接从 languageRequest 中获得相应的 locale 。在四个实现类中,分 别实现相应的 locale 获得机制。4.3配置流程4.3.1 web 配置目的: 配置过滤器代理, 使得过滤器可以通过 Spring 注入的方式来进行配置, 方便属性 的设置。 WEB 配置如下。vfilter- namefilterCha in Proxyv/filter- nameorg.spri ngframework.web.filter.Delegati ngFilterProxyvparam-n amee ncodi ngut
15、f-8vfilter-mapp ingvfilter- namefilterCha in Proxyv/filter- name/*REQUESTv/filter-mapp ing4.3.2 Spri ng 配置所谓的Spring配置是指applicationContext.xml 文件的配置。下面给出了此国际化解决方案的最全配置。v/c on structor-argv/c on structor-argv/bea nvcon structor-arg value=e nx/con structor-argvcon structor-arg value=USv/c on structor-a
16、rgv/bea nvbea n id=localeResource class=c n. csdb.i ntern atio nal.resource.LocaleResourcevproperty n ame=i nstalledLocaleListvlistvref bea n=cn Locale/vref bea n=en Locale/v/listv/propertyv/bea nvbea n id=ha ndleResourceType class = cn.csdb.i nternatio nal.resource.Ha ndleResourceTypevproperty n am
17、e=listvlistvvalue.jpgv/valuevvalue.gifv/valuevvalue.p ngv/valuevvalue.jsv/valuevvalue.cssv/valuev/listv/propertyvproperty n ame=filterListdwr/!- 覆盖默认的session存储,而使用cookie存储locale , cookie有效期为一个月-entry key=localhost value-ref=c nLocale!- 覆盖默认的session存储,而使用cookie存储locale , cookie有效期为一个月-!- 覆盖默认的session
18、存储,而使用cookie存储locale , cookie有效期为一个月-vproperty n ame=localeResolver ref=localeResolverx/propertyvproperty n ame=ha ndleResourceType ref=ha ndleResourceType如上所述,本配置为此方案的最全配置,仅起到参考作用。实际应用过程中,可以根据需求来进行相应的删减。以下是部分配置的说明:(1) 本应用安装的语言资源列表:当应用需要读取其支持的语言时, 以进行进一步的配 置时,可以通过得到此 Bean (LocaleResource),进而得到应用所支持的语言。比如:利用 VDB Model Buider 进行建模时,需要读取当前支持的语言包,并为每套语言提供一套配置 界面。如无此需求,可以不进行配置;(2) 系统需要处理的资源类型:locale语言本身仅能解决页面国际化显示的问题, 而不 能解决诸如JS、JPEG GIF等资源文件的国际化,而这对于国际化应用来说又是必须的。比 如:中文系统的某个 JS 提示可能为:”对不起,您不允许进行此操作“,而对应的英文系统 应有对应的英文提示,可能为:“Sorry, You have no Privilege! ”(建议JS文件中尽量少写 中文)。此时,就需要有各个语
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1