2012-01-25 27 views
1

我们在JSF 2.0中有一个UI,它分为两部分:一部分位于用户语言环境中,另一部分位于所选语言环境中。例如,如果用户是决定选择英语的法国人,则该页面的一些组件是法语的,其他一些是英语的。一个视图中的多个语言环境/软件包

是否有可能实现这一目标?

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

也许我们可以使用多个f:view?我们尝试了一下,但服务器没有太多抱怨,但JavaDoc说f:view是“Container for 全部 JavaServer Faces核心和自定义组件动作在页面”,所以我不会猜测这样做应该是安全的。

回答

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']} 
+0

我想过一个'Bean'其中包含了'ResourceBundle',但是使它_extends_'ResourceBundle'是真聪明,因为它清楚地简化JSF页面中使用它。 顺便说一句,是什么让我们在这里做这样'#{} myBean.someKey电话'就算豆没有一个明确的'getSomeKey()'方法? 'ResourceBundle'有什么特别之处? –

+0

这是正确的。 ''ResourceBundleEL''有特殊待遇['ResourceBundleELResolver'](http://docs.oracle.com/javaee/6/api/javax/el/ResourceBundleELResolver.html)。 – BalusC

+0

那么,这将完全做我们需要的工作。非常感谢! –

0

为什么不干脆把英语值缺省资源束(一种不带后缀)?这样,如果当前语言环境没有匹配的字符串,它会显示。

+0

这不正是OP所要求的:*“分为两部分:一部分在用户区域,另一部分在选定区域”*。我想它是某种后端管理屏幕的一部分。 – BalusC

+0

我同意@BalusC,他回答合适。 –

相关问题