1.概述
把在无需改写源代码即可让开发出来的应用程序能够支持多种语言和数据格式的技术称为国际化.
与国际化对应的是本地化,
指让一个具备国际化支持的应用程序支持某个特定的地区
Struts2国际化是建立在Java
国际化基础上的:
–为不同国家/语言提供对应的消息资源文件
–Struts2框架会根据请求中包含的
Locale 加载对应的资源文件
–通过程序代码取得该资源文件中指定
key 对应的消息
2.国际化的目标:
A、配置国际化资源文件:
①Action 范围资源文件:在Action类文件所在的路径建立名为ActionName_language_country.properties的文件
②包范围资源文件:在包的根路径下建立文件名为package_language_country.properties的属性文件,一旦建立,处于该包下的所有
Action 都可以访问该资源文件。注意:包范围资源文件的baseName就是package,不是Action所在的包名。
③全局资源文件
–命名方式: basename_language_country.properties
–struts.xml
<constantname="struts.custom.i18n.resources" value="baseName"/>
<constantname="struts.custom.i18n.resources" value="baseName"/>
–struts.properties
struts.custom.i18n.resources=baseName
struts.custom.i18n.resources=baseName
④临时指定资源文件:<s:i18n.../>标签的
name 属性指定临时的国际化资源文件
⑤国际化资源文件加载顺序(离当前action较近的优先加载):
⑤国际化资源文件加载顺序(离当前action较近的优先加载):
假设我们在某个ChildAction中调用了getText("username"):–(1)加载和 ChildAction的类文件在同一个包下的系列资源文件 ChildAction.properties–(2)加载 ChildAction 实现的接口 IChild,且和 IChildn在同一个包下 IChild.properties系列资源文件。–(3)加载 ChildAction父类 Parent,且和 Parent 在同一个包下的 baseName为 Parent.properties系列资源文件。–(4) 若 ChildAction实现 ModelDriven接口,则对于getModel()方法返回的model 对象,重新执行第(1)步操作。–(5) 查找当前包下 package.properties系列资源文件。–(6) 沿着当前包上溯,直到最顶层包来查找 package.properties的系列资源文件。–(7) 查找 struts.custom.i18n.resources常量指定 baseName的系列资源文件。–(8) 直接输出该key的字符串值。
B、如何在页面或Action中访问国际化资源文件的value值:
① 在Action类中,若action实现了TextProvide接口,则可以调用其getText() 方法获取资源文件中的value值
》通过继承ActionSupport类来实现此接口
② 在页面上,可以使用<s:text/>标签来访问资源文件中的属性;对于表单标签,可以使用表单标签的key属性值来获取
C、实现通过超链接切换语言:
① 关键在于 Stuts2是如何确定Local对象的
②Struts2 使用
i18n 拦截器处理国际化,并且将其注册在默认的拦截器中
③i18n拦截器在执行Action方法前,自动查找请求中一个名为request_locale的参数。如果该参数存在,拦截器就将其作为参数,转换成Locale对象,并将其设为用户默认的Locale(代表国家/语言环境)。并把其设置为session的
WW_TRANS_I18N_LOCALE属性
WW_TRANS_I18N_LOCALE属性
④若 request没有名为request_locale的参数,则i18n拦截器会从Session中获取WW_TRANS_I18N_LOCALE的属性值,若该值不为空,则将该属性值设置为浏览者的默认Locale
⑤若 session中的WW_TRANS_I18N_LOCALE的属性值为空,则从ActionContext中获取Locale对象。