我们正在为在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。
答案 0 :(得分:2)
只需编写自己的MessageFormat实现,而不需要这个烦人的功能。您可以查看SLF4J Logger的代码。
他们有自己的消息格式化版本,可以按照以下方式使用:
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
空占位符可以与默认排序一起使用,并编号用于某些本地化案例,其中不同语言对单词或句子部分进行排列。
答案 1 :(得分:2)
最后,我们总是使用'卷曲'引号决定支持单引号问题:
warning.item = This item\u2019s {0} is not valid.
答案 2 :(得分:1)
使用`字符代替'来引用。我们一直使用它而没有任何问题。
仅在需要时使用MessageFormat,否则它们只会使代码膨胀并且没有额外的值。
答案 3 :(得分:0)
在我看来,一致性对于这类事情很重要。属性文件和MessageFormat已经有很多限制。如果您发现这些麻烦,您可以“编译”您的属性文件以生成正确形成的属性文件。但我会说到处都使用MessageFormat。这样,在维护代码时,您不必担心哪些字符串已格式化,哪些不格式化。处理起来变得更加简单,因为您可以将消息处理交给库,而不必担心高级别的细节。
答案 4 :(得分:-1)
另一个替代方案......当加载属性文件时,只需将输入流包装在一个FilterInpuStream中,它将每个引号加倍。