增强的MessageFormat?

时间:2011-01-01 23:06:34

标签: java

我一直在使用MessageFormat.format()一段时间,但有一件事我觉得很烦人。

每次在消息中声明参数时,都必须知道映射参数的位置。 e.g。

MessageFormat.format("{0} is annoying {1}.", "this", "indeed")

是否有一个类与MessageFormat完全相同,但是让你省略参数声明中的参数位置,并将其默认设置在消息中的位置,以便第一个参数映射到第一个参数,第二个参数到第二个参数,依此类推? e.g。

MessageFormat.format("{} is much better{}.", "this", "indeed")

我认为log4j的更高版本具有类似的功能,但我只需要格式化类。

新年快乐!

编辑:我需要此功能进行断言,因此它非常适合内部使用,但我很欣赏您对MessageFormat工作方式的理解。

3 个答案:

答案 0 :(得分:8)

您应该使用Formatter或其前端String.format。你可以这样做:

String.format("%s is much better %s", "this", "indeed");
String.format("%1$s provides positional formatting %2$s", "this", "indeed");

答案 1 :(得分:6)

提供您要求的内容会破坏MessageFormatI18NL10N的主要目的之一。也就是说,不同的自然语言可以使用不同的单词顺序来组成“相同”的句子。 MessageFormat允许您的代码以设定的顺序强制输入一定数量的参数,然后在为每种语言编写本地化的自然语言字符串时改变插值顺序 - 您可能在适当命名的Java中定义它们您将使用课程ResourceBundle加载的属性文件

典型的工作流程包括首先使用主要自然语言(例如英语)编写用户可见的消息,然后,对于您希望本地化软件的每种其他语言,定义将这些参数化消息转换为的并行属性文件目标语言,改变输入参数以适应正确的句子结构。

如果您不需要任何此功能,请尝试使用String#format()代替。

答案 2 :(得分:2)

我隐约记得碰到这样的事情。但是,我不记得它在哪里。不过,您可以使用解决方案。例如,您可以将格式字符串存储在外部包中,就像现在一样,但不使用MessageFormat字符串,而是使用printf样式字符串,如String.format()所支持。这些字符串允许位置参数表示法,但它们也允许传统的#34;当他们进入参数列表时#34;排序

但请注意,原因必须指定索引:国际化。如果您决定将格式字符串移动到外部消息包,它通常允许本地化(到其他语言),其中本地化句子中的单词顺序可能与参数中字符串的顺序不匹配列表。

简而言之,您最好坚持指定顺序。如果您发现您的应用程序非常成功并且您在其他国家/地区拥有令人难以置信的销售机会,那么它会让事情变得更轻松,如果只有 ,您可以用他们的语言提供所有消息......