我有一个JSF基础Web应用程序,我使用h:outputFormat
和f:param
在本地化字符串文字中注入参数值。
这是我的JSF:
<h:outputFormat value="#{msg['camelComplaint']}">
<f:param value="#{crusadeBean.camelCount}" />
</h:outputFormat>
这是我的留言:
camelComplaint=Sallah, I said no camels. That's {0} camels. Can't you count?
这是生成的输出:
Sallah, I said no camels. That's 5 camels. Can't you count?
这一切都很好并且符合预期。但是,我想强调注入的参数值。也就是说,我想创建以下输出:
Sallah, I said no camels. That's <span class="ui-highlight">5</span> camels. Can't you count?
是否有方便的方式来设置各个参数的样式?
这是我到目前为止所尝试的:
将字符串文字拆分为多个部分并使用多个h:outputText
:
<h:outputText value="#{msg['camelComplaint.part0']} " />
<h:outputText value="#{crusadeBean.camelCount}" styleClass="ui-highlight" />
<h:outputText value=" #{msg['camelComplaint.part1']}" />
使用:
camelComplaint.part0=Sallah, I said no camels. That's
camelComplaint.part1=camels. Can't you count?
虽然这会创建所需的输出,但如果需要在本地化中切换某些参数的顺序,则会失败。它还需要部分文字(参数值周围的空格)在JSF中,并且可以说是一个相当难看的解决方案。
将原始HTML添加到参数值:
<h:outputFormat value="#{msg['camelComplaint']}" escape="false">
<f:param value="<span class="ui-highlight">#{crusadeBean.camelCount}</span>" />
</h:outputFormat>
这再次创建了所需的输出,但取决于escape="false"
的用法。这意味着如果参数值包含某些字符(例如<
或>
)或者完全是危险的,如果参数值是用户生成的内容(因为它允许代码),此解决方案可能会中断注射)。代码也不太可读。
将原始HTML添加到字符串文字:
<h:outputFormat value="#{msg['camelComplaint']}" escape="false">
<f:param value="#{crusadeBean.camelCount}" />
</h:outputFormat>
使用:
camelComplaint=Sallah, I said no camels. That's <span style="ui-highlight">{0}</span> camels. Can't you count?
这再次创建了所需的输出,但也取决于escape="false"
的用法,因此遇到与先前解决方案相同的问题。此外,它将部分布局移动到本地化。
答案 0 :(得分:2)
令人惊讶的OmniFaces在这里得到了拯救(就像许多其他地方一样)。它f:param
替换value
,也接受内容子项,旁边使用camelComplaint=Sallah, I said no camels. That's {0} camels. Can't you count?
属性。假设您的原始本地化:
o:param
使用原始代码,解决方案2和使用<h:outputFormat value="#{msg['camelComplaint']}" escape="false">
<o:param>
<span class="ui-highlight">
<h:outputText value="#{crusadeBean.camelCount}" />
</span>
</o:param>
</h:outputFormat>
的混合,以下内容将起作用
styleClass
如果你只是需要一种风格,你可以,正如你自己正确地纠正我一样,在h:outputText
上使用<h:outputFormat value="#{msg['camelComplaint']}" escape="false">
<o:param>
<h:outputText value="#{crusadeBean.camelCount}" styleClass="ui-highlight" />
</o:param>
</h:outputFormat>
escape="false"
outputText没有<my:localizationHighlightFormat message="#{msg['camelComplaint']}" value="#{msg['camelComplaint']}" />
因此它将逃脱所有事情! outputFormat没有,所以我假设它接受普通的html并将其渲染为
你可以轻松地将它包装在复合组件中并执行
for(int a = 0; a <= presList.size()-1; a++)