download:海量数据高并发场景,构建Go+ES8企业级搜索微服务无密分享
国际化示例程序
如果您查看国际化的源代码,您会注意到硬编码的英文消息已被删除。因为消息不再是硬编码的,而且语言代码是在运行时指定的,所以同一个可执行文件可以在世界范围内分发。本地化不需要重新编译。这个计划已经国际化了。
您可能想知道消息文本发生了什么变化,或者语言和国家代码的含义。别担心,在示例程序一步步国际化的过程中,你会学到这些概念。
1。创建属性文件
属性存储有关程序或环境特征的信息。该文件是纯文本格式的。您几乎可以使用任何文本编辑器来创建文件。
在示例中,属性文件存储了要显示的消息的可翻译文本。在程序国际化之前,该文本的英文版本是硬编码的,并在System.out.println中声明。默认属性文件名为MessagesBundle.properties,包含以下行:
问候=你好
告别=再见
询问=你好吗?
现在,消息位于属性文件中,它们可以被翻译成各种语言。不需要修改源代码。法语翻译人员创建了一个名为Messages Bundle fr fr . properties的名称,其中包含以下几行:
问候=你好。
再见。
询问=评论allez-vous?
请注意,等号右边的值已被转换,但左边的键没有改变。这些键不能被改变,因为当程序获得翻译的文本时它们将被引用。
属性的名称很重要。例如,消息bundle fr fr.properties文件包含FR语言代码和FR国家代码。创建广告代码时也会用到这些代码区域设置对象。
2。定义区域
的Locale对象标识特定的语言和国家。以下语句定义了语言为英语、国家为美国的区域设置:
aLocale =新的区域设置(" en "," US ");
下一个示例创建一个对象,其中区域设置在加拿大和法国使用法语:
caLocale =新的区域设置(" fr "," CA ");
frLocale =新的区域设置(" fr "," FR ");
该计划是灵活的。该程序不使用硬编码的语言和国家代码,而是在运行时从命令行获取它们:
String language = new String(args[0]);
String country = new String(args[1]);
currentLocale =新的区域设置(语言,国家);
Locale对象只是一个标识符。定义一个区域设置,然后将其传递给执行有用任务的其他对象,例如格式化日期和数字。这些对象是区域敏感的,因为它们的行为是基于区域的。ResourceBundle是区域敏感对象的一个例子。
3。创建ResourceBundle
ResourceBundle对象包含特定于区域设置的对象。您使用ResourceBundle对象来隔离敏感数据,例如可翻译的文本。在示例程序中,ResourceBundle由包含我们想要显示的消息文本的属性文件支持。
的ResourceBundle创建如下:
messages = resource bundle . get bundle(" messages bundle ",current locale);
参数被传递给getBundle方法,以确定将访问哪个属性文件。第一个参数MessagesBundle指的是这组属性文件:
MessagesBundle_en_US .属性
消息绑定_fr_FR.properties
MessagesBundle_de_DE .属性
的区域设置是getBundle,它指定选择了哪个MessagesBundle文件。什么时候。。。创建的区域设置时,语言代码和国家代码已传递给其构造函数。请注意,随后的语言和国家代码消息是在属性文件的名称中。
现在你要做的就是从ResourceBundle开始。
4。从ResourceBundle获取文本
该文件包含键值对。包括程序将显示的翻译文本。可以从ResourceBundle和getString方法开始。例如,要检索由greetings键标识的消息,可以如下调用getString:
string msg 1 = messages . getstring(" greetings ");
示例程序使用关键字greetings,因为它反映了消息的内容,但它可能已经使用了另一个字符串,如s1或msg1。请记住,这个键是硬编码在程序中的,它必须存在于属性文件中。如果您的翻译器不小心修改了属性文件中的键,getString将找不到该消息。
结论
仅仅...如你所见,将程序国际化并不难。它需要一些计划和一些额外的编码,但好处是巨大的。为了让您对国际化过程有一个大致的了解,本课中的示例程序经过了有意的简化。在阅读后面的课程时,你会了解到Java编程语言更高级的国际化功能。