2

我有 af: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 字符串参数替换直接添加到 itemLabel 标记中。

我试过了, <f:facet name="itemLabel">但没有。

有人可以帮助我吗?

谢谢指教,

阿格哈塔

4

1 回答 1

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>

那是 JSF 的一部分,在你的 bean 中:

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 语言做一些事情,而粗体字体不能很好地使用它们。

于 2012-08-14T17:47:34.940 回答