当值取决于 bean 条件时加载包字符串(使用正确的语言)

Load bundle string (in right language) when value depends on bean condition

我对 jsf 和多种语言有疑问。所以我的字符串在 WEB_INF/classes/texte_<lang>.properties 文件中。并像这样访问 <h:outputLabel value="#{messages.err_text}"/> 效果很好。

问题是,我有 <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}" 
     }
  }
}

需要说明的是,这种方式行不通。我正在寻找有效的类似解决方案(或任何解决方案)。
感谢阅读。

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

根据您现在的工作,最好的方法是将资源包直接注入到您的 bean 中:

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

然后,

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

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


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

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

一种方法是:

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 bundle and How to use enum values in f:selectItem(s).