Когда и как следует использовать теги <resource-bundle> и <message-bundle> для локализации в faces-config.xml? Различия между этими двумя не очень ясны для меня.
Интернационализация в JSF, когда использовать набор сообщений и набор ресурсов?
Ответ 1
< сообщение-расслоение >
<message-bundle> должен использоваться всякий раз, когда вы хотите переопределить сообщения об ошибках/сообщениях по умолчанию JSF, которые использовались средствами проверки/преобразования JSF.
Вы можете найти ключи сообщений о предупреждениях/ошибках по умолчанию в главе 2.5.2.4 спецификации :
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, существует также новый API проверки подлинности JSR303 Bean, который представлен этими @NotNull, Size, @Max и т.д. аннотациями javax.validation.constraints. Вы должны понимать, что этот API является полностью не связанным с JSF. Он не является частью JSF, но JSF просто имеет поддержку для него во время фазы валидации. То есть он определяет и распознает наличие реализации JSR303 (например, Hibernate Validator), а затем делегирует ему валидацию (кстати, это может быть отключено с помощью <f:validateBean disabled="true"/>).
В соответствии с разделом 4.3.1.1 спецификации Accept-Language заголовке HTTP-запроса. То же самое относится к стране, например. _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, как запомнить выбранную локаль за сеанс вместо запроса/просмотра.