Mon application s’inspire de l’exemple qui se trouve dans le dossier <msedir>/apps/i18ndemo/.
Mon application comporte un composant de type tstringdisp, et trois boutons qui serviront à changer la langue.
type
class(tmainform)
tmainfo =
sd_weather: tstringdisp;
bt_english: tbutton;
bt_german: tbutton; bt_french: tbutton;
Dans l’inspecteur d’objet, j’attribue une valeur à la propriété frame.caption du composant sd_weather.
J’assigne également une valeur à la propriété text du même composant.
J’ai également renseigné la propriété caption de la forme principale.
Dans main.pas j’ajoute la référence à l’unité msei18nutils.
implementation
uses
main_mfm, msei18nutils;
Je déclare une chaîne de caractères de type resourcestring.
uses
main_mfm,
msei18nutils;
resourcestring
'Good bye!'; rs_goodbye =
Je compile mon application. Le compilateur m’informe qu’il crée un fichier main.rsj.
Writing Resource String Table file: main.rsj
Par curiosité, je jette un œil à l’intérieur de ce fichier (qui se trouve dans le même dossier que les unités compilées).
{"version":1,"strings":[
{"hash":90624273,"name":"main.rs_goodbye","sourcebytes":[71,111,111,100,32,98,121,101,33],"value":"Good bye!"}
]}
Tout semble correct. Il est temps d’ouvrir l’application MSEi18n.
L’application MSEi18n se trouve dans le dossier <msedir>/tools/i18n/.
Après avoir compilé MSEi18n, je l’ouvre, et dans le menu Settings je clique sur le bouton Configure MSEi18n.
Les champs MSEDIR et COMPILER doivent être renseignés.
Je crée un nouveau projet de traduction (un fichier TRP) en cliquant sur le bouton New.
Après avoir choisi l’emplacement et le nom de mon projet, je clique sur OK.
Je vais maintenant éditer mon projet de traduction. Pour cela, je clique sur le bouton Edit.
Je clique dans la colonne File, afin de créer une nouvelle ligne dans la grille, et j’ajoute dans cette ligne le fichier main.mfm. Dans la colonne Kind, je sélectionne rfk_module.
Comme j’utilise dans mon application une chaîne de type resourcestring, je vais ajouter une deuxième ligne. Pour cela, je clique avec le bouton droit de la souris au-dessus de la première ligne, et je choisis, dans le menu qui s’affiche, Append Row.
Dans la colonne File, j’indique main.rsj. Dans la colonne Kind, je sélectionne rfk_resstrings.
Je remplis également les colonnes Language et Directory (une ligne pour l’allemand, une ligne pour le français).
Je ferme la fenêtre en cliquant sur OK. Je peux maintenant traduire, d’une part les chaînes contenues dans mon fichier MFM, d’autre part la chaîne de type resourcestring contenue dans le fichier RSJ.
Vous noterez que j’ai coché les options flat et string only pour n’avoir sous les yeux que les données qui m’intéressent.
Une fois le travail de traduction achevé, je sauvegarde mon projet en cliquant sur le bouton Save.
Avant de compiler le projet, je crée les dossiers devant contenir les modules, en fonction de ce que j’avais indiqué en éditant le projet.
mkdir -p de
mkdir -p fr
Je peux maintenant compiler le projet en cliquant sur Make. Une fenêtre s’ouvre, me permettant de vérifier que la compilation des modules par Free Pascal s’est bien passée.
Voici les fichiers ont été créés.
projet
├── de
│ ├── demo_de.pas
│ ├── libdemo_de.so
│ ├── main.mfm
│ ├── main_mfm.pas
│ ├── main.rsj
│ └── main_rst.pas
├── demo.pas
├── demo.prj
├── demo.trd
├── demo.trp
├── fr
│ ├── demo_fr.pas
│ ├── libdemo_fr.so
│ ├── main.mfm
│ ├── main_mfm.pas
│ ├── main.rsj
│ └── main_rst.pas
├── libdemo_de.so
├── libdemo_fr.so
├── main.mfm
├── main_mfm.pas
├── main.pas
└── main.rsj
Il est temps de terminer mon application. Je rouvre donc (si je l’avais fermé) mon projet demo.prj dans MSEide.
Je crée une méthode pour l’événement onexecute du bouton bt_german.
Dans le corps de cette méthode, j’utilise la fonction
loadlangunit
pour changer la langue, avec comme paramètre
le nom de base du module.
procedure tmainfo.onexecute_bt_german(const sender: TObject);
begin
'demo_de');
loadlangunit(end;
Je fais la même chose pour le français.
procedure tmainfo.onexecute_bt_french(const sender: TObject);
begin
'demo_fr');
loadlangunit(end;
Pour remettre l’application en anglais (la langue des chaînes de
caractères contenues dans le fichier MFM), je n’aurai qu’à appeler la
procédure loadlangunit
avec une chaîne vide comme
argument.
procedure tmainfo.onexecute_bt_english(const sender: TObject);
begin
'');
loadlangunit(end;
Il me reste à faire quelque chose de ma chaîne
rs_goodbye
de type resourcestring. Je
voudrais que mon application dise au revoir à l’utilisateur, dans la
dernière langue sélectionnée, lorsque celui-ci fermera la fenêtre.
J’ajoute donc une méthode pour l’événement onclosequery de
la classe tmainfo
.
procedure tmainfo.onclosequery_mainfo(const sender: tcustommseform; var amodalresult: modalresultty);
begin
end;
Dans le corps de cette méthode, j’utilise la fonction
utf8tostring
pour obtenir la traduction de la chaîne
rs_goodbye
.
procedure tmainfo.onclosequery_mainfo(const sender: tcustommseform; var amodalresult: modalresultty);
var
string;
s: begin
s := utf8tostring(rs_goodbye);
showmessage(s);end;
C’est tout ! Je n’ai plus qu’à compiler et qu’à essayer mon application.
Si vous le souhaitez, vous pouvez télécharger le code source du projet.