# 使用属性文件备份 ResourceBundle

> 原文： [https://docs.oracle.com/javase/tutorial/i18n/resbundle/propfile.html](https://docs.oracle.com/javase/tutorial/i18n/resbundle/propfile.html)

本节逐步介绍名为 [``PropertiesDemo``](examples/PropertiesDemo.java)的示例程序。

## 1.创建默认属性文件

属性文件是一个简单的文本文件。您可以使用几乎任何文本编辑器创建和维护属性文件。

您应该始终创建默认属性文件。该文件的名称以`ResourceBundle`的基本名称开头，以`.properties`后缀结尾。在`PropertiesDemo`程序中，基本名称为`LabelsBundle`。因此，默认属性文件称为`LabelsBundle.properties`。该文件包含以下行：

```
# This is the default LabelsBundle.properties file
s1 = computer
s2 = disk
s3 = monitor
s4 = keyboard

```

请注意，在前面的文件中，注释行以井号（＃）开头。其他行包含键值对。键位于等号的左侧，值位于右侧。例如，`s2`是对应于值`disk`的键。关键是任意的。我们可以将`s2`称为其他东西，如`msg5`或`diskID`。但是，一旦定义，密钥就不应该改变，因为它在源代码中被引用。值可能会更改。实际上，当本地化程序创建新属性文件以容纳其他语言时，它们会将值转换为各种语言。

## 2.根据需要创建其他属性文件

要支持其他`Locale`，您的本地化程序将创建一个包含已翻译值的新属性文件。不需要更改源代码，因为您的程序引用了键而不是值。

例如，要添加对德语的支持，您的本地化程序将转换`LabelsBundle.properties`中的值并将它们放在名为`LabelsBundle_de.properties`的文件中。请注意，此文件的名称与默认文件的名称一样，以基本名称`LabelsBundle`开头，以`.properties`后缀结尾。但是，由于此文件适用于特定的`Locale`，因此基本名称后跟语言代码（`de`）。 `LabelsBundle_de.properties`的内容如下：

```
# This is the LabelsBundle_de.properties file
s1 = Computer
s2 = Platte
s3 = Monitor
s4 = Tastatur

```

`PropertiesDemo`示例程序附带三个属性文件：

```
LabelsBundle.properties
LabelsBundle_de.properties
LabelsBundle_fr.properties

```

## 3.指定区域设置

`PropertiesDemo`程序按如下方式创建`Locale`对象：

```
Locale[] supportedLocales = {
    Locale.FRENCH,
    Locale.GERMAN,
    Locale.ENGLISH
};

```

这些`Locale`对象应与前两个步骤中创建的属性文件匹配。例如，`Locale.FRENCH`对象对应于`LabelsBundle_fr.properties`文件。 `Locale.ENGLISH`没有匹配的`LabelsBundle_en.properties`文件，因此将使用默认文件。

## 4.创建 ResourceBundle

此步骤显示`Locale`，属性文件和`ResourceBundle`如何相关。要创建`ResourceBundle`，请调用`getBundle`方法，指定基本名称和`Locale`：

```
ResourceBundle labels = ResourceBundle.getBundle("LabelsBundle", currentLocale);

```

`getBundle`方法首先查找与基本名称和`Locale`匹配的类文件。如果找不到类文件，则检查属性文件。在`PropertiesDemo`程序中，我们使用属性文件而不是类文件来支持`ResourceBundle`。当`getBundle`方法找到正确的属性文件时，它返回包含属性文件中的键值对的`PropertyResourceBundle`对象。

## 5.获取本地化文本

要从`ResourceBundle`检索已翻译的值，请按如下方式调用`getString`方法：

```
String value = labels.getString(key);

```

`getString`返回的`String`对应于指定的键。 `String`使用适当的语言，前提是指定的`Locale`存在属性文件。

## 6.遍历所有键

此步骤是可选的。调试程序时，可能需要为`ResourceBundle`中的所有键获取值。 `getKeys`方法返回`ResourceBundle`中所有键的`Enumeration`。您可以遍历`Enumeration`并使用`getString`方法获取每个值。以下代码行来自`PropertiesDemo`程序，显示了如何完成此操作：

```
ResourceBundle labels = ResourceBundle.getBundle("LabelsBundle", currentLocale);
Enumeration bundleKeys = labels.getKeys();

while (bundleKeys.hasMoreElements()) {
    String key = (String)bundleKeys.nextElement();
    String value = labels.getString(key);
    System.out.println("key = " + key + ", " + "value = " + value);
}

```

## 7.运行演示程序

运行`PropertiesDemo`程序会生成以下输出。前三行显示`getString`为各种`Locale`对象返回的值。当使用`getKeys`方法迭代键时，程序显示最后四行。

```
Locale = fr, key = s2, value = Disque dur
Locale = de, key = s2, value = Platte
Locale = en, key = s2, value = disk

key = s4, value = Clavier
key = s3, value = Moniteur
key = s2, value = Disque dur
key = s1, value = Ordinateur

```