Інтернаціоналізація в JSF, коли використовувати пакет повідомлень та пакет ресурсів?


84

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

Відповіді:


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>Буде використовуватися всякий раз , коли ви хочете зареєструвати локалізований пакет ресурсів , який доступний на протязі всього програми 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 Validation)

Оскільки 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, як запам’ятати вибраний регіон за сеанс, а не за запитом / переглядом .


1
Привіт, Balus C, чи можемо ми використовувати декілька <message-bundle> і як його викликати з Java-компонента?
T8Z

Особлива обережність повинна бути приділена структурі папок при використанні <ресурсу- набору>. Якщо ви скажете, що у Face-config.xml <resource-bundle> <name-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". тобто не створюйте папку "повідомлення" під папкою "def". До "def" - це те, чого очікує пакет ресурсів, де він очікує знайти всі файли messages_xx.properties.
Рахул Сайні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.