【问题标题】:How to localize JSF 2 composite components如何本地化 JSF 2 复合组件
【发布时间】:2011-12-10 16:47:17
【问题描述】:

我对本地化如何与 JSF 中的复合组件一起工作有一些疑问,我想了解它是如何工作的。

所以我决定用一个小例子来练习复合组件的本地化。

根据建议,我在复合组件所在的完全相同的文件夹中创建了一个 .properties 文件(WebContent/resources 的子文件夹)

labelField1 = FIELD 1
labelField2 = FIELD 2

然后我使用了#{cc.resourceBundleMap.将本地化文本添加到组件实现中:

<html>

<composite:interface>
        ...
</composite:interface>

<composite:implementation>
    <h:form>
            <h:outputText value="#{cc.resourceBundleMap.labelField1}"/>
                                      ...
            <h:outputText value="#{cc.resourceBundleMap.labelField2}"/>
                                              ...
    </h:form>

</composite:implementation> 

</html>

我运行应用程序时的问题是这样的:

SEVERE: Error Rendering View[/index.xhtml]
javax.el.ELException: /resources/custom/demoCustomComponent.xhtml @14,63 value="#{cc.resourceBundleMap.labelField1}": java.lang.NullPointerException
....
Caused by: java.lang.NullPointerException
at javax.faces.component.UIComponent.findComponentResourceBundleLocaleMatch(UIComponent.java:1000)

...

我的问题是:

-我是否需要以某种方式手动加载该消息包或者这应该自动发生?

-我的应用程序中复合组件所在文件夹之外的其他消息包可以干扰这个吗?(我在应用程序的其他地方也有一个 message_en.properties,用于模板和 UI 的其他部分)

-我该如何解决?

【问题讨论】:

    标签: java jsf jakarta-ee jsf-2 java-ee-6


    【解决方案1】:

    资源包的文件名必须与组件的文件名完全相同

    因此,如果您有一个代表复合组件的demoCustomComponent.xhtml 文件,那么您应该有一个包含(默认)本地化消息的demoCustomComponent.properties 文件。您可以使用例如demoCustomComponent_es.properties 将其国际化,但您应该始终在路径中有一个默认值。

    【讨论】:

    • 好的,我明白了。我的应用程序中的其他 UI 本地化可以更改其文件名,只需在 faces-config.xml 中添加捆绑包。但对于复合组件,情况就不同了。现在我修好了。谢谢!
    • 它对我不起作用。我有三个不同语言的 .properties 文件(一个没有 _xx 后缀的默认文件),并且始终从这个默认属性文件填充消息。我尝试使用 FacesContext.getCurrentInstance().getViewRoot().setLocale(locale) 更改语言,并更改我的 Internet 浏览器的语言设置。 L10n 工作的标准(非复合组件)更改。有什么想法吗?
    猜你喜欢
    • 2013-11-10
    • 2011-03-29
    • 2011-09-14
    • 2011-09-28
    • 2012-06-22
    • 1970-01-01
    • 2011-06-27
    • 2013-03-23
    • 2013-04-22
    相关资源
    最近更新 更多