par , 04/03/2024 à 11h19 (2262 Affichages)
Introduction
J'ai eu le besoin d'avoir une interface qui soit disponible dans différentes langues (français et anglais). Pour ce faire j'ai voulu utiliser le composant TLang. Malheureusement soit je n'ai pas bien compris le fonctionnement de ce composant soit il n'est pas vraiment au point mais il ne fonctionnait pas correctement. J'avais des textes non traduit alors que j'avais explicitement indiqué la traduction. Par ailleurs j'ai besoin dans mon interface de pouvoir afficher des données numérique associé à du texte du genre "Il vous reste 50 litres de carburant".
En conséquence je me suis lancé dans la création d'un composant que je vous livre tel quel.
Le composant
Il est basé sur des TDictionary et des fichiers de traduction au format JSON.
Pour chaque langue il y a un mot clef auquel on affecte une traduction. Exemple: mot clef chkManEva traduction Manoeuvre évasive
Afin de pouvoir avoir plusieurs langues disponible au niveau de l'interface l'ensemble des TDictionary de traduction est regroupé dans un TDictionary avec comme clef une chaine de caractère qui correspond à la langue (FRA,ENG...)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
TTraduc = TDictionary<string, string>;
TTraducteur = class(TObject)
private
lesTraduc: TDictionary<string, TTraduc>;
slngref: string;
public
constructor Create; overload;
constructor Create(rep: string); overload;
function traduit(scode, sref: String): String;
function majtraduction(scode, sref, trad: String): boolean;
procedure retireRef(sref: String);
procedure ref2Liste(lst: TStringList);
procedure langues2Liste(lst: TStringList);
procedure Sauve(rep: string);
end; |
Il y a deux constructeur le premier est un constructeur par défaut qui va simplement initialiser les membres privé du composant. Le second constructeur est celui qui sera majoritairement utilisé. Comme paramètre on lui indique le répertoire où les fichier JSON de traduction sont stockés. Il va lire tous les fichier JSON et les classer dans les TDictionary
Structure des fichiers JSON
Les fichiers JSON ont la structure d'un tableau de couple de chaine de caractères. En voici un exemple
1 2
|
[{"ref": "loc_CtrlFCS", "trad": "Batterie"},{"ref": "spbtnRetireTrl", "trad": "<<<"},{"ref": "spbtnAjoutTrl", "trad": ">>>"},{"ref": "lblTitreCible", "trad": "Cibles"}, {"ref": "loc_prt_elem_prop_propshaft", "trad": "perte de %d syst\u00e8me de transmission"}] |
Utilisation du composant
C'est la fonction traduit qui en fonction des paramètres retournera une chaine de caractère dans laquelle figurera le texte à afficher dans la langue demandée. Le retour de cette fonction peut être utilisé de 2 façons:
Soit il s'agit d'un message simple sans paramètre alors on l'utilise tel quel:
1 2
|
Label1.Text := trad.traduit('ENG','loc_joueur'); //Dans le JSON {"ref": "loc_joueur", "trad": "Player"} |
Donnera un label avec le texte Player
Soit il s'agit d'un message avec des paramètres auquel cas il faut employer la chaine de retour avec la fonction format:
1 2
|
Label1.Text :=Format(trad.traduit('ENG','loc_carburant'),[monCarburant]);//Dans le JSON {"ref": "loc_carburant", "trad": "Fuel remainig %d tons"} |
Donnera un label avec le texte Fuel remaining 5 tons
Utilitaire de gestion des fichiers JSON
Avec le composant j'ai aussi développé un petit outils de gestions des fichiers JSON qui permet de gérer plus facilement les traductions.
Le code source
Le code source est disponible sur GitHub (https://github.com/Remi1945/Traducteur) et vous pouvez l'utiliser sans contraintes.