|
Changer la langue de votre application à la demande de l'utilisateur
|
La manière la plus efficace d’internationaliser votre application est d’utiliser les classes java.util.ResourceBundle et java.util.Locale.
Dans cet exemple vous verrez avec quelle simplicité vous pouvez modifier la langue de votre application et en rajouter autant que vous voulez.
L’idée est de contenir chaque chaîne de caractère susceptible d’être internationalisée dans un fichier properties. Il s’agit d’un fichier texte avec l’extension .properties et qui contient un ensemble de paire clé/valeur. Ici les clés seront les noms attribués aux chaînes de caractères dans le code de notre application et les valeurs seront les chaînes de caractères dans une certaine langue. Pour rajouter une nouvelle langue, il vous suffit de créer un nouveau fichier properties.
Dans notre exemple nous utiliserons seulement deux langues : le français et l’anglais. Soit les fichiers : Language_fr_FR.properties et Language_en_US.properties.
fr et en correspondent au code langue ISO dont la liste est disponible à l’adresse suivante : http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt
FR et US correspondent au code pays ISO dont la liste est disponible à l’adresse suivante : http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html
Voici le contenu de nos deux fichiers :
Language_fr_FR.properties :
menuLanguage=Langue
labelHello=Bonjour le Monde!
Language_en_US.properties :
menuLanguage=Language
labelHello=Hello World!
Ici les clés (appellées depuis nos classes) sont menuLanguage et labelHello.
Voici le code de notre java.awt.event.ActionListener qui modifiera les valeurs des champs textes lorsque l’on sélectionnera une langue.
LanguageChooser.java :
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Locale;
import java.util.ResourceBundle;
public class LanguageChooser implements ActionListener {
// Nom du fichier properties (sans les codes ISO)
private static final String LANGUAGE_FILE = "language";
private static ResourceBundle resourceBundle;
// La fenetre
private MyFrame frame;
public LanguageChooser(MyFrame aFrame) {
frame = aFrame;
resourceBundle = ResourceBundle.getBundle(LANGUAGE_FILE, Locale
.getDefault());
}
// Methode appelee lorsqu’on selectionne un menu
public void actionPerformed(ActionEvent arg0) {
// On a selectionne le menu anglais
if (arg0.getActionCommand().equals("menuEn")) {
// On choisi le fichier anglais
resourceBundle = ResourceBundle.getBundle(LANGUAGE_FILE, Locale.US);
}
// Sinon on choisi le francais
else if (arg0.getActionCommand().equals("menuFr")) {
// On choisi le francais
resourceBundle = ResourceBundle.getBundle(LANGUAGE_FILE, Locale.FRANCE);
}
//On modifie les labels avec la nouvelle langue
frame.paintLabelWithLanguage();
}
/*
* Methode statique qui permet de recuperer un String du fichier de langue
* en fonction de la cle passee en parametre
*/
public static String getAnInternationalizeString(String key) {
// On retourne la valeur associee a la cle
return resourceBundle.getString(key);
}
}
Voici un exemple de fenetre (héritant de javax.swing.JFrame) internationalisée.
MyFrame.java :
import javax.swing.*;
public class MyFrame extends JFrame {
// Déclaration des différents composants
private JLabel labelHello;
private JMenuBar menuBar;
private JMenu menuLanguage;
private JMenuItem menuFr;
private JMenuItem menuEn;
private LanguageChooser languageChooser;
// Point d’entrée de l’application
public static void main(String[] args) {
MyFrame fenetre = new MyFrame();
}
public MyFrame() {
// Initialisation standard
super("Application Internationale");
setSize(300, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Création du LanguageChooser
languageChooser = new LanguageChooser(this);
// Création du label
labelHello = new JLabel();
getContentPane().add(labelHello);
// Création de la barre de menu
menuBar = new JMenuBar();
menuLanguage = new JMenu();
menuFr = new JMenuItem("Francais");
menuFr.setActionCommand("menuFr");
menuFr.addActionListener(languageChooser);
menuLanguage.add(menuFr);
menuEn = new JMenuItem("English");
menuEn.setActionCommand("menuEn");
menuEn.addActionListener(languageChooser);
menuLanguage.add(menuEn);
menuBar.add(menuLanguage);
setJMenuBar(menuBar);
// On initailise les valeurs des labels, menus
paintLabelWithLanguage();
// On affiche la fenêtre
setVisible(true);
}
/*
* Méthode qui initialise le texte des différents labels et menus en
* fonction de la langue
*/
protected void paintLabelWithLanguage() {
menuLanguage.setText(LanguageChooser
.getAnInternationalizeString("menuLanguage"));
labelHello.setText(LanguageChooser
.getAnInternationalizeString("labelHello"));
}
}
|
|
|