软件的国际化涉及以下几个方面:
1. 界面静态的文字显示。
2. 提示信息,主要包括错误提示和操作提示、在线帮助等。
3. 日期时间、数字、度量以及货币等与使用习惯相关的一些提示。
4. 邮政编码格式、尊称和称谓习惯、电话号码格式以及地址格式等需要改变页面布局的一些内容。
5. 声音图片等涉及文化习惯的一些资源。
Struts2的国际化是建立在Java国际化的基础之上的,也是使用资源包的方式,通过getBundle()方法来寻找指定Local相关联的资源包,再从资源包文件中查找指定Key所对应的国际化资源信息。 Struts2框架的底层国际化与Java国际化是一致的,作为一个良好的MVC框架,Struts2将Java的国际化功能进行了封装和简化。
一、 配置资源文件
Struts2强调的是各个组件之间的松散耦合,各个组件之间都是通过配置文件来实现相关联和交互的。Struts2框架的国际化也是如此。
Struts2框架加载资源文件一般都是通过常量设置来完成的。配置资源文件常量,即配置Struts2框架的struts.custom.i18n.resources常量,该常量定义了Struts2框架全局国际化资源文件的basename。
配置struts.custom.i18n.resources常量,可以在属性文件struts.properties中定义,也可以在配置文件struts.xml或者web.xml中定义。
假设要定义配置一个basename为globalMessages的struts.custom.i18n.resources常量,可以在struts.properties文件中做如下配置:
#在属性文件中定义basename
struts.custom.i18n.resources=globalMessages
也可以在struts.xml文件中配置basename:
<constant name=" struts.custom.i18n.resources " value=" globalMessages "/>
同样,也可以在web.xml文件中定义:
<init-param>
<param-name> struts.custom.i18n.resources </param-name>
<param-value> globalMessages </param-value>
</init-param>
二、 Struts2的国际化应用
只要开发者指定了struts.custom.i18n.resources常量,即指定了国际化资源文件的basename,那么就可以开发国际化应用了。
1. 建立中文和英文的资源文件,globalMessages_en_US.properties和globalMessages_zh_CN.properties ,内容如下:
globalMessages_en_US.properties文件:
bbs_id=Article_Id
bbs_title=Title
bbs_author=Author
bbs_text=Context
bbs_date=date
bbs_first=First Page
bbs_next=Next Page
bbs_pre=Pre Page
bbs_last=Last Page
globalMessages_zh_CN.properties 文件:
bbs_id=/u6587/u7AE0/u5E8F/u53F7 (文章编号)
bbs_title=/u6587/u7AE0/u4E3B/u9898 (文章标题)
bbs_author=/u6587/u7AE0/u4F5C/u8005 (作者)
bbs_text=/u6587/u7AE0/u5185/u5BB9 (内容)
bbs_date=/u53D1/u8868/u65E5/u671F (日期)
bbs_first=/u9996/u9875 (首页)
bbs_next=/u4E0B/u9875 (下页)
bbs_pre=/u4E0A/u9875 (上页)
bbs_last=/u672B/u9875 (末页)
注意:由于中文为非西欧字符集,而Java使用的是Unicode作为字符编码,所
以中文要转换为Unicode编码。MyEclipse中提供了自动转换。
2. 访问资源文件
1. 用户视图访问国际化资源
<s:text/>是显示静态文本,该标签中可以使用key属性来输出国际化信息。Form元素的标签也可以使用key来获得国际化信息。例如:
<s:text name="bbs_title"/>
<s:textfield name="bbs_author" key="bbs_author"/>
2.Action访问国际化资源
Struts2提供了一个ActionSupport工具类,开发自己的Action,只要继承该类就可以了。在该类的API文档中,该类提供了一个getText(String tTextName)方法,该方法根据资源文件中的key值来返回一个国际化资源信息。
例如:Action中System.out.println(getText("bbs_author")+":"+bbs_author);
三、 使用占位符
globalMessages_en_US.properties文件:
welcomemsg=Hello {0},Now is {1}
globalMessages_zh_CN.properties 文件:
welcomemsg=你好 {0},现在时间是:{1}
1、 在JSP视图中输出支持占位符的国际化资源信息需要使用标签库,可以再<s:text/>标签中定义多个<s:param …/>子元素,来分别对应<s:text…/>标签中引用的国际化资源中的占位符。
如:<% Date now=new Date();%>
<s:text name="welcomemsg">
<s:param><s:property value="userName"/></s:param>
<s:param><%=now%></s:param>
</s:text>
2、 在Action中使用国际化资源占位符,仍然使用getText()方法,ActionSupport类中声明了多个getText()方法:
String getText(String aTextName):以国际化资源文件中的key为参数查找国际化信息。
String getText(String aTextName,List args):增加了一个List参数,作为填充占位符的参数,定义与MessageFormat一致。
String getText(String key,String[] args):增加了一个字符串数组参数,作为填充占位符的参数,定义与MessageFormat一致。
……等等方法
应用示例:
Date now=new Date();
System.out.println(getText("welcomemsg"),new String []
{username,now.toString()});
四、 包范围和Action范围的资源文件
前面使用的资源文件,是根据Struts2框架常量struts.custom.i18n.resources指定的basename来建立的,该资源文件是全局资源文件。 Struts2框架还允许建立包范围的资源文件、Action范围内的资源文件等。
1、 使用包资源文件的方法是:在包的根路径下建立多个文件名为package_language_country.properties的资源文件。 建好该包范围的资源文件后,该包中的所有的Action都可以访问了。
注意:上面package_language_country.properties中的package不是指配置文件中定义的包名,而是固定的名称:package。
2、 Action范围资源文件就是为单独的Action指定国际化资源。方法为:
在Action类所在的目录下,建立一个命名规范为ActionName_language_country.properties的资源文件。建立后,该Action就可以通过Action范围资源文件的访问来实现程序的国际互功能。
五、 动态访问国际化资源文件
配置文件struts-default.xml定义了一个国际化资源拦截器,部分代码如下:
<interceptor name="i18n"
class="com.opensymphony.xwork2.interceptor.I18nInterceptor" />
在该拦截器执行Action之前,会在用户请求中查找名为request_local的参数,如果该参数存在,拦截器将读取该值,转换为local对象,并将其设置为Action所使用的local。下面代码可以通过改变request_local请求参数来动态访问国际化资源文件。
<s:url id="url" action="DynamicAction">
<s:param name="request_local">en_US</param>
</s:url>
<s:a href="%{url}">English</s:a>
<s:url id="url" action="DynamicAction">
<s:param name="request_local">zh_CN</param>
</s:url>
<s:a href="%{url}">Chinese</s:a>