当对一个应用程序进行国际化处理时,所要用的各种语言版本的“标签”信息应该存放在不同的属性文件中,每一个这样的文件对应一种语言的版本。所有属性文件合在一起被称为资源包(Resource Bundle)。
属性文件的命名格式可分为以下两种:
l 文件名前缀.properties
l 文件名前缀_语言种类.properties
l 文件名前缀_语言种类_国家.roperties
文件名后缀必须为properties,前缀则由开发者自行确定,其中的语言种类字段必须是有效的ISO(International Standardization Organization,国际标准化组织)语言代码,ISO-639标准定义的这些代码格式为英文小写、双字符,具体见表5-1所示。
表5-1 ISO-639标准常用语言代码
语 言 | 编 码 |
汉语(Chinese) | Zh |
英语(English) | En |
法语(French) | Fr |
德语(German) | De |
日语(Japanese) | Ja |
意大利语(Italian) | It |
访问网址http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt可以获取其他ISO-639标准语言代码。
关于l 文件名前缀_语言种类_国家.roperties这种命名方式,大部分情况下可以不具体到国家。如果具体到国家,例子如下:
ApplicationResources_en_US.properties
ApplicationResources_zh_CN.properties
资源文件需要存储在类的路径下,而且它的路径要作为初始化参数传送给ActionServlet时,路径的格式要符合完整Java类的标准命名规范。比如,如果资源文件存储在WEB-INF/classes目录中,文件名是 ApplicationResources.properties,那么需要传递的参数值是ApplicationResources。如果文件在WEB-INF/classes/com/test中,那么参数值就应该是com.test.ApplicationResources。
资源包需要在Struts配置文件struts-config.xml中进行配置。<message-resources>元素就是用来配置资源包的。
<message-resources parameter="ApplicationResources"/>
如果有多个资源包要配置,那么它们用key属性来进行区分。
<message-resources parameter="ApplicationResources"/>
<message-resources key="Image" parameter="ApplicationImageResources"/>
<message-resources key="XXX" parameter="ApplicationXXXResources"/>
其中,不带key属性的就是默认的资源包。
资源包建立好后,就可以对其进行访问了。访问的方式主要有两种:一种在JSP页面中通过<bean:message>标记来访问,另一种是在程序中访问。
在JSP页面中访问资源包,需要使用<bean:message>标记。在使用该标记之前,必须首先部署包含此标记的Struts标记库文件struts-bean.tld,具体操作步骤如下:
(1)将Struts发布包中提供的标记库文件struts-bean.tld复制到待进行国际化的应用程序所在项目的WEB-INF目录下。
(2)在使用该标记库的应用程序的部署文件web.xml的<web-app>元素中添加相应的<taglib>元素,具体语法格式如下:
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
(3)在使用<bean:message>标记的JSP源文件的开头引入此标记库,具体格式如下:
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
在程序中访问资源包主要是在Action类中用到。Action提供了getResources()方法可以获得org.apache.struts.MessageResources类的一个实例。MessageResources代表资源包的一个类,它是一个抽象类,因此需要由Action的基类中的getResources()方法来返回它的一个实例。以下是一段程序示例:
//获得用户的Locale信息
Locale locale = getLocale(request);
//获取资源包
MessageResources message = getResources(request);
//从资源包中得到消息文本
String title = message.getMessage(locale,"title.login");
可以看到在调用了getResources()方法后,便可以获得相应的资源包,接下来,就可以按照request对象中的Locale信息来获取相应资源包中的文本。值得注意的是getMessage()有几种形式,如下所示:
getMessage(String key)
getMessage(Locale locale, String key)
getMessage(Locale locale, String key, Object[] args)
其中,最后一种getMessage()方法可以传入参数给资源包中的文件,更加灵活地实现消息的输出。