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.

Nessun commento:

Posta un commento