2015-05-07 111 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请求的整个生命周期内保持一致。

相关问题