JSF Resource Bundle

Per l’internazionalizzazione e localizzazione di una applicazione web JSF offre un meccanismo basato sulla gestione di Resource Bundle. L’idea alla base di tale gestione è quello di inserire label e messaggi di testo all’interno di un file centralizzato, che può poi essere letto dalle pagine jsp e/o dal codice java. Tale gestione consente anche la localizzazione dell’applicazione attraverso la definizione di un file per ogni lingua che si intende supportare.

Resource Bundle

Un message resource bundle è semplicemente un file di property contenente coppie chiave/valore. La chiave, che sarà uguale per ogni lingua, individua univocamente una “risorsa” (label/messaggio) mentre il valore rappresenta il testo associato ed è differente per ogni lingua. La localizzazione dei file avviene inserendo come suffisso al loro nome la coppia identificativa della nazione e della lingua (denominata Locale), entrambe caratterizzati da un codice di due caratteri definiti dall’ISO (International Organization for Standardization). Il nome dei file, ad esempio, per l’italiano e l’inglese sarà quindi:

messages_it_IT.properties

messages_en_EN.properties

In realtà per la lingua di default il suffisso del Locale non è necessario. Per configurare JSF allo scopo è sufficiente specificare il nome del file, la lingua di default e le lingue supportate nel file faces-config.xml.

Il tag <base-name> indica il nome del file di properties, eventualmente preceduto con notazione puntata dal percorso della cartella in cui è collocato nell’applicazione: esempio it.javaboss.messages, indica che il file è posizionato nella cartella src/it/javaboss. Nel caso di progetto Maven è sufficiente inserirli nella cartella src/main/resources ed utilizzare l’xml dell’esempio. Il <tag> var indica la variabile che sarà utilizzata per referenziare il bundle.

Accesso da JSP

L’utilizzo delle proprietà definite nel resource bundle nelle pagine jsp è molto semplice. Come visto alla risorsa è associata una variabile msg alla quale corrisponde una mappa di coppie chiave/valore. Attraverso espressioni EL è possibile accedere alla mappa ed ai suoi valori in modo semplice. Ad esempio:

dove la stringa message.hello corrisponde ad una chiave nel file messages.properties associato al bundle. Ovviamente nel nostro caso i file saranno due:

messages_it_IT.properties message.hello=Benvenuto
messages_en_EN.properties message.hello=Welcome

Accesso da Codice

L’accesso al resource bundle all’interno di un Managed Bean avviene recuperando il contesto corrente dall’oggetto FacesContext e da questo il bundle definito, nel modo seguente:

L’oggetto RecourceBundle ha poi un metodo getString() che prende in input una stringa rappresentante una chiave presente nel file messages.properties.

Message Bundle

JSF offre anche un meccanismo che consente di riscrivere i suoi messaggi di default. Per farlo è sufficiente creare un file di properties e dichiararlo nel faces-config.xml. Nulla vieta di utilizzare lo stesso file già dichiarato come resource bundle nel modo seguente:

Le coppie chiavi valore predefinite in JSF possono essere trovati nella sezione Localized Application Messages della specifica.

Infine riportiamo un esempio di file di properties: