L'utilizzo del locale in Java prevede la possibilità di sfruttare 2 classi che derivano dalla classe abstract ResourceBundle e che sono:
Creiamo un Java Project con una classe main di questo tipo:
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 :
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
Quindi nel nostro main come al solito:
Giocando con il settaggio del default locale possiamo leggere i dati dalla classe localizzata di nostro interesse.
- 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.
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).
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.