我有一条消息想扔到HTML页面中,我希望它对打印出来的东西敏感。 java.text.ChoiceFormat可以营救,对吧?

text.messages=You have {0,choice,1#<b>one</b> message|1<<b>{0}</b> messages} waiting for you

这导致ChoiceFormat的构造函数出错:
 java.lang.IllegalArgumentException: Choice Pattern incorrect: 1#<b>one</b> message|1<'<b>'{0}'</b>' messages

我已将问题缩小为消息中的<符号。没问题:我将使用MessageFormat的引用功能来解决此问题:
text.messages=You have {0,choice,1#'<b>'one'</b>' message|1<'<b>'{0}'</b>' messages} waiting for you

不幸的是,这也失败了:
java.lang.IllegalArgumentException: Choice Pattern incorrect: 1#<b>one</b> message|1<''<b>''{0}''</b>'' messages

请注意在错误消息中单引号字符(MessageFormat的转义字符)如何加倍。我觉得我已经接近了,但是我似乎找不到任何文档来解释如何在<模式中使用特殊字符,例如ChoiceFormat

这是失败时得到的完整堆栈跟踪:
Caused by: java.lang.IllegalArgumentException: Choice Pattern incorrect: 1#''<b>''one''</b>'' message|1<''<b>''{0}''</b>'' messages
        at java.text.MessageFormat.makeFormat(MessageFormat.java:1519)
    at java.text.MessageFormat.applyPattern(MessageFormat.java:479)
    at java.text.MessageFormat.<init>(MessageFormat.java:362)
    at org.apache.struts.util.MessageResources.getMessage(MessageResources.java:305)
    at org.apache.velocity.tools.struts.MessageTool.get(MessageTool.java:158)
    at org.apache.velocity.tools.struts.MessageTool.get(MessageTool.java:125)
    at org.apache.velocity.tools.struts.MessageTool.get(MessageTool.java:192)
[...]

最佳答案

您处在正确的轨道上,但没有全部引用:

text.messages=You have {0,choice,1#'<b>'one'</b>' message|1<'<b>'{0}'</b>' messages} waiting for you

要么:
text.messages=You have {0,choice,1#'<b>one</b> message'|1<'<b>'{0}'</b> messages'} waiting for you

10-08 19:37