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

Lazarus Pascal Discussion :

[0.9.31] Utilisation d'i18n dans un composant [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [0.9.31] Utilisation d'i18n dans un composant
    Bonjour,

    je peine avec l'utilisation de i18n dans les composants.

    • D'abord dans le composant, en mode csDesigning, je suis surpris dans la plupart de ceux fournis dans le répertoire lazarus/components de ne pas y trouver un code du genre
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      procedure TmyComponent.TranslateIT;
      {uses LResources, Translations, gettext}
      var
        PODirectory, Lang, FallbackLang : String;
      begin
        PODirectory := IncludeTrailingPathDelimiter('languages');
        Lang := '';
        FallbackLang := '';
        GetLanguageIDs(Lang,FallbackLang);
       
        Translations.TranslateUnitResourceStrings('myComponent',
                            PODirectory+'myComponent.%s.po', Lang, FallbackLang);
      end;
      ...code que je placerais par exemple dans le constructeur.

      En mode csDesigning, est-ce que cela signifie que le i18n activé qui pointe vers le répertoire languages/ du composant suffit* à assurer la traduction au niveau de l'IDE ? Quelque soit la solution employée, je n'ai rien obtenu de fonctionnel.
      * : sans plus de code que la déclaration de l'unit DefaultTranslation -et encore pas dans tous- dans les uses du composant
      Question 1 : Une solution qui fonctionne ?


    • Maintenant, en mode utilisation de myComponent dans un projet, si une méthode du composant envoie un message (resourcestring) lors de l'exécution du projet, par exemple à la suite d'un Try Except incorporé à une méthode, je me demande comment peut être réalisée la traduction.
      Le resourcestring appartient au composant. A ce titre, comment peut-il (pourrait-il ?) être traduit en "mode exécution" (même si on plaçait les myComponent.xx.po du composant dans le répertoire languages/ du projet) ?
      Question 2 : La traduction dans ce cas de figure est-elle envisageable ?

    Merci.
    Cordialement. Gilles
    Dernière modification par Invité ; 21/12/2011 à 21h00.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Pour la question 2, j'ai une solution :

    • Au niveau du composant
      Dans le répertoire du composant, j'incorpore mes resourcestring dans une unité à part (ici uGlobales.pas) que je déclare dans ses uses.
      Toujours dans le composant, j'active le i18n et déclare comme répertoire pour les po générés : languages. Puis dans ce même composant , je crée une méthode TranslateLCL que l'on exécute dans le constructeur du composant;

      Code du composant TlzStringGrid:
      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
      uses
       [...],
        LResources, Translations, gettext, uGlobales;  
       
      implementation
      procedure TlzStringGrid.TranslateLCL;
      {uses LResources, Translations, gettext}
      var
        PODirectory, Lang, FallbackLang : String;
      begin
        PODirectory:= IncludeTrailingPathDelimiter('languages');
        Lang := '';
        FallbackLang := '';
        GetLanguageIDs(Lang, FallbackLang);
        Translations.TranslateUnitResourceStrings('uGlobales',
                            PODirectory + 'uGlobales.%s.po', Lang, FallbackLang);
      end;   
       
      procedure TlzStringGrid.SetColCount(Const Value: Longint);
      begin
       Showmessage(ersSetColCount);
      end;
      uGlobales.pas
      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
      unit uGlobales;
       
      {$mode objfpc}{$H+}
       
      interface
       
      uses
        Classes, SysUtils; 
      resourcestring
       ersSetColCount  = 'TlzStringGrid only works with GridColumns.';
       ersColumnDelete = 'No Gridcolumn to be deleted.';
       
      implementation
       
      end.
      Le fichier uGlobales.fr.po (ne pas oublier de l'encoder en UTF8 sans BOM avec Notepad++ par exemple si conçu sous Windows ou alors changer le charset par défaut)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      ""
      msgstr "Content-Type: text/plain; charset=UTF-8"
       
      #: lzstringgrid.erscolumndelete
      msgid "No Gridcolumn to be deleted."
      msgstr "Aucune GridColumn à effacer."
       
      #: lzstringgrid.erssetcolcount
      msgid "TlzStringGrid only works with GridColumns."
      msgstr "TlzStringGrid ne fonctionne qu'avec des GridColumns."

    • Au niveau du projet
      Dans le répertoire du projet, je copie le uGlobales.pas et le répertoire languages du composant. Je déclare uGlobales dans le code du projet... et c'est suffisant (ie il n'est pas même pas nécessaire d'activer le i18n dans le projet pour bénéficier de la traduction du composant lors de son exécution; C'est le code du composant qui s'en charge).
      Code du projet
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      uses
        [...],
        lzStringGrid, uGlobales; 
      [...]
      implementation
      procedure TForm1.Button1Click(Sender: TObject);
      begin
        lzStringGrid1.ColCount := 3;
      end;
      Button1Click renvoie : TlzStringGrid ne fonctionne qu'avec des GridColumns.


    Pour la question 1, je n'ai pas de solution. C'est moins important : par défaut les resourcestring sont en anglais; On peut supposer que cela ne gênera pas le programmeur. Mais si quelqu'un(e) a une solution pour me permettre de bénéficier des messages en csDesigning dans la langue de l'IDE, je suis preneur.

    Cordialement.
    Gilles
    Dernière modification par Invité ; 22/12/2011 à 14h34. Motif: Précisions

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/12/2011, 15h02
  2. [Joomla!] Utiliser les plugins dans les composants personels
    Par staarkoo dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 09/02/2011, 23h22
  3. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  4. impossible d'utiliser ma fonction dans un insert
    Par caramel dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/04/2003, 15h04
  5. Utilisation de Pointeurs dans API windows
    Par Drooxy dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 13/03/2003, 22h39

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