国际化解决方案Word下载.docx
- 文档编号:5900110
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:15
- 大小:22.85KB
国际化解决方案Word下载.docx
《国际化解决方案Word下载.docx》由会员分享,可在线阅读,更多相关《国际化解决方案Word下载.docx(15页珍藏版)》请在冰点文库上搜索。
我的配置文件叫message-info.properties,message-info_zh_CN.properties等等,只要有了这个配置,然后配置JSP渲染器为JSTL
支持的,那么在你的JSP文件中使用fmt标记就可以实现客户浏览器语言国际化了。
如:
<
fmt:
messagekey="
info.login.title"
其中的info.login.title和你的资源文件对应.
另外一种方式是使用spring自带的标签显示国际化信息,如:
spring:
messagecode="
main.title"
br>
inputtype="
button"
main.title"
"
/>
二、基于动态加载的国际化配置
1、基于请求的国际化配置
基于请求的国际化配置是指,在当前请求内,国际化配置生效,否则自动以浏览器为主。
配置方式如下:
首先配置拦截器
!
--国际化操作拦截器必需配置,可以和其它国际化方式通用-->
localeChangelnterceptor"
org.springframework.web.servlet.i18n.LocaleChangelnterceptor"
这个配置呢,是不论请求级别的国际化,还是Cookie级别的国际化,再或者Session级别的国际化,
都必需有配置这个拦截器,否则会不能使用。
配好上面的拦截器之后,就将拦截器注入到你的UrlHandlerMapping中,例如:
beanid="
defaultUrlMapping"
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"
interceptors"
ref="
order"
value>
1<
/value>
/property>
这个时候,但凡有了符合UrlMapping的请求,就会被拦截,并且开始配置国际化参数
localeResolver"
org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver"
默认的参数名为locale主意大小写。
里面放的就是你的提交参数。
如:
en_US,zh_CN之类的,这个时
候,你在页面上加一句<
ahref="
?
locale=zh_CN"
简体中文<
/a>
如果你的资源中,饱含建议中文的配置,那么就会变成你确定的简体中文啦。
2、基于Session的国际化配置
拦截器和基于请求的相同
Session的配置如下:
org.springframework.web.servlet.i18n.SessionLocaleResolver"
在你的处理的Controller中,将提交上来的locale字段信息生成真正的Locale对象,然后将对象
保存在Session中,默认保存的ID是SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME
这样,当你的Session不过期,那么语言种类始终保持正确的说。
我一直是这样子用的,我觉得还是Session的好,老外们用了很满意。
3、基于Cookie的国际化配置
org.springframework.web.servlet.i18n.CookieLocaleResolver"
三、注意事项
如果不用默认的浏览器语言国际化方式,那么拦截器一定要配置,如果你有多个UrlMapping,那么就
每个都配上拦截器。
至于配置的LocaleResolver的名字,一定要用上面的配置中的名字localeResolver当然了,这个是
默认的名字来的,自己设置成别的也可以,但是就是麻烦,反正我用默认的就感觉不错。
3网络解决方案的BUG及局限性
对于网络解决方案中提到的“基于请求的国际化配置”,与基于浏览器语言的国际化配置
是等价的。
通过分析AcceptHeaderLocaleResolver的源码,发现“基于请求的国际化配置”
调用的并不是浏览器上传递的locale参数,而是request.getLocale()方法,即浏览器的语言
配置。
事实上,当按照“基于请求的国际化配置”的方法进行配置后,在浏览器端传递locale
参数时,系统会提示如下错误:
CannotchangeHTTPacceptheader-useadifferentlocaleresolutionstrategy此异常是由AcceptHeaderLocaleResolver的setLocale方法抛出的。
由此可见,设置AcceptHeaderLocaleResolver起不到任何效果,不如直接使用基于浏
览器端的国际化配置比较好
此外,对于上面几种解决方案来说,重点解决的是显示层面的国际化问题,即通过locale参数来控制国际化语言,session和cookie只是存储locale参数的介质。
有些需求,通过上面提到的解决方案则无法解决。
(1)系统安装时,选择一个默认安装语言。
不论浏览器语言的版本如何,默认均显示此语言;
且通过locale参数,可以手动调整显示的语言;
(2)系统安装时,为不同语言的版本配置不同的URL;
当访问此URL时,不管浏览器
语言的设置如何,均显示此URL对应的语言版本;
4SPRINGMVC国际化解决方案
前言:
前面提供的网络解决方案也为SPRINGMVC的国际化解决方案,但具有一定的局限性;
接下来本文探讨一种基于Spring的i18n包实现的国际化解决方案。
4.1SpringDispatcherServlet工作原理
DispatcherServlet为Spring的神经中枢,所有的请求与分发均要通过此Servlet。
此Servlet会加载WEB以及applicationContext中的配置,以初始化相应的相应的参数。
对于Spring应用的国际化来说,最重要的参数有三个:
localeResolver、localeChangeInterceptor以及messageSource。
LocaleResolver在i18n中是一个接口,具有setLocale()和resolverLocale()两个方法,setLocale()方法用于在locale发生变化的时候调用,而localeChangeInterceptor用于监听浏览器端locale的变化(第一次访问此应用时,会调用此方法来设置locale;
之后,如果locale有变化,则会调用setLocale()方法),resolveLocale()方法主要用于获得当前的locale(如果为空,则返回浏览器端的locale),在多个地方均会调用此方法获得当前的locale,其中对于页面显示最重要的一处为DispatcherServlet的render()方法。
这个地方获得的locale直接决定浏览器端页面显示的语言,通过resolveLocale()得到的locale即为setLocale()方法设置的值。
Spring中,AcceptHeaderLocaleResolver,SessionLocaleResolver,CookieLocaleResolver分别是
LocaleResolver的三种实现,这在前面的网络解决方案中已经讨论,这里不再赘述
当spring配置文件中,没有配置localeResolver时,spring会默认的使用org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver(缺省策略)。
AcceptHeaderLocaleResolver表示接受浏览器端的语言设置,即根据浏览器端的语言来setLocale()。
也就是说,如果不设置localeResolver,render()时调用resolverLocale()方法获得的locale始终是浏览器端的语言。
在render之前通过filter,interceptors以及servlet等对locale进行修改也无济于事。
因为在springMVC中,当所有的filter,interceptors以及servlet执行完毕后,DispatcherServlet的render()方法此时会调用localeResolver的resolveLocale方法,获得当前的locale对象。
然后set到response中去。
因此,要想控制页面浏览器端页面的显示,必须配置localeResolver。
而采用Spring自带的LocaleResolver接口的实现,无法满足上述提及的需求,且无法处理诸如图片类的资源文件。
4.2实现思路
自定义类实现LocaleResolver接口的setLocale()和resolveLocale(),编写LanguageRequest抽象类(包括getLocale()方法)及其相应的实现类(LanguageRequestFromAppconfig、LanguageRequestFromHostName、LanguageRequestFromRequestHeader、LanguageRequestFromUserSelection),用于
表示国际化解决方案的不同配置。
编写过滤器,用于拦截请求,并对设置的资源文件进行处理。
resolveLocale()直接从languageRequest中获得相应的locale。
在四个实现类中,分别实现相应的locale获得机制。
4.3配置流程
4.3.1web配置
目的:
配置过滤器代理,使得过滤器可以通过Spring注入的方式来进行配置,方便属性的设置。
WEB配置如下。
filter>
vfilter-name>
filterChainProxyv/filter-name〉
filter-class>
org.springframework.web.filter.DelegatingFilterProxy
/filter-class>
init-param>
vparam-name>
encoding<
/param-name>
param-value>
utf-8<
/param-value>
/init-param>
/filter>
vfilter-mapping>
url-pattern>
/*<
/url-pattern>
dispatcher>
REQUEST<
/dispatcher>
v/filter-mapping>
4.3.2Spring配置
所谓的Spring配置是指applicationContext.xml文件的配置。
下面给出了此国际化解
决方案的最全配置。
--系统支持的语言包-->
cnLocale"
class="
java.util.Locale"
constructor-argvalue="
zh"
v/constructor-arg>
CN"
v/bean>
enLocale"
vconstructor-argvalue="
en"
x/constructor-arg>
US"
--本应用安装的语言资源列表-->
vbeanid="
localeResource"
cn.csdb.international.resource.LocaleResource"
installedLocaleList"
vlist>
vrefbean="
cnLocale"
enLocale"
v/list>
v/property>
--系统需要处理的资源类型,即需要配置过滤的资源-->
handleResourceType"
class="
cn.csdb.international.resource.HandleResourceType"
list"
vvalue>
.jpgv/value>
.gifv/value>
.pngv/value>
.jsv/value>
.cssv/value>
filterList"
list>
dwr/<
/list>
--系统配置默认的语言包-->
appConfig"
cn.csdb.international.request.LanguageRequestFromAppconfig"
>
--覆盖默认的session存储,而使用cookie存储locale,cookie有效期为一个月
medium"
cookie"
-->
appLocale"
localeParameterStatus"
--系统根据URL地址来设定语言包-->
hostName"
cn.csdb.international.request.LanguageRequestFromHostName"
urlLocaleMap"
map>
entrykey="
localhost"
value-ref="
〉<
/entry>
127.0.0.1"
enLocale"
/entry>
/map>
--系统根据浏览器语言来设定语言包-->
request"
cn.csdb.international.request.LanguageRequestFromRequestHeader"
--覆盖默认的session存储,而使用cookie存储locale,cookie有效期为一个月
--系统根据用户选择即locale参数来设定语言包-->
userSel"
cn.csdb.international.request.LanguageRequestFromUserSelection"
—
localeResover,要实现多语言显示,则必须配置localeResover,且名称不允许更改;
否则,系统自动按照浏览器语言来显示
class="
cn.csdb.international.resolver.MyLocaleResolver"
languageRequest"
--国际化使用的过滤器-->
--
对于资源文件来说,当遇到多语言处理时,系统自动寻找WEB-INF/lang路径底下的语言文件夹,加
载对应的资源文件;
女口webroot/common/js/jquery/jquery-min.js,遇到多语言处理时,系统自动加载webroot/WEB-INF/lang/locale/common/js/jquery/jquery-min.js;
因此,要配置多语言环境,需要在将所有想要国际化的资源文件放在WEB-INF/lang底下,且default
目录是必须的
internationalFilter"
cn.csdb.international.filter.InternationalFilter"
x/property>
--缓存文件中需要包括名为"
resFileCache”的缓存-->
cacheConfigFile"
/WEB-INF/ehcache.xml"
--配置语言资源文件的地址-->
message/message"
--过滤规则的配置-->
beanid="
filterChainProxy"
class="
org.springframework.security.util.FilterChainProxy"
stripQueryStringFromUrls"
false"
matcher"
beanclass="
org.springframework.security.util.RegexUrlPathMatcher"
propertyname="
filterChainMap"
/.*"
refbean="
internationalFilter"
/entry>
如上所述,本配置为此方案的最全配置,仅起到参考作用。
实际应用过程中,可以根据
需求来进行相应的删减。
以下是部分配置的说明:
(1)本应用安装的语言资源列表:
当应用需要读取其支持的语言时,以进行进一步的配置时,可以通过得到此Bean(LocaleResource),进而得到应用所支持的语言。
比如:
利用VDBModelBuider进行建模时,需要读取当前支持的语言包,并为每套语言提供一套配置界面。
如无此需求,可以不进行配置;
(2)系统需要处理的资源类型:
locale语言本身仅能解决页面国际化显示的问题,而不能解决诸如JS、JPEGGIF等资源文件的国际化,而这对于国际化应用来说又是必须的。
比如:
中文系统的某个JS提示可能为:
”对不起,您不允许进行此操作“,而对应的英文系统应有对应的英文提示,可能为:
“Sorry,YouhavenoPrivilege!
”(建议JS文件中尽量少写中文)。
此时,就需要有各个语
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 国际化 解决方案
![提示](https://static.bingdoc.com/images/bang_tan.gif)