国际化示例程序
如果您查看国际化的源代码,您会注意到硬编码的英语消息已被删除。因为消息不再是硬编码的,并且因为语言代码是在运行时指定的,所以同一可执行文件可以在 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
Locale
是getBundle
的第二个参数,它指定选择了MessagesBundle
个文件。创建Locale
时,语言代码和国家/地区代码已传递到其构造函数。请注意,语言和国家/地区代码在属性文件的名称中紧跟MessagesBundle
。
现在您所要做的就是从ResourceBundle
获取翻译后的消息。
4.从 ResourceBundle 中获取文本
属性文件包含键值对。值包括程序将显示的翻译文本。使用getString
方法从ResourceBundle
提取翻译后的消息时,可以指定键。例如,要检索由 greetings 键标识的消息,请按以下方式调用getString
:
String msg1 = messages.getString("greetings");
该示例程序使用键greetings
,因为它反映了消息的内容,但是它可能已经使用了另一个String
,例如s1
或msg1
。只要记住,密钥是在程序中硬编码的,并且它必须存在于属性文件中。如果您的翻译人员不小心修改了属性文件中的键,则getString
将无法找到消息。
Conclusion
而已。如您所见,国际化程序并不难。它需要一些计划和一些额外的编码,但是好处是巨大的。为了向您提供国际化过程的概述,本课中的示例程序被故意简化了。阅读后面的类时,您将了解 Java 编程语言的更高级的国际化功能。