Tutoriel MSEide


Une application en plusieurs langues avec MSEi18n

Mon application

Mon application s’inspire de l’exemple qui se trouve dans le dossier <msedir>/apps/i18ndemo/.

Création de l’application dans MSEide

Mon application comporte un composant de type tstringdisp, et trois boutons qui serviront à changer la langue.

type
  tmainfo = class(tmainform)
    sd_weather: tstringdisp;
    bt_english: tbutton;
    bt_german: tbutton;
    bt_french: tbutton;

Propriétés des composants

Dans l’inspecteur d’objet, j’attribue une valeur à la propriété frame.caption du composant sd_weather.

Inspecteur d’objet

J’assigne également une valeur à la propriété text du même composant.

Inspecteur d’objet

J’ai également renseigné la propriété caption de la forme principale.

Inspecteur d’objet

L’unité msei18nutils

Dans main.pas j’ajoute la référence à l’unité msei18nutils.

implementation

uses
  main_mfm,
  msei18nutils;

Une chaîne de type resourcestring

Je déclare une chaîne de caractères de type resourcestring.

uses
  main_mfm,
  msei18nutils;

resourcestring
  rs_goodbye = 'Good bye!';

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.

MSEi18n

L’application MSEi18n se trouve dans le dossier <msedir>/tools/i18n/.

Configuration de MSEi18n

Après avoir compilé MSEi18n, je l’ouvre, et dans le menu Settings je clique sur le bouton Configure MSEi18n.

MSEi18n Configure

Les champs MSEDIR et COMPILER doivent être renseignés.

Création d’un projet de traduction

Je crée un nouveau projet de traduction (un fichier TRP) en cliquant sur le bouton New.

MSEi18n New

Après avoir choisi l’emplacement et le nom de mon projet, je clique sur OK.

Édition du projet

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).

MSEi18n Edit

Traduction des chaînes

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.

MSEi18n

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.

Sauvegarde du projet

Une fois le travail de traduction achevé, je sauvegarde mon projet en cliquant sur le bouton Save.

Compilation

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.

MSEi18n Make

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.

Changer la langue de l’application

La procédure loadlangunit

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
 loadlangunit('demo_de');
end;

Je fais la même chose pour le français.

procedure tmainfo.onexecute_bt_french(const sender: TObject);
begin
  loadlangunit('demo_fr');
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;

La fonction utf8tostring

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
  s: string;
begin
  s := utf8tostring(rs_goodbye);
  showmessage(s);
end;

C’est tout ! Je n’ai plus qu’à compiler et qu’à essayer mon application.

Au revoir

Si vous le souhaitez, vous pouvez télécharger le code source du projet.