IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Gouyon

Composant pour la traduction de l'interface d'une application FMX

Noter ce billet
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...)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.

Envoyer le billet « Composant pour la traduction de l'interface d'une application FMX » dans le blog Viadeo Envoyer le billet « Composant pour la traduction de l'interface d'une application FMX » dans le blog Twitter Envoyer le billet « Composant pour la traduction de l'interface d'une application FMX » dans le blog Google Envoyer le billet « Composant pour la traduction de l'interface d'une application FMX » dans le blog Facebook Envoyer le billet « Composant pour la traduction de l'interface d'une application FMX » dans le blog Digg Envoyer le billet « Composant pour la traduction de l'interface d'une application FMX » dans le blog Delicious Envoyer le billet « Composant pour la traduction de l'interface d'une application FMX » dans le blog MySpace Envoyer le billet « Composant pour la traduction de l'interface d'une application FMX » dans le blog Yahoo

Mis à jour 07/03/2024 à 16h57 par Malick

Catégories
Programmation

Commentaires