2014-03-12 63 views
0

我有一個簡單的bean在會話範圍內提供「翻譯方法」JSF/CDI:用綠豆請求字符串從資源

String getText(String key, Object args ...) { 

    ...// lookup in property resource 
    return value; 
} 

我想叫這個bean讓我的UI組件本地化的文本字符串。當試圖呼叫上述功能時,例如通過

 <p:outputLabel for="name" value="#{lang.getText(xyz,arg1)}" /> 
     <p:inputText id="name" value="#{formProject.entity.name}"/> 
     <p:message for="name" id="msgName" /> 

我得到java.lang.IllegalArgumentException異常:錯誤的參數數目

現在,我的問題

1) Is this generally a good alternative to <f:loadBundle> to localize my components? 
2) Since I am able to address my nested bean fields via bean1.bean2.myfield 
    how to avoid conflicts when adressing the properties dot-sepatated, 
    i.e. x.y.z instead of xyz? 

我不認爲我是在右邊跟蹤當前...

回答

3

通常你應該使用

<?xml version='1.0' encoding='UTF-8'?> 
<faces-config version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"> 

    <application> 
     <locale-config> 
      <default-locale>it</default-locale> 
      <supported-locale>it</supported-locale> 
      <supported-locale>en</supported-locale> 
      <supported-locale>de</supported-locale> 
     </locale-config> 

     <resource-bundle> 
      <base-name>/bundle</base-name> 
      <var>bundle</var> 
     </resource-bundle> 
    </application> 

</faces-config> 

,並通過

<p:outputLabel for="name" value="#{bundle.foo}" /> 
<p:inputText id="name" value="#{formProject.entity.name}"/> 
<p:message for="name" id="msgName" /> 

獲取標籤,但同時,你可以訪問點名稱這樣

<p:outputLabel for="name" value="#{bundle['foo.bar']}" /> 

你不能傳遞參數(我不知道如何在沒有插補器的情況下做到這一點,或者如果可能的話)

的混合解決方案可以是

@ManagedBean 
public class LabelBean 
{ 
    private String getText(String key, String... args) 
    { 
     String message = Faces.evaluateExpressionGet("#{bundle['" + key + "']}"); 
     return MessageFormat.format(message, args); 
    } 

    public String getText1(String key, String arg) 
    { 
     return getText(key, arg); 
    } 

    public String getText2(String key, String arg1, String arg2) 
    { 
     return getText(key, arg1, arg2); 
    } 
} 

在類似的方式提出@hwellmann(1)

+0

感謝您的回答,很好的解決方法...... –

2

表達式語言不支持帶可變參數的方法表達式。作爲一種變通方法,您可以介紹的方法

String getText2(String key, Object arg1, Object arg2); 
String getText3(String key, Object arg1, Object arg2, Object arg3); 

關於2),只需使用#{lang.getText('x.y.z',arg1)}

+0

我認爲如此。通過用戶定義的標籤調用多參數函數時會遇到同樣的問題。 –