Передавать параметры сообщения из набора ресурсов в компоненты, отличные от ** 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.

Это требует некоторой дополнительной работы, которая должна быть выполнена, но решает проблему и стоит того времени.