На моей странице JSF2 я использую интернационализировавшие сообщения об ошибках.
В моем бобе поддержки я помещаю сообщения в Объем флэш-памяти:
flash.put("error", exception.getType());
На странице эта строка переводится этот путь:
<h:outputText value="#{bundle[flash.error]}"/>
Хорошо работает.
ТЕПЕРЬ я хочу также смочь поместить (произвольное число) параметры в текст сообщения, который вставляется в заполнителей в i18n-свойстве в моем message.properties. Поэтому я помещаю параметры как Массив строк в Объем Flash, как это:
//exception.getParameters returns String[]
flash.put("errorParams", exception.getParameters())
Теперь я также хочу смочь использовать этот Массив строк в качестве параметров для outputFormat элемента, вставить их в свойство как Welcome, {0} {1}
. Таким образом, я пытался достигнуть этого при помощи ui:repeat:
<h:outputFormat value="#{bundle[flash.error]}" rendered="#{! empty flash.error}" class="invalid">
<ui:repeat value="#{flash.errorParams}" var="_param">
<f:param value="#{bundle[_param]}"/>
<!-- also doesn't work: <f:param value="#{_param}"/>-->
</ui:repeat>
</h:outputFormat>
К сожалению, значение параметрического усилителя проигнорировано, и заполнители i18n-свойства не заменяются, таким образом, представленный вывод Welcome, {0} {1}
. При использовании "обычного" повторителя, отображении элементов массива так же, как outputtext, это работает. Таким образом, тег outputFormat, кажется, не поддерживает использование повторения как ребенок. Чертовски, так близко ;) Кто-либо знает хороший способ сделать то, что я хочу, или есть ли какая-либо библиотека компонентов, поддерживающая что-то как этот?
Проблема в том, что ui: repeat
- это дочерний элемент времени рендеринга h: outputFormat
, который он действительно вообще не поддерживает. Вы хотите поместить несколько элементов f: param
непосредственно в качестве дочерних элементов h: outputFormat
во время сборки.
c: forEach
подходит для этой задачи. Основные теги JSTL (которые уже включены в Facelets, поэтому вам не нужно устанавливать дополнительные JAR) выполняют свою работу во время построения дерева представления, прямо перед тем, как JSF перейдет к процессу / визуализировать дерево представления.
<html xmlns:c="http://java.sun.com/jsp/jstl/core">
...
<h:outputFormat value="#{bundle[flash.error]}" rendered="#{! empty flash.error}" class="invalid">
<c:forEach items="#{flash.errorParams}" var="_param">
<f:param value="#{bundle[_param]}"/>
</c:forEach>
</h:outputFormat>