Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
我们都喜欢使用程序让我们知道发生了什么。通知我们的程序通常通过显示状态和错误消息来实现。当然,这些消息需要翻译,以便世界各地的终端用户能够理解这些消息。Isolating Locale-Specific Data 部分讨论了可翻译的文本消息。通常,在将消息 String
移动到 ResourceBundle
之后,你就完成了。但是,如果你在消息中嵌入了可变数据,则必须采取一些额外步骤来准备翻译。
compound message (复合消息) 包含可变数据。在以下复合消息列表中,变量数据带有下划线:
The disk named MyDisk contains 300 files. The current balance of account #34-09-222 is $2,745.72. 405,390 people have visited your website since January 1, 2009. Delete all files older than 120 days.
你可能想通过连接短语和变量来构造前面列表中的最后一条消息,如下所示:
double numDays; ResourceBundle msgBundle; // ... String message = msgBundle.getString( "deleteolder" + numDays.toString() + msgBundle.getString("days"));
这种方法在英语中运行良好,但它不适用于句子末尾出现动词的语言。由于此消息的单词顺序是硬编码的,因此你的本地化程序将无法为所有语言创建语法正确的翻译。
如果需要使用复合消息,如何使程序可以本地化?你可以使用 MessageFormat
类来完成此操作,正是本节的主题。
复合消息很难翻译,因为消息文本是分段的。如果你使用复合消息,则本地化将花费更长时间并且成本更高。因此,你应该仅在必要时使用复合消息。
复合消息可能包含多种变量:日期,时间,字符串,数字,货币和百分比。若要以与语言环境无关的方式格式化复合消息,请构造应用于 MessageFormat
对象的模式。
如果复数和单数单词形式都可能,则消息中的单词通常会有所不同。使用 ChoiceFormat
类,你可以将数字映射到单词或短语,从而允许你构造语法正确的消息。