2012-08-13 26 views
2

我有一個f:selectitem與它的itemLabel,我想渲染標籤,使它變得「漂亮」!jsf2 f:selectItem itemLabel complex i18n render

問題:

<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> 

我的國際化屬性文件:

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" /> 

換句話說,我希望將國際化字符串替換PARAM直接添加到itemLabel標籤。

我試着用<f:facet name="itemLabel">但沒有。

有人可以幫助我嗎?

謝謝諮詢,

Agharta

回答

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語言做一些事情,而粗體字體不能很好地與它們一起工作。

+0

@BalusC:通常情況下,我不會和你爭論,但在這種情況下,我必須這樣做。如果你知道如何可靠地傳遞一個參數給selectItem的標籤,請不要猶豫,把你的答案。在一般情況下,我知道如何在JSF中格式化消息。但從我的經驗來看,它不適用於嵌入式案例(比如這個)。至於getBundle()的路徑,它只是表明你應該在這裏放置一個有效的路徑。是的,這是類路徑位置,所以你可能期望「。」作爲分隔符......那麼,我發現a)斜線作品b)經常效果更好。奇怪,但是是真的。 – 2012-08-15 14:49:07