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 :

Stocker les ressourcestrings


Sujet :

Langage Delphi

  1. #1
    Membre éclairé Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Par défaut Stocker les ressourcestrings
    Bonjour,

    Excusez moi de vous déranger, mais je voudrai savoir comment vous faîtes pour stocker vos ressourcestrings...

    J'ai ai 500 et je trouve que ça "fou le Bordel !" dans mon unit

    Vous faîtes comment ? Y'a t'il moyen de les mettre dans un autre fichier ?

    Merci

  2. #2
    Membre éclairé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 83
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 777
    Par défaut
    Petite question pour être sûr

    J'ai trouvé TResourceStream, mais pas Tressourcstring. Tu trouves ça où ?

  3. #3
    Membre éclairé Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Par défaut
    Les ressourcestrings ce sont juste des chaînes que tu déclares à part pour mieux traduire ton application...

  4. #4
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Par défaut
    Pour gérer mes resourcestring, je procède de la façon suivante:

    Pour chaque langue je décris chaque ressource dans un fichier texte :

    francais.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    resourcestring
      RSTYes = 'oui';
      RSTMessage = 'Salut %s';
    anglais.txt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    resourcestring
      RSTYes = 'yes';
      RSTMessage = 'hello %s';
    puis j'ai créé une unité international.pas où j'appelle via la directive {$I monfichier} le fichier de langue concerné. Avec la fonction FilterString, (voir code ci-dessous) on peut récupérer la valeur d'une resourcestring.


    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
    26
    27
    28
    29
    30
    31
    32
     
    unit international;
    interface
    {$I appli.inc}
    {$IFDEF anglais}
       {$I anglais.txt}
    {$ELSE}
       {$IFDEF francais}
          {$I francais.txt}
       {$ENDIF}
    {$ENDIF}
     
    function FilterString(AResString: Pointer): string;
     
    type
      TFilterGetResourceStringFunc = function(
        AResString: Pointer): string;
     
    var
      FilterGetResourceStringFunc: TFilterGetResourceStringFunc;
     
    implementation
    function FilterString(
      AResString: Pointer): string;
    begin
      if Assigned(FilterGetResourceStringFunc) then
        Result := FilterGetResourceStringFunc(AResString)
      else
        Result := LoadResString(AResString);
    end;
     
    end.

    Dans le fichier mon appli.inc qui contient toutes les directives de mon application, on active la langue qui doit être utilisée lors de la compilation.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    {-$DEFINE anglais}
    {$DEFINE francais}
    ici le français est actif lors de la compilation.

    Il suffit maintenant de déclarer l'unité international dans toutes les unités qui vont appeler les ressourceString et d'utiliser la fonction FilterString(@maresourcestring) et le tour est joué.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    uses
      international;
     
    procedure TForm1.afficheResource;
    begin
      showMessage(FilterString(@RSTYes));
      showMessage(format(FilterString(@RSTMessage),['Rémi']));
    end;
    Voilà la solution que j'emploie. Il y a certainement mieux et plus efficace...

  5. #5
    Membre éclairé Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Par défaut
    C'est très gentil, mais faut que je réécrive tout mon code
    Je voulais juste une solution pour éviter d'avoir un méga fichier de milliers de lignes...

    Il n'y a peut être pas moyen de les mettre dans un autre fichier...

    Merci quand même

  6. #6
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Par défaut
    Je crois que ta réponse se touve là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {$I mesressources.txt}
     
    
    Tu crées un fichier text avec toutes tes ressources, tu coupes et colles tes ressources existantes dedant. Puis tu l'incopores à ton unité où elles se trouvaient initialement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    unit
    .....
    interface
     
    {$I mesressources.txt}
    ....
    Cela te prendra à peine deux minutes

  7. #7
    Membre éclairé Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Par défaut
    Ca fonctionne très bien, merci

  8. #8
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Pascal Jankowski :
    J'aime beaucoup ta solution, mais une chose me chagrine : la langue est définit de manière statique avant l'exécution. Est ce possible de la définir à l'exécution avec un appel à GetSystemDefaultLangID ?

    Merci d'avance,
    Kal

  9. #9
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Par défaut
    Bonjour _Kal

    Effectivement cette solution reste statique. J'adapte parfois cette solution quand je développe des composants.
    Je l'ai posté pour répondre à la question de Remixtech quand à connaître nos habitudes avec l'utilisation des resourcestring.

    Par contre, pour favoriser le côté dynamique dans un applicatif, j'utilise l'expert DLL de ressources qui lui répond parfaitement au problème et s'avère très pratique.

  10. #10
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Merci de ta réponse Pascal

    Voici la solution (teporaire) que j'ai adapté et qui ne me plait absolument pas :

    section var de interface
    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
    var
      RSTUn7zipNotFound: string = 'Unable to find %s' + sLineBreak +
      'It should be placed in : %s';
      RSTDPsNotFound: string = 'No DriverPacks found';
      RSTRunError: string = 'Unable to run %s';
      RSTBtnShowHLP: string = 'Show Supported' + sLineBreak + 'Device';
      RSTAcShowHLP: string = 'Show Supported Devices';
      RSTCbxCheckUncheckAll: string = 'Select/Unselect All';
      RSTAcExtract: string = 'E&xtract';
      RSTListViewColum0: string = 'DriverPacks';
      RSTListViewColum1: string = 'File Names';
      RSTMiFile: string = '&File';
      RSTMiHelp: string = '&Help';
      RSTExit: string = '&Exit';
      RSTLblChronoTitle: string = 'Auto-Extraction in :';
    Dans OnCreate, j'appelle DoLocalization:
    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
    26
    27
    28
    29
    30
    31
    32
    33
    procedure TForm1.DoLocalization;
    begin
      if GetSystemDefaultLangID = 1036 then
      begin
        RSTUn7zipNotFound := 'Impossible de trouver %s' + sLineBreak +
          'Il devrait être placé dans : %s';
        RSTDPsNotFound := 'Aucun DriverPacks trouvé';
        RSTRunError := 'Impossible d''exécuter %s';
        RSTCbxCheckUncheckAll := 'Tout sélectionner/désélectionner';
        RSTBtnShowHLP := 'Afficher les périphériques ' + sLineBreak +
          'supportés';
        RSTAcShowHLP := 'Afficher les périphériques supportés';
        RSTAcExtract := 'E&xtraire';
        RSTListViewColum0 := 'DriverPacks';
        RSTListViewColum1 := 'Noms des fichiers';
        RSTMiFile := '&Fichier';
        RSTMiHelp := '&Aide';
        RSTExit := '&Quitter';
        RSTLblChronoTitle := 'Auto-Extraction dans :';
      end;
      btnShowHLP.Caption := RSTBtnShowHLP;
      acShowHLP.Caption := RSTAcShowHLP;
      cbxCheckUncheckAll.Caption := RSTCbxCheckUncheckAll;
      acExtract.Caption := RSTAcExtract;
      ListView.Column[0].Caption := RSTListViewColum0;
      ListView.Column[1].Caption := RSTListViewColum1;
      miFile.Caption := RSTMiFile;
      miHelp.Caption := RSTMiHelp;
      acFileExit.Caption := RSTExit;
     
      lblChronoTitle.Caption := RSTLblChronoTitle;
      lblChrono.Left := lblChronoTitle.Left + lblChronoTitle.Width + 6;
    end;
    J'aurai aimé gardé ta structure qui consiste à séparer les trads dans des fichiers distincts, mais je n'y arrive pas ...

    Je ne connais pas expert dll, c'est inclus dans Delphi ?

    Kal

  11. #11
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Par défaut
    Pourquoi ne crées-tu pas un fichier texte comme indiqué à Remixtech ? Ce fichier contiendrait ta traduction.

    francais.txt
    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
        RSTUn7zipNotFound := 'Impossible de trouver %s' + sLineBreak +
          'Il devrait être placé dans : %s';
        RSTDPsNotFound := 'Aucun DriverPacks trouvé';
        RSTRunError := 'Impossible d''exécuter %s';
        RSTCbxCheckUncheckAll := 'Tout sélectionner/désélectionner';
        RSTBtnShowHLP := 'Afficher les périphériques ' + sLineBreak +
          'supportés';
        RSTAcShowHLP := 'Afficher les périphériques supportés';
        RSTAcExtract := 'E&xtraire';
        RSTListViewColum0 := 'DriverPacks';
        RSTListViewColum1 := 'Noms des fichiers';
        RSTMiFile := '&Fichier';
        RSTMiHelp := '&Aide';
        RSTExit := '&Quitter';
        RSTLblChronoTitle := 'Auto-Extraction dans :';
    Puis tu modifies ta procédure doLocalization de la façon suivante :

    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
    procedure TForm1.DoLocalization;
    begin
      if GetSystemDefaultLangID = 1036 then
      begin
        {$I francais.txt}
      end;
      AssignCaptionToComponents;
    end;
     
    procedure TForm1.AssignCaptionToComponents;
    begin
     btnShowHLP.Caption := RSTBtnShowHLP;
     acShowHLP.Caption := RSTAcShowHLP;   
     cbxCheckUncheckAll.Caption := RSTCbxCheckUncheckAll;
     acExtract.Caption := RSTAcExtract;
     ListView.Column[0].Caption := RSTListViewColum0;
     ListView.Column[1].Caption := RSTListViewColum1;
     miFile.Caption := RSTMiFile;
     miHelp.Caption := RSTMiHelp;
     acFileExit.Caption := RSTExit;
     
     lblChronoTitle.Caption := RSTLblChronoTitle;
     lblChrono.Left := lblChronoTitle.Left + lblChronoTitle.Width + 6;  
    end;
    Comme cela tu peux avoir ton fichier de traduction séparé.

    En ce qui concerne l'expert dll de ressources, il est disponible depuis la version 5 de Delphi version entreprise.
    D'ailleurs voici un lien vers un tuto qui traite de l'internationalisation des projets.

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

Discussions similaires

  1. [JTree] comment y stocker les objets ?
    Par calogerogigante dans le forum Débuter
    Réponses: 12
    Dernier message: 16/08/2008, 20h39
  2. stocker les degrès dans la BD postgresql
    Par coquero dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 24/12/2005, 11h47
  3. Créer un ficher pour stocker les informations
    Par b_steph_2 dans le forum C++
    Réponses: 3
    Dernier message: 10/11/2005, 10h08
  4. [WebForms][Web.config] Stocker les chaine de connexion
    Par bossun dans le forum Général Dotnet
    Réponses: 15
    Dernier message: 19/08/2005, 15h34
  5. [JDBC] Stocker les résultats d'une requête
    Par etiennegaloup dans le forum JDBC
    Réponses: 9
    Dernier message: 26/07/2005, 18h18

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