如何将一个小于号的符号放入ChoiceFormat模式中?

时间:2016-01-27 17:57:15

标签: java internationalization struts

我有一条消息,我想投入一个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)
[...]

3 个答案:

答案 0 :(得分:2)

你走在正确的轨道上,但没有引用所有这些:

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

答案 1 :(得分:0)

Apache Struts 1.x“有用”地逃避资源包中的单引号...大概是这样一个流浪的单引号不会破坏MessageFormat。以下是实施它的修订:

http://svn.apache.org/viewvc?view=revision&revision=48526

可以禁用此转义,但必须基于每个MessageResources来完成:

<message-resources key="MyProperties" parameter="MyProperties">
  <set-property property="escape" value="false" />
</message-resources>

如果你想要一些转义的属性和其他不属于的属性,你可以轻松使用这样的技巧:

<message-resources key="MyProperties" parameter="MyProperties">
  <set-property property="escape" value="false" />
</message-resources>
<message-resources key="MyPropertiesEscaped" parameter="MyPropertiesEscaped">
  <set-property property="escape" value="true" />
</message-resources>

答案 2 :(得分:-1)

您正在寻找的内容被称为&#34;转义序列/字符&#34;。在HTML中,您可以将<替换为&lt;,将>替换为&gt;

虽然我不记得需要在Java中转义的<,但是你会在Java中的字符前加一个反斜杠\来逃避它。

希望这有帮助!

逃生表:

Java

HTML