jsf - JSF国际化,什么时候使用message-bundle和resource-bundle?

标签 jsf localization internationalization

我应该何时以及如何使用<resource-bundle><message-bundle> faces-config.xml 中的本地化标签?我不太清楚这两者之间的区别。

最佳答案

<消息包>

<message-bundle>每当您想要覆盖 JSF 验证/转换内容所使用的 JSF 默认警告/错误消息时,就可以使用它。 您可以在 JSF specification 的第 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>在每个 View 中。

例如,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,由 @NotNull 表示。 , Size , @Max javax.validation.constraints 的注释包裹。您应该了解此 API 与 JSF 完全无关。它不是 JSF 的一部分,但 JSF 恰好在验证阶段支持它。 IE。它确定并识别 JSR303 实现(例如 Hibernate Validator)的存在,然后将验证委托(delegate)给它(顺便说一句,可以使用 <f:validateBean disabled="true"/> 禁用它)。

根据 JSR303 specification 第 4.3.1.1 章,自定义 JSR303 验证消息文件需要完全名称 ValidationMessages_xx_XX.properties并且需要将其放置在类路径的中(因此,不要放在包中!)。

<小时/>

本地化

在上面的示例中,_xx_XX文件名中代表(可选)语言和国家/地区代码。如果完全不存在,那么它将成为默认(后备) bundle 。如果存在该语言,例如_en ,那么当客户端在 Accept-Language 中明确请求使用这种语言时,就会使用它。 HTTP 请求 header 。这同样适用于国家,例如_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> 设置所需的区域设置。另请参阅Localization in JSF, how to remember selected locale per session instead of per request/view .

关于jsf - JSF国际化,什么时候使用message-bundle和resource-bundle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2668161/

相关文章:

ajax - 带有浏览器历史记录/标签的 PrimeFaces Ajax 导航

jsf - 在 JSF 数据表中显示 Hibernate/JPA 结果会导致 : java. lang.NumberFormatException:对于输入字符串: "[propertyname]"

python - 如何为 flask 应用程序设置空白默认语言环境?

c# - 有没有更好的方法来管理本地化字符串?

JSF 传递参数的最佳方式

jsf - 在 JSF 2.3 中通知用户 session 结束

php - 使用 gettext 在 PHP 中添加对 i18n 的支持?

php - 如何将内联翻译导出到另一个 Magento 商店?

javascript - 如何以 reCAPTCHA 形式重写链接文本? (本地化问题)

ruby-on-rails - 我应该使用哪种方法将产品翻译存储在数据库中?