Home / Programmazione / Java / Internazionalizzazione in JSF
Mattepuffo

Internazionalizzazione in JSF

Internazionalizzazione in JSF

Oggi vediamo un semplice meccanismo per integrare la internazionalizzazione nelle nostre applicazioni Java Server Faces.

Prima di tutto consideriamo che useremo dei file di properties, formati dalla combinata chiava=valore.

Secondo poi, ogni file di lingua dovrà essere nominato in questo modo: <nome>_<lingua>.properties.

A parte quello di default al quale dovete levare la parte riguardante la lingua.

Quindi nella nostra applicazione creiamo un package (ad esempio com.mf.language) e dentro ci creiamo due file:

  • messages.properties
  • messages_en.properties

Il primo è per l'italiano, lingua di default.

Dentro questi file mettiamo una cosa tipo questa:

msg=CIAO // ITALIANO
msg=HELLO // INGLESE

Bene, adesso dobbiamo creare un ManagedBean (l'ho messo nel package principale com.mf):

@ManagedBean(name = "language")
@SessionScoped
public class LanguageBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private String locale;
    private static Map countries;

    static {
        countries = new LinkedHashMap();
        countries.put("Italiano", Locale.ITALIAN);
        countries.put("English", Locale.ENGLISH);
    }

    public Map getCountries() {
        return countries;
    }

    public String getLocale() {
        return locale;
    }

    public void setLocale(String locale) {
        this.locale = locale;
    }

    public void localeChanged(ValueChangeEvent e) {
        String newLocaleValue = e.getNewValue().toString();
        for (Map.Entry entry : countries.entrySet()) {
            if (entry.getValue().toString().equals(newLocaleValue)) {
                FacesContext.getCurrentInstance().getViewRoot().setLocale((Locale) entry.getValue());
            }
        }
    }
}

Abbiamo due lingue; questo bean è un pò il cuore del meccanismo.

A questo punto dobbiamo modificare il file di configurazione di JSF, faces-config.xml (se non c'è createlo):

<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.2"
              xmlns="http://xmlns.jcp.org/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
    <application>
        <locale-config>
            <default-locale>it</default-locale>
            <supported-locale>en</supported-locale>
        </locale-config>
        <resource-bundle>
            <base-name>com_mf.language.messages</base-name>
            <var>about</var>
        </resource-bundle>
    </application>
</faces-config>

Qua gli diciamo quali sono le lingue disponibili, quale quella di default, il package seguito dal nome dei file di properties (messages), e la varibile che contiene la parola (msg, messa come chiave nei file).

A questo punto manca solo la pagina dove visualizzare il valore e dove cambiare lingua:

        <h:form>
          <h:selectOneMenu value="#{language.locale}" onchange="submit()" valueChangeListener="#{language.localeChanged}">
                <f:selectItems value="#{language.countries}" />
            </h:selectOneMenu>
        </h:form>
      <h:outputText value="#{about['about']}" escape="false" />

Io ho usato un menu a tendina, ma potete anche usare altri componenti volendo.

Il meccanismo vuole che al submit del form, venga cambiata lingua prendendo il valore dalla voce selezionata.

Se non avete fatto errori, dovreste vedere tutto per bene e poter cambiare lingua.

Come vedete il bean è SessionScoped, quindi l'ultima lingua scelta rimarrà di default fino alla chiusura della sessione; potrebbe essere un giusto comportamento.

Ciao!