Interface utilisateur multi-langue. - Delphi/Pascal - Programmation
Marsh Posté le 27-04-2005 à 12:52:47
Solution facile : utiliser un truc tout fait
J'avais fait une classe qui gère la traduction des éléments.
www.antp.be/temp/AntTranslator.pas
Tu as par exemple dans ton fichier .lng ceci :
[Form1]
Caption=Titre de fenêtre
Button1.Caption=Le bouton
etc.
Pour créer l'objet tu fais ceci :
Translator := TAntTranslator.Create(nil);
Translator.SetLanguageFile('français.lng');
Puis quand tu veux traduire une Form (dans le OnCreate des forms par exemple) tu fais :
Translator.Translate(Self);
Et il ira chercher dans français.lng la section ayant le nom de la Form en cours et il traduira tous les éléments.
Sinon il y a un composant gratuit de traduction qui fonctionne de manière similaire, mais j'ai pas l'URL sous la main.
Marsh Posté le 27-04-2005 à 13:02:15
Personnellement, j'utiliserais les mêmes variables partout (un genre de constantes initialisées), avec une fonction unique qui lit un fichier langage pour initialiser ces "constantes".
Changement de langage => appel de la fonction (+ rafraîchissement de l'affichage). Et basta, rien d'autre ne change.
Toute l'appli devra par contre utiliser les variables au lieu des chaînes en dur, néanmoins il n'y aura pas besoin de faire n appels de fonction.
Mais il y a peut-être plus élégant, ma solution est quand même assez basique.
Marsh Posté le 27-04-2005 à 13:32:50
Ha oui j'avais oublié de dire un truc, la solution que j'ai donné c'est pour traduire les Forms.
Pour traduire les chaînes "en dur", je passais par un composant qui les stocke sur les forms, comme ça elles sont traduites directement par le même système que pour traduire les forms. Si nécessaire je peux mettre ce composant sur mon serveur aussi.
Marsh Posté le 28-04-2005 à 09:58:54
Moi je suis intéressé par le composant qui stocke les chaines sur les form. J'avais déja vu ton composant AntTranslator et je me demandais comment tu fesais pour les chaines.
Marsh Posté le 28-04-2005 à 10:05:25
|
Marsh Posté le 26-04-2005 à 17:33:02
Hello ! Vague idée qui me vient alors que je ferais mieux de travailler :
Je me dis que moins mon appli aura de chaînes de caractères codées en dur, plus elle sera facile à traduire. J'ai bien envie de mettre un maximum de ces chaînes dans un fichier texte (français.lng, english.lng...). Stocker les chaînes sous une forme clef=valeur me paraît pratique.
Pour la lecture du fichier de langue et la modif de masse des Caption et Hint, je sais pas encore vraiment comment faire. Je n'ai vraiment pas envie de me lancer dans le codage d'un million de lignes du genre ButtonCancel.Caption := GetLanguageValue('cancel') (avec GetLangageValue(string) une fonction que j'aurais codée). Je pense plutôt opérer un balayage de tous les composants d'une fiche lors de sa création, et faire un TheComposant.Caption := GetLangageValue(TheComposant.Caption).
Je m'avance vers de graves ennuis à votre avis ? Tous les composants ont-il un Caption et un Hint ? Si non comment m'en assurer avant de faire l'affectation ? Je vais rencontrer des problèmes si je gère pas l'unicode ? Si oui faut que je fasse quoi pour le gérer ?... Etc, etc.. Je ferai des essais ce soir et je posterai ce que je trouverai. Si vous avez déjà fait de tels trucs, vous pourrez peut-être m'éviter des errements .
Merci en tout cas.