Internacionalización (I18N) en JavaFX
Usando la tecnología JavaFX es fácil programar aplicaciones con soporte para múltiples idiomas, a esto se le llama internacionalización o i18n para abreviar, es este tutorial desarrollaremos una pequeña aplicación con soporte para dos idiomas, español e inglés, luego podrás agregar más idiomas si lo deseas, la GUI multi-idiomas será creada usando FXML y la herramienta SceneBuilder que nos agiliza la creación de las mismas.
Luego de crear nuestro proyecto, si queremos darle soporte para distintos lenguajes debemos agregar un archivo .properties por cada idioma que deseemos soportar, por ejemplo: traduccion.properties, traduccion_es.properties, traduccion_en.properties, etc., el nombre del archivo debe ser igual, salvo que al final ubicamos el código del lenguaje, _es, _en, _ru, etc., para español, inglés y ruso respectivamente.
Nuestro proyecto JavaFX Maven contendrá lo siguiente:
El archivo que no tiene código de idioma, será el usado por defecto.
/i18n/mensajes.propertiesbtn.aceptar = Aceptar
btn.cancelar = Cancelar
lbl.nombre = Nombre
lbl.apellido = Apellido
lbl.edad = Edad
lbl.correo = Correo
lbl.genero = Genero
txt.ayuda = Escriba aquí...
btn.aceptar = Accept
btn.cancelar = Cancel
lbl.nombre = Firt Name
lbl.apellido = Last Name
lbl.edad = Age
lbl.correo = Mail
lbl.genero = Gender
txt.ayuda = Write here...
Al momento de crear la GUI en FXML usamos el símbolo % para indicar la clave del archivo .properties a la que deseamos hacer referencia, el diseño en SceneBuilder se ve de la siguiente manera:
En SceneBuilder hacemos clic en el icono que se encuentra a la derecha de la propiedad Text y seleccionamos la opción que se muestra en la imagen, luego podremos escribir la clave deseada.
Cambiar el idioma de una GUI JavaFX
Ahora, ¿como cambiamos el idioma?, lo que debemos hacer en usar un ResourceBundle
para cargar los archivos correspondientes, este utilizara el Locale
, clase que representa la información de idioma y ubicación para determinar que archivo debe usar para generar los textos de la GUI FXML.
Locale.setDefault(Locale.ENGLISH);
ResourceBundle resourceBundle = ResourceBundle.getBundle("i18n/mensajes");
Parent root = FXMLLoader.load(getClass().getResource("/fxml/Scene.fxml"), resourceBundle);
El método Locale.setDefault()
estable el idioma por defecto, podemos usar las constantes estáticas para obtener el idioma requerido, Locale.ENGLISH
para el inglés, por ejemplo, si es idioma que deseamos no se encuentra podemos usar el constructor de la clase indicando el código deseado, new Locale("es")
para español, podemos también indicar el idioma y la región de la siguiente manera: new Locale("es_pa")
para español de panamá.
Cuando deseemos cambiar el idioma debemos volver al cargar el FXML para que los textos se actualicen.
Las imágenes muestran como usamos un ToggleButton
para cambiar el idioma del formulario.
idioma.selectedToggleProperty().addListener((p, o, n) -> {
ToggleButton tb = (ToggleButton) n.getToggleGroup().getSelectedToggle();
switch (tb.getText()) {
case ESPANOL:
main.getChildren().remove(1);
main.getChildren().add(loadUI(new Locale("es")));
break;
case ENGLISH:
main.getChildren().remove(1);
main.getChildren().add(loadUI(Locale.ENGLISH));
break;
}
});
Como podemos ver quitamos el Node
anterior y lo reemplazamos por el nuevo que contiene el idioma actualizado, el método loadUI()
fue creado por nosotros y es el encargado de cargar el FXML nuevamente, esta vez con el idioma establecido.
Descargar código: javafx-i18n.zip
Comentarios
Publicar un comentario