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

PyQt Python Discussion :

Traduction d'une fenetre secondaire


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut Traduction d'une fenetre secondaire
    Bonjour,

    toujours dans l'idée d'une amélioration de mon logiciel en cours de création.

    Je rencontre encore un soucis au niveau de la traduction, en effet j'ouvre une fenêtre secondaire de type About via le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MKVExtractorGui(QMainWindow):
         self.ui.about_open.activated.connect(self.AboutMKVExtractorGui)
    ....
     
        def AboutMKVExtractorGui(self):
            """Affichage de la fenetre about."""
            dial = QDialog()
            self.about = Ui_about_window()
            self.about.setupUi(dial)
            reply = dial.exec_()
    Cela fonctionne très bien.
    Mais le soucis est celui de la traduction, en effet bien que le fichier de traduction contienne les textes de la fenêtre, impossible d'avoir la traduction.

    Comment peut-on faire pour avoir la traduction de la fenêtre ?

    Merci

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne sais pas utiliser la traduction en général (QTranslator, etc...), mais comme je fais des programmes en français pour des français, j'ai tout de même trouvé comment traduire les boutons des messagebox pour avoir "oui/non" et pas "yes/no". Voir mon tuto:

    http://python.jpvweb.com/mesrecettes...t4_traductions
    http://pyqt.developpez.com/tutoriels...4/traductions/

    Pour la traduction en général, je suis intéressé, mais je n'ai pas encore trouvé un tuto assez simple pour me donner envie. Par contre, il y a un exemple fourni avec PyQt4 qui fonctionne bien. Sous Windows, il est ici: C:\Python27\Lib\site-packages\PyQt4\examples\tools\i18n.

    Si tu réussis, ce serait bien que tu expliques comment tu as fait!

  3. #3
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    je regarde ça tout à l'heure.

    Sinon la traduction est très simple

    1) Utiliser la commande tr("la chaine à traduire") dans ton son script python.
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.widget.setStatusTip(tr("Bonjour je suis une chaine traduite"))
    Possibilité d'utiliser trUTF8 egalement si pas python3 d'utilisé.


    2) Permettre la traduction des textes des widgets via qtdesigner (option activée pour chaque texte de chaque widget par défaut) si qtdesigner est utilisé.


    3) Lancer une petite commande qui va lister tous les textes à traduire dans un fichier ts (translate) :
    ex avec mon logiciel MKVExtractorGui.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pylupdate4 MKVExtractorGui.ui MKVExtractorGui.py -ts MKVExtractorGui_fr_FR.ts
    pylupdate4 ou pylupdate5 en fonction de qt.
    MKVExtractorGui_fr_FR.ts : langue qui résultera (fr_FR si anglais => Francais ou en_EN si Francais => anglais).

    Le fichier ts est à conserver, car si la commande ci-dessus est à nouveau exécutée, le fichier sera simplement mis à jour. Sans lui il faudra tout recommencer depuis 0.

    Il y a également l'option -noobsolete qui peut être pratique, elle vire tous les anciens textes qui ne sont plus utilisés.
    Par défaut le fichier conserves tous les textes utilisés mais ne les envoie pas dans le fichier qm.


    4) Ouvrir le fichier ts via le logiciel qlinguist.


    5) Traduire via l'interface graphique les différents textes. (si qtdesigner est utilisé (où est-ce pyqt ?), on a même le droit à l'interface graphique traduite en temps réel )


    6) Une fois les traductions OK, il faut cocher la petite icone devant les textes du widget "Source texte" pour qu'il passe en tic vert (preuve que c'est validé).


    7) Il faut maintenant exporter le travail au format qm.
    Cela se fait simplement via "File" > "Release" du logiciel qlinguist.


    8) Quelques modifications dans le fichier python est ça sera bon
    J'ai ajouté ceci dans la classe de ma GUI, dans la fonction __init__ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # Pour une détection automatique de la langue locale
    locale = QLocale.system().name() # De type en_EN ou fr_FR
     
    # Et pour une version forcée :
    # locale = "fr_FR"
     
    appTranslator = QTranslator()
      # il est inutile d'indiquer l'extension du fichier
      if appTranslator.load("MKVExtractorGui_{}".format(locale)):
        app.installTranslator(appTranslator)
     
    ...
    self.show() # Affichage de la fenêtre principale
    et hop !
    Voila tout est bien traduit



    Pour utiliser une traduction dynamique (changement de langue sans redémarrer), la démarche ci-dessus est donc à faire plus ce qui suit.
    Ex en passant via une combobox qui propose fr ou en et dont le logiciel est en anglais de base et dont la GUI a été créée par qtdesigner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def OptionLanguage(self, value):
      """Fonction modifiant en temps réel la traduction."""
      # Partie la plus simple, celle qui retraduit le fichier py créé depuis qtdesigner qui propose une fonction de retraduction
      if value == "fr":
        locale = "fr_FR" # Mise à jour de la variable
        appTranslator = QTranslator()
        appTranslator.load("MKVExtractorGui_{}".format(locale))
        app.installTranslator(appTranslator)
        self.retranslateUi(self) # lance la fonction retranslateUi tres pratique
     
      else:
        locale = "en_EN"
        self.retranslateUi(self)
    Ça, c'est pour la partie fun de qtdesigner

    Pour toutes les traductions du fichier python, il faut relancer toutes les commandes ayant du texte déjà affiché.
    Les commandes suivantes seront bien traduites puisque le changement de langue à été fait...

    Ça, c'est la partie moins fun...

    Il faut, par exemple, relancer le texte actuellement affiché par la statusBar, le contenu des combobox faites à la main, des tree, table, list, lineEdit, textEdit...


    Pour information il est possible de traduire un dictionnaire simplement :
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    self.Traductions = {"MKVOpen" : self.tr("Select the MKV File"),
                               "MKVFolder" : self.tr("Select the output folder"),
                               "MKClean" : self.tr("Select the output MKV file")}
    Mais même le dictionnaire aura besoin d’être rechargé après coup...


    Il est donc plus simple (ou pas...) de regrouper, comme le fait qtdesigner, toutes les commandes envoyant des infos dans une fonction qui sera exécutée au démarrage et après chaque changement de langue (surtout dans le cas ou qtdesigner n'est pas utilisé pour les setStatusTip par ex).


    Voila, en espérant que ce soit compréhensible... si ça manque de précision, dites le moi

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Merci pour tout ça! Je vais creuser.

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Pas de soucis, pour une fois que je peux aider ici

    J'essaie de pousser la traduction le plus loin possible pour être à 100% FR/EN.

    Me reste que cette fichue fenêtre d'à propos :p

    EDIT : La fenêtre d'about qt est en EN aussi... mmhhh...

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Quel est le type de ta fenêtre about?

    Au cas où, voilà ce que j'applique pour l'about de mes projets:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # Python 2.7
     
    import sys
    from PyQt4 import QtCore, QtGui
     
    #############################################################################
    from sip import SIP_VERSION_STR
     
    #============================================================================
    __logiciel__ = u"logiciel"
    __version__ = u"1.0.0"
    __date__ = u"1/1/2013"
    __auteur__ = u"auteur"
     
    #============================================================================
    def apropos():
        """Fenêtre 'à propos' du logiciel"""
        pf = sys.platform
        if pf=='win32': pf='Windows'
        elif pf=='linux2': pf = 'Linux'
        elif pf=='sunos5': pf='Sun OS'
        else: pass
     
        QtGui.QMessageBox.about(None, u"A propos du logiciel",
        u"""%s version %s  (%s)
      Copyright %s
      Licence GPL3
      Source sur demande ici: http://accueil.jpvweb.com
     
    Contexte d'exécution en cours:
      Système d'exploitation: %s
      Python version: %s
      Sip version: %s
      PyQt4 version: %s
      Qt version: %s""" % (\
            __logiciel__, 
            __version__, 
            __date__, 
            __auteur__,
            pf,
            sys.version,
            SIP_VERSION_STR,
            QtCore.PYQT_VERSION_STR, 
            QtCore.QT_VERSION_STR )
            )
     
    #############################################################################
    def aproposqt():
        """Fenêtre 'à propos' de la bibliothèque graphique Qt """
        QtGui.qApp.aboutQt()
     
    #############################################################################
    class Fenetre(QtGui.QWidget):
     
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
     
            self.bouton1 = QtGui.QPushButton(u"A propos", self)
            self.bouton1.clicked.connect(apropos)
            self.bouton2 = QtGui.QPushButton(u"A propos de Qt", self)
            self.bouton2.clicked.connect(aproposqt)
     
            posit = QtGui.QGridLayout()
            posit.addWidget(self.bouton1, 0, 0)
            posit.addWidget(self.bouton2, 1, 0)
            self.setLayout(posit)
     
        def apropos_m(self):
            pass
     
        def aproposqt_m(self):
            pass
     
    #############################################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
     
        # pour assurer la traduction automatique du conversationnel à la locale
        locale = QtCore.QLocale.system().name()
        translator = QtCore.QTranslator ()
        translator.load(QtCore.QString("qt_") + locale,   
                      QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath))
        app.installTranslator(translator)
     
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Et avec ça, la fenêtre "about Qt" est en français!

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

Discussions similaires

  1. attendre la fermeture d'une fenetre secondaire
    Par hizoka dans le forum PyQt
    Réponses: 5
    Dernier message: 02/12/2013, 20h38
  2. ouvrir une fenetre secondaire depuis 1 bouton
    Par TheBlackReverand dans le forum MFC
    Réponses: 7
    Dernier message: 16/03/2006, 22h02
  3. [VB6] [Système] Récupérer le contenu d'une fenêtre DOS
    Par Nounours666 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 18/11/2004, 16h38
  4. Aide sur une fenetre
    Par Ray-j dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 29/11/2002, 08h51
  5. gérer les jpg dans une fenetre directdraw???
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 14/06/2002, 13h39

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