我们在 JSF 2.0 中有一个用户界面,它分为两部分:一部分位于用户区域设置中,另一部分位于所选区域设置中。例如,如果用户是决定选择英语的法国人,则该页面的某些组成部分是法语,其他部分则是英语。
有可能实现这个目标吗?
简单f:loadBundle
不接受任何语言环境并使用其父f:view
中定义的语言环境,因此我们似乎只能为每个视图定义一个语言环境。
也许我们可以使用多个f:view
?我们尝试了一下,服务器没有抱怨那么多,但是JavaDoc说f:view是“用于所有 JavaServer Faces核心的容器和使用的自定义组件操作一个页面“,所以我不认为这样做应该是安全的。
答案 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)
为什么不将英文值放在默认资源包中(没有后缀的那个)?这样,如果当前语言环境没有匹配的字符串,它就会显示出来。