Java内置的国际化功能以三个类为中心。
类 说明
Java.util.Locale 封装一种特定的语言环境
Java.util.ResourceBundle 封装特定于语言环境的资源束
Java.text.MessageFormat 提供格式化资源束信息的方法
以下介绍每个类:
1. java.util.Locale类:
Locale类封装一种特定的语言环境。所有其他面向语言环境的类使用Locale类的实例来定制它们针对某种特定语言环境的输出和表达方式。
创建Locale类的对象时,可以指定环境的语言、国家和变体。
构造函有数如下三种:
Locale(String language)
Locale(String language,String country)
Locale(String language,String country,String variant)
language参数必须使用有效的双字母ISO-639语言代码指定,eg:”en”表英语,”es”表西班牙语。
country参数必须使用有效的大写双字母ISO-3166国家代码指定,eg:”US”表示美国。
variant参数用来指定特定于供应商或浏览器的代码eg:”WIN”表示Windows,”MAC”表示Macintosh。
有关语言代码和国家代码参见网站说明:
http://www.unicode.org/unicode/onlinedat/language.html
http://www.unicode.org/unicode/onlinedat/country.html
注意:
1. Locale对象是不可变的,一旦创建,他的属性不能被改变。如果需要改变属性,则须重新创建一个新的Locale实例。
2. 为了方便起见,Locale提供了一些的代表国家和语言的静态属性变量。请参见相关API。
2. java.util.ResourceBundle类:
封装了特定语言环境的资源束。从本质上来说,ResourceBundle是一个中心信息库,应用程序用它来存取资源。
对于所有语言环境来说,资源名称是一样的,应用程序在获取资源信息时,将发送一个指定的环境参数。
资源束大都包含应用程序中特定语言环境的文本,如:错误信息、字段、按扭信息等。事实上资源束可以定义特定语言环境的任何资源。ResourceBundle类提供了处理资源束的核心接口,但他是一个抽象类,不能直接使用它。
Java提供了ResourceBundle的两个子类java.util.ListResourceBundle和java.util.PropertyResourceBundle。
java.util.ListResourceBundle是一个抽象类,提供了一种使用列表来存取资源的机制。必须提供一个具体子类实现才能使用它。
java.util.PropertyResourceBundle类是一个具体的子类,提供了一种使用属性文件来存储资源的机制,该类是用来处理资源束的一个最常用的类,并且是ResourceBundle的静态方法getBundle()方法使用的默认机制。
java.util.PropertyResourceBundle是java.util.ResourceBundle类的默认实现。了解他非常重要。PropertyResourceBundle类提供了一个用来访问存储在属性文件中的资源的接口。在内部,它使用java.util.Properties类。
PropertyResourceBundle类要求使用特定的方法命名资源属性文件,格式如下:
<bundlename>_<language>_<country>_<variant>.properties
例如:
如果有一个束在美国的windows平台中用英文命名为SampleResources,则属性名称就是:SampleResources_en_US_WIN.properties。当然,不是所有的名称都需要包含语言环境的每个部分。因此简单的英文属性名称可以为:SampleResources_en.properties。资源束也支持默认资源束概念,在这个例子中,其默认资源束名称为:SampleResources.properties。
不存在特定语言环境资源是束时或特定语言环境资源束中不存在相关资源的条目时,使用默认的资源束。
3. java.text.MessageFormat类
MessageFormat类提供创建格式化的特定于语言环境的信息的方法。
资源束可以从属性文件中检索特定语言环境的静态信息。但在很多情况下,我们需要建立动态信息。MessageFormat提供了创建特定语言环境的动态信息的方法。
假设属性文件中有如下代码:
SampleResources.properties:
error.number.required= number is required
error.name.required= name is required
两行信息很相似。这样就会造成内容的重复。
使用MessageFormat可以接内容重复的情况。创建一个动态信息:
error.required = {0} is required
次属性用{0}表示一个占位符。MessageFormat类包含一个动态信息和一个替换数据列表,并用替换数据代替动态信息的占位符
当用户第一次访问Struts应用程序时,Struts将捕获用户的语言环境创建Locale实例并将其保存在用户会话中,使得Struts框架能很方便地访问用户的环境信息。在用户会话中放置Locale对象(而不是每次从请求中获取它)的的好处在于应用程序可以独立与浏览器的设置来更新用户的语言环境,由于Struts是根据会话中的Locale对象而不是浏览器中的环境参数来确定语言环境,Struts将根据新的语言环境来运行。
不过应用程序有时需要总是使用请求中指定的语言环境设置。如用户更改浏览器设置,Struts将获得这些更改。为此,需要在应用程序的struts-config.xml配置文件中将controller元素的localse属性设置为false,从而将struts配置为不将语言环境对象存储在会话中,代码如下:
<controller localse=”false”/>
信息资源:
Struts将信息资源用做JSP动态插入文本以及存储数据验证返回错误信息的一种方法。你只需要将所有的应用程序文本存储在资源属性文件中。当需要国际化支持时,需要创建特定语言环境的资源属性文件。Struts根据用户环境决定用哪个属性文件。属性文件扩展名必须为.properties。属性文件需要放置在应用程序的类路径中,如在/WEB-INF/classes/目录下的某个地方或在/WEB-INF/lib目录下的.jar文件中,Struts使用Java类加载程序家在属性文件。需要在strusts-config.xml中配置message-resources元素来指定属性文件的存放位置,示例如下:
struts-config.xml:
<message-resources
paramater=”cn.rolia.SampleResources” />
Struts通过message-resources元素的paramater属性获取属性文件的位置。该属性文件存放在类路径中名为cn/rolia的目录中,文件名为SampleResources。Struts将自动为其附加.properties后缀。如果错误的指定了.properties扩展名。则Struts无法定位文件。
通过多个message-resources元素,可以在Struts配置文件中定义多个资源束,除了默认束外,其他资源束都要用key属性指定束名。举例如下:
struts-config.xml:
<message-resources
paramater=”cn.rolia.SampleResources” />
<message-resources
key=”logon”
paramater=”cn.rolia.LogonResources” />
<message-resources
key=”logout”
paramater=”cn.rolia.LogoutResources” />
当应用程序第一次访问资源时,Struts将属性文件加载到内存并对其进行缓存,以便可以快速访问它。因此,如果在应用程序运行时修改资源束,则必须重新启动应用程序才能使更改生效。
资源属性文件中的中文汉字最好进行解码否则会出现乱码。java bin目录里的native2ascii.exe能实现此功能。
在应用程序中有两种方式使用资源信息:
1. 用bean标记库的message标记将文本动态的插入到JSP中,举例如下:
<head><title><bean:message key=”title”/></title</head>
struts标记库的一些标记通过在信息资源束中允许将某些属性值指定为属性的关键字来支持国际化。下表列出了这些标记:
库 标记 属性
Bean Message Key
Bean Write formatKey
HTML Button altKey
HTML Button titleKey
HTML Cancel altKey
HTML Cancel titleKey
HTML Checkbox altKey
HTML Checkbox titleKey
HTML File altKey
HTML File titleKey
HTML Frame titleKey
HTML Hidden altKey
HTML Hidden titleKey
HTML Image altKey
HTML Image pageKey
HTML Image srcKey
HTML Image titleKey
HTML img altKey
HTML img pageKey
HTML img srcKey
HTML Img titleKey
HTML Link titleKey
HTML Multibox altKey
HTML Multibox titleKey
HTML Option key
HTML Password altKey
HTML Password titleKey
HTML Radio altKey
HTML Radio titleKey
HTML Reset altKey
HTML Reset titleKey
HTML Select altKey
HTML select titleKey
HTML submit altKey
HTML submit titleKey
HTML Text altKey
HTML Text titleKey
HTML Area altKey
HTML area titleKey
2. 在form bean 的validate()方法进行数据验证出错时利用资源信息key创建ActionError并保存到ActionErrors里,然后庖厨ActionErrors。举例如下:
ValiForm.java:
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
// TODO Auto-generated method stub
if(number.length()>4){
ActionErrors errors = new ActionErrors();
errors.add("number",new ActionError("error.vali.number"));
return errors;
}
else return null;
}
struts-config.xml里action元素的validate属性必须为”true”:
struts-config.xml:
<action
attribute="valiForm"
input="/form/vali.jsp"
validate="true"
name="valiForm"
path="/vali"
type="cn.rolia.struts.action.ValiAction">
<forward name="result" path="/form/result.jsp" />
<forward name="success" path="/form/success.jsp" />
</action>
<message-resources
key="vali"
parameter="cn.rolia.struts.ValiResources" />
资源束内容:
ValiResources.properties:
error.vali.number=error in number:legth should shorter than 4
评论