Contenu | Rechercher | Menus

Annonce

T-shirt Seiche Cosmic, Série limitée

L'équipe des administrateurs et modérateurs du forum vous invite à prendre connaissance des nouvelles règles.
En cas de besoin, vous pouvez intervenir dans cette discussion.

Ubuntu 18.10
T-shirt Ubuntu-FR « Seiche Cosmique » en série limitée ! Prix spécial pré-vente (15€) jusqu'au 4 novembre 2018.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

Heure d'hiver: N'oubliez pas de décochez l'heure d'été dans votre profil.

#1 Le 25/08/2018, à 15:17

toitoinebzh

[Résolu]Internationaliser une application python3/pyqt5

Bonjour à tous,

Voilà je suis à la recherche de conseil pour internationaliser une application python.

Pour être honnête, j'ai fouillé un peu sur le net, et je trouve souvent une référence vers des outils tels que gettext et poedit, mais les méthodes ne sont jamais vraiment les mêmes d'un site à l'autre.

Je cherche donc des conseils d'une personne qui a déjà utilisé ce genre d'outils pour me recommander le "bon tuto".

Dernière modification par toitoinebzh (Le 26/08/2018, à 17:33)

Hors ligne

#2 Le 25/08/2018, à 17:28

moths-art

Re : [Résolu]Internationaliser une application python3/pyqt5

Alors, je me suis permis de faire un fork de ton projet (c'est 1 des principe de base de git) et j'ai créé une branche avec un exemple de traduction le plus simple qui soit.
Pour voir ça, j'ai fait un pull request : https://framagit.org/toitoinebzh/studma … requests/1
J'ai détaillé ce que j'ai fait dans le commentaire.

Tu as 2 possibilités : soit tu acceptes la pr et tu fais un "git pull" sur ton poste pour récup ton dépôt modifié et tu tests.
soit tu clone mon dépôt, tu vas sur ma branche et tu tests.

Hors ligne

#3 Le 25/08/2018, à 17:37

moths-art

Re : [Résolu]Internationaliser une application python3/pyqt5

n'hésites pas si tu as des questions : gettext + git sont des gros morceaux à digérer au début.

Hors ligne

#4 Le 25/08/2018, à 20:05

grim7reaper

Re : [Résolu]Internationaliser une application python3/pyqt5

Salut,

gettext c’est effectivement l’outil le plus courant sur Linux, mais Qt à son propre mécanisme de traduction (l’internationalisation ça va plus loin que la traduction).
Il y a de la documentation ici, mais en résumé :

  1. il faut exécuter pylupdate5 sur ton code pour extraire les chaînes de caractères à traduire (ça va créer un fichier XML en .ts)

  2. utiliser Qt Linguist sur ce fichier .ts pour faire les traductions

  3. exécuter lrelease pour convertir le fichier .ts en fichier .qm

  4. éventuellement, utiliser pyrcc5 pour embarquer les fichiers .qm dans ton application

Aussi, il me semble qu’il faille utiliser la méthode tr (ou translate qui semble préférable en Python, cf. exemple à la fin) pour marquer les chaînes à traduire.

Dernière modification par grim7reaper (Le 25/08/2018, à 20:06)

Hors ligne

#5 Le 25/08/2018, à 20:39

moths-art

Re : [Résolu]Internationaliser une application python3/pyqt5

Bon, ben t'as l’embarras du choix du coup !

J'avais déjà parlé d'une méthode de traduction via l'api de QT à toitoinebzh dans un autre topic ... mais faute de vraiment m'y être penché, j'ai préféré lui donner un exemple.

Perso, j'ai tendance à faire de plus en plus de softs qui ont plusieurs mode de fonctionnement : cli, gui GTK, QT,  web etc. Est-ce que les libs QT peuvent s'utiliser sans faire appels au toolkit graphique ? Si oui, ça peut être intéressant.

Sinon, un projet pas encore suffisamment stable mais à suivre qui pourrait ringardiser gettext dans les mois/années qui viennent : https://projectfluent.org/

Hors ligne

#6 Le 26/08/2018, à 11:55

grim7reaper

Re : [Résolu]Internationaliser une application python3/pyqt5

moths-art a écrit :

Est-ce que les libs QT peuvent s'utiliser sans faire appels au toolkit graphique ? Si oui, ça peut être intéressant.

Ça dépend ce que tu entends par là, mais à priori tu peux faire des apps non-graphique utilisant Qt (Qt étant un framework qui va bien au-delà de la GUI, même si c’est son but premier).

Hors ligne

#7 Le 26/08/2018, à 14:41

toitoinebzh

Re : [Résolu]Internationaliser une application python3/pyqt5

super, ça marche j'ai réussi à traduire mon application en français (en grande partie)

j'ai finalement opté pour gettext qui me semble plus "passe partout"

je rencontre maintenant un soucis avec les boite de dialogue, comme par exemple,

QFileDialog.getOpenFileName(self, _("Open file"), "", "Sqlite Files (*.sqlite);;All Files (*)", options=options)

je me retrouve avec une erreur du genre

UnboundLocalError: local variable '_' referenced before assignment

est ce que je ne peux pas utiliser gettext dans les dialogues ? où dois passer par une varaible texte intermédiaire ?

je continue mes recherches


=============

j'ai également des fichiers txt que j'appelle pour le contenu de certaines listes,
suis obligé de les transformer en .py pour pouvoir prendre en compte la traduction ?

Dernière modification par toitoinebzh (Le 26/08/2018, à 14:45)

Hors ligne

#8 Le 26/08/2018, à 15:10

moths-art

Re : [Résolu]Internationaliser une application python3/pyqt5

Non, c'est plus simple que ça :

file_name, _ = QFileDialog.getOpenFileName(...

Tu essais d'assigner la variable "_" et juste après d'appeler la fonction du même nom : python est du coup perdu.

Je dirais que si tu n'as pas besoin de récupérer le 2ème résultat de ta fonction (ce qui est pour l'instant le cas), il suffit de faire

file_name = QFileDialog.getOpenFileName(
            self,
            _("Open file"),
            "",
            "Sqlite Files (*.sqlite);;All Files (*)",
            options=options)[0]

Sinon, tu renommes ta variables :

        file_name, _file_type = QFileDialog.getOpenFileName(
            self,
            _("Open file"),
            "",
            "Sqlite Files (*.sqlite);;All Files (*)",
            options=options)

Hors ligne

#9 Le 26/08/2018, à 15:15

toitoinebzh

Re : [Résolu]Internationaliser une application python3/pyqt5

oups, effectivement, il fallait que je regarde un peu plus loin
merci

Hors ligne

#10 Le 26/08/2018, à 15:16

moths-art

Re : [Résolu]Internationaliser une application python3/pyqt5

Je me suis fait avoir mille fois pour que ça me saute aux yeux wink

Hors ligne

#11 Le 26/08/2018, à 17:31

toitoinebzh

Re : [Résolu]Internationaliser une application python3/pyqt5

je pense que je vais pouvoir mettre ce post en résolu,
pour récapituler la méthodologie

  1. créer un dossier /locale/fr/LC_MESSAGES à coté du python pour lancer le programme

  2. dans chaque fichier python avec du texte à traduire

    1. au début du script, ajouter "import gettext"

    2. ajouter également "gettext.install('monprogramme', './locale')"

    3. pour chaque string, les modifier de cette manière "Hello World" > _("Hello World")

  3. utiliser pygettext pour générer un fichier .pot (pygettext -o monprogramme.pot fichier1.py, fichier2.py

  4. avec poedit, ouvrir le fichier .pot, effectuer la traduction puis sauvegarder pour générer les fichiers monprogramme.po et monprogramme.mo

  5. placer les fichiers .mo et .po dans /locale/fr/LC_MESSAGES

lancer le logiciel et normalement c'est bon

Dernière modification par toitoinebzh (Le 26/08/2018, à 17:32)

Hors ligne

#12 Le 26/08/2018, à 20:54

moths-art

Re : [Résolu]Internationaliser une application python3/pyqt5

bien résumé.

Hors ligne

#13 Le 28/08/2018, à 07:15

bipede

Re : [Résolu]Internationaliser une application python3/pyqt5

toitoinebzh a écrit :

je pense que je vais pouvoir mettre ce post en résolu,
pour récapituler la méthodologie

  1. créer un dossier /locale/fr/LC_MESSAGES à coté du python pour lancer le programme

  2. dans chaque fichier python avec du texte à traduire

    1. au début du script, ajouter "import gettext"

    2. ajouter également "gettext.install('monprogramme', './locale')"

    3. pour chaque string, les modifier de cette manière "Hello World" > _("Hello World")

  3. utiliser pygettext pour générer un fichier .pot (pygettext -o monprogramme.pot fichier1.py, fichier2.py

  4. avec poedit, ouvrir le fichier .pot, effectuer la traduction puis sauvegarder pour générer les fichiers monprogramme.po et monprogramme.mo

  5. placer les fichiers .mo et .po dans /locale/fr/LC_MESSAGES

lancer le logiciel et normalement c'est bon

Pour une application PyQt5 c'est grim7reaper qui a raison.
PyQt5 est livré avec des outils simples et puissants d'internationalisation et il serait vraiment dommage de ne pas en profiter.


Desktop: MSI - Intel® Core™ i5-3330 CPU @ 3.00GHz × 4 - RAM 8 go- Ubuntu 18.10 - Système sur SSD 64 Go - /home sur HDD 500 Go.
Laptop: DELL Inspiron-15 3567 - Intel® Core™ i5-7200 CPU @ 2.50GHz × 4 - RAM 8 go - HDD 1 To - Ubuntu 18.10 avec /home séparé.

Mon site: Les contributions du bipède

Hors ligne

#14 Le 28/08/2018, à 07:59

Hizoka

Re : [Résolu]Internationaliser une application python3/pyqt5

Salut, perso j'utilise ce que propose qt d'une façon un peu différente ce qui permet le changement de langue à la volée.

J'ai une fonction qui est appelée à chaque changement de langue, celle-ci contient absolument tous les textes (widgets et messages) dans un dictionnaire (utile pour les messages ou les widgets qui ne sont pas encore utilisés).

je fais un truc du genre :

    def OptionLanguage(self, value):
        """Fonction modifiant en temps réel la traduction."""
        ### Mise à jour de la variable de la langue
        Configs.setValue("Language", value)


        ### Chargement du fichier QM de traduction (anglais utile pour les textes singulier/pluriel)
        appTranslator = QTranslator() # Création d'un QTranslator

        ## Pour la trad française, AppFolder contient l'adresse du dossier stockant les fichiers qm
        if Configs.value("Language") == "fr_FR":
            find = appTranslator.load("MKVExtractorQt5_fr_FR", str(AppFolder))

            # Si le fichier n'a pas été trouvé, affiche une erreur et utilise la version anglaise
            if not find:
                QMessageBox(3, "Erreur de traduction", "Aucun fichier de traduction <b>française</b> trouvé.<br/>Utilisation de la langue <b>anglaise</b>.", QMessageBox.Close, self, Qt.WindowSystemMenuHint).exec()
                self.ui.lang_en.setChecked(True)
                Configs.setValue("Language", "en_US")

            # Chargement de la traduction
            else:
                app.installTranslator(appTranslator)

        ## Pour la version tchèque
        elif Configs.value("Language") == "cs_CZ":
            find = appTranslator.load("MKVExtractorQt5_cs_CZ", str(AppFolder))

            # Si le fichier n'a pas été trouvé, affiche une erreur et utilise la version anglaise
            if not find:
                QMessageBox(3, "Chyba překladu", "No translation file <b>Czech</b> found. Use <b>English</b> language. Soubor s překladem do <b>češtiny</b> nenalezen. Použít <b>anglický</b> jazyk.", QMessageBox.Close, self, Qt.WindowSystemMenuHint).exec()
                self.ui.lang_en.setChecked(True)
                Configs.setValue("Language", "en_US")

            # Chargement de la traduction
            else:
                app.installTranslator(appTranslator)


        ### Mise à jour du fichier langage de Qt
        translator_qt = QTranslator() # Création d'un QTranslator
        if translator_qt.load("qt_" + Configs.value("Language"), QLibraryInfo.location(QLibraryInfo.TranslationsPath)):
            app.installTranslator(translator_qt)


        ### Mise à jour du dictionnaire des textes
        self.Trad = {"AboutTitle": QCoreApplication.translate("About", "About MKV Extractor Gui"),
                     "AboutText": QCoreApplication.translate("About", "blablablabla"),
                     ....}

        ### Recharge les textes de l'application graphique du fichier ui.py (si utilisé)
        self.ui.retranslateUi(self)

        ### Recharge les textes des widgets... toujours visibles
        self.option_ffmpeg.setText(self.Trad["OptionsFFMpeg"])
        self.option_ffmpeg.setStatusTip(self.Trad["OptionsFFMpegStatusTip"])
}

Au démarrage je créé les widgets sans texte, et lance la fonction de langue à la fin de la fonction __init__.
et pour les widgets qui seront affichés après, il suffit de balancer les textes contenus dans le dictionnaire de traduction.
Genre :

self.option_ffmpeg.setText(self.Trad["OptionsFFMpeg"])

Puis une fois que c'est fait, il faut créer le fichier ts :

pylupdate5 ui_MKVExtractorQt5.ui MKVExtractorQt5.py -ts MKVExtractorQt5.ts

Ce fichier est modifiable manuellement ou bien mieux encore avec Qt Linguist.
le logiciel peut convertir le fichier en qm ou via :

lrelease fichier.ts

et voilou smile
Ca fonctionne bien.

Si vous avez besoin de plus d'infos, n’hésitez pas.

Hors ligne