该Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并且可能使用已不再可用的技术。
有关Java SE 9及以后版本中更新的语言特性的摘要,请参见Java语言变更。
有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息,请参见JDK发行说明。
许多程序在最初编写时并没有进行国际化。这些程序可能是原型,或者可能不打算国际分发。如果你必须对现有程序进行国际化,请按照以下步骤进行:
文本消息是最明显的与文化有关的数据形式。然而,其他类型的数据可能随地区或语言而异。以下列表包含了一些与文化相关的数据的例子:
翻译是一项昂贵的工作。你可以通过将必须翻译的文本隔离到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);
如果你使用日期格式化类,你的应用程序可以正确地显示全球各地的日期和时间。有关示例和说明,请参阅日期和时间一节。
以下代码试图验证一个字符是否为字母:
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.equals
和String.compareTo
方法执行二进制比较,在大多数语言的排序中效率低下。相反,你应该使用Collator
类,该类在比较字符串一节中进行了描述。
Java编程语言中的字符以Unicode编码。如果你的应用程序处理非Unicode文本,你可能需要将其转换为Unicode。有关详细信息,请参阅转换非Unicode文本一节。