Тег h: outputFormat (насколько я знаю) будет использовать только f: param children в качестве параметров.
Если сообщение было ссылкой (вместо h: commandLink ), вы могли бы использовать литералы HTML:
<h:outputFormat escape="false"
value="...seconds, please <a href='etc..." />.
Я бы не советовал пытаться эмулировать h: commandLink, делая это. Может быть возможно найти более богатую версию h: commandLink в сторонней библиотеке , которая делает именно то, что вы хотите.
Простое разбиение строки на две части возможно, но усложняет жизнь переводчикам, и качество перевода может пострадать (особенно если вы делаете это много).
Я бы посмотрел на использование пользовательской функции, подобной этой:
<f:loadBundle basename="i18n.I18n" var="bundle" />
<h:outputText value="#{i18n:fragment(bundle.scheduleUpdateLink, 0)}" />
<h:commandLink>
<h:outputText value="#{bundle.update}" />
</h:commandLink>
<h:outputText value="#{i18n:fragment(bundle.scheduleUpdateLink, 1)}" />
Вывод имеет вид:
After waiting a few seconds, please <script type="text/javascript"><!--
/*JavaScript elided*/
//-->
</script><a href="#"
onclick="return oamSubmitForm('someClientId');">update</a> the page.
Функция поддерживается статическим методом, который разбивает строку и возвращает запрошенный фрагмент:
public static String fragment(String string, int index) {
// TODO: regex probably not complete; ask stackoverflow!
// see http://java.sun.com/javase/6/docs/api/java/text/MessageFormat.html
final String regex = "\\{\\d.*?\\}";
String[] fragments = string.split(regex, index + 2);
return fragments[index];
// TODO: error handling
}
В зависимости от вашей технологии просмотра (Facelets или JSP), объявление функции может немного отличаться:
РЕДАКТИРОВАТЬ: на основе дополнительной информации
JSF использует декларативный подход к созданию интерфейсов. Вам нужен динамический пользовательский интерфейс с упорядоченными дочерними элементами в порядке их появления в переведенной строке. Эти две вещи противоречат друг другу, но еще не все потеряно.
Есть несколько способов подойти к этому.
- Перепроектируйте пользовательский интерфейс, чтобы использовать текст выше, таблицу ввода / управления ниже (популярный подход к форме). Это самое простое решение, но оно может не порадовать вашего дизайнера пользовательского интерфейса.
- Используйте атрибут привязки на панели , чтобы создать и программно упорядочить все. Это может означать много повторяющегося кода в ваших компонентах.
- Напишите пользовательский элемент управления многократного использования, который может выглядеть следующим образом:
.
<ed:formatPane string="click {0} after filling in forename {1} and surname {2}">
<h:commandLink value="#{bundle.linkMsg}" />
<h:inputText value="#{bean.prop1}" />
<h:inputText value="#{bean.prop2}" />
</ed:formatPane>
Возможно, возможно (и меньше работы) просто заменить средство визуализации для h: outputFormat для поддержки произвольных дочерних элементов вместо создания полного пользовательского элемента управления, но я бы поспорил с этим, поскольку это может привести к путанице в течение длительного техническое обслуживание.
Кто-то, возможно, уже написал пользовательский элемент управления, который делает то, что я предлагаю (это вряд ли может быть оригинальной идеей).