我使用MessageFormat.format()已经有一段时间了,但是有一件事我觉得很烦人。
每次在消息中声明参数时,都必须知道映射参数的位置。例如:
MessageFormat.format("{0} is annoying {1}.", "this", "indeed")是否有一个类在任何其他方面都与MessageFormat相同,但允许您完全省略参数声明中的参数位置,并让它默认在消息中的位置,以便第一个参数映射到第一个参数,第二个参数映射到第二个参数,等等?例如:
MessageFormat.format("{} is much better{}.", "this", "indeed")我认为log4j的后期版本也有类似的特性,但我只需要格式化类。
新年快乐!
编辑:我需要这个特性来断言,所以它实际上是用于内部使用的,但是我很欣赏您对为什么MessageFormat是这样工作的洞察力。
发布于 2011-01-01 23:16:49
您应该使用Formatter或它的前端String.format。你可以:
String.format("%s is much better %s", "this", "indeed");
String.format("%1$s provides positional formatting %2$s", "this", "indeed");发布于 2011-01-01 23:16:06
提供所需的内容将挫败MessageFormat的主要目的之一:I18N和L10N。也就是说,不同的自然语言可以用不同的语序组成“相同”的句子。MessageFormat允许您的代码按照设置的顺序强制输入一定数量的参数,然后在为每种语言编写本地化的自然语言字符串时改变插值顺序--您可能会用适当的名称来定义这些字符串--您将用类ResourceBundle加载这些文件。
典型的工作流程包括首先用您的主要自然语言(例如英语)编写用户可见的消息,然后,对于您希望本地化软件的每一种额外语言,定义并行属性文件,将这些参数化消息转换为目标语言,并调整输入参数以适应适当的句子结构。
如果您不需要任何这样的功能,只需使用String#format()即可。
发布于 2011-01-01 23:17:59
我隐约记得遇到过这样的事情。但是,我想不起来它在哪里了。尽管如此,你还是可以使用一些解决方案。例如,您可以像现在一样将格式字符串存储在外部包中,但不要使用MessageFormat字符串,而是使用由String.format()支持的printf-style字符串。这些字符串允许位置参数表示法,但它们也允许传统的“在参数列表中使用它们”排序。
但是,请注意,必须指定索引:国际化是有原因的。如果您决定将格式字符串移动到外部消息包,则通常允许本地化(到其他语言),其中本地化句子中的单词的顺序可能与参数列表中字符串的顺序不匹配。
简而言之,最好还是坚持指定顺序。如果你发现你的应用程序非常成功,而且你在其他国家拥有难以置信的销售机会,只要你能用他们的语言发布你的所有信息,那就更容易了。
https://stackoverflow.com/questions/4576223
复制相似问题