Précédent   Forum des professionnels en informatique > Autres langages > Pascal > Lazarus
Lazarus Forum d'entraide sur Lazarus, l'EDI RAD multiplateforme basé sur Free Pascal
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/12/2011, 20h07   #1
Membre expérimenté
 
Homme Gilles
Enseignant
Inscription : novembre 2006
Messages : 599
Détails du profil
Informations personnelles :
Nom : Homme Gilles
Âge : 53
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : novembre 2006
Messages : 599
Points : 570
Points : 570
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 :
    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
selzig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 11h09   #2
Membre expérimenté
 
Homme Gilles
Enseignant
Inscription : novembre 2006
Messages : 599
Détails du profil
Informations personnelles :
Nom : Homme Gilles
Âge : 53
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : novembre 2006
Messages : 599
Points : 570
Points : 570
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 :
    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 :
    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 :
    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 :
    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
selzig est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h45.


 
 
 
 
Partenaires

Hébergement Web