# 消息

> 原文： [https://docs.oracle.com/javase/tutorial/i18n/format/messageintro.html](https://docs.oracle.com/javase/tutorial/i18n/format/messageintro.html)

我们都喜欢使用程序让我们知道发生了什么。通知我们的程序通常通过显示状态和错误消息来实现。当然，这些消息需要翻译，以便世界各地的最终用户能够理解这些消息。 [隔离特定于区域设置的数据](../resbundle/index.html)部分讨论了可翻译的文本消息。通常，在将消息`String`移动到`ResourceBundle`后就完成了。但是，如果您在消息中嵌入了可变数据，则必须采取一些额外步骤来准备翻译。

_ 复合消息 _ 包含可变数据。在以下复合消息列表中，变量数据带有下划线：

```
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`类来完成此操作，这是本节的主题。

* * *

**Caution:** 

复合邮件很难翻译，因为邮件文本是碎片化的。如果您使用复合邮件，则本地化将花费更长时间并且成本更高。因此，您应该仅在必要时使用复合消息。

* * *

## [处理复合讯息](messageFormat.html)

复合邮件可能包含多种变量：日期，时间，字符串，数字，货币和百分比。若要以与语言环境无关的方式格式化复合邮件，请构造应用于`MessageFormat`对象的模式。

## [处理复数](choiceFormat.html)

如果复数和单数单词形式都可能，则消息中的单词通常会有所不同。使用`ChoiceFormat`类，您可以将数字映射到单词或短语，从而可以构造语法正确的消息。