我应该将java.text.MessageFormat用于没有占位符的本地化消息吗?

Pet*_*ton 11 java localization messageformat

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

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

search.summary = Your search for {0} found {1} items.
Run Code Online (Sandbox Code Playgroud)

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

warning.item = This item''s {0} is not valid.
Run Code Online (Sandbox Code Playgroud)

但是,应用程序1000个左右的消息中有四分之三不包含占位符.这意味着我们可以直接输出它们,避免使用MessageFormat,并保留单引号:

help.url = The web page's URL
Run Code Online (Sandbox Code Playgroud)

问题:我们应该为所有消息使用MessageFormat,以获得一致的语法,还是尽可能避免使用MessageFormat,因此大多数消息都不需要转义?

无论哪种方式都有明显的优点和缺点.

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

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

Bor*_*vić 2

只需编写您自己的 MessageFormat 实现即可,无需此烦人的功能。您可以查看SLF4J Logger的代码。

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

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
Run Code Online (Sandbox Code Playgroud)

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