Internationalisation dans JSF, quand utiliser un bundle de messages et un bundle de ressources?

84

Quand et comment dois-je utiliser les balises <resource-bundle>et <message-bundle>pour la localisation dans faces-config.xml? Les différences entre ces deux éléments ne me sont pas très claires.

jsfQ
la source

Réponses:

148

<message-bundle>

Le <message-bundle>doit être utilisé chaque fois que vous souhaitez remplacer les messages d'avertissement / d'erreur par défaut JSF qui ont été utilisés par les éléments de validation / conversion JSF. Vous pouvez trouver les clés des messages d'avertissement / d'erreur par défaut au chapitre 2.5.2.4 de la spécification JSF .

Par exemple, les Messages_xx_XX.propertiesfichiers dans le com.example.i18npackage comme ci-dessous qui remplacent le required="true"message par défaut :

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

peut être configuré comme suit (sans le spécificateur de paramètres régionaux _xx_XXet l'extension de fichier!):

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

<bundle-source>

Le <resource-bundle>doit être utilisé chaque fois que vous souhaitez enregistrer un ensemble de ressources localisées qui est disponible dans toute l'application JSF sans qu'il soit nécessaire de le spécifier <f:loadBundle>dans chaque vue.

Par exemple, les Text_xx_XX.propertiesfichiers dans le com.example.i18npackage comme ci-dessous:

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

peut être configuré comme suit (sans le spécificateur de paramètres régionaux _xx_XXet l'extension de fichier!):

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

et être utilisé main.xhtmlcomme suit:

<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 (validation du bean JSR303)

Depuis Java EE 6 / JSF 2, il y a aussi la nouvelle API de validation JSR303 Bean qui est représenté par ceux @NotNull, Size, @Max, etc annotations du javax.validation.constraintspaquet. Vous devez comprendre que cette API n'a aucun rapport avec JSF. Il ne fait pas partie de JSF, mais JSF est juste pris en charge pendant la phase de validation. C'est-à-dire qu'il détermine et reconnaît la présence d'une implémentation JSR303 (par exemple Hibernate Validator) et lui délègue ensuite la validation (qui peut être désactivée en utilisant <f:validateBean disabled="true"/>, d'ailleurs).

Conformément au chapitre 4.3.1.1 de la spécification JSR303 , le fichier de messages de validation JSR303 personnalisé doit avoir exactement le nom ValidationMessages_xx_XX.propertieset il doit être placé à la racine du chemin de classe (donc, pas dans un package!).


Localisation

Dans les exemples ci-dessus, le _xx_XXdans le nom de fichier représente la langue (facultative) et les codes de pays. Si cela est complètement absent, il devient le bundle par défaut (de secours). Si la langue est présente, par exemple _en, elle sera utilisée lorsque le client a explicitement demandé cette langue dans l' Accept-Languageen-tête de la requête HTTP. Il en va de même pour le pays, par exemple _en_USou _en_GB.

Vous pouvez spécifier les paramètres régionaux pris en charge pour le message et le groupe de ressources de manière générique dans l' <locale-config>élément de 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>

Les paramètres régionaux souhaités doivent être définis via <f:view locale>. Voir aussi Localisation dans JSF, comment se souvenir des paramètres régionaux sélectionnés par session au lieu de par demande / vue .

BalusC
la source
1
Bonjour Balus C, pouvons-nous utiliser plusieurs <message-bundle> et comment l'appeler depuis java bean?
T8Z
Une attention particulière doit être apportée à la structure des dossiers lors de l'utilisation du <resource-bundle>. Si vous avez ce qui suit dans faces-config.xml <resource-bundle> <base-name> org.abc.def.messages </base-name> <var> msg </var> </resource-bundle> alors tous les messages.properties, message_es.properties, message_de.properties doivent se trouver uniquement dans le 'dossier src / main / resources / org / abc / def'. c'est-à-dire ne créez pas de dossier «messages» sous le dossier «def». Jusqu'à ce que 'def' soit ce à quoi le bundle de ressources attend là où il s'attend à trouver tous les fichiers messages_xx.properties.
Rahul Saini