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

Python Discussion :

changer de langue via un menu avec Tkinter et Gettext


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 57
    Par défaut changer de langue via un menu avec Tkinter et Gettext
    Bonjour,

    en consultant la doc de gettext, je vois que l'on peut changer la langue utilistaur à la volée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import gettext
     
    lang1 = gettext.translation('myapplication', languages=['en'])
    lang2 = gettext.translation('myapplication', languages=['fr'])
    lang3 = gettext.translation('myapplication', languages=['de'])
     
    # start by using language1
    lang1.install()
     
    # ... time goes by, user selects language 2
    lang2.install()
     
    # ... more time goes by, user selects language 3
    lang3.install()
    J'ai donc fait un test avec une fenêtre Tkinter et un menu:
    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
    from __future__ import unicode_literals
    from Tkinter import *
    import gettext
    import os
     
    pathname = os.path.dirname(sys.argv[0])
    localdir = os.path.abspath(pathname) + "/locale"
    lang1 = gettext.translation('messages', localdir, languages=['fr'])
    lang1.install()
    print _('Repertoire') # CONTROLE: Ca affiche 'Repertoire'
     
    def langue():
        lang2 = gettext.translation('messages', localdir, languages=['nl'])
        lang2.install()
        print _('Repertoire') #CONTROLE: Ca affiche 'REP' donc c'est traduit
     
    root = Tk()
    root.title(_("Repertoire"))
    mainmenu = Menu(root)
    menuFichier = Menu(mainmenu)
    menuFichier.add_command(label=_("Encoder"))    #Ajouter la commande
    menuFichier.add_command(label=_("Quitter"), command = quitte)
    menuFichier.add_command(label=_("Changer la langue"), command= langue)
    mainmenu.add_cascade(label = _("Programme"), menu=menuFichier)
    root.config(menu = mainmenu)
     
    root.mainloop()
    Mais volià, si dans la console, celà fonctionne bien (mes prints de contrôles), dans ma fenêtre là ca fonctionne pas du tout, mes chaines de carractères restent en fr

    Comment puis-je faire pour que mes chaînes soient traduites dans Tk ?

    Merci d'avance,

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 695
    Par défaut
    Salut,
    "a la volee" est quelque peu optimiste: une fois que la chaine de caractere a ete assigne dans la langue X, elle ne switchera pas "automagiquement" si on change la langue.

    Comment avez vous definit _ ?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 57
    Par défaut
    _ est définit par défaut à l'utilisation de .install()
    en fait celà fonctionne, tout ce que je passe en console est traduit, mais les labels dans Tkinter restent figés, ainsi, si le tritre de ma fenêtre est "Repertoire", dans mes fichiers .po et .mo, la traduction est "REP".
    Si en cliquant la langue Nl dans le menu je, fait dans ma fonction langue() , le retour console est bien "REP", mais le titre de ma fenêtre reste "Repertoire".

    En clair, je cherche à savoir comment faire pour afficher une fenetre Tkinter multilingue suivant le choix de l'utilisateur (en choisissant sa langue dans un menu).

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 695
    Par défaut
    Normalement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    menuFichier.add_command(label=_("Encoder"))    #Ajouter la commande
    mettra dans label le retour de getext("Encoder").
    Si vous faites:
    juste avant le .add_command, vous obtenez quoi?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 57
    Par défaut
    justement, là c'est bien traduit...
    Et si je lance une nouvelle fenetre dans la fonction langue (), le gui est bien traduit aussi.
    par contr j'ai essayé root.update (), mais là pas de résultat.
    je pensais aussi passer par un fichier de configuration, mais l'application est destinée à etre mise en réseau. je vais voir la possibilité de reconnaître l'utilisateur et appeler le fichier de traduction via ses données personnelles dans une bdd...

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 57
    Par défaut
    sinon, je vais aller voir du côté de pyqt via eric4 et qtlinguist....

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 695
    Par défaut
    Salut,
    Je ne suis pas sur d'avoir compris ce qui "fonctionne" ou pas.

    Est ce qu'on peut dire que ca fonctionne sauf lorsque l'utilisateur change de langue via le menu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fichier.add_command(label=_("Changer la langue"), command= langue)
    i.e. apres le lancement initial?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 57
    Par défaut
    Je reconnais que parfois je ne suis pas très clair...

    Reprenons le code :
    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
    from Tkinter import *
    import gettext
    import os
     
    pathname = os.path.dirname(sys.argv[0])
    localdir = os.path.abspath(pathname) + "/locale"
     
     
    lang1 = gettext.translation("messages", localdir, languages=['fr'])
    lang1.install()
     
    def langue():
        lang2 = gettext.translation("messages", localdir, languages=['nl'])
        lang2.install()
     
    def retour_langue():
        lang1 = gettext.translation("messages", localdir, languages=['fr'])
        lang1.install()
     
    def imprime():
        print _("Ceci est un test")
     
    def quitter():
        print _("Quitter")
     
    root = Tk()
    root.title(_("Repertoire"))
    mainmenu = Menu(root)
    menuFichier = Menu(mainmenu)
    menuFichier.add_command(label=_("Quitter"), command = quitter)
    menuFichier.add_command(label="Changer de langue", command= langue)
    menuFichier.add_command(label="revenir à la langue", command= retour_langue)
    mainmenu.add_cascade(label = _("Programme"), menu=menuFichier)
    root.config(menu = mainmenu)
     
    bouton = Button(root, text = _("Imprimer"), command = imprime)
    bouton.pack()
     
    root.mainloop()
    Dans mes fichiers .po et .mo, les chaînes de caractères traduites sont:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "Repertoire" : "AGENDA"
    "Quitter" : "EXIT"
    "Programme" : "APPLICATION"
    "Imprimer" : "PRINT"
    "Ceci est un test" : "TEST OK"
    Quand je lance le programme, celui-ci démarre en français puisque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lang1 = gettext.translation("messages", localdir, languages=['fr'])
    lang1.install()
    Dès lors, si je clique sur le bouton "Imprimer", le texte en console est , idem si dans le menu je clique sur "Quitter" j'obtiens Je vais dans le menu et je clique sur "Changer de langue", cela active :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    menuFichier.add_command(label="Changer de langue", command= langue)
    #...
    def langue():
        lang2 = gettext.translation("messages", localdir, languages=['nl'])
        lang2.install()
    si à présent je clique sur le bouton "Imprimer", j'obtiens et de même si je clique sur "Quitter" dans le menu, j'obtiens bien Si à présent dans le menu je clique sur "Retour à la langue", je retrouve mes chaîne de caractères du départ ( "Ceci est un test" et "Quitter" ) en cliquant à nouveau sur le bouton ou dans le menu.

    Donc, mes chaînes de caractères sont bel et bien traduites, cela fonctionne en mode console, mais l'affichage Tkinter reste désespérément en français.
    J'ai bien essayé de faire un rafraîchissement de la fenêtre via root.update(), mais ça ne change rien.

    Casse-tête

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 695
    Par défaut
    Salut,

    Ca fonctionne a partir du moment ou vous repassez par l’évaluation des chaînes de caractères a (re)traduire - i.e appel a _("....").

    Si vous faites un seule fois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    menuFichier.add_command(label=_("Encoder")
    Par quelle magie "label" serait modifie plus tard?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 57
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    Si vous faites un seule fois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    menuFichier.add_command(label=_("Encoder")
    Par quelle magie "label" serait modifie plus tard?

    - W
    Ok mais c'est justement l'objet de ma question: Comment faire ?
    Au final j'ai pris mon idée de reconnaître l'utilisateur pour passer la langue.
    Il suffit de créer une bdd contenant son identifiant et sa langue puis de placer et début de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import getpass
    user=getpasst.getuser ()
    puis après avoir interrogé la base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if langue_utilisateur = 'nl':
        lang1= gettext.translation ('messages', localdir, languages = ['nl'])
        lang1.install ()
    else:
        lang2 = gettext. translation ('messages', localdir, languages = ['fr'])
        lang2.install ()

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 695
    Par défaut
    Citation Envoyé par pierre3401 Voir le message
    Ok mais c'est justement l'objet de ma question: Comment faire ?
    Dit comme ca, on se fout pas mal de gettext.
    La question pourrait plus simplement être comment changer les "labels" des entrees d'un Menu...
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> import tkinter as tk
    >>> app = tk.Tk()
    >>> menu = tk.Menu()
    >>> app['menu'] = menu
    >>> menu.add_command(label='foo')
    >>> menu.add_command(label='bar')
    On peut recuperer les "labels" via:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> menu.entrycget(1, 'label')
    'foo'
    >>> menu.entrycget(2, 'label')
    'bar'
    Pour les modifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> menu.entryconfigure(2, label='quux')
    A partir de la... Si vous voulez "changer" tout le texte de facon dynamique, il faudrait s/classer Menu pour memoriser les trucs a changer et provoquer une remise a jour au cas ou.
    Au final j'ai pris mon idée de reconnaître l'utilisateur pour passer la langue.
    Il suffit de créer une bdd contenant son identifiant et sa langue puis de placer et début de code
    Dans ce cas, plus besoin de changer "a la volee" les labels qui ont deja ete assignes. Dans un premier temps, vous pourriez vous contenter de demander la selection de la langue au demarrage et stocker l'information dans un fichier .ini dans le HOME de l'utilisateur.
    Pas la peine de faire une BDD juste pour ca.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 57
    Par défaut
    Dans ce cas-ci, l'application est un répertoire disponible sur un réseau, donc puisque je peux savoir quel utilisateur se connecte, j'ai simplement ajouté le champ langue dans la bdd existante...
    maintenant je trouve dommage qu'apparament Tkinter ne permette pas ce changement de langue à la volee à l'instar de pyqt...
    je vais donc devoir m'y mettre pour le futur

  13. #13
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 695
    Par défaut
    Citation Envoyé par pierre3401 Voir le message
    maintenant je trouve dommage qu'apparament Tkinter ne permette pas ce changement de langue à la volee à l'instar de pyqt...
    je vais donc devoir m'y mettre pour le futur
    Qt4 expédiera un LanguageChange Event aux widgets. Les mises a jour seront effectuée via des résignations et des appels a tr(..).

    Cote Tkinter, il n'est pas interdit de créer son "<<LanguageChangeEvent>>". Un .bind des Toplevel pour appeler la méthode /on_language_change/ sur l'ensemble de sa descendance (.children) (lorsqu'elle existe).
    Ça se réduit a une classe avec 2/3 méthodes de quelques lignes dont pourraient hériter Tk et Toplevel.
    Cote programmation, ce n'est pas bien complique.

    Le gros du boulot sera le détail de la prise en compte de l'event pour chaque Widget. De ce cote la, Qt4 n'aide pas plus que Tk.

    Ceci dit, se mettre un jour a PyQt4 (ou autre framework) n'est pas une mauvaise chose. Il vous permettra de comparer et de constater que Tkinter sera plus adapte dans certains cas, Qt a d'autres.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Comment changer la langue d'un menu Struts via un bouton
    Par OdréCobel dans le forum Struts 2
    Réponses: 4
    Dernier message: 28/02/2012, 17h17
  2. changer la langue avec les raccourcis de clavier
    Par cherifa_m dans le forum Debian
    Réponses: 3
    Dernier message: 30/05/2008, 16h42
  3. [ZedGraph] changer la langue du menu
    Par afrodje dans le forum VB.NET
    Réponses: 5
    Dernier message: 21/03/2008, 11h15
  4. Comment changer la langue avec 2 TMainMenu ?
    Par aliwassem dans le forum Composants VCL
    Réponses: 1
    Dernier message: 20/01/2006, 18h50
  5. [Swing] Changer le contenu d'un Container via un menu
    Par TheSeb dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 07/12/2004, 23h07

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