Checklist
初次编写时,许多程序尚未国际化。这些程序可能是作为原型开始的,或者可能不打算用于国际发行。如果必须国际化现有程序,请执行以下步骤:
识别文化相关数据
短信是随文化而变化的最明显的数据形式。但是,其他类型的数据可能会因地区或语言而异。以下列表包含文化相关数据的示例:
-
Messages
-
GUI 组件上的标签
-
Online help
-
Sounds
-
Colors
-
Graphics
-
Icons
-
Dates
-
Times
-
Numbers
-
Currencies
-
Measurements
-
Phone numbers
-
荣誉称号和个人头衔
-
Postal addresses
-
Page layouts
隔离资源包中的可翻译文本
翻译是昂贵的。通过隔离必须在ResourceBundle
对象中翻译的文本,可以帮助降低成本。可翻译文本包括状态消息,错误消息,日志文件条目和 GUI 组件标签。该文本被硬编码到尚未国际化的程序中。您需要找到所有出现在final用户面前的硬编码文本。例如,您应该清理如下代码:
String buttonLabel = "OK";
// ...
JButton okButton = new JButton(buttonLabel);
有关详细信息,请参见隔离区域特定的数据部分。
处理复合消息
复合消息包含可变数据。在消息“磁盘包含 1100 个文件”中。整数 1100 可以变化。该消息很难翻译,因为整数在句子中的位置在所有语言中都不相同。以下消息不可翻译,因为句子元素的 Sequences 是通过 String 联硬编码的:
Integer fileCount;
// ...
String diskStatus = "The disk contains " + fileCount.toString() + " files";
尽可能避免构造复合消息,因为它们很难翻译。但是,如果您的应用程序需要复合消息,则可以使用Messages部分中描述的技术来处理它们。
格式化数字和货币
如果您的应用程序显示数字和货币,则必须以与语言环境无关的方式设置它们的格式。以下代码尚未国际化,因为它不会在所有国家/地区正确显示该数字:
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 字符属性
下面的代码try验证字符是字母:
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
比较方法的更多信息,请参见检查角色属性部分。
正确比较字符串
在对文本进行排序时,您经常会比较字符串。如果显示了文本,则不应使用String
类的比较方法。尚未国际化的程序可能会比较字符串,如下所示:
String target;
String candidate;
// ...
if (target.equals(candidate)) {
// ...
if (target.compareTo(candidate) < 0) {
// ...
String.equals
和String.compareTo
方法执行二进制比较,这在使用大多数语言进行排序时无效。相反,您应该使用Collator
类,这在Comparing Strings部分中进行了描述。
转换非 Unicode 文本
Java 编程语言中的字符以 Unicode 编码。如果您的应用程序处理非 Unicode 文本,则可能需要将其转换为 Unicode。有关更多信息,请参见转换非 Unicode 文本部分。