2016-01-27 10 views
1

У меня есть сообщение, которое я хотел бы бросить в HTML-страницу, и я хотел бы, чтобы он был чувствительным к количеству вещей, которые печатали. java.text.ChoiceFormat на помощь, правда?Как я могу помещать символ меньшего размера в шаблон ChoiceFormat?

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

Этот результат ошибки в конструкторе ChoiceFormat «s:

java.lang.IllegalArgumentException: Choice Pattern incorrect: 1#<b>one</b> message|1<'<b>'{0}'</b>' messages 

Я сужен вниз проблема в < символ в сообщении. Нет проблем: Я не буду использовать MessageFormat «S процитировать возможности исправить это:

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) 
[...] 
+0

Я согласен с голосованием, чтобы закрыть, но я думаю, что ответ имеет некоторую полезность. Я с удовольствием переработал этот вопрос, чтобы как он, так и ответ были лучше подходят для формата SO с вопросом о том, как заставить персонажей требовать ускорения работы с пакетами ресурсов Struts. –

ответ

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> 
-1

Что вы ищете называется «Escape-последовательности символов /». В HTML, вы должны заменить < с &lt; и > с &gt;

Хотя я не помню < необходимости экранировать в Java, вы бы поставить обратную косую черту \ перед символом в Java, чтобы избежать его.

Надеюсь, это поможет!

Спасения столы:

Для Java

Для HTML

+0

Извините, это не сработает: мне нужны те теги, которые на самом деле работают. Свойства Java не будут автоматически вызывать не-HTML-escape-значения. –

+0

Тогда, пожалуйста, уточните свой вопрос, так как это очень неясно. Вы помещаете Java и говорите о HTML. Я дал вам ответ на Java. Включите в свой вопрос то, что вы пытаетесь выполнить. – Spencer4134

+0

Это очень * ясно, что я говорю о HTML на странице. Перечитайте вопрос. –

0

Вы были на правильном пути, но не процитировать все из них:

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 
+0

Собственно, это был надуманный пример, измененный для защиты виновных. Недостающие одиночные кавычки являются опечатками в вопросе. Я уточню вопрос соответствующим образом. В реальном коде все escape-последовательности находятся на своем месте. –

+0

@ChristopherSchultz Ну, оба примера, которые я сделал, и ваше собственное сообщение об ошибке говорит, что вы не процитировали первый набор, поэтому, пожалуйста, попробуйте еще раз. – Andreas

+0

Хм. Я написал драйвер, обернутый вокруг этого примера, и он действительно работает. Существует еще один уровень работы между пакетом ресурсов и «MessageFormat» в моем приложении: Apache Velocity Tools. Возможно, эти удвоенные кавычки являются признаком того, что что-то меняется где-то на этом пути. –