Internacjonalizacja w JSF, kiedy używać pakietu komunikatów i pakietu zasobów?

84

Kiedy i jak używać tagów <resource-bundle>i <message-bundle>do lokalizacji w faces-config.xml? Różnice między tymi dwoma nie są dla mnie zbyt jasne.

jsfQ
źródło

Odpowiedzi:

148

<message-bundle>

Ma <message-bundle>być używany za każdym razem, gdy chcesz zastąpić domyślne ostrzeżenia / komunikaty o błędach JSF, które są używane przez elementy sprawdzania poprawności / konwersji JSF. Klucze domyślnych komunikatów ostrzegawczych / komunikatów o błędach można znaleźć w rozdziale 2.5.2.4 specyfikacji JSF .

Na przykład Messages_xx_XX.propertiespliki w com.example.i18npakiecie jak poniżej, które zastępują domyślny required="true"komunikat:

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

można skonfigurować w następujący sposób (bez specyfikatora ustawień regionalnych _xx_XXi rozszerzenia pliku!):

<message-bundle>com.example.i18n.Messages</message-bundle>

<resource-bundle>

Ma <resource-bundle>być używany, gdy chcesz zarejestrować zlokalizowany pakiet zasobów, który jest dostępny w całej aplikacji JSF bez konieczności określania <f:loadBundle>w każdym pojedynczym widoku.

Na przykład Text_xx_XX.propertiespliki w com.example.i18npakiecie jak poniżej:

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

można skonfigurować w następujący sposób (bez specyfikatora ustawień regionalnych _xx_XXi rozszerzenia pliku!):

<resource-bundle>
    <base-name>com.example.i18n.Text</base-name>
    <var>text</var>
</resource-bundle>

i być używane w main.xhtmlnastępujący sposób:

<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)

Ponieważ Java EE 6 / JSF 2, jest również nowy API JSR303 Bean Validation który jest reprezentowany przez tych @NotNull, Size, @Maxitp adnotacji na javax.validation.constraintsopakowaniu. Należy zrozumieć, że ten interfejs API nie jest całkowicie powiązany z JSF. Nie jest częścią JSF, ale JSF po prostu obsługuje go na etapie walidacji. Oznacza to, że określa i rozpoznaje obecność implementacji JSR303 (np. Hibernate Validator), a następnie deleguje do niej walidację (którą można wyłączyć <f:validateBean disabled="true"/>, przy okazji).

Zgodnie z rozdziałem 4.3.1.1 specyfikacji JSR303 , niestandardowy plik komunikatów walidacyjnych JSR303 musi mieć dokładnie taką nazwę ValidationMessages_xx_XX.propertiesi musi być umieszczony w katalogu głównym ścieżki klas (a więc nie w pakiecie!).


Lokalizacja

W powyższych przykładach znak _xx_XXw nazwie pliku reprezentuje (opcjonalne) kody języków i krajów. Jeśli jest całkowicie nieobecny, staje się pakietem domyślnym (rezerwowym). Jeśli język jest obecny, np _en. Zostanie użyty, gdy klient wyraźnie zażądał tego języka w Accept-Languagenagłówku żądania HTTP. To samo dotyczy kraju, np . _en_USLub _en_GB.

Można określić obsługiwane ustawienia narodowe zarówno dla wiadomości, jak i pakunku zasobów, ogólnie w <locale-config>elemencie 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>

Żądane ustawienie regionalne należy ustawić za pomocą <f:view locale>. Zobacz także Lokalizacja w JSF, jak zapamiętać wybrane ustawienia regionalne na sesję zamiast na żądanie / widok .

BalusC
źródło
1
Witaj Balus C, czy możemy użyć wielu <message-bundle> i jak wywołać to z java bean?
T8Z
Podczas korzystania z <resource-bundle> należy zwrócić szczególną uwagę na strukturę folderów. Jeśli powiedz, że masz następujące elementy w plikach faces-config.xml <resource-bundle> <base-name> org.abc.def.messages </base-name> <var> msg </var> </resource-bundle>, to wszystkie message.properties, message_es.properties, message_de.properties powinny znajdować się tylko w folderze „src / main / resources / org / abc / def”. tj. nie twórz folderu „wiadomości” w folderze „def”. Dopóki „def” nie jest tym, czego pakiet zasobów oczekuje, gdy spodziewa się znaleźć wszystkie pliki messages_xx.properties.
Rahul Saini,