JSF中的国际化,何时使用消息捆绑和资源捆绑?


84

我应该何时以及如何使用<resource-bundle><message-bundle>标记进行本地化faces-config.xml?这两个之间的区别对我来说不是很清楚。

Answers:


148

<消息包>

<message-bundle>每当你要覆盖其被使用的JSF验证/转换的东西JSF默认的警告/错误信息将被使用。您可以在JSF规范的第2.5.2.4章中找到默认警告/错误消息的键。

例如,以下软件包中的Messages_xx_XX.properties文件com.example.i18n将覆盖默认required="true"消息:

com/example/i18n/Messages_en.properties

javax.faces.component.UIInput.REQUIRED = {0}: This field is required

com/example/i18n/Messages_nl.properties

javax.faces.component.UIInput.REQUIRED = {0}: Dit veld is vereist

可以按以下方式配置(没有语言环境说明符_xx_XX和文件扩展名!):

<message-bundle>com.example.i18n.Messages</message-bundle>

<资源束>

<resource-bundle>每当你想注册一个本地化资源束,其在整个JSF应用程序可用而不需要指定要使用的<f:loadBundle>在每一个单一视图。

例如,软件包中的Text_xx_XX.properties文件com.example.i18n如下:

com/example/i18n/Text_en.properties

main.title = Title of main page
main.head1 = Top heading of main page
main.form1.input1.label = Label of input1 of form1 of main page

com/example/i18n/Text_nl.properties

main.title = Titel van hoofd pagina
main.head1 = Bovenste kop van hoofd pagina
main.form1.input1.label = Label van input1 van form1 van hoofd pagina

可以按以下方式配置(没有语言环境说明符_xx_XX和文件扩展名!):

<resource-bundle>
    <base-name>com.example.i18n.Text</base-name>
    <var>text</var>
</resource-bundle>

并用于main.xhtml以下用途:

<h:head>
    <title>#{text['main.title']}</title>
</h:head>
<h:body>
    <h1 id="head1">#{text['main.head1']}</h1>
    <h:form id="form1">
        <h:outputLabel for="input1" value="#{text['main.form1.input1.label']}" />
        <h:inputText id="input1" label="#{text['main.form1.input1.label']}" />
    </h:form>
</h:body>

ValidationMessages(JSR303 Bean验证)

由于Java EE 6 / JSF 2,这里还有其由那些代表的新的JSR303 Bean验证API @NotNullSize@Max等注解的javax.validation.constraints包。您应该了解,此APIJSF完全无关。它不是JSF的一部分,但是JSF恰好在验证阶段对此提供了支持。即,它确定并识别JSR303实现(例如Hibernate Validator)的存在,然后将验证委托给它(可以使用禁用它<f:validateBean disabled="true"/>,顺便说一下)。

根据JSR303规范的第4.3.1.1章,自定义JSR303验证消息文件需要确切地具有名称ValidationMessages_xx_XX.properties,并且需要将其放置在类路径的根目录中(因此,不要放在包中!)。


本土化

在以上示例中,_xx_XX文件名中的代表(可选)语言和国家/地区代码。如果完全不存在,则它将成为默认(备用)捆绑包。如果存在该语言(例如)_en,则当客户端在Accept-LanguageHTTP请求标头中显式请求该语言时,将使用该语言。这同样适用于该国家/地区,例如_en_US_en_GB

您通常可以在中的<locale-config>元素中为消息和资源包指定支持的语言环境faces-config.xml

<locale-config>
    <default-locale>en</default-locale>
    <supported-locale>nl</supported-locale>
    <supported-locale>de</supported-locale>
    <supported-locale>es</supported-locale>
    <supported-locale>fr</supported-locale>
</locale-config>

所需的语言环境需要通过设置<f:view locale>。另请参见JSF中的本地化,如何记住每个会话而不是每个请求/视图的选定语言环境


1
您好Balus C,我们可以使用多个<message-bundle>以及如何从Java bean调用它吗?
T8Z 2014年

使用<resource-bundle>时,需要特别注意文件夹结构。如果说在faces-config.xml <resource-bundle> <base-name> org.abc.def.messages </ base-name> <var> msg </ var> </ resource-bundle>中具有以下内容,则所有message.properties,message_es.properties,message_de.properties仅应位于“ src / main / resources / org / abc / def文件夹”中。即不要在“ def”文件夹下创建“ messages”文件夹。直到“ def”是资源束所期望的位置,它希望在其中找到所有message_xx.properties文件。
拉胡尔·赛尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.