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 :

[gettext] Utiliser gettext sous windows


Sujet :

Python

  1. #1
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut [gettext] Utiliser gettext sous windows
    Bonjour,

    Je n'arrive pas à faire fonctionner gettext sous windows

    Sous Linux, pas de problème, j'ai créé mon arborescence,
    locale/fr_Fr/LC_MESSAGES/messages.po
    compiler message.po en message.mo et appelé gettext dans le programme comme ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    import gettext
    gettext.install("messages", "/usr/local/share/ohraimeur/locale" )
    [...]
    _("chaine à traduire")
    Sous Windows, ce code ne marche pas. J'ai testé plusieurs solutions celle-ci me semble avancer un peu les choses et me renvoie cette erreur.
    (Le répertoire local se trouve dans le même répertoire que le programme)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import gettext
    import locale
     
    os.environ['LC_MESSAGES'] = locale.getdefaultlocale()[0]
    locale.setlocale(locale.LC_ALL, '')
    print ( locale.getdefaultlocale() )  # ('fr_FR', 'cp1252')
    gettext.install("messages", "locale" )
    Traceback (most recent call last):
    File "C:\Documents and Settings\Maillol\Bureau\version\ohraimeur-0.4-win-Pall\ohraimeur.py", line 43, in <module>
    gettext.install("messages", "locale" )
    File "C:\Python31\lib\gettext.py", line 441, in install
    t = translation(domain, localedir, fallback=True, codeset=codeset)
    File "C:\Python31\lib\gettext.py", line 426, in translation
    t = _translations.setdefault(key, class_(fp))
    File "C:\Python31\lib\gettext.py", line 176, in __init__
    self._parse(fp)
    File "C:\Python31\lib\gettext.py", line 316, in _parse
    catalog[str(msg, charset)] = str(tmsg, charset)
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 11: ordinal not in range(128)
    Quelqu'un à une idée ?
    Merci d'avance.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  2. #2
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    Re-bonjour,

    En attendant, j'ai mi un fichier messages.py dans chaque répertoires de langues ce fichier messages.py contient un dictionnaire avec les msgid du fichier messages.po en clefs et les msgstr en valeur.

    j'ai ensuite ce petit module nogettext.py

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import locale, os, sys
     
    lang = locale.getdefaultlocale()[0]
    sys.path.append( os.path.join( 'locale', lang, 'LC_MESSAGES'  ) )
    from messages import traductions
     
    def _( msg ) :
        if msg in traductions.keys() :
            return traductions[ msg ] 
        else :
            return msg
    Que j'importe de la sorte dans mon applications.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from nogettext import _
    __builtins__._ = _
    C'est un peu moche et j'ai quelque module qui ne se traduisent pas
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  3. #3
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    j'ai trouvé une autre solution mais elle est pas forcément mieux.

    j'ai fait une copie ugettext.py du module gettext.py
    puis j'ai changer la ligne 307

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    charset = self._charset or 'ascii'
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    charset = self._charset or 'utf-8'
    Ça marche impeccable mais niveau déploient je me voie mal distribuer mon application avec une copie de gettext.py.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  4. #4
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    C'est bon j'ai trouvé

    Il faut inscrire les lignes
    msgid ""
    msgstr ""
    "Content-Type: text/plain; charset=UTF-8\n"
    "Content-Transfer-Encoding: 8bit\n"
    au tout début du fichier .po et c'est bon. Pour l'appel dans le programme j'ai fait comme ceci :

    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
     
    # Récupère le chemin complet.
    local_path = os.path.realpath( os.path.dirname( sys.argv[0] ) )
    local_path = os.path.join( local_path, 'locale' ) 
     
    # Récupère la langue du système.
    lc, encoding = locale.getdefaultlocale()
     
    # Sans ces deux lignes ça marche aussi, mais comme elles sont 
    # dans beaucoup d'exemples, je les laisses. 
    gettext.bindtextdomain( APP_NAME, local_path )
    gettext.textdomain( APP_NAME )
     
    # On crée notre fonction de translation. J'imagine qu'il y a un lien entre 
    # entre la liste des langages et les deux lignes du dessus. 
    lang = gettext.translation( APP_NAME, local_path,
            languages=[ lc ], fallback = True) 
    #fallback = true évite qu'une Exception IOError sois relevée quand 
    # APP_NAME n'est pas trouvé.
     
     
    _ = lang.gettext
    __builtins__._ = _
    Voilà.
    J'espère que ça servira à d'autre.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

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

Discussions similaires

  1. Utiliser crypt() sous windows
    Par Samyhijodelaluna dans le forum C
    Réponses: 2
    Dernier message: 30/12/2006, 15h58
  2. Utiliser FPING sous WINDOWS
    Par TigreRouge dans le forum Programmation et administration système
    Réponses: 7
    Dernier message: 28/04/2006, 10h03
  3. Utiliser FD_SET sous Windows sur l'entré STDIN ?
    Par MonsieurAk dans le forum Windows
    Réponses: 6
    Dernier message: 09/12/2005, 20h45

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