文档

Java™ 教程
隐藏目录
检查清单
路径:国际化
课程:介绍

检查清单

许多程序在最初编写时并没有进行国际化。这些程序可能是原型,或者可能不打算国际分发。如果你必须对现有程序进行国际化,请按照以下步骤进行:

识别与文化相关的数据

文本消息是最明显的与文化有关的数据形式。然而,其他类型的数据可能随地区或语言而异。以下列表包含了一些与文化相关的数据的例子:

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

翻译是一项昂贵的工作。你可以通过将必须翻译的文本隔离到ResourceBundle对象中来帮助降低成本。可翻译的文本包括状态消息、错误消息、日志文件条目和GUI组件标签。这些文本被包含在没有进行国际化的程序中。你需要定位所有显示给最终用户的包含文本的出现位置。例如,你应该清理以下代码:

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

有关详细信息,请参阅隔离特定于区域设置的数据一节。

处理复合消息

复合消息包含可变数据。在消息 "The disk contains 1100 files." 中,整数1100可能会有所不同。这个消息很难翻译,因为整数在句子中的位置在所有语言中都不相同。下面的消息是不可翻译的,因为句子元素的顺序是通过连接而固定的:

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

尽量避免构建复合消息,因为它们很难翻译。然而,如果你的应用程序需要复合消息,你可以使用消息一节中描述的技术来处理它们。

格式化数字和货币

如果你的应用程序显示数字和货币,你必须以与区域无关的方式进行格式化。以下代码尚未国际化,因为它无法在所有国家正确显示数字:

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

你应该用一个能正确格式化数字的程序替换上述代码。Java编程语言提供了几个格式化数字和货币的类。这些类在数字和货币一节中进行了讨论。

格式化日期和时间

日期和时间的格式因地区和语言而异。如果你的代码包含以下语句,你需要进行更改:

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

如果你使用日期格式化类,你的应用程序可以正确地显示全球各地的日期和时间。有关示例和说明,请参阅日期和时间一节。

使用Unicode字符属性

以下代码试图验证一个字符是否为字母:

char ch;
// 这段代码是不正确的
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))

注意这样的代码,因为它在除英语以外的语言中无法正常工作。例如,在德语单词"Grün"中,该if语句会忽略字符ü。

Character比较方法使用Unicode标准来识别字符属性。因此,你应该用以下代码替换之前的代码:

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

有关Character比较方法的更多信息,请参阅检查字符属性一节。

正确比较字符串

在对文本进行排序时,你经常需要比较字符串。如果文本是显示的,你不应该使用String类的比较方法。一个没有国际化的程序可能会这样比较字符串:

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

String.equalsString.compareTo方法执行二进制比较,在大多数语言的排序中效率低下。相反,你应该使用Collator类,该类在比较字符串一节中进行了描述。

转换非Unicode文本

Java编程语言中的字符以Unicode编码。如果你的应用程序处理非Unicode文本,你可能需要将其转换为Unicode。有关详细信息,请参阅转换非Unicode文本一节。


上一页:国际化示例程序
下一页:设置区域设置