|
L’objectif de chaque personne qui met en oeuvre une application est que cette dernière soit utilisée par le monde entier. Mais le problème consiste à adapter son contenu culturel et linguistique aux caractéristiques de la population ou du marché ciblé. Pour cela, on demande à un expert dans le domaine de faire ce qui est communément appelé un « audit de localisation » afin d’analyser l'application et, par la suite, faire des recommandations concernant l'étendu du travail à faire et aussi faire une estimation des coûts (cela risque de coûter très cher).
Avant, on se contentait de compiler pour chaque population une version (pour vue qu’il n’y a aucun texte en dure sinon c’est mal barré). Heureusement, qu’actuellement les nouvelles générations des langages de programmation nous permettent de le faire facilement, rapidement et au moindre coût à condition de penser à l’étape de la planification ou on prévoit comment les éléments culturels et linguistiques de l'application seront placés dans des fichiers ressources à l'extérieur du code source de l'application.
Pour mieux comprendre les choses, nous allons écrire un programme qui affiche des éléments dépendants d'une quelconque langue et d'un quelconque pays mais qui puisse intégrer une nouvelle langue sans nécessiter de re-compilation.
Dans un premier temps nous allons écrire un programme en java Exemple.java (voir code sore ci-dessous) qui affichait une interface avec un texte statique, puis nous l'analyserons par la même occasion et nous essayerons de l’améliorer.
Exemple.java
import java.awt.*;
import javax.swing.*;
public class Exemple extends JFrame {
private JPanel contentPane;
private JLabel paysLabel = new JLabel();
private JLabel dateLabel = new JLabel();
private JLabel tempsLabel = new JLabel();
private JLabel montantLabel = new JLabel();
private JTextField paysText = new JTextField();
private JTextField dateText = new JTextField();
private JTextField tempsText = new JTextField();
private JTextField montantText = new JTextField();
public Exemple() {
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(new GridLayout(4, 2));
contentPane.add(paysLabel);
contentPane.add(paysText);
contentPane.add(dateLabel);
contentPane.add(dateText);
contentPane.add(tempsLabel)
contentPane.add(tempsText);
contentPane.add(montantLabel);
contentPane.add(montantText);
paysLabel.setText("Pays");
dateLabel.setText("Date");
tempsLabel.setText("Temp");
montantLabel.setText("Montant");
setTitle("Exemple d'internationalisation");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
set Size(293,123);
setVisible(true);
}
public static void main(String[] args) {
new Exemple();
}
}
|
L'internationalisation est cas particulier d’exploitation des ressources, c'est un concept relativement simples avec Java puisque on dispose d’un ensemble de mécanismes prédéfinis pour nous faciliter la tache:
- Locale: Définition d'une information du “contexte culturel”
- ResourceBundle: Mise en place d’un mécanisme abstrait de recherche de ressources (fichiers des messages).
- Classe de “formattage” (mise en forme, analyse) dans le cadre de conventions dépendantes de la culture locale. les Classes principales de mise en forme : DateFormat, MessageFormat, NumberFormat.
Une des phases essentielles est de séparer le code des textes affichés dans le programme. Nous allons crée un fichier où seront stockés les messages statiques de l'exemple precedent, pour pour chacun messages nous attribuerons une clé d’identification ainsi que sa valeur corrspandate, puis nous modifierons l'exemple pour qu'il lise les messages à partir du fichier.
DynExemple.properties (exemple d'un fichier de ressource)
Pitle = Exemple d'internationalisation
PPays = Pays
PDate = Date
PTemps = Temps
PMontant = Montant
DynExemple.java
import java.awt.*;
import javax.swing.*;
public class DynExemple extends JFrame {
private JPanel contentPane;
private JLabel paysLabel = new JLabel();
private JLabel dateLabel = new JLabel();
private JLabel tempsLabel = new JLabel();
private JLabel montantLabel = new JLabel();
private JTextField paysText = new JTextField();
private JTextField dateText = new JTextField();
private JTextField tempsText = new JTextField();
private JTextField montantText = new JTextField();
private ResourceBundle bundle = ResourceBundle.getBundle("DynExemple");
public DynExemple() {
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(new GridLayout(4, 2));
contentPane.add(paysLabel);
contentPane.add(paysText);
contentPane.add(dateLabel);
contentPane.add(dateText);
contentPane.add(tempsLabel)
contentPane.add(tempsText);
contentPane.add(montantLabel);
contentPane.add(montantText);
paysLabel.setText(bundle.getString("Pays"));
dateLabel.setText(bundle.getString("Date"));
tempsLabel.setText(bundle.getString("Temp"));
montantLabel.setText(bundle.getString("Montant"));
setTitle(bundle.getString("Exemple d'internationalisation"));
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
set Size(293,123);
setVisible(true);
}
public static void main(String[] args) {
new DynExemple();
}
}
|
Pour Terminer, on va améliorer le programme précédant pour qu’il puisse prendre en charge d’autres langues. On va créer deux fichiers Internationalisation_fr_FR.properties et Internationalisation_en_US.properties (voir exemple ci-dessous), chacun d'eux correspond à une langue.
Fichier de langue française:
PTitle = Exemple d'internationalisation
PPays = Pays
PDate = Date
PTemps = Temps
PMontant = Montant
Addition=Vous devez {0}
Fichier de langue anglaise:
PTitle = Example of internationalization
PPays = Country
PDate = Date
PTemps = Time
PMontant = Amount
Addition= You owe {0}
Internationalisation.java
import java.awt.*;
import javax.swing.*;
public class Internationalisation extends JFrame {
private JPanel contentPane;
private JLabel paysLabel = new JLabel();
private JLabel dateLabel = new JLabel();
private JLabel tempsLabel = new JLabel();
private JLabel montantLabel = new JLabel();
private JTextField paysText = new JTextField();
private JTextField dateText = new JTextField();
private JTextField tempsText = new JTextField();
private JTextField montantText = new JTextField();
private ResourceBundle bundle;
public Internationalisation(Locale locale) {
bundle = ResourceBundle.getBundle("Internationalisation", locale);
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(new GridLayout(4, 2));
contentPane.add(paysLabel);
contentPane.add(paysText);
contentPane.add(dateLabel);
contentPane.add(dateText);
contentPane.add(tempsLabel)
contentPane.add(tempsText);
contentPane.add(montantLabel);
contentPane.add(montantText);
paysLabel.setText(bundle.getString("Pays"));
dateLabel.setText(bundle.getString("Date"));
tempsLabel.setText(bundle.getString("Temp"));
montantLabel.setText(bundle.getString("Montant"));
setTitle(bundle.getString("Exemple d'internationalisation"));
DateFormat uneDate = DateFormat.getDateInstance(DateFormat.LONG, locale);
DateFormat unTime = DateFormat.getTimeInstance(DateFormat.MEDIUM,locale);
Object[] numero = new Object[] {
NumberFormat.getCurrencyInstance(locale).format(1234.56)
};
String montant = MessageFormat.format(bundle.getString("Addition"),numero);
paysText.setText(locale.getISO3Country());
dateText.setText(uneDate.format(new Date()));
tempsText.setText(unTime.format(new Date()));
montantText.setText(montant);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
set Size(293,123);
setVisible(true);
}
public static void main(String[] args) {
Locale locale = Locale.getDefault();
if (args.length == 2)
locale = new Locale(args[0], args[1]);
new Internationalisation(locale);
}
}
|
Essayer d’ajouter d’autres fichiers de langue et tester (pour connaître les différentes langues prises en charge par java, compilez et exécutez ce programme suivant: AllLocale). Enfin sachez que pour certaines langues comme l'Arabe ou l'Hébreu, il faudra adapter automatiquement l’ordre de disposition des composants. Voici une nouvelle version du programme précedant Internationalisation2.java avec la prise en charge de la langage arabe (Internationalisation_ar_MA.properties )
Télécharger l'archive complet de ce tutoriel (Internationalisation.zip)
|