如何在JSF中的单个页面中从两个不同的特定于语言环境的文件加载属性?

时间:2016-05-18 09:26:36

标签: jsf jsf-2 locale

资源包配置为 -

    <resource-bundle>                        
        <base-name>views.msgs.labels</base-name>
        <var>msg</var>
    </resource-bundle>
faces-config.xml中的

resources/views/msgs/ -

中包含2个属性文件
labels_en.properties
labels_fr.properties

有两个部分:

在上一节中,文字/标签需要在English中显示,而在下半部分,文字必须显示在French中。

简单来说,

  <f:view locale="en" >            
            #{msg['hello']}
            #{msg['name']}
  </f:view>
  <f:view locale="fr" >            
            #{msg['HELLO']}
            #{msg['name']}
  </f:view>

两个键hello&amp; name出现在两个属性文件中。

我看到下半部locale="fr"中的f:view会覆盖上面的French

整个输出显示在widgets is undefined

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

不支持此构造。 <f:view>代表UIViewRoot。虽然可以有多个<f:view>标记,但组件树中只能有一个UIViewRoot个实例。后一个<f:view>声明的属性将覆盖之前声明的任何属性。

您最好的选择是通过ResourceBundle API手动加载资源包,并在EL中为其分配一个不同的变量名称。

最简单的方法是使用托管bean。 E.g。

@ManagedBean
@RequestScoped
public class Labels {

    private ResourceBundle french;

    @PostConstruct
    public void init() {
        french = ResourceBundle.getBundle("views.msgs.labels", Locale.FRENCH);
    }

    public ResourceBundle getFrench() {
        return french;
    }

}

(提示:您可以通过<default-locale>获取<supported-locale>s和所有Application

然后使用如下:

Current locale:
#{msg['hello']}
#{msg['name']}

French locale:
#{labels.french['HELLO']}
#{labels.french['name']}

另见: