Como hacer una aplicación multi idioma en Java

Hola a todos, hoy os voy a explicar como podemos crear una aplicación multi idioma en Java.

Hacer una aplicación multi idioma nos permite tener nuestra aplicación disponible en varios idiomas, algo que es muy útil.

Lo que vamos a usar es una clase Idioma, que yo te proporciono, y ficheros properties, que crearemos nosotros mismos.

Aquí os dejo el código de la clase Idioma.

import java.io.IOException;
import java.util.Properties;

public class Idioma extends Properties{

    private static final long serialVersionUID = 1L;

    public Idioma(String idioma){

        //Modificar si quieres añadir mas idiomas
        //Cambia el nombre de los ficheros o añade los necesarios
    	switch(idioma){
	    	case "Español":
                    getProperties("espanol.properties");
                    break;
	    	case "Inglés":
                    getProperties("ingles.properties");
                    break;
	    	default:
                    getProperties("espanol.properties");
	   	}

    }

    private void getProperties(String idioma) {
        try {
            this.load( getClass().getResourceAsStream(idioma) );
        } catch (IOException ex) {

        }
   }
}

Pincha aquí para descargar la clase Idioma (copia el texto).

Incluimos esa clase en nuestro proyecto.

Ahora vamos a crear un para de ficheros properties, desde Nuevo -> Otro… -> Otro -> Fichero Properties

Crearemos un fichero properties por cada idioma que queramos mostrar.

Lo abrimos en Netbeans, será como un fichero de texto.

Bien, ahora vamos a ver como insertar los distintos textos en los distintos idiomas.

En cada fichero, usaremos este formato por cada elemento que queramos traducir.

nombre_texto=valor

Por ejemplo, en el fichero espanol.properties:

saludo=Hola

titulo=Ejemplo

cambio=Cambia idioma

espanol=Español

ingles=Ingles

frances= Frances

En el fichero ingles.properties:

saludo=Hello

titulo=Example

cambio=Change language

espanol=Spanish

ingles=English

frances= French

Fijate que en los dos ficheros solo cambia el valor pero no el nombre del texto. Si quieres comentar una linea, usa el caracter #

Lo mismo hariamos si tuvieramos mas idiomas.

Ahora vamos con el código:

Tenemos que crear un atributo de la clase idioma y después usamos el metodo setText del elemento al que queremos cambiar el nombre (JButton, JLabel, etc.). Por último, dentro de ese método invocamos el método getProperty del objeto Idioma, como parametro ponemos el nombre del texto que queremos invocar. Por ejemplo:

lblHola.setText(idioma.getProperty("saludo"));

Os dejo un ejemplo para que lo descargais y lo mireis:

public class frmPrincipal extends javax.swing.JFrame {

    public frmPrincipal() {
        initComponents();

        cambiarIdioma("Espanol");
    }

    public void cambiarIdioma(String nombreIdioma){

        idioma=new Idioma(nombreIdioma);

        btnCambio.setText(idioma.getProperty("cambio"));
        this.setTitle(idioma.getProperty("titulo"));
        lblHola.setText(idioma.getProperty("saludo"));

        cmbIdiomas.removeAllItems();

        String idiomas[]={
                          idioma.getProperty("espanol"),
                          idioma.getProperty("ingles"),
                          idioma.getProperty("frances")
                          };

        for(int i=0;i<idiomas.length;i++){
            cmbIdiomas.addItem(idiomas[i]);
        }

    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        btnCambio = new javax.swing.JButton();
        lblHola = new javax.swing.JLabel();
        cmbIdiomas = new javax.swing.JComboBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        btnCambio.setText("jButton1");
        btnCambio.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCambioActionPerformed(evt);
            }
        });

        lblHola.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lblHola.setText("jLabel1");

        cmbIdiomas.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Español", "Ingles", "Frances" }));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(145, 145, 145)
                .addComponent(btnCambio)
                .addContainerGap(120, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(lblHola, javax.swing.GroupLayout.DEFAULT_SIZE, 166, Short.MAX_VALUE)
                    .addComponent(cmbIdiomas, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(75, 75, 75))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(35, 35, 35)
                .addComponent(lblHola, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(44, 44, 44)
                .addComponent(cmbIdiomas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(35, 35, 35)
                .addComponent(btnCambio)
                .addContainerGap(67, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void btnCambioActionPerformed(java.awt.event.ActionEvent evt) {                                          

        switch(cmbIdiomas.getSelectedIndex()){

            case 0:
                cambiarIdioma("Español");
                break;
            case 1:
                cambiarIdioma("Ingles");
                break;
            case 2:
                cambiarIdioma("Frances");
                break;

        }

    }                                         

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(frmPrincipal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(frmPrincipal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(frmPrincipal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(frmPrincipal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new frmPrincipal().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton btnCambio;
    private javax.swing.JComboBox cmbIdiomas;
    private javax.swing.JLabel lblHola;
    // End of variables declaration
    private Idioma idioma;
}

Pincha aquí para decargar el proyecto. Importalo en tu NetBeans.

Espero que os sea de ayuda. Si tenéis dudas, preguntad, estamos para ayudarte.

Compartir

3 comentarios

  1. Merih

    Para crear sitios o aplicaciones multi-idioma yo recomiendo altamente esta rápida y intuitiva herramienta en línea para la localización de software: https://poeditor.com/

  2. Paul

    MUCHISIMAS GRACIAS por compartir el codigo, me ha sido de muchisima utilidad y me ha solucionado el atasco de varios dias que tenia!!!!

  3. jeenika

    hola y pata qque el programa mande un error al ccolocar mal una palabra

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *