Home > Java for Web > Localizzazione in JSF della applicazione web

Localizzazione in JSF della applicazione web

Spesso è utile localizzare una applicazione, cioè renderla disponibile in diverse lingue, magari anche in maniera automatica in base alla lingua configurata sul sistema dell’utente utilizzatore. Ecco che JSF ci viene in aiuto in maniera molto semplice e completa.

Io sono abituato a creare per prima cosa un package di nome “.messages” contenente tutti i files che elencheranno le varie parole e frasi nelle relative lingue.

package contenente i file di localizzazione

package contenente i file di localizzazione

Questi files sono di tipo properties, cioè dei files che contengo in ogni riga le informazioni:

nome_proprietà=valore proprietà

per creare il primo di questi files, che di solito per me è quello contenente i messaggi in lingua italiana, basta cliccare con il tasto destro del mouse sul nuovo package creato, e quindi scegliere “new>>Other…>>Other>>Properties File

come nome file consiglio di chiamarlo messages_it (it sta per italiano)

a questo punto nel file possiamo inserire tutte quelle frasi che vogliamo rendere disponibili in diverse lingue. la stringa prima dell’uguale sarà usata nelle varie parti del codice dei bean o direttamente nelle pagine jsf, quindi non può essere una stringa con caratteri strani ne tantomeno spazi, proprio come se fossero dei nomi di variabili java.

legendFieldsetLogin=Accesso
labelUserLogin=Nome utente
labelPwdLogin=Password
buttonLogin=Entra
userNotFoundMsg=Utente non trovato, correggi username o password inserite

Se vogliamo possiamo copiare nello stesso package questo stesso file “messages_it.properties” sotto diversi nomi, cambiando soltanto il suffisso dopo l’underscore in base alla lingua che vogliamo rendere disponibile, ad esempio,  le parole e le frasi in lingua inglese andranno tradotte dal file in italiano al file “messages_en.properties”:

legendFieldsetLogin=Login
labelUserLogin=Username
labelPwdLogin=Password
buttonLogin=Enter
userNotFoundMsg=User not found, insert correct username and password

Notare che i nomi delle proprietà non devono assolutamente essere cambiati.

S i possono anche ridefinire le frasi di default di JSF, come ad esempio la frase di campo obbligatorio:

javax.faces.component.UIInput.REQUIRED={0}: Campo obbligatorio.

Il {0} è un parametro che in questo caso scrive in quella posizione della frase il nome del campo textfield

Andiamo a dire ora all’applicazione di usare per default il file italiano e la disponibilità del file in lingua inglese, quindi apriamo il file di configurazione faces-config.xml ed inseriamo le seguenti righe:

<application>
        <locale-config>
            <default-locale>it</default-locale>
            <supported-locale>it</supported-locale>
            <supported-locale>en</supported-locale>
        </locale-config>
        <resource-bundle>
            <base-name>mypackage.messages.messages</base-name>
            <var>msgs</var>
        </resource-bundle>
        <message-bundle>
            mypackage.messages.messages
        </message-bundle>
     </application>

(Cambiare mypackage con il vostro package madre)

Ora siamo pronti a richiamare le frasi ad esempio nella nostra pagina web:

#{msgs.legendFieldsetLogin}
<h:outputLabel for="username" styleClass="label">#{msgs.labelUserLogin}:</h:outputLabel>

o nel codice java:

utility.getLocaleMessage("userNotFoundMsg", null)

La classe utility contiene i metodi che permettono di accedere ad i file properties delle lingue, ed è la seguente:

import java.text.MessageFormat;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import javax.faces.context.FacesContext;

/**
 *
 * @author Lorenzo
 */
public class utility {

    private static ClassLoader getCurrentClassLoader(Object defaultObject){

        ClassLoader loader = Thread.currentThread().getContextClassLoader();

        if(loader == null){
            loader = defaultObject.getClass().getClassLoader();
        }

        return loader;
    }

    private static String getMessageResourceString(
                            String bundleName,
                            String key,
                            Object params[],
                            Locale locale){

        String text = null;

        ResourceBundle bundle =
                ResourceBundle.getBundle(bundleName, locale,
                                        getCurrentClassLoader(params));

        try{
            text = bundle.getString(key);
        } catch(MissingResourceException e){
            text = "?? key " + key + " not found ??";
        }

        if(params != null){
            MessageFormat mf = new MessageFormat(text, locale);
            text = mf.format(params, new StringBuffer(), null).toString();
        }

        return text;
    }

    public static String getLocaleMessage(String stringa, Object[] parametri) {
        FacesContext context = FacesContext.getCurrentInstance();
        String text = utility.getMessageResourceString(context.getApplication().getMessageBundle(), stringa , parametri, context.getViewRoot().getLocale());
        return text;
    }
}

Usando questi metodi è possibile anche mandare dei parametri alle frasi definite nei file di proprietà, visto che le diverse lingue non posizionano le parole sempre nella stessa maniera.

Java for Web , , , , , ,

  1. Nessun commento ancora...
  1. Nessun trackback ancora...