Visualizzazione post con etichetta java internazionalizzazione. Mostra tutti i post
Visualizzazione post con etichetta java internazionalizzazione. Mostra tutti i post

mercoledì 7 gennaio 2015

Internalizzazione con Struts 1.3

Con la vecchia versione di Struts per realizzare l'internazionalizzazione occorre:

1) definire nello struts-config.xml l'elemento message-resources
2) definire un package con i file di properties, tenendo conto che il parameter impostato al punto 1 dovrà puntare al nome del file di properties senza estensione nè localizzazione
3) caricare in sessione nella variabile org.apache.struts.Globals.LOCALE_KEY il locale prescelto

Esempio

definisco un package denominato org.common.i18

con dentro 3 files:
  • messages.properties;
  • messages_en.properties;
  • messages_it.properties
Ogni file ha una proprietà soltanto

welcome.message=Benvenuto (DEF) per il messages.properties
welcome.message=Benvenuto (EN)  per il messages_en.properties
welcome.message=Benvenuto (IT) per il messages_it.properties

Nello struts config definiamo il seguente elemento:


<message-resources key="localeBundle" parameter="org.common.i18.messages">
</message-resources>

La key serve ad individuare univocamente il bundle e quindi consente di definirne più di uno.

Sulla prima action chiamata dall'applicazione si setta il locale in questo modo:


request.getSession().setAttribute(Globals.LOCALE_KEY, request.getLocale());


Nella jsp occorre importare la taglib di struts


<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%> 


Per accedere alla proprietà è sufficiente quindi scrivere:


<bean:message key="welcome.message" bundle="localeBundle" />


venerdì 27 dicembre 2013

Localizzazione 2/2

L'utilizzo del locale in Java prevede la possibilità di sfruttare 2 classi che derivano dalla classe abstract ResourceBundle e che sono:
  • La classe concreta PropertyResourceBundle che prevede il supporto dei locale tramite file di properties;
  • La classe astratta ListResourceBundle che può essere estesa per aggiungere il supporto ad uno specifico locale effettuando l'override del metodo getContents() che torna un Object[][] con la lista delle chiavi e valori necessari.
ESEMPIO UTILIZZO PROPERTYRESOURCEBUNDLE

Creiamo un Java Project con una classe main di questo tipo:


package it.bundles;
import java.util.Locale;
import java.util.ResourceBundle;
public class CiaoLocalizzato {
	public static void main(String[] args){
Locale.setDefault(Locale.FRANCE);
Locale current=Locale.getDefault();
System.out.println(String.format("Locale %s %s %s", current.getDisplayName(),
current.getLanguage(),current.getCountry()));
ResourceBundle bundle=ResourceBundle.getBundle("it.localizzazione.ResourceBundle",current);
System.out.println(bundle.getString("greetings"));
	}
}


Quindi definiamo un package it.localizzazione al cui interno mettiamo i nostri file di properties.
La regola base è che il file deve essere presente nel classpath per poter consentire il caricamento a runtime delle proprietà.
Nel package avremo ad esempio i file :
  •  ResourceBundle.properties (il default nel caso non si trovi il locale giusto);
  • ResourceBundle_it.properties (per l'estensione italiana);
  • ResourceBundle_fr.properties (per l'estensione francese utilizzata in questo caso).
I file saranno semplici file di properties con la chiave greetings mappata ai valori "Hello" "Ciao" oppure "Bonjour!" a seconda della tipologia di locale.
Mandando in esecuzione il programma di volta in volta sarà stampato il valore a seconda del locale (sarà stampato Hello se il locale settato non ha un file di properties di riferimento).



ESEMPIO UTILIZZO LISTRESOURCEBUNDLE 

In questo caso dobbiamo definire 2 classi che estendono ListResourceBundle

package it.bundles;
import java.util.ListResourceBundle;
public class ResBundle extends ListResourceBundle {
	static final Object[][] contents={{"nome","ARSENAL"},{"anno","1886"},{"scudetti","13"}};
	@Override
	protected Object[][] getContents() {
		return this.contents;
	}

}



package it.bundles;
import java.util.ListResourceBundle;
public class ResBundle_it_IT extends ListResourceBundle {
	static final Object[][] contents={{"nome","INTER"},{"anno","1908"},{"scudetti","18"}};
	@Override
	protected Object[][] getContents() {
		return this.contents;
	}

}


Quindi nel nostro main come al solito:


package it.bundles;
import java.util.Locale;
import java.util.ResourceBundle;
public class TestResBundle {
	public static void main(String[] args) {
		Locale.setDefault(Locale.CANADA);
		Locale l=Locale.getDefault();
		ResourceBundle rb=ResourceBundle.getBundle("it.bundles.ResBundle",l);
		System.out.println(rb.getString("nome"));
		System.out.println(rb.getString("anno"));
		System.out.println(rb.getString("scudetti"));
	}
}


Giocando con il settaggio del default locale possiamo leggere i dati dalla classe localizzata di nostro interesse.

Localizzazione 1/2

Un oggetto di tipo Locale rappresenta un insieme di caratteristiche peculiari di un paese, ossia linguaggio, cultura, formattazione di numeri e di date.
La classe java.util.Locale possiede alcune importanti proprietà riferite a 3 entità fondamentali, il nome del paese, il nome della lingua e il nome del cosiddetto VARIANT, che indica la variazione del linguaggio all'interno del paese (praticamente il dialetto):
  • getCountry() che torna il codice del paese;
  • getDisplayCountry() che torna il nome del paese;
  • getLanguage() che torna il codice del linguaggio del paese;
  • getDisplayLanguage() che torna la descrizione del linguaggio del paese;
  • getVariant() che torna il variant code;
  • getDisplayVariant() che torna la descrizione del variant.
 Con questo semplice codice possiamo avere informazioni sui Locale presenti nella nostra JVM.
Oltre alle 3 informazioni fondamentali su paese-linguaggio-dialetto abbiamo anche informazioni aggiuntive in alcuni linguaggi (script ed extensions) che vedremo poi negli esempi.


public static void main(String[] args) {
  Locale[] lista=Locale.getAvailableLocales();
  System.out.println(Locale.getDefault());
  System.out.printf("Numero locale presenti %s",lista.length);
  System.out.println();
  for(Locale l:lista){
   //if(l.getLanguage().equals("it"))
   System.out.println(l+" - "+l.getDisplayName());
   
  }
  

 }


L'output può essere filtrato se si inserisce il commento, stampando soltanto quello che corrisponde al country code desiderato.
Se ad esempio mettiamo "en" nel filtro avremo il seguente output:

it_IT
Numero locale presenti 156
en_MT - inglese (Malta)
en_GB - inglese (Regno Unito)
en_CA - inglese (Canada)
en_US - inglese (Stati Uniti)
en_ZA - inglese (Sudafrica)
en - inglese
en_SG - inglese (Singapore)
en_IE - inglese (Irlanda)
en_IN - inglese (India)
en_AU - inglese (Australia)
en_NZ - inglese (Nuova Zelanda)
en_PH - inglese (Filippine)

I primi 2 caratteri rappresentano il codice del linguaggio, quindi abbiamo il codice del Paese (es en_GB ).
Ci possono poi essere anche il codice variant. Ad esempio abbiamo (se filtriamo per language "no") tra gli output questa stringa:
no_NO_NY ossia norvegese (Norvegia,Nynorsk)
Il Nyorsk è infatti un dialetto norvegese utilizzato da circa il 10-15% della popolazione norvegese.

In alcuni casi sono presenti anche gli script e le extension, ossia altre informazioni aggiuntive oltre al dialetto (variant)  . Ad esempio se scegliamo come codice "th" otteniamo tra gli altri risultati:
th_TH_TH_#u-nu-thai - thai (Thailandia,TH)


qui non abbiamo lo script ma abbiamo le extension, in questo caso u-nu-thai.
Per vedere un esempio di script possiamo provare il codice linguaggio "sr".
Vedremo in output ad esempio:
sr_ME_#Latn - serbo (Latino,Montenegro)

Latn è un esempio di script, deve essere  fatto da 4 lettere di cui la prima maiuscola (e. Latn,Cyrl).