11

我们正在本地化运行在 Java 5 上的 Web 应用程序的用户界面文本,并且对于如何输出属性文件中定义的消息(java.util.Properties使用的那种类型)存在两难境地。

一些消息包含将使用java.text.MessageFormat填充的占位符。例如:

search.summary = Your search for {0} found {1} items.

MessageFormat 很烦人,因为单引号是一个特殊字符,尽管在英文文本中很常见。您必须为文字单引号键入两个:

warning.item = This item''s {0} is not valid.

但是,应用程序的大约 1000 条消息中有四分之三不包含占位符。这意味着我们可以直接输出它们,避免使用 MessageFormat,并且不理会单引号:

help.url = The web page's URL

问题:我们应该对所有消息使用 MessageFormat,以保持语法一致,还是尽可能避免使用 MessageFormat,以便大多数消息不需要转义?

无论哪种方式,都有明显的利弊。

请注意,MessageFormat 的 API 文档承认了该问题并提出了非解决方案:

不幸的是,在消息格式模式中使用引号的规则有些令人困惑。特别是,对于本地化人员来说,单引号是否需要加倍并不总是显而易见的。确保将规则告知本地化人员,并告诉他们(例如,通过在资源包源文件中使用注释)MessageFormat 将处理哪些字符串。

4

5 回答 5

2

只需编写您自己的 MessageFormat 实现,而无需使用这个烦人的功能。您可以查看SLF4J Logger的代码。

他们有自己的消息格式化程序版本,可以按如下方式使用:

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

空占位符可以与默认排序一起使用,并为不同语言对单词或句子部分进行排列的某些本地化情况进行编号。

于 2009-01-30T15:07:40.593 回答
2

最后,我们决定通过始终使用“卷曲”引号来回避单引号问题:

warning.item = This item\u2019s {0} is not valid.
于 2009-04-03T10:11:04.850 回答
1

使用 ` 字符而不是 ' 进行引用。我们一直使用它没有问题。

仅在需要时才使用 MessageFormat,否则它们只会使代码膨胀并且没有额外的价值。

于 2009-01-30T16:09:19.283 回答
0

在我看来,一致性对于这类事情很重要。属性文件和 MessageFormat 已经有很多限制。如果您发现这些麻烦,您可以“编译”您的属性文件以生成格式正确的文件。但我想说随处使用 MessageFormat 。这样,当您维护代码时,您无需担心哪些字符串已格式化,哪些未格式化。处理起来变得更简单,因为您可以将消息处理交给库,而不必担心高层的细节。

于 2009-01-30T16:54:00.723 回答
-1

另一种选择...加载属性文件时,只需将输入流包装在 FilterInpuStream 中,它将每个单引号加倍。

于 2009-01-30T16:04:42.100 回答