}
}
请注意:在上面的代码中,信息并没有被hardcoded在代码中!
如果想运行上面的代码,请下载下面的文件:
1、I18NSample.java
2、MessageBundle.properties
3、MessageBundle_de_DE.properties
4、MessageBundle_en_US.properties
5、MessageBundle_fr_FR.properties
下面看看这个程序的运行结果:
显示法语信息:
javaI18NSamplefrFR
Bonjour.
Commentallez-vous?
Aurevoir.
显示英语信息:
javaI18NSampleenUS
Hello.
Howareyou?
Goodbye.
从上面的代码我们可以看出,在实现了国际化的代码中,并没有将需要显示的信息直接hardcode在代码中,而是存在一个文件中供程序使用。程序根据不同的语言和国家(Local)来取得文件中不同信息显示。我们试着按一下的步骤一步一步分析这段代码如何实现了国际化:
1、建立properties文件----本地化数据
properties文件用来存储程序和环境相关的信息。必须以.properties的后缀结尾,properties文件是纯文本格式的。在上面的例子中,一共有4个properties文件。分别定义了不同语言和国家的打招呼、再见和问候时使用的语言。properties文件使用名值对(key-value)的形式,如下所示:
greetings=Bonjour.
farewell=Aurevoir.
inquiry=Commentallez-vous?
properties文件的名字很重要,它的形式是basename_LL_CC.properties.LL表示语言代码,CC表示国家代码。语言代码和国家代码是Local类初始化的参数,basename是创建ResourceBundle对象的参数。
2、创建Local对象----不同语言和国家的标识
java.util.Local是JDK提供的标准API。这个类用来标识国家和语言。
我们可以创建一个local对象:
aLocale=newLocale("en","US");
这个对象标志了一个地方,这个地方是美国,并且这里的语言是英语。
这下面2个对象又表示什么呢?
caLocale=newLocale("fr","CA");
frLocale=newLocale("fr","FR");
caLocale对象标志的是加拿大并且那里使用了法语,而frLocal标志的是法国而那里的语言是法语。
注意:Local对象只是一个标识类,创建了这个类的对象并不表示你的程序已经实现了国际化。这个类是给那些需要实现国际化的类使用的,它用来标识我们即将实现国际化的Local信息。
3、创建ResourceBundle对象----本例中实现国际化的主要角色
java.util.ResourceBundle是JDK提供的标准API。它实际上是个抽象类,同时它提供了创建它的子类的静态工厂方法。在例子程序中我们实际上使用的是ResourceBundle的子类PropertyResourceBundle的对象。通过它,我们可以根据Local对象来读取不同的properties文件,从而取得不同的信息。
如果local=newLocale("en","US");则读取了MessagesBundle_en_US.properties文件。
在例子中,用如下语句创建这个对象:
message=ResourceBundle.getBundle("MessagesBundle",currentLocale);
4、用ResourceBundle读取信息----本地化实现了
读取了propeties文件后,我们就可以用ResourceBundle的实例通过getString(StringKey)方法来取得信息了。
Java的ResourceBundle是一个很好用的工具,可以很方便的用来实现
软件的国际化和本地化功能。因为ResourceBundle能够按照一定的规则,自动寻找目录下符合某个文化和地区的资源文件(.properties文件)。通过为不同的文化和地区提供不同的资源文件,然后让java自动根据规则来读取这些资源文件,实际上就完成软件的本地化工作。