# 国际化样例计划 > 原文: [https://docs.oracle.com/javase/tutorial/i18n/intro/steps.html](https://docs.oracle.com/javase/tutorial/i18n/intro/steps.html) 如果你查看国际化的源代码,你会发现硬编码的英文消息已被删除。由于消息不再是硬编码的,并且因为语言代码是在运行时指定的,因此可以在全球范围内分发相同的可执行文件。本地化不需要重新编译。该计划已国际化。 您可能想知道消息文本的内容或语言和国家/地区代码的含义。别担心。当您逐步完成示例程序的国际化过程时,您将了解这些概念。 ## 1.创建属性文件 属性文件存储有关程序或环境特征的信息。属性文件采用纯文本格式。您可以使用几乎任何文本编辑器创建文件。 在示例中,属性文件存储要显示的消息的可翻译文本。在该计划国际化之前,该文本的英文版本在`System.out.println`声明中进行了硬编码。默认属性文件称为`MessagesBundle.properties`,包含以下行: ```java greetings = Hello farewell = Goodbye inquiry = How are you? ``` 现在消息在属性文件中,它们可以被翻译成各种语言。不需要更改源代码。法语翻译器创建了一个名为`MessagesBundle_fr_FR.properties`的属性文件,其中包含以下行: ```java greetings = Bonjour. farewell = Au revoir. inquiry = Comment allez-vous? ``` 请注意,等号右侧的值已被翻译,但左侧的键未更改。这些键不能更改,因为它们将在您的程序获取翻译文本时被引用。 属性文件的名称很重要。例如,`MessagesBundle_fr_FR.properties`文件的名称包含`fr`语言代码和`FR`国家/地区代码。创建`Locale`对象时也会使用这些代码。 ## 2.定义区域设置 `Locale`对象标识特定语言和国家/地区。以下语句定义了`Locale`,其语言为英语,国家为美国: ```java aLocale = new Locale("en","US"); ``` 下一个示例为加拿大和法国的法语创建`Locale`对象: ```java caLocale = new Locale("fr","CA"); frLocale = new Locale("fr","FR"); ``` 该计划非常灵活。该程序不是使用硬编码语言和国家/地区代码,而是在运行时从命令行获取它们: ```java 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`创建如下: ```java messages = ResourceBundle.getBundle("MessagesBundle", currentLocale); ``` 传递给`getBundle`方法的参数标识将访问哪些属性文件。第一个参数`MessagesBundle`引用此属性文件系列: ```java MessagesBundle_en_US.properties MessagesBundle_fr_FR.properties MessagesBundle_de_DE.properties ``` `Locale`是`getBundle`的第二个参数,指定选择了哪个`MessagesBundle`文件。创建`Locale`时,语言代码和国家/地区代码将传递给其构造器。请注意,语言和国家/地区代码遵循属性文件名称中的`MessagesBundle`。 现在你所要做的就是从`ResourceBundle`获取翻译的消息。 ## 4.从 ResourceBundle 中获取文本 属性文件包含键值对。值包含程序将显示的已翻译文本。使用`getString`方法从`ResourceBundle`获取已翻译的消息时指定密钥。例如,要检索由问候键标识的消息,请按如下方式调用`getString`: ```java String msg1 = messages.getString("greetings"); ``` 示例程序使用密钥`greetings`,因为它反映了消息的内容,但它可能使用了另一个`String`,例如`s1`或`msg1`。请记住,密钥在程序中是硬编码的,并且必须存在于属性文件中。如果您的翻译人员意外修改了属性文件中的密钥,`getString`将无法找到这些消息。 ## 结论 而已。如您所见,国际化程序并不太难。它需要一些规划和一些额外的编码,但好处是巨大的。为了向您提供国际化过程的概述,本课程中的示例程序有意保持简单。在阅读下面的课程时,您将了解 Java 编程语言的更高级的国际化功能。