Передавать параметры сообщения из набора ресурсов в компоненты, отличные от ** h: outputFormat **
Есть ли удобный способ передать параметры сообщениям из набора ресурсов для компонентов, отличных от h: outputFormat?
Например, это законно:
<h:outputFormat value="#{myBundle['parametricMessage']}">
<f:param value="#{myBundle['someParameterValue']}"/>
</h:outputFormat>
Но мне нужно это для кнопки, вроде этого (которая не будет работать):
<h:commandButton value="#{myBundle['parametricMessage']}">
<f:param value="#{myBundle['someParameterValue']}"/>
</h:commandButton>
Конечно, я могу использовать ссылку вместо кнопки, и я могу выполнить ее через свойство в управляемом bean, но в этом вопросе я ищу способ удобный. кнопка...
Я использую RichFaces 3.3.3, JSF2, facelets.
Ответы
Ответ 1
Как насчет этого подхода?
Выражение EL позволяет вам определить функцию. Сначала вы определяете функцию выражения EL, которая принимает пакет ресурсов, его ключ сообщения и заполнитель параметр и вывести разрешенное сообщение.
public static String geti18nMsg(ResourceBundle bundle ,String msgKey, String paramValue ) {
String msgValue = bundle.getString(msgKey);
MessageFormat messageFormat = new MessageFormat(msgValue);
Object[] args = {paramValue};
return messageFormat.format(args);
}
Затем вызовите эту функцию, чтобы получить разрешенное сообщение в <h:commandButton>
:
<h:commandButton value="#{f:geti18nMsg(myBundle , parametricMessage, someParameterValue)}"/>
Ответ 2
Попробуйте следующее:
<h:commandButton>
<h:outputFormat value="#{myBundle['parametricMessage']}">
<f:param value="#{myBundle['someParameterValue']}"/>
</h:outputFormat>
</h:commandButton>
Btw, это делает то, что вы хотите, а также избегает необходимости писать код bean.
Ответ 3
Ну, я не нашел на этом хорошего ответа, поэтому вопрос останется открытым.
Хорошая практика, которую я обнаружил, состоит в том, чтобы иметь специальный класс, который представляет каждый набор ресурсов (который имеет параметрический материал), а также передавать все сообщения и работать с контекстом (например, приобретать локаль из FacesContext, получать ResourceBundle, применить параметры и т.д.). И, наконец, предоставить доступ к одному элементу такого класса обслуживания из вашего ManagedBean.
Это требует некоторой дополнительной работы, которая должна быть выполнена, но решает проблему и стоит того времени.