分享
 
 
 

JAVA的国际化机制(一 介绍)

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

本文是翻译SUN的官方网站的教程Internationalization Tutorial

一 介绍 国际化(Internationalization)是设计一个适用于多种语言和地区的应用程序的过程。适用于多种语言和地区的含义是当使用不同语言及处于不同的地区的用户在使用这个应用程序时,应用程序必须使用他们能看懂的语言和符合他们文化习惯来显示信息。国际化有时候被简称为i18n,因为有18个字母在国际化的英文单词的字母i和n之间。

一个国际化的程序通常具有以下特征:

有一个附加的本地化数据(localized data)及拥有在全世界各个地区执行的能力。 文本的元素,比如状态信息或GUI截面的lables,不是直接写(hardcoded)在程序中,而是被存储在本地化的数据中,并且能被程序正确的动态的使用。 支持新的语言时,不需要修改程序,不需要重新编译。 文化差异的数据,比如日期和货币,必须根据拥护的语言和习惯显示不同的格式。 可以被迅速的本地化。 本地化(Localization)是指通过增加本地描述的构件(locale-specific components )和文字翻译工作来使应用程序适应于不同的语言和地区的过程。本地化有时候被简称为l10n,应为有10个字母在本地化的英文单词的字母l和n之间。通常本地化最耗时的工作应该是文字翻译。本地化工作者们要根据地区的具体需求来为日期、数字和通货等数据建立新的格式。其他类型的数据,象声音,图象等,也需要根据具体需要来决定是否本地化。

下面通过一个简单的例子来说明如何给一个程序提供国际化的特性。这个例子在不同的语言环境下显示不同的文本信息。

一个简单的例子 先看下面的一段代码:

public class NotI18N {

static public void main(String[] args) {

System.out.println("Hello.");

System.out.println("How are you?");

System.out.println("Goodbye.");

}

}

如果你决定在上面的程序中给德国和法国的不同用户显示同样的信息。但是你的程序员却不是个语言专家,他不懂德语和法语。所以你需要翻译人员把它翻译成德语和法语,但是你的翻译人员不懂程序,所以你可以把这些信息存到一个文本或其他格式的文件中供翻译人员使用。那么,程序必须能显示不同语言的信息,并且你并不知道你希望为这个程序提供的下一个语言支持是什么,或许是日语或许是别的什么语言。

下面的代码是一个国际化的代码的例子:

import java.util.*;

public class I18NSample {

static public void main(String[] args) {

String language;

String country;

if (args.length != 2) {

language = new String("en");

country = new String("US");

} else {

language = new String(args[0]);

country = new String(args[1]);

}

Locale currentLocale;

ResourceBundle messages;

currentLocale = new Locale(language, country);

messages = ResourceBundle.getBundle("MessagesBundle",

currentLocale);

System.out.println(messages.getString("greetings"));

System.out.println(messages.getString("inquiry"));

System.out.println(messages.getString("farewell"));

}

}

请注意:在上面的代码中,信息并没有被hardcoded在代码中!

如果想运行上面的代码,请下载下面的文件:

1、I18NSample.java

2、MessageBundle.properties 3、MessageBundle_de_DE.properties 4、MessageBundle_en_US.properties

5、MessageBundle_fr_FR.properties

下面看看这个程序的运行结果:

显示法语信息:

java I18NSample fr FR

Bonjour.

Comment allez-vous?

Au revoir.

显示英语信息:

java I18NSample en US

Hello.

How are you?

Goodbye.

从上面的代码我们可以看出,在实现了国际化的代码中,并没有将需要显示的信息直接hardcode在代码中,而是存在一个文件中供程序使用。程序根据不同的语言和国家(Local)来取得文件中不同信息显示。我们试着按一下的步骤一步一步分析这段代码如何实现了国际化:

1、建立properties文件----本地化数据 properties文件用来存储程序和环境相关的信息。必须以.properties的后缀结尾,properties文件是纯文本格式的。在上面的例子中,一共有4个properties文件。分别定义了不同语言和国家的打招呼、再见和问候时使用的语言。properties文件使用名值对(key-value)的形式,如下所示:

greetings = Bonjour.

farewell = Au revoir.

inquiry = Comment allez-vous?

properties文件的名字很重要,它的形式是basename_LL_CC.properties.LL表示语言代码,CC表示国家代码。语言代码和国家代码是Local类初始化的参数,basename是创建ResourceBundle对象的参数。

2、创建Local对象----不同语言和国家的标识 java.util.Local是JDK提供的标准API。这个类用来标识国家和语言。

我们可以创建一个local对象:

aLocale = new Locale("en","US");

这个对象标志了一个地方,这个地方是美国,并且这里的语言是英语。

这下面2个对象又表示什么呢?

caLocale = new Locale("fr","CA");

frLocale = new Locale("fr","FR");

caLocale对象标志的是加拿大并且那里使用了法语,而frLocal标志的是法国而那里的语言是法语。

注意:Local对象只是一个标识类,创建了这个类的对象并不表示你的程序已经实现了国际化。这个类是给那些需要实现国际化的类使用的,它用来标识我们即将实现国际化的Local信息。

3、创建ResourceBundle对象----本例中实现国际化的主要角色

java.util.ResourceBundle是JDK提供的标准API。它实际上是个抽象类,同时它提供了创建它的子类的静态工厂方法。在例子程序中我们实际上使用的是ResourceBundle的子类PropertyResourceBundle的对象。通过它,我们可以根据Local对象来读取不同的properties文件,从而取得不同的信息。

如果local = new Locale("en","US");则读取了MessagesBundle_en_US.properties文件。

在例子中,用如下语句创建这个对象:

message = ResourceBundle.getBundle("MessagesBundle", currentLocale);

4、用ResourceBundle读取信息----本地化实现了 读取了propeties文件后,我们就可以用ResourceBundle的实例通过getString(String Key)方法来取得信息了。如下的语句所示:

String msg1 = messages.getString("greetings");

结论: 如上面的例子所示,实现国际化实际上并不困难。他需要你做一些计划,并在程序中加入少量的额外编码。本章只是简介,在后面的章节中我们会了解JAVA的更多国际化的高级特性。

2005/7/24 John Peng 译

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有