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
class(tmainform)
tmainfo =
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.
J’attribue également une valeur à la propriété text.
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
'Something'; rs_mystring =
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.
L’application MSEi18n se trouve dans le dossier <msedir>/tools/i18n/.
Après avoir compilé MSEi18n, je l’ouvre, et je clique sur le bouton Configure.
Les champs MSEDIR et COMPILER doivent être renseignés.
Je crée un nouveau projet de traduction en cliquant sur le bouton New.
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.
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.
Oui, mon exemple est mal fait : la chaîne de ressource fait double-emploi avec la propriété text du composant. Tant pis !
Une fois le travail de traduction achevé, je sauvegarde mon projet en cliquant sur le bouton Save.
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.
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.
Dans la classe tmainfo
j’ajoute une méthode
updatedisp
.
type
class(tmainform)
tmainfo =
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;
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
'demo_de');
loadlangunit(//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.