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.

Crear una GUI JavaFX Internacionalizable, soporte para varios idiomas

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:

ResourceBundle para varios idiomas

El archivo que no tiene código de idioma, será el usado por defecto.

/i18n/mensajes.properties
btn.aceptar = Aceptar
btn.cancelar = Cancelar

lbl.nombre = Nombre
lbl.apellido = Apellido
lbl.edad = Edad
lbl.correo = Correo
lbl.genero = Genero

txt.ayuda = Escriba aquí...
/i18n/mensajes_en.properties
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:

FXML con soporte para distintos idiomas

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.

SceneBuilder textos internacionales

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.

Aplicación JavaFX en español e inglés

Aplicación JavaFX en inglés y español

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

Temas relacionados

Entradas populares de este blog

tkinter Grid

Controles y Contenedores JavaFX 8 - I

Conectar SQL Server con Java

tkinter Canvas