Интернационализация в JSF, когда использовать пакет сообщения и пакет ресурса?

Когда и как я должен использовать <resource-bundle> и <message-bundle> теги для локализации в faces-config.xml? Различия между теми двумя не являются очень четкими мне.

82
задан BalusC 19 June 2016 в 07:55
поделиться

1 ответ

следует использовать всякий раз, когда вы хотите переопределить предупреждение 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>

следует использовать всякий раз, когда вы хотите зарегистрировать локализованный пакет ресурсов, который доступен во всем приложении JSF без необходимости указывать в каждом отдельном представлении.

Например, 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 Validation)

Начиная с Java EE 6 / JSF 2, есть также новый API проверки компонентов JSR303, который представлен аннотациями @NotNull , Size , @Max и т. д. для javax.validation.constraints пакет. Вы должны понимать, что этот API полностью не связан с JSF. Он не является частью JSF, но JSF просто имеет поддержку на этапе проверки. Т.е. он определяет и распознает наличие реализации JSR303 (например, Hibernate Validator), а затем делегирует ему проверку (которая, кстати, может быть отключена с помощью ] ).

В соответствии с главой 4.3.1.1 спецификации JSR303 , пользовательский файл сообщений проверки JSR303 должен иметь ровно имя ValidationMessages_xx_XX.properties и ему необходимо быть помещенным в корень пути к классам (таким образом, не в пакете!).


Локализация

В приведенных выше примерах _xx_XX в имени файла представляет (необязательно) коды языка и страны. Если он вообще отсутствует, он становится пакетом по умолчанию (резервным). Если язык присутствует, например _en , тогда он будет использоваться, когда клиент явно запросил этот язык в заголовке HTTP-запроса Accept-Language . То же самое относится и к стране, например _en_US или _en_GB .

Вы можете указать поддерживаемые языковые стандарты как для сообщения, так и для пакета ресурсов в общем виде в элементе файла 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>

Требуемый языковой стандарт должен быть установлен через . См. Также Локализация в JSF, как запомнить выбранный языковой стандарт для каждого сеанса, а не для каждого запроса / представления .

145
ответ дан 24 November 2019 в 09:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: