当值取决于bean条件时,加载捆绑字符串(以正确的语言)



我对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}" 
     }
  }
}

只是为了明确说明它不起作用。我正在寻找有效的类似解决方案(或任何解决方案)。
感谢您的阅读。

不要那样做。该模型不应该意识到视图。本地化也不严格属于模型。该模型应该准备一些视图必须注意的状态。

一种方法是:

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,如以下相关问题所示:资源捆绑中的枚举值以及如何在f:selectItem(s)中使用枚举值。

您现在不起作用的原因,是因为outputTextvalue属性被评估为普通字符串,而不是EL表达式。

通过您现在正在使用的工作,最好的方法是将资源捆绑直接注入您的bean:

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

然后,

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

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


在您最初的问题的无关注释上,您还应该知道,通常不建议将处理逻辑埋在您的Getter中。一方面,在您的页面渲染过程中,getter被多次称为。同样为此,您应该能够确保值something在单个JSF请求的整个生命周期中保持一致

最新更新