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.
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/
MUCHISIMAS GRACIAS por compartir el codigo, me ha sido de muchisima utilidad y me ha solucionado el atasco de varios dias que tenia!!!!
hola y pata qque el programa mande un error al ccolocar mal una palabra