# 清单

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

首次编写时，许多程序都没有国际化。这些程序可能已经开始作为原型，或者它们可能不是用于国际分发。如果必须国际化现有程序，请执行以下步骤：

## 识别文化依赖数据

短信是最明显的数据形式，随文化而变化。但是，其他类型的数据可能因地区或语言而异。以下列表包含文化相关数据的示例：

*   消息
*   GUI 组件上的标签
*   网上帮助
*   声音
*   颜色
*   图像
*   图标
*   日期
*   时
*   数字
*   货币
*   测量
*   电话号码
*   荣誉和个人头衔
*   邮政地址
*   页面布局

## 隔离资源包中的可翻译文本

翻译费用昂贵。您可以通过隔离必须在`ResourceBundle`对象中转换的文本来帮助降低成本。可翻译文本包括状态消息，错误消息，日志文件条目和 GUI 组件标签。该文本被硬编码到尚未国际化的程序中。您需要找到显示给最终用户的所有硬编码文本。例如，您应该像这样清理代码：

```
String buttonLabel = "OK";
// ...
JButton okButton = new JButton(buttonLabel);

```

有关详细信息，请参见[隔离特定于区域设置的数据](../resbundle/index.html)部分。

## 处理复合邮件

复合消息包含可变数据。在消息“磁盘包含 1100 个文件”中。整数 1100 可以变化。此消息难以翻译，因为句子中整数的位置在所有语言中都不相同。以下消息不可翻译，因为句子元素的顺序是通过连接硬编码的：

```
Integer fileCount;
// ...
String diskStatus = "The disk contains " + fileCount.toString() + " files";

```

只要有可能，您应该避免构造复合消息，因为它们很难翻译。但是，如果您的应用程序需要复合消息，您可以使用[消息](../format/messageintro.html)部分中描述的技术处理它们。

## 格式化数字和货币

如果您的应用程序显示数字和货币，则必须以与语言环境无关的方式对其进行格式化。以下代码尚未国际化，因为它不会在所有国家/地区正确显示数字：

```
Double amount;
TextField amountField;
// ...
String displayAmount = amount.toString();
amountField.setText(displayAmount);

```

您应该使用正确格式化数字的例程替换前面的代码。 Java 编程语言提供了几个格式化数字和货币的类。这些类在[数字和货币](../format/numberintro.html)部分中讨论。

## 格式日期和时间

日期和时间格式因地区和语言而异。如果您的代码包含如下语句，则需要更改它：

```
Date currentDate = new Date();
TextField dateField;
// ...
String dateString = currentDate.toString();
dateField.setText(dateString);

```

如果您使用日期格式化类，您的应用程序可以在世界各地正确显示日期和时间。有关示例和说明，请参阅[日期和时间](../format/dateintro.html)部分。

## 使用 Unicode 字符属性

以下代码尝试验证字符是否为字母：

```
char ch;
// This code is incorrect
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))

```

注意这样的代码，因为它不适用于英语以外的语言。例如，`if`语句错过了德语单词 Grün 中的字符ü。

`Character`比较方法使用 Unicode 标准来标识字符属性。因此，您应该使用以下代码替换以前的代码：

```
char ch;
// ...
if (Character.isLetter(ch))

```

有关`Character`比较方法的更多信息，请参见[检查字符属性](../text/charintro.html)部分。

## 正确比较字符串

排序文本时，您经常比较字符串。如果显示文本，则不应使用`String`类的比较方法。尚未国际化的程序可能会比较字符串如下：

```
String target;
String candidate;
// ...
if (target.equals(candidate)) {
// ...
if (target.compareTo(candidate) < 0) {
// ...

```

`String.equals`和`String.compareTo`方法执行二进制比较，在大多数语言中排序时无效。相反，你应该使用`Collator`类，这在[比较字符串](../text/collationintro.html)一节中有描述。

## 转换非 Unicode 文本

Java 编程语言中的字符以 Unicode 编码。如果您的应用程序处理非 Unicode 文本，您可能需要将其转换为 Unicode。有关更多信息，请参阅[转换非 Unicode 文本](../text/convertintro.html)部分。