2015-05-07 112 views
1

我有jsf和多種語言的問題。所以我的字符串在WEB_INF/classes/texte_<lang>.properties文件中。並訪問,例如那樣 <h:outputLabel value="#{messages.err_text}"/> 它工作正常。當值取決於bean條件時加載包字符串(使用正確的語言)

問題是,我有<h:outputLabel...元素,我想根據錯誤顯示錯誤消息。我想的東西是這樣的:

<h:outputLabel value="#{someBean.errMsg}/> 

一個bean像

@ManagedBean() 
@SessionScoped 
public class SomeBean{ 
    public String getErrMsg(){ 
    if(something){ 
     return "#{messages.err_text}" 
    }else if(somethingElse){ 
     return "#{messages.err_text2}" 
    }else{ 
     return "#{messages.err_text3}" 
    } 
    } 
} 

只是要清楚它不工作的方式。我正在尋找一種類似的解決方案(或任何解決方案)。
感謝您的閱讀。

回答

1

不要那樣做。模型不應該意識到這個觀點。本地化也不完全屬於模型。相反,模型應該準備一些視圖必須注意的狀態。

一種方法是:

public String getErrMsg(){ 
    if (something) { 
     return "err_text"; 
    } else if (somethingElse) { 
     return "err_text2"; 
    } else { 
     return "err_text3"; 
    } 
} 
<h:outputLabel value="#{messages[someBean.errMsg]}" /> 

其他方式將返回一個enum如下面的相關問題證明:Localizing enum values in resource bundleHow to use enum values in f:selectItem(s)

+0

謝謝,完美的工作。 – AntJOo

+0

不客氣。 – BalusC

0

你現在有什麼不工作的原因是因爲outputTextvalue屬性評估爲普通字符串,而不是EL表達式。

由你與現在的工作去,則最好的方式是直接注入資源包到你的bean:你

@ManagedProperty("#{messages}") 
ResourceBundle messages; 

然後,

public String getErrMsg(){ 
    if(something){ 
     messages.getString("err_text"); 
    } 
} 

萬一」不知道,傳統上,使用h:message組件顯示錯誤消息。


在與原始問題無關的說明中,您還應該知道將處理邏輯隱藏在您的getter中通常是不可取的。首先,在渲染頁面的過程中,多次調用getter。此外,爲了正常工作,您應該能夠保證值something將在單個JSF請求的整個生命週期內保持一致。

相關問題