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 13/03/2011, à 13:41

YannUbuntu

Integrer des .po .pot .mo dans mon application?

Bonjour
Quelle est la bonne pratique pour intégrer des traductions de type .po etc.. dans une application ?
Ou doit-on placer ces fichiers dans l'arborescence ?
Comment creer le .pot initial ? (et le mettre a jour avec recuperation des variables dans mes scripts?)
J'ai regardé dans plusieurs logiciels, mais pas un ne fait la meme chose...

Merci d'avance smile


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#2 Le 13/03/2011, à 13:44

YannUbuntu

Re : Integrer des .po .pot .mo dans mon application?

J'ai trouve ceci , est-ce que c'est d'actualité ? y a-t-il mieux ?

Traduire une application


gettext doit être installé ( défaut sous ubuntu ).
Il faut un dossier locale dans le dossier du script/glade. Un sous -dossier du choix de la langue (fr, de, es) et un sous -dossier LC_MESSAGES.
                 
dirscripts/locale/fr/LC_MESSAGES


Au début du script associé *
#! /bin/bash           
chemin="$(dirname "$0")";pwd)"
###Pour exporter la librairie de gettext.
set -a
source gettext.sh
set +a
export TEXTDOMAIN=Test    # ici le nom du .mo, .glade, ....
export TEXTDOMAINDIR="${chemin}/locale"
. gettext.sh

Texte à traduire dans le script
$(eval_gettext "label à traduire")

Avec une commande glade2script
echo "SET@_label1.set_text('$(eval_gettext "label à traduire")')"




Création des fichiers de traduction
On crée d'abord un fichier .dot, qui servira de base pour créer le .po
Les noms des .po et .mo (.dot) devront avoir le même nom que le glade.
cd ./dirscript
xgettext -o Test.pot Test.glade Test.sh
#ou xgettext -o Test.pot *.glade *.sh
msginit -i Test.pot -o Test.po
C'est dans ce fichier .po qu'on indiquera les traductions.

Ensuite :
msgfmt Test.po -o Test.mo

C'est ce fichier .mo qui servira à la traduction de l'interface et du script. Il doit être collé dans le dossier  LC_MESSAGES de la langue traduite.


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#3 Le 13/03/2011, à 15:20

ehmicky

Re : Integrer des .po .pot .mo dans mon application?

N'hésite pas à partager tes découvertes, j'apprends aussi la même chose !


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#4 Le 14/03/2011, à 22:31

ehmicky

Re : Integrer des .po .pot .mo dans mon application?

Des idées dans le FAQ (C / C++, le manuel a un chapitre pour le Bash).
Sinon, je suis tombé par hasard en lisant le source de Gimp sur le fait qu'ils mettaient les .po dans un répertoire "po" à la racine.


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#5 Le 24/03/2011, à 00:05

YannUbuntu

Re : Integrer des .po .pot .mo dans mon application?


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#6 Le 31/03/2011, à 22:48

YannUbuntu

Re : Integrer des .po .pot .mo dans mon application?

Pour info la methode du post #2 fonctionne, mais pas quand la chaine contient une variable...

Help ! smile

Dernière modification par YannUbuntu (Le 31/03/2011, à 23:18)


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#7 Le 31/03/2011, à 23:32

feuloren

Re : Integrer des .po .pot .mo dans mon application?

D'habitude on importe/inclut gettext,
puis on utilise la méthode _() autour de chaque chaine à traduire, en C on utilise les %s %d... pour mettre des variables dans la chaine: par exemple printf(_("Hello %s"), name); Par contre je ne sais pas comment ça marche en bash.
Enfin tu utilises la commande xgettext pour extraire les chaines à traduire et générer ton fichier pot, généralement il est placé dans un répertoire "po", où l'on met aussi les fichiers .po traduits.

Hors ligne

#8 Le 31/03/2011, à 23:38

YannUbuntu

Re : Integrer des .po .pot .mo dans mon application?

Oui c'est la methode pour le C donnee au post #4, mais ca ne nous avance pas beaucoup pour le Bash (merci quand meme) smile

EDIT: si j'ai bien compris, le .pot et les .po servent uniquement au developpeur pour creer ses .mo, mais dans le paquet il suffit de mettre les .mo , c'est bien ca ?

Dernière modification par YannUbuntu (Le 31/03/2011, à 23:46)


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#9 Le 01/04/2011, à 00:00

YannUbuntu

Re : Integrer des .po .pot .mo dans mon application?

A mon avis, le soucis vient du fait que la variable dans la chaine est remplacee par sa valeur avant que eval_gettext() n'aille chercher le mo ... il faudrait trouver en Bash un moyen de faire cette substitution apres. (comme le printf(_("Hello %s"), name) en C )


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#10 Le 01/04/2011, à 00:02

Hizoka

Re : Integrer des .po .pot .mo dans mon application?

pourquoi tu demandes pas ? smile

alors voila ce que j'utilise :

chemin="$(cd "$(dirname "$0")";pwd)"

#Pour exporter la librairie de gettextset -a
source gettext.sh
set +a
export TEXTDOMAIN=mkv_extractor_gui
export TEXTDOMAINDIR="${chemin}/locale"
. gettext.sh

donc il faut un dossier local dans ton dossier de logiciel.

Ce dossier contiendra langue/LC_MESSAGES/nom_du_log.mo

donc au final par ex :
local => fr => LC_MESSAGES => logiciel.mo
        => en => LC_MESSAGES => logiciel.mo

Pour créer tes mo :

xgettext -o *.sh --from-code UTF-8
# Créer un fichier pot contenant tout ton texte à traduire
msginit -i fichier.pot -o fichier.po
# Converti ton pot en po, c'est lui qu'il faut modifier
msgfmt fichier.po -o fichier.mo
# et voila le fichier mo...

Mais si tu as deja testé, ton fichier pot doit être vide...
et oui, pour qu'il sache quel est le texte à traduire, il te faut l'indiquer dans ton script :
ex :

echo "Il fait beau"
echo "$(eval_gettext 'Il fait beau')"

voilou, en gros...

sinon look mon script sur l'extraction de mkv ou les explications donnés par glade2script sur la traduction.

EDIT : tu peux regarder multisystem egalement de frafa

Dernière modification par Hizoka (Le 01/04/2011, à 00:13)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#11 Le 01/04/2011, à 00:16

YannUbuntu

Re : Integrer des .po .pot .mo dans mon application?

Salut Hizo. C'est exactement la methode du post #2, et c'est celle avec laquelle j'ai de bons resultats SAUF quand il y a une variable dans la chaine, par exemple:

echo "$(eval_gettext 'Removing ${VARIABLE} ...')"

Aurais-tu une solution dans ce cas ?  (a part couper la chaine en 2 et retirer la variable de la chaine, vu que sa position varie selon les langues)


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#12 Le 01/04/2011, à 00:18

Hizoka

Re : Integrer des .po .pot .mo dans mon application?

non ça c'est pas possible (su moins je ne sais comment faire).

au traducteur de faire en sorte que la variable soit à la fin...

echo "$(eval_gettext 'Removing') ${VARIABLE} ..."

KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#13 Le 01/04/2011, à 00:26

YannUbuntu

Re : Integrer des .po .pot .mo dans mon application?

Comme indiqué dans mon post précédent, la position de la variable n'est pas la meme dans toutes les langues (francais/anglais c'est generalement pareil, mais pas pour les langues asiatiques par exemple), donc il est imperatif que le traducteur puisse choisir la position de la variable dans la chaine.

Je crois que je vais laisser tomber, ca marchait tres bien sans les .mo ...  (par contre les traducteurs vont gueuler car ils ne pourront pas utiliser leur POedit wink )

Dernière modification par YannUbuntu (Le 01/04/2011, à 00:28)


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#14 Le 01/04/2011, à 00:28

Hizoka

Re : Integrer des .po .pot .mo dans mon application?

ou alors un truc du genre :
echo "$(eval_gettext 'debut') ${VARIABLE} $(eval_gettext 'fin') "
ainsi meme si fin n'est qu'un point au moins ça passe...

du coup
bla blo bli blu VARIABLE
bla blo bli VARIABLE blu
bla VARIABLE blo bli blu
VARIABLE bla blo bli blu


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#15 Le 01/04/2011, à 00:44

YannUbuntu

Re : Integrer des .po .pot .mo dans mon application?

J'y avais pensé, mais va expliquer ca aux traducteurs, qui sont habitués a traduire chaine par chaine wink


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#16 Le 01/04/2011, à 18:14

bruno

Re : Integrer des .po .pot .mo dans mon application?

YannUbuntu : c'est quoi le problème avec la variable ?

Normalement tu devrait la retrouver dans ton fichier .pot

code bash :

echo $(eval_gettext 'Removing $mavariable…')

fichier .pot

msgid "Removing $mavriable…"
msgstr""

Dernière modification par bruno (Le 01/04/2011, à 18:14)

Hors ligne

#17 Le 01/04/2011, à 18:54

Hizoka

Re : Integrer des .po .pot .mo dans mon application?

Bah ouais mais le texte affiché sera :

Removing $mavariable…
et non
Removing /usr/share...

KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#18 Le 01/04/2011, à 19:01

bruno

Re : Integrer des .po .pot .mo dans mon application?

Ah ? Tu as testé avec ma syntaxe ?

Essaie ceci :

#!/bin/bash
. gettext.sh
ma_variable='Ubuntu'

echo $(eval_gettext 'Removing $ma_variable…')

Cela m'affiche bien : Removing Ubuntu…

Dernière modification par bruno (Le 01/04/2011, à 19:21)

Hors ligne

#19 Le 01/04/2011, à 19:36

YannUbuntu

Re : Integrer des .po .pot .mo dans mon application?

Merci pour ta reponse Bruno.

En fait chez moi la variable est bien remplacée par sa valeur, par contre la chaine reste en anglais. Et ca me le fait aussi bien avec Zenity qu'avec Glade2script.
Par exemple, ci-dessous avec Zenity la chaine reste en anglais car elle contient une variable (dont la valeur dans l'exemple est "Ubuntu").
(Bizarrement j'ai aussi le bouton "Cancel" en anglais au lieu de "Annuler", mais je crois que c'est un soucis du live-CD Ubuntu international qui n'a pas tous les paquets de langue francais, car je n'ai pas le soucis sur une session installée.)

1301679258.png

Autre exemple avec glade2script (sur session installée) :
1301679719.png

Ca ne serait pas une histoire de double voire triple guillemets (''$VARIABLE"" ou '''$VARIABLE''') à utiliser ???

Dernière modification par YannUbuntu (Le 01/04/2011, à 19:54)


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#20 Le 01/04/2011, à 20:00

Malizor

Re : Integrer des .po .pot .mo dans mon application?

Ou sinon tu recodes tout en python et après ça marche.

(ceci était le commentaire inutile du jour)


« Prouver que j'ai raison serait accorder que je puis avoir tort. »  -  Beaumarchais  ← Le premier troll ?

Hors ligne

#21 Le 01/04/2011, à 20:16

YannUbuntu

Re : Integrer des .po .pot .mo dans mon application?

lol lol lol C'est si gentiment proposé... tu peux le faire pour quand ? lol


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#22 Le 01/04/2011, à 23:37

YannUbuntu

Re : Integrer des .po .pot .mo dans mon application?

Ah, bonne nouvelle ! Le 1er exemple (zenity) ci-dessus a trouvé solution en utilisant

eval_gettext 'Removing $mavariable…'

ou

eval_gettext '''Removing $mavariable…'''

au lieu de

eval_gettext "Removing $mavariable…"

Par contre j'ai toujours de soucis avec le 2eme exemple (glade2script), dans lequel la variable est de type ${OS_NAME[$OS_NB]} (on voit que seul $OS_NB a été remplacé par sa valeur) :

1301693782.png

et ce 3eme exemple (zenity), qui contient une apostrophe (et donc m'empeche d'utiliser la solution du 1er exemple) :

1301693808.png

Dernière modification par YannUbuntu (Le 01/04/2011, à 23:40)


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#23 Le 02/04/2011, à 00:41

AnsuzPeorth

Re : Integrer des .po .pot .mo dans mon application?

Tu n'as pas essayé un truc du genre:

eval_gettext "$(echo Removing ${mavariable}…)"

Faut s'amuser avec les guillemets ou apostrophes. Sinon, peut être voir avec printf, des fois ...
Mais logiquement, le echo se interprété avant.

PS: j'ai pas fait de tests, pas le courage de créer les po,mo & co ... smile

Dernière modification par AnsuzPeorth (Le 02/04/2011, à 00:42)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#24 Le 02/04/2011, à 06:35

Jarbinks

Re : Integrer des .po .pot .mo dans mon application?

@AnsuzPeorth : j'ai essayé, mais ton code interprète la variable avant de passer dans la moulinette eval_gettext.

Le code de Bruno marche bien pour moi, mais il y a effectivement un problème quand il y a une apostrophe dans l'histoire :

man bash a écrit :

Enclosing characters in single quotes preserves the literal value of each character within the quotes.  A single quote may not occur between  single quotes, even when preceded by a backslash.

Une astuce consiste à utiliser les chaînes $'...' :

man bash a écrit :

Words  of  the  form  $'string' are treated specially.
[...]
\'     single quote

Ce qui donne donc :

#!/bin/bash
. gettext.sh
ma_variable='Ubuntu'
echo $(eval_gettext $'Removing $ma_variable avec l\'apostrophe…')

Pour la variable tableau, j'ai cherché mais j'ai pas trouvé, le texte était traduit mais la variable à moitié interprétée (index seulement).
Le seul moyen que j'ai trouvé pour contourner ça est de mettre la valeur qu'on veut dans une variable avant puis d'utiliser cette variable simple dans le texte à traduire.

Donc :

#!/bin/bash
. gettext.sh
ma_variable=${mon_tableau[$mon_index]}
echo $(eval_gettext $'Removing $ma_variable avec l\'apostrophe…')

Hors ligne

#25 Le 02/04/2011, à 08:38

Hizoka

Re : Integrer des .po .pot .mo dans mon application?

bon bah c'est cool si ça passe ça smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne