这些Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9和后续版本中更新的语言功能的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息,请参阅JDK发行说明。
我们都喜欢使用能告诉我们发生了什么的程序。通常,通过显示状态和错误信息来让我们了解情况。当然,这些信息需要被翻译,以便全球的最终用户能够理解。本节讨论了可翻译的文本消息,详见隔离特定区域设置的数据。通常,在将消息String
移入ResourceBundle
后,你的工作就完成了。但是,如果你在消息中嵌入了变量数据,你需要采取一些额外的步骤来准备它以进行翻译。
一个复合消息包含变量数据。在下面的复合消息列表中,变量数据被下划线标出:
磁盘名为MyDisk的磁盘包含300个文件。 账户#34-09-222的当前余额为$2,745.72。 自2009年1月1日以来,已有405,390人访问了您的网站。 删除所有早于120天的文件。
你可能会尝试通过连接短语和变量来构建前面列表中的最后一个消息:
double numDays; ResourceBundle msgBundle; // ... String message = msgBundle.getString( "deleteolder" + numDays.toString() + msgBundle.getString("days"));
这种方法在英语中可以正常工作,但对于动词出现在句子末尾的语言则行不通。因为这条消息的词序是硬编码的,你的本地化人员将无法创建所有语言的语法正确的翻译。
如果你需要使用复合消息,如何使你的程序可本地化呢?你可以使用MessageFormat
类来实现,本节将讨论这个主题。
复合消息难以翻译,因为消息文本是碎片化的。如果你使用复合消息,本地化将需要更长的时间和更高的成本。因此,只有在必要时才应使用复合消息。
复合消息可能包含多种类型的变量:日期、时间、字符串、数字、货币和百分比。为了以与区域设置无关的方式格式化复合消息,你需要构建一个模式,并将其应用于MessageFormat
对象。
消息中的单词通常会变化,如果可能存在复数和单数形式。使用ChoiceFormat
类,你可以将一个数字映射到一个词或短语,从而构建语法正确的消息。