将参数从资源包传递到消息到 **h:outputFormat** 之外的组件

发布于 2024-11-01 22:58:50 字数 619 浏览 1 评论 0原文

是否有一种方便的方法将参数从资源包传递到除 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。

Is there a convenient way to pass parameters to messages from resource bundle to components other than h:outputFormat?

For instance, this is legal:

<h:outputFormat value="#{myBundle['parametricMessage']}">
    <f:param value="#{myBundle['someParameterValue']}"/>
</h:outputFormat>

But I need it for a button, like this (which won't work):

<h:commandButton value="#{myBundle['parametricMessage']}">
    <f:param value="#{myBundle['someParameterValue']}"/>
</h:commandButton>

Of course, I can use link instead of button, and I can make it through a property in a managed bean, but in this question I'm seeking for a convenient way to use the button...

I'm using RichFaces 3.3.3, JSF2, facelets.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

〃安静 2024-11-08 22:58:50

这种方法怎么样?

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 value="#{f:geti18nMsg(myBundle , parametricMessage, someParameterValue)}"/>

How about this approach ?

EL expression allow you to define a function .You first define a EL expression 's function , which accepts a resource bundle , its message key and placeholder 's parameter and output the resolved message .

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);
}

Then call this function to get the resolved message in the <h:commandButton> :

<h:commandButton value="#{f:geti18nMsg(myBundle , parametricMessage, someParameterValue)}"/>
卷耳 2024-11-08 22:58:50

试试这个:

<h:commandButton>
    <h:outputFormat value="#{myBundle['parametricMessage']}">
        <f:param value="#{myBundle['someParameterValue']}"/>
    </h:outputFormat>
</h:commandButton>

顺便说一句,这可以满足您的要求,并且还可以避免编写支持 bean 代码。

Try this:

<h:commandButton>
    <h:outputFormat value="#{myBundle['parametricMessage']}">
        <f:param value="#{myBundle['someParameterValue']}"/>
    </h:outputFormat>
</h:commandButton>

Btw, this does what you want and also avoids having to write backing bean code.

七堇年 2024-11-08 22:58:50

好吧,我没有找到很好的答案,所以这个问题仍然悬而未决。
我发现的一个好的做法是有一个特殊的类来表示每个资源包(具有参数化的东西),并传输所有消息形成,并在那里使用上下文(例如,从 FacesContext 获取语言环境,获取 ResourceBundle ,应用参数等)。最后从 ManagedBean 提供对此类服务类的单例的访问。

这需要完成一些额外的工作,但可以解决问题并且值得花时间。

Well I didn't find good answer on that, so the question will remain open.
A good practice I've discovered, is to have a special class that represents each resource bundle (that has parametric stuff), and to transfer all the message formation, and working with context there (like, acquire locale from FacesContext, get a ResourceBundle, apply parameters, etc). And finally to provide access to a singleton of such service class from your ManagedBean.

This requires some additional work to be done, but solves the problem and is worth of the time.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文