1

我对 jsf 和多种语言有疑问。所以我的字符串在WEB_INF/classes/texte_<lang>.properties文件中。并且例如 <h:outputLabel value="#{messages.err_text}"/> 可以正常访问。

问题是,我有<h:outputLabel...一个元素,我想根据错误显示错误消息。我想要这样的东西:

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

像这样的豆子

@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}" 
     }
  }
}

只是要清楚,它不是那样工作的。我正在寻找一个类似的解决方案(或任何解决方案)。
谢谢阅读。

4

2 回答 2

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)

于 2015-05-07T15:15:23.487 回答
0

您现在所拥有的东西不起作用的原因是因为 的value属性outputText被评估为纯字符串,而不是 EL 表达式。

按照您现在正在使用的方式,最好的方法是将资源包直接注入到您的 bean 中:

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

接着,

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

如果您不知道,传统上会使用h:message组件显示错误消息。


在与原始问题无关的注释中,您还应该知道通常不建议将处理逻辑隐藏在您的 getter 中。一方面,在渲染页面期间多次调用 getter。此外,为了使其正常工作,您应该能够保证该值something将在单个 JSF 请求的整个生命周期中保持一致

于 2015-05-07T14:44:49.127 回答