文档

Java™ 教程-Java Tutorials 中文版
消息
Trail: Internationalization
Lesson: Formatting

消息

我们都喜欢使用程序让我们知道发生了什么。通知我们的程序通常通过显示状态和错误消息来实现。当然,这些消息需要翻译,以便世界各地的终端用户能够理解这些消息。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 类,你可以将数字映射到单词或短语,从而允许你构造语法正确的消息。


Previous page: Changing Date Format Symbols
Next page: Dealing with Compound Messages