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

84

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

jsfQ
источник

Ответы:

148

<связка сообщений>

Он <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>

Его <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)

Поскольку Java EE 6 / JSF 2, есть также новый JSR303 Bean Validation API , который представлен теми @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, как запомнить выбранный языковой стандарт для каждого сеанса, а не для каждого запроса / представления .

BalusC
источник
1
Привет, Балус C, можем ли мы использовать несколько <message-bundle> и как вызвать его из Java-компонента?
T8Z
Особое внимание следует уделять структуре папок при использовании <resource-bundle>. Если, скажем, у вас есть следующее в faces-config.xml <resource-bundle> <base-name> org.abc.def.messages </base-name> <var> msg </var> </resource-bundle>, тогда все message.properties, message_es.properties, message_de.properties должны находиться только в папке src / main / resources / org / abc / def. т.е. не создавайте папку «messages» в папке «def». До def - это то, что пакет ресурсов ожидает там, где он ожидает найти все файлы messages_xx.properties.
Рахул