1:java内置的国际化
java内置的国际化,以java.util.ResourceBundle和java.util.Locale两个类为中心,其中java.util.Locale负责选择合适的语言,而java.util.ResourceBundle负责根据注入的java.util.Locale对象来选择国际化信息的来源,返回国际化信息。
简单示例:
准备3份文件:
* 默认语言文件:message.properties
labela = labela in zh_CN
labelb = labelb in zh_CN
*中文语言文件
labela = labela in zh_CN
labelb = labelb in zh_CN
*英文语言文件
labela = labela in en_US
labelb = labelb in en_US
java类,在引用多语言信息的时候,要做3件事情:
*引用哪种语言。
*引用哪组多语言文件
*引用这种语言文件的这组文件里的哪条信息
代码:
输出结果:
bundle=labela in zh_CN
enBundle=labela in en_US
franceLocal=labela in zh_CN
2:向国际化信息中传入参数
labela = your order({0}) is confirmed, can not be modified
java类:
输出结果:
you order(20100000000) is confimed, can not be modified
如果有两个参数,就要需要使用数组了,
字符串为:labela={0}, your order({1}) is confirmed, cannot be modified
java类:
输出结果:
your label=Petter you order(20100000000) is confimed, can not be modified
3:Struts2中的国际化入门
*首先包含国际化资源文件message.properties, message_zh_CN.properties, message_en_US.properties
*然后在struts.xml中设置一个常量:
<constant name="struts.custom.i18n.resource" value="message" />
*在jsp中访问国际化信息
<s:text name="labela" />
4:资源文件读取顺序
*全局资源文件
<constant name="struts.custom.i18n.resource" value="message" />
这里设置的message是一组国际化资源文件名的前缀,如果有多组国际化资源文件,则可以用逗号分隔,如"message, dictionary",就表示还另有以dictionary为前缀名的国际化资源文件,这些文件都放在classpath的根目录上。
*包级资源文件
包级资源文件,在当前访问的Action的同包下,声明一组package.properties, 可能包括package.properties, package_zh_CN.properties, package_en_US.properties等。
如果包级资源文件和全局级资源文件同时存在,则包级资源文件覆盖全局级资源文件中的同样的key的值。
*类级资源文件
在类的包下建立以该Action类名为前缀的国际化资源文件,可能包括Action类名.properties, Action类名_en_US.properties, Action类名_zh_CN.properties等。
比如访问的Action是com.capinfotech.I18NAction, 那么要设置的包级文件是 I18NAction_zh_CN.properties等。
优先级的顺序为:类级资源文件> 包级资源文件 > 全局级资源文件
5:Struts2访问国际化信息的不同方式
*使用<s:text>访问国际化信息
Struts2官方文档对该标签的说明如下:
The message must be in a resource bundlewith the same name as the action that it is associated with. In practicethis means that you should create a properties file in the same packageas your Java class with the same name as your class, but with .propertiesextension.
If the named message is not found in a property file, then the body of thetag will be used as default message. If no body is used, then the stack willbe searched, and if a value is returned, it will written to the output.If no value is found on the stack, the key of the message will be written out.
即最好在该Action的包下面建一个以该类名为前缀的properties文件
比如有:labela = labela in zh_CN
labelb = labelb, {0}
在jsp文件中:
<s:text name="labelb">
<s:param>k</s:param>
</s:text>
输出结果为:
labela in zh_CN
labelb ok
*在Action中访问国际化信息
输出结果如下:
labela in zh_CN in class properties
labelb ok
labela in zh_CN for global
6:指定语言信息的不同方式
*使用struts的常量设置
<constant name="struts.locale" value="zh_CN" />
*用户选择语言:
Struts2提供了最灵活,也是级别最高的方式,那就是由用户选择语言,用户只要在提交请求时加上request_locale这个参数,并提供对应的值就可以自由选择语言了。
这得利于Struts2的i18n内建拦截器,defaultStack拦截器栈引用了i18n拦截器,因此,能很方便的由用户来选择语言。i18n拦截器在Action运行之前会检查请求中是否包含了了一个叫做"request_locale"的参数,如果存在该参数,则会用它的值建立一个Locale对象,并用这个Locale对象去覆盖Struts2的常量设置和浏览器的语言设置,除此之外,Strut2还会把这个Locale对象保存到名为WW_TRANS_I18N_LOCALE的Session属性中去,而这个属性也会覆盖 Struts2的常量设置和浏览器的语言设置,因此,只需要传入一次request_locale参数,session就会记住用户的选择,整个网站就会都变成用户选择的语言。
如果在页面中使用: <s:property value="#session.WW_TRANS_I18N_LOCALE" default="找不到"/>来获得session中的WW_TRANS_I18N_LOCALE属性值