国际化示例程序

如果您查看国际化的源代码,您会注意到硬编码的英语消息已被删除。因为消息不再是硬编码的,并且因为语言代码是在运行时指定的,所以同一可执行文件可以在 Global 范围内分发。本地化无需重新编译。该计划已国际化。

您可能想知道消息文本发生了什么,或者语言和国家/地区代码的含义。不用担心在逐步完成示例程序国际化的过程中,您将学习这些概念。

1.创建属性文件

属性文件存储有关程序或环境的 Feature 的信息。属性文件为纯文本格式。您几乎可以使用任何文本编辑器来创建文件。

在示例中,属性文件存储要显示的消息的可翻译文本。在程序国际化之前,该文本的英语版本被硬编码在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,其语言为英语,国家/地区为美国:

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

LocalegetBundle的第二个参数,它指定选择了MessagesBundle个文件。创建Locale时,语言代码和国家/地区代码已传递到其构造函数。请注意,语言和国家/地区代码在属性文件的名称中紧跟MessagesBundle

现在您所要做的就是从ResourceBundle获取翻译后的消息。

4.从 ResourceBundle 中获取文本

属性文件包含键值对。值包括程序将显示的翻译文本。使用getString方法从ResourceBundle提取翻译后的消息时,可以指定键。例如,要检索由 greetings 键标识的消息,请按以下方式调用getString

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

该示例程序使用键greetings,因为它反映了消息的内容,但是它可能已经使用了另一个String,例如s1msg1。只要记住,密钥是在程序中硬编码的,并且它必须存在于属性文件中。如果您的翻译人员不小心修改了属性文件中的键,则getString将无法找到消息。

Conclusion

而已。如您所见,国际化程序并不难。它需要一些计划和一些额外的编码,但是好处是巨大的。为了向您提供国际化过程的概述,本课中的示例程序被故意简化了。阅读后面的类时,您将了解 Java 编程语言的更高级的国际化功能。