分享
 
 
 

java的本地化问题

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

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")。此构造函数第一个参数是ISO -639 中定义的语言代码(http://www.ics.UCi.edu/pub/ietf/http/related/iso639.txt);第二个参数为ISO -3166 中定义的国家代码(http://www.chemie. fu -berlin.de/diverse/doc/ISO ?3166.Html)。当用户选定了适用的语言后,应将此Locale 设为默认值:Locale.setDefault(new Locale("zh","CN")).

2. 与语言相关的资源单独存放

Java 提供了两种方法存放与语言相关的资源。一种是用文本文件;另一种是用ListResourceBundle 资源类。下面分别阐述两者的不同之处。

*文本文件

使用文本文件存放资源的好处是简单易用。可以用任何文本编辑器编写此文件,而且当修改资源时无须重新编译程序。其格式是´ 键= 值´ 的列表。例子如下:

#The list in 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=ResourceBundle.getBundle("WebTax ?

Resource",currentLocale);

getBundle 的第一个参数指定了资源文件和资源类的基本类名;第二个参数是你所创建的Locale 的实例,指定了当前程序所有资源默认的语言代码和地区代码。

可见,资源文件名或类名是由" 基本类名_ 语言代码_ 地区代码" 组成的。Java 将先查找有无此名称的类,若没有则查找具有此名称的properties 文件。

匹配了正确的资源文件名或类名后,要获取某键对应的值就变得相当轻易。例如,要创建标识为" 计算器" 的标签,只要调用以下语句:

label1=new Label(bundle.getString("label_ jisuanqi"), Label.CENTER);

getString 方法的参数是资源文件中的键名。除了getString 外,ResourceBundle 类还提供了其他方法获取不同的对象,如getStringArray、getObject 等(因为在ListResourceBundle 的实例中答应存在非字符对象)。

4. 转换非Unicode 资源

在Java 内部字符是用Unicode 字符表示的。Unicode 是一种16bit 的编码,支持大多数地区的语言。具体标准可到http://www.unicode.org/index.html 查询。因此,无论是用文本文件还是用资源类的方式存储资源,都应该将非Unicode 字符转换为Unicode 字符。Java 为我们提供了转换的工具-Native2ascii。将含有GB 编码的汉字的WebTaxResource_zh.CN.properties 文件转换为只含Unicode 字符的例子如下:

native2ascii -encoding GB2321 WebTaxRe

source_zh_CN.properties

.outputWebTaxResource_zh_CN.properties

到此为止,一个支持i18n 的程序就已初步完成了。

三、其他相关问题

正如实现目标中所讲到,支持i18n 的程序不但要识别不同的编码方式,还要根据不同的语言习惯动态调整与语言相关的元素,如数字、金额、日期等的显示。例如在法文中数值123456.78 表示为123 456,78;而在德文中应表示为123.456,78。除了数值和货币之外,不同语言有不同表示的元素还有日期、时间和文本消息。Java 提供了NumberFormat、DateFormat、MessageFormat 类根据不同的Locale 实例动态改变这些元素的显示模式。下面的例子将根据不同的Locale 实例改变数值123456.78 的显示方式。

Double amount = new Double (123456.78);

NumberFormat numberFormatter;

String amountOut;

numberFormatter = NumberFormatgetNumber ?

Instance(currentLocale);

amountOut = numberFormatter.format

(amount);

System.out.println(amountOut +" " +

currentLocale.toString());

当然,实现Java 程序的i18n 还有很多问题要考虑,如不同语言的语法问题等。但在Java 中,碰到问题多看看联机文档或其他相关的资料,一般都能得到满足的答案。 (中国计算机报 苏志成)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有