如何将参数化MessageFormat与JSF组件的非值属性一起使用

如何将参数化MessageFormat与JSF组件的非值属性一起使用,jsf,jsf-2,Jsf,Jsf 2,我有一个用例,在这个用例中,我必须使用资源包在UI上显示各种文本。其中一些资源包条目采用参数(例如{0}),对于这些参数,我使用h:outputFormat,但有时这还不够 e、 g 在资源包中 要在xhtml上显示它,我通常会执行以下操作: <h:outputFormat value="#{msg['someMessage']}"><f:param value="#{someBean.value}"/></h:outputFormat> 当它是一个简单

我有一个用例,在这个用例中,我必须使用资源包在UI上显示各种文本。其中一些资源包条目采用参数(例如{0}),对于这些参数,我使用h:outputFormat,但有时这还不够

e、 g

在资源包中

要在xhtml上显示它,我通常会执行以下操作:

<h:outputFormat value="#{msg['someMessage']}"><f:param value="#{someBean.value}"/></h:outputFormat>

当它是一个简单的用例时,它工作得很好,但是对于更复杂的用例来说,它是不够的。例如,如果我希望commandLink的“title”属性使用上述资源包条目:

    <h:commandLink action="logout" title="#{msg['someMessage']}">
        <f:param value="#{someBean.value}" />
        <h:graphicImage library="images" name="image.png" />
    </h:commandLink>

这不管用。我还尝试:

    <h:commandLink action="logout">
        <f:attribute name="title">
            <h:outputFormat value="#{msg['someMessage']}"><f:param value="#{someBean.value}"/></h:outputFormat>
        </f:attribute>
        <h:graphicImage library="images" name="image.png" />
    </h:commandLink>

这也不起作用,因为f:attibute不允许孩子

即使有黑客绕过这一点(例如使用primefaces中的悬停组件),也有其他字段可能需要参数化消息

有人知道使用MessageFormat在JSF组件的非值字段中获取参数的方法吗?

您可以为此创建一个参数,并最终得到如下结果:

<h:commandLink ... title="#{my:format(msg['someMessage'], someBean.value)}" />


更新:JSF实用程序库中有函数和组件用于此目的。

类似的问题:这是一个不同的问题,因为这是关于值属性的问题,这是直接处理的(我回答了这个问题)。我正在寻找一种将参数化MessageFormat与非值属性结合使用的方法。这种方法的问题是,如果MessageFormat包含2个参数,则需要一个新方法,如果MessageFormat包含3个参数,则需要另一个方法,等等。有没有更优雅的方法?如果没有,那么应该将它添加到JSF的未来版本中,因为默认情况下应该支持它。EL不支持varargs(也没有重载函数名,因此您确实需要
format1()
format2()
format3()
,等等)。注意,这不是JSF限制,而是EL限制。只需创建包含1到5个参数的函数,或者10个。顺便说一句,我个人从未在现实世界中创建/见过一个包含5个以上参数的bundle条目。不,我认为需要的是一种将f:attribute用于子级的方法。这样,您只需将f:attribute的名称设置为使用messageFormat(例如title)的属性名称,其子级可以是h:outputFormat(我上面的第二次尝试就是一个很好的例子)。这将使messageFormat在任何地方都可用,只要所有组件都可以有一个f:attribute子级。这是个好主意,但
不是这样工作的:)我更喜欢
var
属性,这与JSTL的良好“ol
工作原理一致。也许是OmniFaces的另一个想法。那将是很棒的,肯定会对我的项目的国际化/本地化团队有所帮助。很快,OmniFaces将成为JSF的ApacheCommons!
<h:commandLink ... title="#{my:format(msg['someMessage'], someBean.value)}" />
<my:outputFormat ... var="linkTitle">
    ...
</my:outputFormat>
<h:commandLink ... title="#{linkTitle}" />