Interface utilisateur multi-langue.

Interface utilisateur multi-langue. - Delphi/Pascal - Programmation

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.

Reply

Marsh Posté le 26-04-2005 à 17:33:02   

Reply

Marsh Posté le 27-04-2005 à 12:52:47    

Solution facile : utiliser un truc tout fait :D
 
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.


Message édité par antp le 27-04-2005 à 12:56:07

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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.


Message édité par Elmoricq le 27-04-2005 à 13:02:58
Reply

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.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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.


---------------
Mes photos : http://500px.com/endemyon
Reply

Marsh Posté le 28-04-2005 à 10:05:25    


unit AntStringList;
 
interface
 
uses
  Classes;
 
type
 
  TAntStringList = class(TComponent)
  private
    FStrings: TStrings;
    procedure SetStrings(Value: TStrings);
  protected
  public
    constructor Create(Owner: TComponent); override;
    destructor  Destroy; override;
  published
    property Strings: TStrings read FStrings write SetStrings;
  end;
 
procedure Register;
 
implementation
 
procedure Register;
begin
  RegisterComponents('Ant', [TAntStringList]);
end;
 
constructor TAntStringList.Create(Owner: TComponent);
begin
  inherited;
  FStrings := TStringList.Create;
end;
 
destructor TAntStringList.Destroy;
begin
  FStrings.Free;
  inherited;
end;
 
procedure TAntStringList.SetStrings(Value: TStrings);
begin
  FStrings.Assign(Value);
end;
 
end.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed