文档

Java™ 教程
隐藏目录
国际化示例程序
路径: 国际化
课程: 介绍
章节: 快速示例

对示例程序进行国际化

如果你查看国际化的源代码,你会注意到硬编码的英文消息已经被移除了。因为消息不再是硬编码的,而且语言代码是在运行时指定的,所以同一个可执行文件可以在全球范围内分发。本地化不需要重新编译。该程序已经国际化。

你可能想知道消息的文本发生了什么变化,语言和国家代码又是什么意思。别担心。在步骤中你将了解到这些概念,同时国际化示例程序。

1. 创建属性文件

属性文件存储程序或环境的特性信息。属性文件是以纯文本格式存储的。你可以使用任何文本编辑器创建该文件。

在示例中,属性文件存储要显示的可翻译文本消息。在国际化之前,这些文本的英文版本是硬编码在System.out.println语句中的。默认的属性文件称为MessagesBundle.properties,包含以下行:

greetings = Hello
farewell = Goodbye
inquiry = How are you?

现在这些消息已经在属性文件中,可以被翻译成不同的语言。不需要对源代码进行任何更改。法语翻译人员创建了一个名为MessagesBundle_fr_FR.properties的属性文件,其中包含以下行:

greetings = Bonjour.
farewell = Au revoir.
inquiry = Comment allez-vous?

注意,等号右侧的值已经被翻译,但左侧的键没有改变。这些键不能改变,因为在程序获取翻译文本时将引用这些键。

属性文件的名称很重要。例如,MessagesBundle_fr_FR.properties文件的名称包含fr语言代码和FR国家代码。在创建Locale对象时也会使用这些代码。

2. 定义Locale

Locale对象标识特定的语言和国家。下面的语句定义了一个语言为英语、国家为美国的Locale

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

下面的示例创建了加拿大和法国的法语Locale对象:

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

该程序是灵活的。它不是使用硬编码的语言和国家代码,而是在运行时从命令行获取:

String language = new String(args[0]);
String country = new String(args[1]);
currentLocale = new Locale(language, country);

Locale对象仅仅是标识符。在定义了一个Locale之后,你可以将其传递给执行有用任务的其他对象,例如格式化日期和数字。这些对象是与地区有关的,因为它们的行为会根据Locale的不同而变化。例如,ResourceBundle就是一个与地区有关的对象。

3. 创建一个ResourceBundle

ResourceBundle对象包含与地区相关的对象。你可以使用ResourceBundle对象来隔离与地区有关的数据,例如可翻译的文本。在示例程序中,ResourceBundle由包含我们想要显示的消息文本的属性文件支持。

创建ResourceBundle的方法如下:

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

传递给getBundle方法的参数标识将要访问的属性文件。第一个参数MessagesBundle指的是这组属性文件:

MessagesBundle_en_US.properties
MessagesBundle_fr_FR.properties
MessagesBundle_de_DE.properties

Locale作为getBundle的第二个参数,指定了选择哪个MessagesBundle文件。创建Locale时,语言代码和国家代码被传递给它的构造函数。注意语言和国家代码紧跟在属性文件名中的MessagesBundle后面。

现在你只需要从ResourceBundle中获取翻译后的消息即可。

4. 从ResourceBundle中获取文本

属性文件包含键值对。值由程序将要显示的翻译后的文本组成。当从ResourceBundle中获取翻译后的消息时,你需要使用getString方法指定键。例如,要检索由greetings键标识的消息,你可以这样调用getString

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

示例程序使用了greetings键,因为它反映了消息的内容,但也可以使用其他字符串,例如s1或msg1。只需记住,键是硬编码在程序中的,必须存在于属性文件中。如果翻译者不小心修改了属性文件中的键,getString将无法找到消息。

总结

就是这样。如你所见,国际化程序并不太困难。它需要一些规划和一点额外的编码工作,但是收益是巨大的。为了向你提供国际化过程的概述,本课程中的示例程序被故意保持简单。在阅读后续的课程时,你将了解到Java编程语言更高级的国际化特性。


上一页: 运行示例程序
下一页: 清单