Internazionalizzazione in JSF, quando utilizzare message-bundle e resource-bundle?


84

Quando e come devo utilizzare i tag <resource-bundle>e <message-bundle>per la localizzazione in faces-config.xml? Le differenze tra i due non mi sono molto chiare.

Risposte:


148

<message-bundle>

Deve <message-bundle>essere utilizzato ogni volta che si desidera sovrascrivere i messaggi di avviso / errore predefiniti JSF che sono stati utilizzati dalla convalida / conversione JSF. È possibile trovare le chiavi dei messaggi di avviso / errore predefiniti nel capitolo 2.5.2.4 della specifica JSF .

Ad esempio, Messages_xx_XX.propertiesfile nel com.example.i18npacchetto come di seguito che sovrascrive il required="true"messaggio predefinito :

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

può essere configurato come segue (senza l'identificatore locale _xx_XXe l'estensione del file!):

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

<resource-bundle>

Deve <resource-bundle>essere utilizzato ogni volta che si desidera registrare un bundle di risorse localizzato disponibile nell'intera applicazione JSF senza la necessità di specificare <f:loadBundle>in ogni singola vista.

Ad esempio, Text_xx_XX.propertiesfile nel com.example.i18npacchetto come di seguito:

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

può essere configurato come segue (senza l'identificatore locale _xx_XXe l'estensione del file!):

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

ed essere utilizzato main.xhtmlcome segue:

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

Dal momento che Java EE 6 / JSF 2, c'è anche la nuova API JSR303 Bean Validation che è rappresentato da coloro che @NotNull, Size, @Max, ecc annotazioni del javax.validation.constraintspacchetto. Dovresti capire che questa API non è completamente correlata a JSF. Non fa parte di JSF, ma JSF ne ha il supporto durante la fase di convalida. Cioè determina e riconosce la presenza di un'implementazione JSR303 (es. Hibernate Validator) e poi gli delega la validazione (che può essere disabilitata usando <f:validateBean disabled="true"/>, a proposito).

Come per il capitolo 4.3.1.1 della specifica JSR303 , il file dei messaggi di convalida JSR303 personalizzato deve avere esattamente il nome ValidationMessages_xx_XX.propertiese deve essere posizionato nella radice del classpath (quindi, non in un pacchetto!).


Localizzazione

Negli esempi precedenti, _xx_XXnel nome del file rappresenta la lingua (facoltativa) e i codici paese. Se questo è del tutto assente, diventa il pacchetto predefinito (fallback). Se la lingua è presente, ad esempio _en, verrà utilizzata quando il client ha richiesto esplicitamente questa lingua nell'intestazione della Accept-Languagerichiesta HTTP. Lo stesso vale per il paese, ad esempio _en_USo _en_GB.

È possibile specificare genericamente le impostazioni locali supportate sia per il messaggio che per il bundle di risorse <locale-config>nell'elemento di 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>

La locale desiderata deve essere impostata tramite <f:view locale>. Vedere anche Localizzazione in JSF, come ricordare la locale selezionata per sessione invece che per richiesta / vista .


1
Ciao Balus C, possiamo usare più <message-bundle> e come chiamarlo da java bean?
T8Z

È necessario prestare particolare attenzione alla struttura delle cartelle quando si utilizza <resource-bundle>. Se supponi di avere quanto segue in faces-config.xml <resource-bundle> <base-name> org.abc.def.messages </base-name> <var> msg </var> </resource-bundle> allora tutti i message.properties, message_es.properties, message_de.properties dovrebbero essere solo nella "cartella src / main / resources / org / abc / def". cioè non creare una cartella "messages" nella cartella "def". Fino a 'def' è ciò che resource-bundle si aspetta dove si aspetta di trovare tutti i file messages_xx.properties.
Rahul Saini
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.