jsf2 f:selectItem itemLabel complex i18n render

时间:2012-08-13 15:48:10

标签: jsf internationalization tags el

我有一个f:selectitem及其itemLabel,我希望将标签呈现为“漂亮”!

问题:

<p:selectOneRadio id="selectRadio" value="#{somebean.somevalue}" layout="pageDirection" >
<f:selectItem itemLabel="#{msg['message.1']}" itemValue="1" />
<f:selectItem itemLabel="#{msg['message.2']}" itemValue="2" />
</p:selectOneRadio>

我的属性i18n文件:

message.1=some message by {0}
message.2=another message by {0}

我想通过#{somebean.theUser}进行{0}的内联替换 结果应该是这样的(粗体包括):

some message by <b>HUSTON</b>

在标记文件中,我应该做这样的事情(或以类似的方式)

<f:selectItem itemLabel="#{msg['message.1']{'<b>'+somebean.theUser+'</b>'}}" itemValue="1" />

换句话说,我想直接将i18n字符串param替换添加到itemLabel标记中。

我尝试使用<f:facet name="itemLabel">,但没有尝试。

有人可以帮助我吗?

感谢您的建议,

Agharta

1 个答案:

答案 0 :(得分:2)

JSF不会让你从标记方面那样做。没有办法使用例如<h:outputFormat />

相反,您需要简单地创建一个bean,它将从属性文件中读取内容并相应地格式化:

<p:selectOneRadio id="selectRadio" value="#{somebean.somevalue}" layout="pageDirection" >
<f:selectItem itemLabel="#{helperbean.someMessage}" itemValue="1" />
<f:selectItem itemLabel="#{helperbean.anotherMessage}" itemValue="2" />
</p:selectOneRadio>

这是你的bean中的JSF部分:

public String getSomeMessage() {
  // Actually you need some common access helper, it is just simplified example
  String messagePattern = null;
  try {
    ResourceBundle rb = ResourceBundle.getBundle("path/to/properties/file");
    String messagePattern = rb.getString("message.1");
    return MessageFormat.format(messagePattern, somebean.getTheUser());
  } catch (MissingResourceException mre) {
     logger.warn("Missing resource file or resource key", mre);
     return "!message.1!"; // That will show you where the problem is
  }
}

关于可本地化的其他几点:

  1. 请使用有意义的密钥名称。像“message.1”这样的东西没有为译者提供任何背景信息。我不知道你在做什么,但也许“some-module.select.message.radio.message.sent.by.pattern”会更好 - 翻译需要知道a)它将在哪里显示, b)本文的目的是什么(无论是一些描述,消息模式,一般文本,窗口/对话框标题,按钮标题等)。务必为他们提供这样的背景。

  2. 请务必在邮件本身中包含格式标记。这意味着,消息应该在属性文件中看起来像message.1=some message by <b>{0}</b>。你会惊讶地发现这些标签需要被删除(或者用其他重点手段替换)。你应该特别小心,因为你似乎正在使用RTL语言做一些事情,粗体字体不适合它们。