Tutoriel MSEide


Une application en plusieurs langues avec MSEi18n

Mon application

Mon application sera largement inspirée 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
  tmainfo = class(tmainform)
    sd_mystring: tstringdisp;
    b_reset: tbutton;
    b_german: tbutton;
    b_french: tbutton;
  end;

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

Inspecteur d’objet

J’attribue également une valeur à la propriété text.

Inspecteur d’objet

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

implementation

uses
  main_mfm, msei18nutils;

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

uses
  main_mfm, msei18nutils;

resourcestring
  rs_mystring = 'Something';

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.

{"version":1,"strings":[
{"hash":63616551,"name":"main.rs_mystring","sourcebytes":[83,111,109,101,116,104,105,110,103],"value":"Something"}
]}

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 je clique sur le bouton Configure.

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 en cliquant sur le bouton New.

MSEi18n New

Édition du projet

Je clique sur le bouton Edit.

Dans la colonne File, j’ajoute 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. 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.

MSEi18n Edit

Traduction des chaînes

Je ferme la fenêtre en cliquant sur OK. Je peux maintenant traduire les chaînes contenues dans mon fichier MFM, ainsi que la chaîne de type resourcestring.

MSEi18n

Oui, mon exemple est mal fait : la chaîne de ressource fait double-emploi avec la propriété text du composant. Tant pis !

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 de traduction, je crée les dossiers de destination.

$ mkdir -p de
$ mkdir -p fr

Je peux maintenant compiler le projet en cliquant sur Make.

MSEi18n Make

Je vois que des fichiers ont été créés dans le répertoire de mon application.

mydemo
├── 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.

Changer la langue de l’application

La fonction utf8tostring

Dans la classe tmainfo j’ajoute une méthode updatedisp.

type
  tmainfo = class(tmainform)
    sd_mystring: tstringdisp;
    b_reset: tbutton;
    b_german: tbutton;
    b_french: tbutton;
  protected
    procedure updatedisp;
  end;

Dans le corps de cette méthode, j’utilise la fonction utf8tostring pour obtenir la traduction de la chaîne rs_mystring.

procedure tmainfo.updatedisp;
begin
  sd_mystring.value := utf8tostring(rs_mystring);
end;

La procedure loadlangunit

Je crée une méthode pour l’événement onexecute du bouton b_german. Dans le corps de cette méthode, j’utilise la fonction loadlangunit pour changer la langue.

procedure tmainfo.onexecute_b_german(const sender: TObject);
begin
 loadlangunit('demo_de');
 //updatedisp;
end;

C’est là qu’il faudrait exécuter aussi la méthode updatedisp, mais dans mon exemple c’est inutile puisque la traduction des propriétés du composant est déjà assurée sans cela.

Pour remettre l’application en anglais, je n’aurai qu’à appeler la procédure loadlangunit avec une chaîne vide comme argument.

loadlangunit('');

C’est tout !

Vous pouvez télécharger le code source du projet.