Java 的 i18n 问题 Java 的 i18n 问题, Java 的 Internationalization 问题, 指的是如何使 即 应用程序能够同时支持多种语言的问题。 对我国这样的非英语国家而汉字又有多 种编码方式的情况下具有现实意义。本文将对用 java 编制 i18n 程序的方法作 一介绍。 一、实现目标 作为 i18n 程序, 不单是能够识别不同编码这么简单。 它应能解决如下
问题: *能识别不同的编码方式,如 GB 码、BIG5 码等; *与编码有关的元素,如状态行、消息、按钮的 caption 等应在程序之外 存储。使新增一种语言时不用修改程序; *根据不同的语言习惯动态调整与语言相关的元素,如数字、金额、日期等 的显示。
二、解决方法 1.不同地区码的识别 Java 中用 Locale 类识别不同的地区码。 创建 Locale 类的实例时指定了语 言代码和地区代码。 创建 GB 中文和 BIG5 中文资源的 Locale 类实例的语句分 别如下: zhLocale=new Locale("zh","CN"); twLocale=new Locale("tw","TW")。 此构造函数第一个参数是中定义的语言代码;第二个参数中定义的国家代 码 。 当 用 户 选 定 了 适 用 的 语 言 后 , 应 将 此 Locale 设 为 默 认 值 :
Locale.setDefault(new Locale("zh","CN")).
2. 与语言相关的资源单独存放 Java 提供了两种方法存放与语言相关的资源。一种是用文本文件;另一种 是用 ListResourceBundle 资源类。下面分别阐述两者的不同之处。 *文本文件 使用文本文件存放资源的好处是简单易用。 可以用任何文本编辑器编写此文 件,而且当修改资源时无须重新编译
程序。其格式是' 键= 值' 的
列表。例子如 下: #WebTaxResource_zh_CN.properties button1= 税金 button2= 税率 status1= 初始化中 其中以' #' 开头的行为注释行。对应每一种语言写一个这样的资源文件, 但所有的资源文件都必须包含相同的键。 *ListResourceBundle 资源类 虽然用文本文件存储资源非常容易,但它只能存储字符对象。而对于数字、 自定义对象等它就无能为力了。因此 Java 提供了 ListResourceBundle 类。其 缺点是每次对资源的修改都必须重新编译程序。此类的结构如下: //file WebTaxResource_zh_CN.java import java.util. *;
public class WebTaxResource_zh_CN extends ListResourceBundle { static final Object[][] contents = { {"frametitle"," 工资、薪金所得适用"}, {"label_qizhengdian"," 起征点:"}, {"label_shuikuan"," 税款:"}, {"label_shourue"," 收入额:"}, {"checkbox_qiushouru"," 求收入"}, {"checkbox_qiushuie"," 求税额"}, {"lable1"," 简易税金计算器"}, {"button1"," 工资、薪金个人所得税计算"}, {"button_caculate"," 计算"}, };
public Object[][] getContents() { return contents; } }
其中两维的 Object 数组存放的是键-值对。每对中的第一个元素是键。在 各
个资源类中所有键的数量和标识都必须完全一致。
3. 资源的获取 不同语言的资源存放的文件名都不相同, 那如何从正确的文件取得我们需要 的资源呢?留意到前面例子中 properties 文件名和 ListResourceBundle 类名 中下划线后的部分吗?没错,它们就是在创建 Locale 实例时指定的语言代码和 地区代码!剩下的问题就是要解决下划线前面的基本类名部分了。它是由一个 ResourceBundle 类的实例来指定的: ResourceBundle bundle;
bundle=ResourceBundle.getBundle("WebTaxResource",currentLocale); getBundle 的第一个参数指定了资源文件和资源类的基本类名;第二个参 数是你所创建的 Locale 的实例,指定了当前程序所有资源默认的语言代码和地 区代码。 可见,资源文件名或类名是由" 基本类名_ 语言代码_ 地区代码" 组成的。
Java 将先查找有无此名称的类,若没有则查找具有此名称的 properties 文件。 匹配了正确的资源文件名或类名后,要获取某键对应的值就变得相当