IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Comment gérer la traduction d'une appli avec resourceString ?


Sujet :

Langage Delphi

  1. #1
    Membre habitué

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Points : 175
    Points
    175
    Par défaut Comment gérer la traduction d'une appli avec resourceString ?
    Bonjour,

    Je souhaiterais gérer la traduction d'une nouvelle application Delphi XE4.

    => Dans les options de l'application, on pourra sélectionner la langue affichée
    L'idée est de charger un fichier ini (UNICODE) avec la traduction correspondante.

    langFRA.ini
    Ex:
    demo_formcaption = 'Titre de l''application';
    demo_captionbutOK = 'Validation';
    langENG.ini
    Ex:
    demo_formcaption = 'Title application';
    demo_captionbutOK = 'Validate';
    langALL.ini
    langRUS.ini
    langCN.ini
    ...

    Je souhaiterais traduire (En fonction de la langue choisie dans l'appli et non en fonction de la langue du poste) :
    - Les chaines Delphi
    ex : Indice de liste hors limite...
    - Les chaines de mon application (caption, hint, message...)

    En surfant sur le net, j'ai vu que LA FACON de gérer la traduction est d'utiliser les ResourceString.

    Par contre j'ai X questions car je n'ai pas trouvé d'exemples complet et je ne connais pas le principe de A à Z.

    Pour résumer ce que je dois faire

    1.0- La déclaration des ressourceString dans l'applicatif
    Ce que j'ai trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    unit trad;
     
    interface
     
    resourcestring
      demo_formcaption  = 'Titre de l''application';
      demo_captionbutOK = 'Valider';
     
    implementation
     
    end.
    2.0- Extraire les resourceString du projet Delphi ("constante" + chaine) pour enregistrer dans un fichier langREF.ini : utile pour la constitution du fichier ini et pour donner le fichier pour traduction

    3.0- Utilisation d'une resourceString
    Ce que j'ai trouvé mais sans la gestion $3.1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Caption:= stl_formcaption
    //ou
    Caption:= LoadResString(@stl_formcaption);
    3.1- Si pas de fichier ini chargé, le programme doit utiliser les resourceString renseigné dans l'application
    Si fichier ini chargé, le programme doit utiliser le resourceString traduit du fichier ini (si non trouvé, utilser celui renseigné dans l'application)

    4.0- Procédure d'initialisation pour le changement de traduction à la volée

    5.0- Lorsque j'ajoute de nouvelle resourceString, la trad existante fonctionne toujours : se baser sur le nom de la resourceString et non sur un ID...

    Comment faire tout ceci ? Comment procéder ?

    Un exemple ou une démo serait la bienvenue.

    Merci beaucoup.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    je conseille d'aller faire un tour du coté de dggettext
    bon , ce n'est pas un fichier ini qui sera produit mais c'est vraiment un standard
    une petite demo ici qui vaut mieux qu'un long discours

    il y a aussi le composant XE4 TLang (Fmx), T.Laborde nous en a fait une petite démonstration lors des devdujeudi cela doit être durant l'épisode 16 par contre je ne suis plus sur du draft matin 2° partie ou après midi 1° partie
    L'outil de traduction fourni avec les Delphi VCL par contre n'est pas vraiment top
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre habitué

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Points : 175
    Points
    175
    Par défaut
    Pour clore le sujet et apporter une solution.

    Je parcours les resourceString en mémoire pour les passer en Lecture/Ecriture.
    Je change donc la valeur de la chaine de chaque resourceString (Passage de FRA -> ENG)
    Je rétablit le mode d'accès des resourceString (Lecture si elle était dans cet état).

    Et ceci fonctionne donc pour traduire n'importe quel composant (à condition d'avoir les sources des composants pour parcourir et connaitre les resourceString déclaré)
    resourceString Delphi, DevExpress, QuickReport, nos propres resourceString, etc.

    Voici un exemple trouvé sur le net :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    unit LanguageControl;
     
     interface
     
     implementation
     
     uses
       Windows, Consts;
     
     // Assign new value to a resource string
     procedure HookResourceString(ResStringRec: pResStringRec; NewStr: pChar) ;
     var
       OldProtect: DWORD;
     begin
       VirtualProtect(ResStringRec, SizeOf(ResStringRec^), PAGE_EXECUTE_READWRITE, @OldProtect);
       ResStringRec^.Identifier := Integer(NewStr);
       VirtualProtect(ResStringRec, SizeOf(ResStringRec^), OldProtect, @OldProtect);
     end;
     
     initialization
       HookResourceString(@SCannotOpenClipboard, 'Nije moguce otvoriti Clipboard') ;
       HookResourceString(@SMsgDlgWarning, 'Upozorenje');
       HookResourceString(@SMsgDlgError, 'Greska');
       ...
     end.
    http://delphi.about.com/od/delphitip...esourcestr.htm

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Traduction d'une appli : pb avec le .resx
    Par noftal dans le forum VB.NET
    Réponses: 33
    Dernier message: 04/04/2016, 17h16
  2. comment récupérer la fermeture d'une appli lancée avec "subprocess"
    Par ptissendier dans le forum Général Python
    Réponses: 2
    Dernier message: 11/04/2014, 07h49
  3. [C#/SQL] Comment gérer les exceptions d'une Procédure stockée ?
    Par thomas_strass dans le forum Accès aux données
    Réponses: 10
    Dernier message: 06/07/2005, 10h40
  4. Réponses: 17
    Dernier message: 18/03/2005, 15h56
  5. Déployer une appli avec SQL SERVER
    Par tiboleo dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 15/10/2003, 14h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo