Java语言国际化API中,影响数据本地化的因素主要有两个:一个是用户的语言环境,另一个是用户的时区。
国际化:是设计和制造适应不同区域要求的产品的一种方式。它要求产品中抽离所有的与语言、国家/地区和文化相关的因素
本地化:解决网站,软件向其他国家推广时遇到的语言障碍问题。
Local类有Local(String language)和Local(String language,String country)两个常用的构造方法。其中language表示语言,它的取值范围在ISO-639定义的是小写的、两个字符组成的语言代码。
Local locale= new Locale("zh","CN");
在Locale中海定义了一个静态的方法getDefault(),用于获取本地系统默认的Locale对象。要查看Java支持的所有语言环境,可以调用Locale类中的静态方法getValiableLoacales()函数,该函数返回一个Local对象数组。
2.资源包
获取资源包有以下几种不同的获取方法。我们需要调用ResourceBundle类中的静态方法getBundle().
1)根据基名可以得到资源包,使用系统缺省的Locale对象,语法如下所示。
public static final ResourceBundle getBundle(String baseName)
2)根据基名和Locale对象获取资源包,语法如下
public static final ResourceBundle getBundle(String baseName,Locale locale)
3)从资源包中根据关键字取值
利用ResourceBundle类的getObject()方法,还可以从资源包中得到任何需要的对象,语法如下所示。
public final Object getObject(String key)
利用getBundle()方法可以得到对应于某个Locale对象的资源包,然后利用ResourceBundle类的getString()方法得到相应语言版本的字符串
public final String getString(String key)
如果在使用资源类的时候需要扩展资源类,那么必须要扩展ResourceBundle类,这个时候需要实现下面两个方法
:返回资源包的关键字枚举
public abstract Enumeration getKeys()
:从资源包中根据关键字得到对象
protected abstract Object handleGetObject(String key)
为了方便开发人员编写和使用,在java.util包中还提供了ListResourceBundle和PropertyResourceBundle两个资源类,他们都是从ResourceBundle类中派生出来的。
如果传布的资源都是字符串类型,可以使用PropertyResourceBundle类。该类对于不同的国家分别提供不同的文件,他们的属性文件名称都有一定的规律,都是资源类的命名方式,他们的扩展名都是.properties,文件的内容都是以键值对的形式存储的。
在加载资源的时候可以使用ResourceBundle类的getBundle()静态方法。该方法的执行顺序是,先加载资源类,如果没有成功则加载属性资源文件;如果成功则创建PropertyResourceBundle对象。
getBundle()会按照下列顺序查找资源包
ChinaResource_zh_CN.class
ChinaResource_zh_CN.properties
ChinaResource_zh.class
ChinaResource_zh.properties
ChinaResource.class
ChinaResource.properties
3.将用户注册国际化
1)使用struts.xml文件
<constant name="struts.custom.il8n.resource" value="globalMessages"></constant>
2)使用struts.properties文件
struts.custom.il8n.resources=globalMssages
3)使用web.xml文件
<init-param>
<param-name>struts.custom.il8n.resources</param-name>
<param-value>globalMessages</param-value>
</init-param>
注意:struts.custom.il8n.resources:在struts2框架中,表示国际化的常量,是一个固定不变的值
globalMessages:表示全局国际化资源文件的basename值,对应的全局国际化资源文件可以使globalMessages_zh_CN.properties、globalMessages_en_US.properties等,这些文件名符合globalMessages_language_country的格式。
5.在文本中使用参数
1)占位符的方式
占位符的方式就是Java中设置消息文本参数的方式。相当于使用从{0}到{9}的占位符。当使用MessageFormat类的format()方法格式化消息字符串时,参数信息内容传递进来,替换掉消息文本的占位符。
2)OGNL表达式
使用OGNL表达式方式,不同于在标签中使用OGNL表达式,在消息文本中使用OGNL表达式的语法是:${ms}.
例如,设置用户登录时提示用户登录后的欢迎信息,资源文件的代码如下所示:
ms=${username},您好!欢迎登录窗体个人空间
在登录成功首页面内设置text标签,来输出资源文件中的消息内容,代码如下:
<s:text name="ms">
这样的话,不用通过${""}方式计算栈中的东西了。
6.访问国际化消息
在struts2框架中,访问国际化消息主要有两种。
在JSP文件中:<s:text name="key"/>或者为表单元素指定一个Key属性
在Action类中:使用ActionSupport类的getText()方法。