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 :

Comment intégrer les fichiers de traduction (.po) dans l'exe [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre à l'essai
    Profil pro
    Dev
    Inscrit en
    Octobre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Octobre 2010
    Messages : 23
    Points : 15
    Points
    15
    Par défaut Comment intégrer les fichiers de traduction (.po) dans l'exe
    Bonjour,

    Je teste la possibilité d'avoir une application multilingue.
    Cela fonctionne bien, mais si j'utilise l'application sur un autre poste, je dois ajouter le répertoire dans lequel se trouvent les fichiers .po
    Est-il possible de les intégrer dans l'exécutable ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 245
    Points : 534
    Points
    534
    Par défaut
    Bonjour,

    Vous pouvez intégrer les fichiers .po dans le fichier ressources de l'application. Classiquement pour obtenir les libellés en français des composants standards comme les boutons, on peut intégrer le fichier lclstrconsts.fr.po dans le fichier ressources et on traduit l'unité lclstrconsts juste après l'initialisation de l'application.
    Mais pour une traduction en de multiples langues, il me semble préférable de livrer les fichiers .po avec l'application dans un répertoire séparé pour ne pas charger inutilement l'exécutable. Ça facilite également la mise à jour des traductions.

    André

  3. #3
    Membre à l'essai
    Profil pro
    Dev
    Inscrit en
    Octobre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Octobre 2010
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Merci André,

    Je vais donc rester avec les .po dans un répertoire séparé.
    Cependant, copier les fichiers lclstrconsts.xx.po dans ce répertoire ne fonctionne pas.
    Par exemple, si je prend le composant savedialog1 j'ai toujours la version anglaise affichée, malgré la sélection d'une autre langue.
    Pour avoir le titre de cette boite en français, j'ai ajouté les lignes suivantes à mon fichier .po :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #: tform1.savedialog1.title
    msgid "Save file as"
    msgstr "Enregistrer le fichier sous"
    En revanche, comment faire pour avoir la mention 'Tous les fichiers' à la place de 'All File Types' ?
    Nom : 2015-12-04_161349.png
Affichages : 291
Taille : 5,8 Ko

  4. #4
    Membre confirmé

    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 145
    Points : 625
    Points
    625
    Par défaut
    A priori, ceci est codé 'en dur' quand le filtre (propriété "Filter") de ce contrôle est vide (cf. "win32wsdialogs.pp").

    De plus, cette propriété n'est pas exportée en activant l'option "i18n" d'un projet.

    Le plus simple est donc probablement d'utiliser ici une "resourcestring" et de l'affecter dans le code à la propriété 'Filter' du contrôle TSaveDialog concerné. Une entrée correspondante sera alors créée dans le(les) fichier(s) de langue, et pourra ainsi être traduite.

    Example

    Dans le code source de l'unité concernée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    resourcestring
      MySaveDialogFilter = 'Text files (*.txt)|*.txt|All files (*.*)|*.*';
     
    ...
     
      SaveDialog1.Filter := MySaveDialogFilter;
      SaveDialog1.FilterIndex := 1;
      SaveDialog1.Execute;
    On trouve alors dans le fichier "langue de base" [project].po et dans tous les autres fichiers de langue [project].xx.po, l'entrée suivante (pour l'unité Unit1.pas):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #: unit1.mysavedialogfilter
    msgid "Text files (*.txt)|*.txt|All files (*.*)|*.*"
    msgstr ""
    Il suffit alors de la traduire de la façon habituelle. Par exemple pour le fichier français:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #: unit1.mysavedialogfilter
    msgid "Text files (*.txt)|*.txt|All files (*.*)|*.*"
    msgstr "Fichiers text (*.txt)|*.txt|Tous les fichiers (*.*)|*.*"

  5. #5
    Membre à l'essai
    Profil pro
    Dev
    Inscrit en
    Octobre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Octobre 2010
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Merci FChrisF, mais cela ne fonctionne pas.
    L'application prend bien en compte la 'resourcestring' créée, mais n'en change plus ensuite quel que soit le contexte de langue sélectionné.

  6. #6
    Membre confirmé

    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 145
    Points : 625
    Points
    625
    Par défaut
    A priori, cela devrait fonctionner correctement.

    Bien sûr, il faut mettre à jour la propriété filtre du contrôle TSaveDialog avant chaque appel à son exécution (ou tout au moins après chaque changement de langue). Si cette propriété n'est mise à jour qu'une seule fois, par exemple lors de la création de la fiche, la mise à jour de la langue n'est bien entendu pas répercutée automatiquement.

    En pièce jointe, un petit exemple pour illustrer ceci: dans un souci de simplification, je n'ai traduit que la resourcestring concernée dans les fichiers .po.

    Les parties du code les plus intéressantes:
    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
     
     
    uses
     ... DefaultTranslator, LCLTranslator;
     
    ...
     
    resourcestring
      rsSaveDialogFilter = 'Text files (*.txt)|*.txt|All files (*.*)|*.*';
     
    ...
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      SaveDialog1.Filter := rsSaveDialogFilter;
      SaveDialog1.FilterIndex := 1;
      if SaveDialog1.Execute then
        ShowMessage('Fichier ' + SaveDialog1.FileName + ' à sauver.');
    end;
     
    ...
     
    procedure TForm1.RadioButton1Change(Sender: TObject);
    begin
      SetDefaultLang('en');
    end;
     
    procedure TForm1.RadioButton2Change(Sender: TObject);
    begin
      SetDefaultLang('fr');
    end;
     
    ...
    Fichiers attachés Fichiers attachés

  7. #7
    Membre à l'essai
    Profil pro
    Dev
    Inscrit en
    Octobre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Octobre 2010
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    C'est effectivement le rafraichissement de la propriété de filtre après le changement de langue qui manquait.
    Comme cela est automatique pour les autres composants, je n'y ai pas pris garde.
    Merci beaucoup d'avoir pris le temps de me répondre de façon très détaillée.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 18/06/2009, 11h04
  2. Comment lister les fichiers dans un répertoire ?
    Par PatricePatrice dans le forum Framework .NET
    Réponses: 18
    Dernier message: 04/01/2007, 11h15
  3. Réponses: 6
    Dernier message: 03/05/2006, 12h01
  4. Réponses: 11
    Dernier message: 13/03/2006, 18h51
  5. Réponses: 5
    Dernier message: 16/07/2005, 01h01

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