Contenu | Rechercher | Menus

Annonce

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.

#1 Le 22/12/2008, à 20:32

alteo_gange

[résolu] plusieurs *.mo gettext?

Bonjour à tous.

Comment utiliser 2 fichiers gettext *.mo différents pour une même application? Mon but est de pouvoir utiliser 2 types de traductions différentes pour un même script (sachant qu'il y en a plusieurs).

Dernière modification par alteo_gange (Le 23/12/2008, à 14:52)

Hors ligne

#2 Le 23/12/2008, à 11:51

alteo_gange

Re : [résolu] plusieurs *.mo gettext?

J'y suis presque. Je bloque sur le scan des scripts, c'est-à-dire lors de l'application de la commande xgettext. Ma méthode (en fait, celle du logiciel Anki, que je donnerai plus tard pour python) consiste à utiliser deux types de traduction: une avec '_', celle par défaut (pour la traduction basique de l'interface du logiciel), et une avec 'tr', celle que je choisis (pour la traduction de la documentation). Elle a été testée avec succès sur des fichiers séparés (un script contenant majoritairement des '_' pouvant appeler une fonction externe qui va lui renvoyer le texte qui sera traduit par la méthode des 'tr').

Le problème est que quand les '_' et les 'tr' se situent dans un même script, xgettext peut prendre en compte soit les '_', soit les '_' et les 'tr' mais en aucun cas les 'tr' uniquement. sad
La commande est la suivante:

xgettext --keyword='tr' -o locale/prog.pot mes_scripts

Si j'utilise pygettext à la place de xgettext avec la commande:

pygettext --keyword='tr' --no-default-keywords -o locale/prog.pot mes_scripts

... il me récupère uniquement les 'tr' (ce que je souhaite), mais ça ne va pas car la gestion des accents est alors calamiteuse. C'est sans doute une des raison expliquant que même les développeurs de pygettext déconseillent son utilisation! Par exemple, le mot séquence est écrit: s\303\251quence dans le *.pot! Même si c'est transparent pour un traducteur utilisant poedit, cela ne m'inspire pas confiance.

Une solution serait de remplacer tous les '_' par des 'tr', l'autre alias de traduction étant 'tr_', mais ça me gêne.

Alors, que faire? Regrouper la documentation dans un seul fichier? Possible. Je vais y songer. Faire une demande aux développeurs de xgettext? Ça pourrait aussi être utile à d'autre.

Quel dommage que xgettext n'ait pas d'argument --no-default-keywords!
Ce message aborde le problème. Une méthode de désactivation de '_' est indiquée. Elle est illogique et ne marche pas chez moi.

Hors ligne

#3 Le 23/12/2008, à 12:21

valAa

Re : [résolu] plusieurs *.mo gettext?

Salut,

xgettext -k --keyword='tr' -o locale/prog.pot mes_scripts

le "-k" sans mot clé derrière désactive les mots clés par défaut. Ensuite tu spécifies ton mot clé "tr", et tu peux ainsi n'aspirer que les chaînes utilisant "tr".
Testé et approuvé chez moi.

[edit] j'ai regardé ton lien. Il y a une erreur dans la commande donnée dans ce lien, c'est ou "-k" ou "--keyword", mais pas "--k" !!
En tous cas je t'assure que faire un "-k" tout seul désactive bien les mots clés par défaut chez moi (essayé en C++ pour désactiver le mot clé par défaut "gettext").

Dernière modification par valAa (Le 23/12/2008, à 12:24)

Hors ligne

#4 Le 23/12/2008, à 12:46

aleph

Re : [résolu] plusieurs *.mo gettext?

> alteo_gange

Question: c'est pour des scripts en Python ?

#5 Le 23/12/2008, à 13:40

HP

Re : [résolu] plusieurs *.mo gettext?

Je me posais la même…


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#6 Le 23/12/2008, à 14:05

alteo_gange

Re : [résolu] plusieurs *.mo gettext?

Bonjour à tous.

valAa a écrit :

Salut,

xgettext -k --keyword='tr' -o locale/prog.pot mes_scripts

Génial! Merci valAa smile

En fait, avant de poster mon deuxième message, en me basant sur le lien indiqué, j'avais essayé la commande suivante:

xgettext -k --keyword='tr' --keyword='_' -o locale/prog.pot mes_scripts

... ce qui était assez stupide puisque je désactivais '_' avant de le réactiver. roll Donc la méthode xgettext de désactivation des mots-clés est illogique (et bien cachée) mais fonctionnelle.

Entre temps j'étudiais la méthode de traduction qt4, mais là aussi, je bloquais sur un problème de scan des scripts (seules les chaines de caractères des fonctions QCoreApplication.translate ou self.tr sont scannés).

aleph a écrit :

Question: c'est pour des scripts en Python ?

Pour ce qui concerne le chargement des 2 fichiers *.po par le programme, c'est effectivement une méthode spécifique à python (après tout ce qui concerne xgettext est indépendant). Mais peut-être existe-t-il des équivalences dans d'autres langages.

Je vous prépare le code utilisé pour charger les 2 *.po avec python (méthode courte mais ésotérique).

Hors ligne

#7 Le 23/12/2008, à 14:42

aleph

Re : [résolu] plusieurs *.mo gettext?

> alteo_gange

> Pour ce qui concerne le chargement des 2 fichiers *.po par le programme, c'est effectivement une méthode spécifique à python (après tout ce qui concerne xgettext est indépendant). Mais peut-être existe-t-il des équivalences dans d'autres langages.

---

Oui, je vois. C'est bien pour des scripts (une application) Python, entendu que les ".mo" ne sont pas générés pas du code Python.

Il me semble qu'en son temps, tu avais formulé une demande pour savoir comment "internationaliser" une application. D'où ma question.

N'as-tu jamais envisagé de faire ce travail en pur Python, C'est assez simple, performant, facile à maintenir et ne nécessite aucune application tierce. C'est étonnant, Python dispose nativement de tout l'arsenal nécessaire et c'est une variante que beaucoup de développeurs utilisent.

En gros pour donner une idée:


# -*- coding: iso-8859-1 -*-

#dicos: peuvent être dans des fichiers/modules séparés
dicofr = {'id0': 'rouge', 'id1': 'vert','id2': 'bleu'}
dicoge = {'id0': 'rot', 'id1': 'grün','id2': 'blau'}
dicoen = {'id0': 'red', 'id1': 'green','id2': 'blue'}

def main():
    #selectionne un dico pointé par la variable lexique
    #une copie de dico est aussi possible
    lexer = dicofr
    print 'Couleurs en français : %s.' % ', '.join(lexer.values())
    print 'Un item particulier, par exemple %s ' % lexer['id0']
    print
    
    lexer = dicoge
    print 'Couleurs en allemand : %s.' % ', '.join(lexer.values())
    print 'Un item particulier, par exemple %s ' % lexer['id0']
    print
    
    lexer = dicoen
    print 'Couleurs en anglais : %s.' % ', '.join(lexer.values())
    print 'Un item particulier, par exemple %s ' % lexer['id0']
    print
    
if __name__ == '__main__':
    main()

#8 Le 23/12/2008, à 14:50

alteo_gange

Re : [résolu] plusieurs *.mo gettext?

J'ai un peu simplifié la méthode utilisé par Anki (qui elle n'a pas de problème de scan xgettext car le développeur applique la commande sur 2 répertoires bien distincts pour générer ses 2 *.mo). Je prends le cas particulier d'une traduction française (les arguments sont à changer pour s'adapter à la langue détectée sur le système. Pensez à traiter l'exception quand le fichier de traduction est absent!). Ceci est à mettre en début de programme:

import gettext
import __builtin__
from functools import partial

traduction1 = gettext.translation("nomProgramme_fr", "locale", ["fr"])
__builtin__.__dict__['_'] = partial(traduction1.ugettext)
traduction2 = gettext.translation("nomProgrammeDoc_fr", "locale", ["fr"])
__builtin__.__dict__['tr'] = partial(traduction2.ugettext)

Et c'est tout!
Les _('chaines de caractères') seront enregistrées dans locale/nomProgramme.pot
et les tr('chaines de caractères') seront enregistrées dans locale/nomProgrammeDoc.pot après application des commandes:

xgettext -o locale/nomProgramme.pot mes_scripts
xgettext -k --keyword='tr' -o locale/nomProgrammeDoc.pot mes_scripts

Après il ne reste plus qu'à importer les *.pot avec poedit pour créer les *.po suivants:

locale/fr/LC_MESSAGES/nomProgramme_fr.po
locale/fr/LC_MESSAGES/nomProgrammeDoc_fr.po

C'est pas beau?

Édition pour corriger une erreur dans une commande.

Dernière modification par alteo_gange (Le 23/12/2008, à 14:59)

Hors ligne

#9 Le 23/12/2008, à 14:52

alteo_gange

Re : [résolu] plusieurs *.mo gettext?

Pour utiliser la méthode partial avec python < 2.5:

if sys.version_info[:2] < (2, 5):
	def partial(func, arg):
		def callme():
			return func(arg)
		return callme
else:
	from functools import partial

Hors ligne

#10 Le 23/12/2008, à 15:15

alteo_gange

Re : [résolu] plusieurs *.mo gettext?

aleph a écrit :

Il me semble qu'en son temps, tu avais formulé une demande pour savoir comment "internationaliser" une application.

D'après mes souvenirs, il s'agissait de bien afficher les caractères non ASCII -> méthode u"caractères".
On avait aussi parlé de l'utilisation de la documentation. C'était un réflexe que je n'avais pas. Je l'ai pris depuis avec Qt4. Un peu aussi avec python, mais je trouve que la documentation python n'est pas à la hauteur de celle de qt (je me sens vraiment à l'aise avec elle). Il parait que les windowsiens sont mieux lotis avec un outil spécial de documentation python (nous devons passer par un navigateur web).

aleph a écrit :

N'as-tu jamais envisagé de faire ce travail en pur Python, C'est assez simple, performant, facile à maintenir et ne nécessite aucune application tierce. C'est étonnant, Python dispose nativement de tout l'arsenal nécessaire et c'est une variante que beaucoup de développeurs utilisent.

Ce n'est pas un peu rustique (et plus long à coder)?
De plus le fait de ne pas avoir de langue de référence m'effraie un peu (j'aurais peur de me perdre en relisant le code). Une fois, je cherchais une info dans le code de kcontrol et je n'avais rien trouvé. Je commence à comprendre pourquoi. Il ne devait pas y avoir de langue de référence. Je ne pouvais donc pas associer un label à un endroit précis du programme.

Hors ligne

#11 Le 23/12/2008, à 15:54

aleph

Re : [résolu] plusieurs *.mo gettext?

> alteo_gange

> Rustique.

Non, simple oui.

> (et plus long à coder)

Honnêtement, je ne pense pas. Un fois que tu as les dictionnaires/modules à disposition, difficile de faire plus simple que, par ex. dans un widget graphique en tenant compte de mon exemple précédent.

<type_label>.SetText(lexer['it1'])

Le choix d'un dictionnaires se fait à l'initialisation de l'application.

Pour la réalisation des dictionnaires, j'ai de la peine à trouver une difficulté, il ne s'agit que de traduire les valeurs/strings des "dict.value's" dans le sens Python.

> De plus le fait de ne pas avoir de langue de référence m'effraie un peu...

En fait, c'est un peu un raisonnement fait à postériori. Tu parles de langue de référence parce que "mo" dans sa sophistication utilise une langue de référence. Dans la variante que je propose, la langue de référence n'existe simplement pas, ce sont les clés des dict que tu utilises.


Que tu utilises les "mo" ou non, peu importe. Mon intention est de montrer qu'il existe d'autres variantes plus légères et tout aussi efficace.

Python est une outil intrinsèquement *très* puissant et on ne pense pas souvent à l'utiliser dans sa pleine puissance en allant chercher ailleurs ce qui existe.

Mais, je le répète, à toi de voir.

PS Si tu penses que l'utilisation de dictionnaires, type dict de Python, serait pénalisante, tu fais fausse route.

#12 Le 23/12/2008, à 16:07

HP

Re : [résolu] plusieurs *.mo gettext?

aleph a écrit :

Dans la variante que je propose, la langue de référence n'existe simplement pas, ce sont les clés des dict que tu utilises.

Dans le même genre il y a xmllangs.py utilisé dans Gmail Notifier… qui est assez sympa… permettant d'avoir l'ensemble des langues localisées dans un unique fichier XML… enfin, perso, après avoir tenté la documentation à propos de gettext, je penserais plutôt me tourner vers un truc dans ce genre. L'avantage de xmllangs par rapport à la méthode de aleph étant seulement, à mon sens, l'utilisation d'un dictionnaire en XML qui pourrait être plus simple à manipuler/traduire par des "non-programmeurs".


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#13 Le 23/12/2008, à 16:35

alteo_gange

Re : [résolu] plusieurs *.mo gettext?

aleph a écrit :

En fait, c'est un peu un raisonnement fait à postériori. Tu parles de langue de référence parce que "mo" dans sa sophistication utilise une langue de référence. Dans la variante que je propose, la langue de référence n'existe simplement pas, ce sont les clés des dict que tu utilises.

Ça me pose un problème.

aleph a écrit :

PS Si tu penses que l'utilisation de dictionnaires, type dict de Python, serait pénalisante, tu fais fausse route.

Dois-je en conclure que tu es prêt à coder un équivalent à poedit ou qtLinguist? tongue
Parce que les traducteurs n'aiment pas toujours les éditeurs de texte (qui montrent vite leurs limites ici).

J'avais aussi suivi la piste qt4/qtlinguist mais là aussi je bloquais sur le scan des chaines de caractères ('_' ici). À priori la seule solution serait de se coder son propre pylupdate4 pour générer le fichier *.ts (en fait xml) de traduction.

Hors ligne

#14 Le 23/12/2008, à 17:16

aleph

Re : [résolu] plusieurs *.mo gettext?

> alteo_gange

Je pense que tu n'as pas bien saisi mes propos. La seule chose que tu as besoin est d'un dictionnaire dans le sens français du terme, mot -> définition, clé -> valeur.

Après que tu utilises mo, linguist, un dict Python, un xml, ou un simple fichier texte importe peu. Je souligne uniquement sur le fait que le faire en pur Python à l'aide de dict est simple, archi-simple et que si tu choisis cette voie, tu peux t'épargner du travail. Si tu veux utiliser autre chose, ce que je comprends tout à fait, libre à toi.

Pour la remarque "pénalisante". Je pensais à la taille d'un dict Python, cent, mille ou dix milles clés ne seraient pas un problème.

Dans le même ordre d'idée, j'ai une application qui utilise une base de données de type lecture seule,
en lieu et place d'un module spécifique ou une application tierce, de type sqlite, j'ai simplement créé une dict dans un module Python. Ordre de grandeur 120 items avec 30 à 50 "attributs".

#15 Le 23/12/2008, à 17:19

aleph

Re : [résolu] plusieurs *.mo gettext?

> HP

Je n'ai pas pris garde à ton message, mais je pense que nous sommes sur la même longueur d'onde.

#16 Le 23/12/2008, à 18:30

HP

Re : [résolu] plusieurs *.mo gettext?

Si tu le penses… ça me rassure, puisque je commence, sérieusement, à me mettre à Python… mais je commence doucement… alors, je lis pas mal de doc… je me me penche sur ce qui est le plus multiplateforme. Là j'en suis encore pas mal dans des trucs comme syslog, os, et os.path… et je m'étais posé les questions sur la localisation il n'y a pas si longtemps (et puis de toute façon j'ai horreur des chaînes langue au milieu du code).


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#17 Le 23/12/2008, à 19:12

aleph

Re : [résolu] plusieurs *.mo gettext?

> HP

> je me me penche sur ce qui est le plus multiplateforme

Un tuyau. Apprends, étudie, comprends ce qu'est le *sys.path*. C'est fondamental.

Python n'est pas simplement multiplateforme dans le sens multi-système d'exploitation (OS X, BSD, ...).
Un environnement Python peut et *généralement est* différent même entre différents utilisateurs d'un même système d'exploitation et d'une même version.

Distribuer, partager des scripts Python entre utilisateurs de différents OS est de la même essence que distribuer des scripts entre utilisateurs d'un même OS. Il n'y *aucune différence*.

#18 Le 23/12/2008, à 19:55

HP

Re : [résolu] plusieurs *.mo gettext?

aleph a écrit :

Un tuyau. Apprends, étudie, comprends ce qu'est le *sys.path*. C'est fondamental.

Ouais… on perds pas de temps à parler avec toi !… Intéressant, je vais creuser.


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#19 Le 23/12/2008, à 20:25

alteo_gange

Re : [résolu] plusieurs *.mo gettext?

aleph a écrit :

Après que tu utilises mo, linguist, un dict Python, un xml, ou un simple fichier texte importe peu.

Tu crois ça? Comment est-ce qu'un traducteur non développeur pourra s'y retrouver avec ta méthode? Quel outil utiliserait-il? Poedit et QtLinguist sont capables de trouver les chaines de caractères qui ont été modifiées dans le programme depuis la dernière traduction. Elles sont signifiées par un signe spécial (une étoile pour poedit). Elles contiennent toujours l'ancienne traduction. Les chaines de caractères ajoutés sont encore indiquées d'une autre façon. Les chaines de caractères obsolètes et leur traduction restent encore accessibles. Des chaines de caractères communes à plusieurs logiciels peuvent être enregistrées dans un catalogue. Et tu voudrais te passer de tout cela?

aleph a écrit :

Je souligne uniquement sur le fait que le faire en pur Python à l'aide de dict est simple, archi-simple et que si tu choisis cette voie, tu peux t'épargner du travail. Si tu veux utiliser autre chose, ce que je comprends tout à fait, libre à toi

Je ne suis pas le chef du projet. Et à mon avis il ne serait pas très chaud pour passer par un dictionnaire.

Quelle genre de clés utiliserais-tu? une compréhensible par un humain ("bouton-parcourir") ou pas ("jodi64zedjzg")? Dans le 2ème cas il faudrait ajouter des commentaires supplémentaires dans le code pour s'y retrouver (en tout cas quand on n'utilise pas glade ou qtdesigner).

Est-ce qu'une personne extérieure au projet qui rechercherait une information en scrutant le code n'aurait pas plus de mal à la trouver?

aleph a écrit :

tu peux t'épargner du travail

Peux-tu détailler? Est-ce cela serait aussi vrai pour les traducteurs?

aleph a écrit :

Dans le même ordre d'idée, j'ai une application qui utilise une base de données de type lecture seule,
en lieu et place d'un module spécifique ou une application tierce, de type sqlite, j'ai simplement créé une dict dans un module Python. Ordre de grandeur 120 items avec 30 à 50 "attributs".

S'agit-il d'une traduction? En fait, qu'utilises-tu pour tes traductions? Un dictionnaire?

Hors ligne

#20 Le 23/12/2008, à 20:35

HP

Re : [résolu] plusieurs *.mo gettext?

alteo_gange a écrit :

Quelle genre de clés utiliserais-tu? une compréhensible par un humain ("bouton-parcourir") ou pas ("jodi64zedjzg")? Dans le 2ème cas il faudrait ajouter des commentaires supplémentaires dans le code pour s'y retrouver (en tout cas quand on n'utilise pas glade ou qtdesigner).

La classe que je citais plus tôt permettrait bien sûr ce genre de clefs, puisque de toute façon ce serait compatible avec des id XML wink.


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#21 Le 23/12/2008, à 21:04

aleph

Re : [résolu] plusieurs *.mo gettext?

> alteo_gange

Je t'ai *proposé* une variante. Il semblerait que tu n'en as pas saisi l'essence et/ou n'en voit pas l'utilité.

Il se peut aussi que mon bref script d'explication n'ait pas été suffisant ou assez illustratif. Dans ce cas, mea culpa.

Rien de grave. Restons-en là. (J'ai une urgence à régler du côté de Python 2.5.4, tout chaud).

#22 Le 24/12/2008, à 12:33

alteo_gange

Re : [résolu] plusieurs *.mo gettext?

@aleph: libre à toi de persister dans la thèse du malentendu. Mais je trouve un peu facile de dire ou de suggérer:
si tu n'es pas d'accord avec moi, c'est que tu n'as pas compris où je voulais en venir.

Hors ligne

#23 Le 24/12/2008, à 13:52

aleph

Re : [résolu] plusieurs *.mo gettext?

> alteo_gange

Je t'ai fait une proposition basée sur les maigres informations de ton 1er message, "Mon but est de pouvoir utiliser 2 types de traductions différentes pour un même script (sachant qu'il y en a plusieurs)".

Il semble qu'elle ne convient pas à ton projet que je ne connais pas. Fort possible et rien d'exceptionnel. C'est tout.

#24 Le 26/12/2008, à 20:27

alteo_gange

Re : [résolu] plusieurs *.mo gettext?

OK aleph.

Hors ligne

#25 Le 02/03/2009, à 23:23

Grahack

Re : [résolu] plusieurs *.mo gettext?

Je me permets de squatter ce post: j'ai une espèce d'architecture de plugin ds un programme python. Serait-il possible d'utiliser plusieurs .mo pour une même fonction _() ?
En gros je voudrais séparer les .mo du core des .mo des plugins, mais n'utiliser que _().

Merci.

Hors ligne