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
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?xml version="1.0" encoding="UTF-8"?> <faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"> <application> <resource-bundle> <base-name>messages</base-name> <var>msg</var> </resource-bundle> <locale-config> <default-locale>it</default-locale> <supported-locale>en</supported-locale> </locale-config> </application> </faces-config> |
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:
1 |
<h2>#{msg['message.hello']}</h2> |
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:
1 2 3 4 5 6 7 8 |
ResourceBundle bundle = null; public ResourceBundle getBundle() { if (bundle == null) { FacesContext context = FacesContext.getCurrentInstance(); bundle = context.getApplication().getResourceBundle(context, "msg"); } return bundle; } |
L’oggetto RecourceBundle
ha poi un metodo getString()
che prende in input una stringa rappresentante una chiave presente nel file messages.properties
.
1 |
String msg = getBundle().getString( "message.hello" ); |
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:
1 2 3 4 5 6 7 8 9 10 11 |
<application> <message-bundle>messages</message-bundle> <resource-bundle> <base-name>messages</base-name> <var>msg</var> </resource-bundle> <locale-config> <default-locale>it</default-locale> <supported-locale>en</supported-locale> </locale-config> </application> |
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:
1 2 |
javax.faces.component.UIInput.REQUIRED=Valore obbligatorio. message.hello=Benvenuto |