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