Comment utiliser un ResourceBundle sous JBuilder pour l'internationalisation d'un logiciel ?

dimanche 30 septembre 2001

Parmi les nombreuses fonctionnalités des versions Pro et Entreprise de JBuilder 5, on peut trouver un outil ("Wizard") très utile, qui permet de "ressources les Strings" de vos programmes.
Un exemple est le bienvenu pour montrer l’ampleur d’une telle fonction: vous créez votre programme avec une interface en français, et, par exemple, une fenêtre (classe héritant de JFrame) avec pour titre "Bienvenue dans mon logiciel !", par l’instruction this.setTitle("Bienvenue dans mon logiciel !");. Si vous décidez de traduire votre logiciel dans plusieurs autres langues, vous devrez ré-écrire votre code en remplaçant à chaque fois votre phrase par sa traductions dans les langues désirées. Vous allez donc devoir créer X versions de votre code source et les compiler… c’est long et contraignant.
Le créer des "Strings ressourcés" permet de remédier à ce problème. En effet, la procédure change du tout au tout: tous les messages sont créés dans un fichier texte brut que l’on peut éditer sous n’importe quel bloc-notes. Pour distribuer des versions dans des langues étrangères, il suffira donc de créer plusieurs versions de ce fichier texte ! Le code lui même n’est pas changé.

Note: on utilise ici la version US de JBuilder… la procédure est similaire dans la version française.

Voici donc la procédure en images:

1) Une fois votre classe implémentée, lancer l’assistant dans JBuilder, c’est la dernière entrée du menu "Wizard": "Resource Strings"

RessourcesStrings

2) Une fenêtre s’ouvre, on est invité à spécifier le nom du "ResourceBundle", en général Res est le nom par défaut.

RessourcesStrings

On doit ensuite spécifier que l’on veut créer des ressources à partir des chaînes dures de notre classe, en cochant le premier Radio. On clique ensuite sur Next (Suivant).

3) Une fenêtre s’ouvre avec toutes les chaînes dures de votre classe, on peut choisir de décocher les chaînes que l’on ne veut pas voir exporter (j’ai décoché ici n’importe quoi sans faire attention de qui il s’agissait).

Tout est coché par défaut.

L’ instruction dans laquelle se trouve le String sélectionné est affichée en bas de la fenêtre. Ici le String vide (qui correspond à 1 espace de la barre d’espace) se trouve dans l’appel de la méthode updateTitle(""); (et on voit bien qu’elle admet ici comme argument une chaîne vide).

RessourcesStrings

NOTE: dans la suite de cet article je n’ai pas gardé les mêmes chaînes que celles que vous pouvez voir sur cette capture d’écran, en effet, il n’est d’aucun intérêt de ressources les chaînes affichées ci-contre. J’utilise dans la suite de ce tutoriel un exemple concret, sur une URL, ce qui est vraiment plus utile: pas besoin de recompiler le programme à chaque changement d’adresse du site !!

On clique ensuite sur Finish (Terminer).

4) L’opération est terminée.

RessourcesStrings

Nous allons maintenant nous intéresser à ce qu’a fait JBuilder.

On voit pour commencer qu’il a créé un objet statique ResourceBundle nommé "res" et qui est créé avec pour argument la chaîne "Res" qui en en fait le nom du fichier texte brut dans lequel sont stockées les chaînes.

5) En parcourant le code de notre classe, on s’aperçoit que certaines instructions ont été changées. Ici, l’instruction était:

jTextPane1.setPage("http://perso.wanadoo.fr/guillaume/cadre_droit.htm");

qui a été modifiée en ce qu’on voit sur la capture d’écran.

RessourcesStrings

On conclue que notre URL ci-dessus correspond à l’entrée "ACTU_ADDRESS" dans le fichier texte brut sur lequel pointe notre objet REsourceBundle "res".

6) Nous allons donc voir ce fichier texte brut pour savoir comment il est formé. On peut le trouver dans la liste des fichiers du projet, en haut à gauche de la fenêtre de JBuilder.

On l’ouvre en double-cliquant dessus.

RessourcesStrings

7) Et voilà notre fichier.

RessourcesStrings

La première ligne est un commentaire (syntaxe des commentaires Unix: ligne débutant par dièse #). Les autres lignes sont simplement les correspondances des chaînes que nous avions dans nos classes. On peut voir la chaîne représentée par l’entrée ACTU_ADDRESS, chaîne que j’ai citée plus haut. On note aussi la syntaxe un peu particulière: "http://" au lieu de"http://". Ceci s’explique par le fait que les deux points (:) sont un caractère spécial et que l’anti-slash () sert à signaler la présence d’un caractère spécial. N’y faites pas attention, mais respectez la syntaxe si vous changez votre URL. Je tiens à dire, pour terminer, que cet exemple est fonctionnel, puis qu’il s’agit du fichier de ressources qu’utilise ML. (regardez dans le JAR de ML…).

Conclusion:

Pour reprendre notre premier exemple, on oppose:

</tr> </table>

Tutoriel distribué pour le FAQ Java de Java-France www.java-france.com / www.jgflsoft.com
Réédité pour Valhalla GFBLOG.
Écrit à Montpellier le 30 septembre 2001

Sans les Strings ressourcés (3 compilations) Avec les Strings ressourcés (1 compilation)

this.setTitle("Bienvenue dans mon logiciel</p>

!");
this.setTitle("Welcome in my Soft !");
this.setTitle("Bienvenido en mi programa !"); </font>

</td>
this.setTitle(res.getString("BONJOUR"));

Dans le fichier de propriétés:
BONJOUR=Bienvenue dans mon logiciel !
BONJOUR=Welcome in my Soft !
BONJOUR=Bienvenido en mi programa !

Parmi les nombreuses fonctionnalités des versions Pro et Entreprise de JBuilder 5, on peut trouver un outil ("Wizard") très utile, qui permet de "ressources les Strings" de vos programmes.
Un exemple est le bienvenu pour montrer l’ampleur d’une telle fonction: vous créez votre programme avec une interface en français, et, par exemple, une fenêtre (classe héritant de JFrame) avec pour titre "Bienvenue dans mon logiciel !", par l’instruction this.setTitle("Bienvenue dans mon logiciel !");. Si vous décidez de traduire votre logiciel dans plusieurs autres langues, vous devrez ré-écrire votre code en remplaçant à chaque fois votre phrase par sa traductions dans les langues désirées. Vous allez donc devoir créer X versions de votre code source et les compiler… c’est long et contraignant.
Le créer des "Strings ressourcés" permet de remédier à ce problème. En effet, la procédure change du tout au tout: tous les messages sont créés dans un fichier texte brut que l’on peut éditer sous n’importe quel bloc-notes. Pour distribuer des versions dans des langues étrangères, il suffira donc de créer plusieurs versions de ce fichier texte ! Le code lui même n’est pas changé.

Note: on utilise ici la version US de JBuilder… la procédure est similaire dans la version française.

Voici donc la procédure en images:

1) Une fois votre classe implémentée, lancer l’assistant dans JBuilder, c’est la dernière entrée du menu "Wizard": "Resource Strings"

RessourcesStrings

2) Une fenêtre s’ouvre, on est invité à spécifier le nom du "ResourceBundle", en général Res est le nom par défaut.

RessourcesStrings

On doit ensuite spécifier que l’on veut créer des ressources à partir des chaînes dures de notre classe, en cochant le premier Radio. On clique ensuite sur Next (Suivant).

3) Une fenêtre s’ouvre avec toutes les chaînes dures de votre classe, on peut choisir de décocher les chaînes que l’on ne veut pas voir exporter (j’ai décoché ici n’importe quoi sans faire attention de qui il s’agissait).

Tout est coché par défaut.

L’ instruction dans laquelle se trouve le String sélectionné est affichée en bas de la fenêtre. Ici le String vide (qui correspond à 1 espace de la barre d’espace) se trouve dans l’appel de la méthode updateTitle(""); (et on voit bien qu’elle admet ici comme argument une chaîne vide).

RessourcesStrings

NOTE: dans la suite de cet article je n’ai pas gardé les mêmes chaînes que celles que vous pouvez voir sur cette capture d’écran, en effet, il n’est d’aucun intérêt de ressources les chaînes affichées ci-contre. J’utilise dans la suite de ce tutoriel un exemple concret, sur une URL, ce qui est vraiment plus utile: pas besoin de recompiler le programme à chaque changement d’adresse du site !!

On clique ensuite sur Finish (Terminer).

4) L’opération est terminée.

RessourcesStrings

Nous allons maintenant nous intéresser à ce qu’a fait JBuilder.

On voit pour commencer qu’il a créé un objet statique ResourceBundle nommé "res" et qui est créé avec pour argument la chaîne "Res" qui en en fait le nom du fichier texte brut dans lequel sont stockées les chaînes.

5) En parcourant le code de notre classe, on s’aperçoit que certaines instructions ont été changées. Ici, l’instruction était:

jTextPane1.setPage("http://perso.wanadoo.fr/guillaume/cadre_droit.htm");

qui a été modifiée en ce qu’on voit sur la capture d’écran.

RessourcesStrings

On conclue que notre URL ci-dessus correspond à l’entrée "ACTU_ADDRESS" dans le fichier texte brut sur lequel pointe notre objet REsourceBundle "res".

6) Nous allons donc voir ce fichier texte brut pour savoir comment il est formé. On peut le trouver dans la liste des fichiers du projet, en haut à gauche de la fenêtre de JBuilder.

On l’ouvre en double-cliquant dessus.

RessourcesStrings

7) Et voilà notre fichier.

RessourcesStrings

La première ligne est un commentaire (syntaxe des commentaires Unix: ligne débutant par dièse #). Les autres lignes sont simplement les correspondances des chaînes que nous avions dans nos classes. On peut voir la chaîne représentée par l’entrée ACTU_ADDRESS, chaîne que j’ai citée plus haut. On note aussi la syntaxe un peu particulière: "http://" au lieu de"http://". Ceci s’explique par le fait que les deux points (:) sont un caractère spécial et que l’anti-slash () sert à signaler la présence d’un caractère spécial. N’y faites pas attention, mais respectez la syntaxe si vous changez votre URL. Je tiens à dire, pour terminer, que cet exemple est fonctionnel, puis qu’il s’agit du fichier de ressources qu’utilise ML. (regardez dans le JAR de ML…).

Conclusion:

Pour reprendre notre premier exemple, on oppose:

</tr> </table>

Tutoriel distribué pour le FAQ Java de Java-France www.java-france.com / www.jgflsoft.com
Réédité pour Valhalla GFBLOG.
Écrit à Montpellier le 30 septembre 2001

Sans les Strings ressourcés (3 compilations) Avec les Strings ressourcés (1 compilation)

this.setTitle("Bienvenue dans mon logiciel</p>

!");
this.setTitle("Welcome in my Soft !");
this.setTitle("Bienvenido en mi programa !"); </font>

</td>
this.setTitle(res.getString("BONJOUR"));

Dans le fichier de propriétés:
BONJOUR=Bienvenue dans mon logiciel !
BONJOUR=Welcome in my Soft !
BONJOUR=Bienvenido en mi programa !