JSF中的国际化,何时使用消息包和资源包?
何时以及如何在faces-config.xml
使用<resource-bundle>
和<message-bundle>
标记进行本地化? 这两者之间的差异对我来说不是很清楚。
<邮件束>
每当你想覆盖JSFvalidation/转换材料使用的JSF默认警告/错误消息时,就会使用<message-bundle>
。 您可以在JSF规范的章节2.5.2.4中find默认警告/错误消息的键。
例如,下面的com.example.i18n
包中的Messages_xx_XX.properties
文件覆盖默认的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
可以configuration如下(没有区域说明符_xx_XX
和文件扩展名):
<message-bundle>com.example.i18n.Messages</message-bundle>
<资源束>
每当你想要注册一个本地化的资源包,在整个JSF应用程序中都可以使用<resource-bundle>
,而不需要在每个视图中指定<f:loadBundle>
。
例如, com.example.i18n
包中的Text_xx_XX.properties
文件如下:
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
可以configuration如下(没有区域说明符_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 Beanvalidation)
从Java EE 6 / JSF 2开始,还有新的JSR303 BeanvalidationAPI,由javax.validation.constraints
包的javax.validation.constraints
, Size
, javax.validation.constraints
等注释表示。 你应该明白这个API和JSF是完全无关的 。 这不是JSF的一部分,但JSF恰好在validation阶段支持它。 也就是说,它确定并确认JSR303实现(例如Hibernate Validator)的存在,然后将validation委派给它(可以通过使用<f:validateBean disabled="true"/>
)。
根据JSR303规范的第4.3.1.1 节 ,自定义JSR303validation消息文件需要具有名称ValidationMessages_xx_XX.properties
,并且需要将其放在类path的根目录 (因此不在包中!)。
本土化
在上面的例子中,文件名中的_xx_XX
代表(可选的)语言和国家代码。 如果这完全不存在,则它成为默认(后备)捆绑。 如果语言存在,例如_en
,则在客户端在Accept-Language
HTTP请求头中显式请求该语言时使用该Accept-Language
。 国家也是如此,例如_en_US
或_en_GB
。
您可以在faces-config.xml
<locale-config>
元素中为消息和资源包指定支持的语言环境。
<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中的本地化,如何记住每个会话选定的区域设置,而不是每个请求/视图 。