# 国际化样本计划

> 原文： [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`，包含以下行：

```
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`获取已翻译的消息时指定密钥。例如，要检索由问候键标识的消息，请按如下方式调用`getString`：

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

```

示例程序使用密钥`greetings`，因为它反映了消息的内容，但它可能使用了另一个`String`，例如`s1`或`msg1`。请记住，密钥在程序中是硬编码的，并且必须存在于属性文件中。如果您的翻译人员意外修改了属性文件中的密钥，`getString`将无法找到这些消息。

## 结论

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