JSF - Internazionalizzazione

L'internazionalizzazione è una tecnica in cui i messaggi di stato, le etichette dei componenti della GUI, la valuta, la data non sono codificati nel programma. Vengono invece archiviati al di fuori del codice sorgente in bundle di risorse e recuperati dinamicamente. JSF fornisce un modo molto conveniente per gestire il bundle di risorse.

I seguenti passaggi sono necessari per interiorizzare un'applicazione JSF.

Passaggio 1: definire i file delle proprietà

Crea il file delle proprietà per ogni locale. Il nome deve essere nel formato <file-name> _ <locale> .properties.

La locale predefinita può essere omessa nel nome del file.

messages.properties

greeting = Hello World!

messages_fr.properties

greeting = Bonjour tout le monde!

Passaggio 2: aggiorna faces-config.xml

faces-config.xml

<application>
   <locale-config>
      <default-locale>en</default-locale>
      <supported-locale>fr</supported-locale>
   </locale-config>
   
   <resource-bundle>
      <base-name>com.tutorialspoint.messages</base-name>
      <var>msg</var>
   </resource-bundle>
</application>

Passaggio 3: utilizza resource-bundle var

home.xhtml

<h:outputText value = "#{msg['greeting']}" />

Applicazione di esempio

Creiamo un'applicazione JSF di prova per testare l'internazionalizzazione in JSF.

Passo Descrizione
1 Creare un progetto con un nome helloworld sotto un pacchetto com.tutorialspoint.test come spiegato nel capitolo JSF - Prima applicazione .
2 Crea la cartella delle risorse sotto src → mai cartella.
3 Crea la cartella com in src → main → cartella delle risorse .
4 Crea la cartella tutorialspoint in src → main → resources → cartella com .
5 Crea il file messages.properties sotto src → main → resources → com → cartella tutorialspoint . Modificalo come spiegato di seguito.
6 Crea il file messages_fr.properties sotto src → main → resources → com → cartella tutorialspoint . Modificalo come spiegato di seguito.
7 Crea faces-config.xml in WEB-INFf più vecchio come spiegato di seguito.
8 Creare UserData.java sotto pacchetto com.tutorialspoint.test come spiegato di seguito.
9 Modifica home.xhtml come spiegato di seguito. Mantieni invariato il resto dei file.
10 Compilare ed eseguire l'applicazione per assicurarsi che la logica aziendale funzioni secondo i requisiti.
11 Infine, crea l'applicazione sotto forma di file war e distribuiscila nel server Web Apache Tomcat.
12 Avvia la tua applicazione web utilizzando l'URL appropriato come spiegato di seguito nell'ultimo passaggio.

messages.properties

greeting = Hello World!

messages_fr.properties

greeting = Bonjour tout le monde!

faces-config.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<faces-config
   xmlns = "http://java.sun.com/xml/ns/javaee"
   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"
   version = "2.0">
   
   <application>
      <locale-config>
         <default-locale>en</default-locale>
         <supported-locale>fr</supported-locale>
      </locale-config>
      
      <resource-bundle>
         <base-name>com.tutorialspoint.messages</base-name>
         <var>msg</var>
      </resource-bundle>
   </application>
</faces-config>

UserData.java

package com.tutorialspoint.test;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;

@ManagedBean(name = "userData", eager = true)
@SessionScoped
public class UserData implements Serializable {
   private static final long serialVersionUID = 1L;
   private String locale;

   private static Map<String,Object> countries;
      static {
      
      countries = new LinkedHashMap<String,Object>();
      countries.put("English", Locale.ENGLISH);
      countries.put("French", Locale.FRENCH);
   }

   public Map<String, Object> getCountries() {
      return countries;
   }

   public String getLocale() {
      return locale;
   }

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

   //value change event listener
   public void localeChanged(ValueChangeEvent e) {
      String newLocaleValue = e.getNewValue().toString();
      
      for (Map.Entry<String, Object> entry : countries.entrySet()) {
         
         if(entry.getValue().toString().equals(newLocaleValue)) {
            FacesContext.getCurrentInstance()
               .getViewRoot().setLocale((Locale)entry.getValue());         
         }
      }
   }
}

home.xhtml

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns = "http://www.w3.org/1999/xhtml"   
xmlns:h = "http://java.sun.com/jsf/html"
xmlns:f = "http://java.sun.com/jsf/core">
   
   <h:head>
      <title>JSF tutorial</title>	 	
   </h:head>
   
   <h:body> 
      <h2>Internalization Language Example</h2>
      
      <h:form>
         <h3><h:outputText value = "#{msg['greeting']}" /></h3>
         
         <h:panelGrid columns = "2"> 
            Language : 
            <h:selectOneMenu value = "#{userData.locale}" onchange = "submit()"
               valueChangeListener = "#{userData.localeChanged}">
               <f:selectItems value = "#{userData.countries}" /> 
            </h:selectOneMenu> 
         </h:panelGrid> 
      
      </h:form>
   </h:body>
</html>

Una volta che sei pronto con tutte le modifiche apportate, compiliamo ed eseguiamo l'applicazione come abbiamo fatto nel capitolo JSF - Prima applicazione. Se tutto va bene con la tua applicazione, questo produrrà il seguente risultato.

Cambia lingua dal menu a discesa. Vedrai il seguente output.