Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
首次编写时,许多程序都没有国际化。这些程序可能已经开始作为原型,或者它们可能不是用于国际分发。如果必须国际化现有程序,请执行以下步骤:
文本消息是最明显的数据形式,随区域性的变化而变化。但是,其他类型的数据可能因地区或语言而异。以下列表包含文化相关数据的示例:
翻译费用昂贵。你可以通过隔离必须在 ResourceBundle
对象中翻译的文本来帮助降低成本。可翻译文本包括状态消息,错误消息,日志文件条目和 GUI 组件标签。该文本被硬编码到尚未国际化的程序中。你需要找到显示给终端用户的所有硬编码文本。例如,你应该像这样清理代码:
String buttonLabel = "OK"; // ... JButton okButton = new JButton(buttonLabel);
有关详细信息,请参阅 Isolating Locale-Specific Data 部分。
复合消息包含可变数据。在消息“The disk contains 1100 files.”中。整数 1100 可能变化。此消息难以翻译,因为句子中整数的位置在所有语言中并不相同。以下消息不可翻译,因为句子元素的顺序是通过连接硬编码的:
Integer fileCount; // ... String diskStatus = "The disk contains " + fileCount.toString() + " files";
只要有可能,你应该避免构造复合消息,因为它们很难翻译。但是,如果你的应用程序需要复合消息,则可以使用 Messages 部分中描述的技术处理它们。
如果你的应用程序显示数字和货币,则必须以与语言环境无关的方式格式化它们。以下代码尚未国际化,因为它不会在所有国家/地区正确显示数字:
Double amount; TextField amountField; // ... String displayAmount = amount.toString(); amountField.setText(displayAmount);
你应该使用正确格式化数字的例程替换前面的代码。Java 编程语言提供了几个格式化数字和货币的类。这些类在 Numbers and Currencies 部分讨论。
日期和时间格式因地区和语言而异。如果你的代码包含如下语句,则需要更改它:
Date currentDate = new Date(); TextField dateField; // ... String dateString = currentDate.toString(); dateField.setText(dateString);
如果你使用日期格式化类,你的应用程序可以在世界各地正确显示日期和时间。有关示例和说明,请参阅 Dates and Times 部分。
以下代码尝试验证字符是否为字母:
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
比较方法的更多信息,请参阅 Checking Character Properties 部分。
排序文本时,你经常比较字符串。如果显示文本,则不应使用 String
类的比较方法。尚未国际化的程序可能会比较字符串如下:
String target; String candidate; // ... if (target.equals(candidate)) { // ... if (target.compareTo(candidate) < 0) { // ...
String.equals
和 String.compareTo
方法执行二进制比较,这在大多数语言中排序时无效。相反,你应该使用 Collator
类,该类在 Comparing Strings 部分中进行了描述。
Java 编程语言中的字符以 Unicode 编码。如果你的应用程序处理非 Unicode 文本,你可能需要将其转换为 Unicode。有关更多信息,请参阅 Converting Non-Unicode Text 部分。