一个视图中有多个区域设置/包

时间:2012-01-25 16:09:21

标签: jsf-2 internationalization bundle

我们在 JSF 2.0 中有一个用户界面,它分为两部分:一部分位于用户区域设置中,另一部分位于所选区域设置中。例如,如果用户是决定选择英语的法国人,则该页面的某些组成部分是法语,其他部分则是英语。

有可能实现这个目标吗?

简单f:loadBundle不接受任何语言环境并使用其父f:view中定义的语言环境,因此我们似乎只能为每个视图定义一个语言环境。

也许我们可以使用多个f:view?我们尝试了一下,服务器没有抱怨那么多,但是JavaDoc说f:view是“用于所有 JavaServer Faces核心的容器和使用的自定义组件操作一个页面“,所以我不认为这样做应该是安全的。

2 个答案:

答案 0 :(得分:3)

通过<f:loadBundle>手段无法做到这一点。您确实在整个视图中只有一个区域设置,并且不允许嵌套<f:view>标记(从技术上讲,它将起作用,但嵌套标记将被忽略)。

最好的办法是创建一个扩展ResourceBundle的托管bean,将捆绑包装在所需的语言环境中,并将调用委托给它。像这样:

@ManagedBean
@RequestScoped
public class BundleBean extends ResourceBundle {

    private ResourceBundle wrapped;

    public BundleBean() {
        // You can get/supply the locale as a parameter or property.
        // Again, just a basic kickoff example.
        wrapped = ResourceBundle.getBundle("com.example.i18n.text", new Locale("fr"));
    }

    @Override
    protected Object handleGetObject(String key) {
        return wrapped.getObject(key);
    }

    @Override
    public Enumeration<String> getKeys() {
        return wrapped.getKeys();
    }

}

您可以通常的方式使用它:

#{bundleBean.someKey}
#{bundleBean['some.key.with.periods']}

答案 1 :(得分:0)

为什么不将英文值放在默认资源包中(没有后缀的那个)?这样,如果当前语言环境没有匹配的字符串,它就会显示出来。