/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package practica1.language;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Locale;
import java.util.ResourceBundle;
import practica1.preferences.PreferencesListener;
import practica1.preferences.PreferencesXML;
/**
* Clase de instancia que permite gestionar los idiomas de la aplicación
* @author Miguel González - Ceura
*/
public class Language implements PreferencesListener {
private static Language INSTANCE = null;
private ResourceBundle idioma;
private PreferencesXML prefs;
private String idiomaCountry;
private String idiomaLanguage;
private ArrayList<LanguageListener> listeners;
/**
* Constructor privado de la clase por defecto
*/
private Language() {
prefs = PreferencesXML.getInstance();
prefs.addPreferencesListener(this);
idiomaLanguage = prefs.getValue(this, "idiomaLanguage", "ES");
idiomaCountry = prefs.getValue(this, "idiomaCountry", "es");
idioma = ResourceBundle.getBundle("practica1/language/LanguageWords",
new Locale(idiomaLanguage, idiomaCountry));
listeners = new ArrayList<LanguageListener>();
}
/**
* Devuelve la instancia de la clase
* @return Language
*/
public static Language getI() {
if(INSTANCE == null) {
INSTANCE = new Language();
}
return INSTANCE;
}
/**
* Devuelve el nombre del lenguage genérico
* @return String idiomaLanguage
*/
public String getIdiomaLanguage() {
return idiomaLanguage;
}
/**
* Devuelve el idioma específico del país
* @return String idiomaCountry
*/
public String getIdiomaCountry() {
return idiomaCountry;
}
/**
* Permite suscribirse a los cambios en el idioma
* @param l LanguageListener
*/
public void addLanguageListener(LanguageListener l) {
if(l != null) {
listeners.add(l);
}
}
/**
* Permite desuscribirse a los cambios en el idioma
* @param l LanguageListener
*/
public void removeLanguageListener(LanguageListener l) {
if(l != null) {
listeners.remove(l);
}
}
/**
* Devuelve la palabra asociada con la clave que se recibe
* @param Key Clave de la palabra
* @return String Palabra del idioma actual
*/
public String getP(String Key) {
return idioma.getString(Key);
}
/**
* Devuelve la traducción de una palabra al idioma en ejecución
* @param word Palabra en cualquier idioma
* @return String Palabra en el idioma actual de ejecución
*/
public String getT(String word) {
//Comprobamos en cada uno de los dos idiomas si se encuentra la palabra
ResourceBundle id1 = ResourceBundle.getBundle(
"practica1/language/LanguageWords", new Locale("ES", "es"));
//Recorremos los valores del idioma en español
Iterator it1 = id1.keySet().iterator();
while (it1.hasNext()) {
String clave = (String)it1.next();
if(id1.getString(clave).equals(word)) {
return idioma.getString(clave);
}
}
ResourceBundle id2 = ResourceBundle.getBundle(
"practica1/language/LanguageWords", new Locale("EN", "us"));
//Recorremos los valores del idioma en inglés
Iterator it2 = id1.keySet().iterator();
while (it2.hasNext()) {
String clave = (String)it2.next();
if(id2.getString(clave).equals(word)) {
return idioma.getString(clave);
}
}
//Si no se encuentra la traducción devolvemos [NOT_FOUND]
return "[NOT_FOUND]";
}
/**
* Método que se llama cuando se quieren guardar las preferencias de la aplicación,
* guarda el idioma actual en ejecución
*/
@Override
public void savePreferences() {
prefs.setValue(this, "idiomaLanguage", idiomaLanguage);
prefs.setValue(this, "idiomaCountry", idiomaCountry);
}
/**
* Establece el nuevo idioma de la aplicación en ejecución
* @param idiomaLanguage Idioma genérico
* @param idiomaCountry Idioma específico del país
*/
public void setIdioma(String idiomaLanguage, String idiomaCountry) {
this.idiomaLanguage = idiomaLanguage;
this.idiomaCountry = idiomaCountry;
idioma = ResourceBundle.getBundle("practica1/language/LanguageWords",
new Locale(idiomaLanguage, idiomaCountry));
fireIdiomaChange();
}
/**
* Notifica a todos los que escuchan que ha cambiado el idioma
*/
private void fireIdiomaChange() {
for(LanguageListener l : listeners) {
l.idiomaChange(new LanguageEvent(idioma));
}
}
/**
* Devuelve el nombre del lenguaje actual de la aplicación (Español, Inglés)
* @return
*/
public String getLanguage() {
if(idiomaLanguage.equals("ES")) {
return idioma.getString("ESPANIOL");
} else {
return idioma.getString("INGLES");
}
}
}