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 08/02/2020, à 11:24

Christophe C

gérer une traduction / localisation pour un logiciel

Bonjour,

Je voudrais écrire un système de traduction / localisation pour un petit logiciel.

Je peux gérer cela à l'arrache avec un nom de variable pour chaque chaîne de caractères, et un fichier texte externe ou sont stockées les variables (et une gestion de la langue du système pour savoir quoi prendre). Je l'ai déjà fait.

Par contre, je crois comprendre qu'il existe une norme pour la gestion de la localisation / langue sous linux. Donc autant la connaître / la respecter. Je pensais que c'était les fichiers .po, mais quand je cherche sur mon disque, j'en trouve fort peu.

J'aimerais avoir accès à un descriptif technique de la méthode / des fichiers.

Dernière modification par Christophe C (Le 11/02/2020, à 18:24)


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#2 Le 08/02/2020, à 11:59

abelthorne

Re : gérer une traduction / localisation pour un logiciel

Oui, c'est gettext. Tu ne trouves pas de fichiers .po (ou .pot) en faisant une recherche parce que ce sont les fichiers sources, qui sont ensuite compilés en fichiers .mo utilisés au final.
- gettext sur Wikipédia (informations générales) ;
- Internationaliser un logiciel libre dans la doc ici (pas très détaillé) ;
- dans les dépôts, pour éditer les fichiers .po, il doit y avoir gtranslator et poedit, peut-être d'autres.

J'ai déjà utilisé gettext en PHP. Si je me souviens bien, le .pot est le fichier avec les chaînes d'origine et on génère des .po pour les langues. En unicode, il faut a priori utiliser les codes de langue internationaux (du genre fr_FR et pas simplement fr) mais c'est peut-être une spécificité de PHP, je n'ai pas d'expérience avec d'autres implémentations. Les biblis gettext fournissent des fonctions pour gérer les chaînes traduites.

Dernière modification par abelthorne (Le 08/02/2020, à 12:14)

Hors ligne

#3 Le 08/02/2020, à 13:40

kevlar

Re : gérer une traduction / localisation pour un logiciel

Bonjour, je complète l'intervention ci-dessus, tout à fait pertinente.
- avant tout, bien veiller à ce que dans le logiciel, les messages soient en anglais, car la norme c'est d'écrire dans le programme en anglais, par défaut, et de fournir les fichiers de traduction vers les langues. Il faut, en langage compilable, lier aux bibliothèques d'internationalisation (libintl). En outre, le code source doit encadrer les chaînes à traduire par des appels à des macros. En langage C, la macro est appelée par le caractère de soulignement,  comme ceci :

 _("it's a text")

Si ces macros sont absentes, on ne peut ni extraire les chaînes à traduire, ni bien évidemment les traduire à la volée lors de l'exécution du programme.
- les fichiers "source" (ce sont de simples fichiers textes extraits par les outils gettext voit plus bas) sont de type .po; les fichiers "compilés" qui permettent de traduire "à la volée" lors de l'exécution sont les fichier .mo
- le programme d'installation du logiciel (en imaginant qu'il sera compilé, que ce ne soit pas un langage interprété) doit placer les fichiers .mo dans les répertoires standard d'un système Linux. Il est donc nécessaire d'utiliser des scripts d'installation adaptés, en mode "à la mano" ou avec un EDI. En gros, c'est le classique "make install" qui réalisera cela, ou bien les fichiers de description d'un paquet .deb.
- Poedit est en effet bien adapté : il permet de réaliser les traductions (fichiers .po) et de les compiler (fichiers .mo)., mais il ne sait pas les extraire du code source du programme.
- il faut utiliser des scripts pour "extraire" des fichiers source l'ensemble des chaînes à traduire, puis les faire traiter par Poedit, puis installer les fichiers .mo dans le système. C'est le rôle des outils getttext.
- il faut refaire le cycle décrit au § ci-dessus avant tout déploiement du logiciel, afin de prendre en compte les modifications des chaînes de caractère.
Voilà, c'est mon expérience en langage C, je n'utilise pas d'EDI, uniquement gedit+terminal+poedit+autotools+outils gettext
Je ne sais pas faire avec un langage interprété.

Dernière modification par kevlar (Le 08/02/2020, à 13:49)

Hors ligne

#4 Le 08/02/2020, à 15:49

Christophe C

Re : gérer une traduction / localisation pour un logiciel

Merci smile

J'utilise du bash, et yad. Et j'avais repéré ces fichiers .mo (ils ont des noms qui fleurent bon la localisation smile), mais je ne les comprenais pas, et ne pouvais pas les lire. C'est plus clair.
Une précision quand même : il y a un .po par langue, mais sauf erreur un seul .mo qui "compile" tous les .po des différentes langues, c'est ça ? Non, j'ai compris : plein de fichier dans des sous-répertoires.

Sinon, je comprend les grandes lignes de ce qu'il y a ci-dessus, mais pas tout. Par exemple, "il faut utiliser des scripts pour "extraire" des fichiers source l'ensemble des chaînes à traduire". Je les connais les chaînes à traduire : je les écrits. Donc pourquoi faire tourner un script ?

Pareil pour l’installation dans "les répertoires standards" avec des scripts. C'est le travail du .deb de déployer les fichiers, normalement, non ?

Dernière modification par Christophe C (Le 08/02/2020, à 16:02)


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#5 Le 08/02/2020, à 16:20

abelthorne

Re : gérer une traduction / localisation pour un logiciel

Christophe C a écrit :

Pareil pour l’installation dans "les répertoires standards" avec des scripts. C'est le travail du .deb de déployer les fichiers, normalement, non ?

Si je comprends bien, c'est ce que dit kevlar : si tu passes par un paquet deb, il faut qu'il place les fichiers au bon endroit, mais surtout, si tu gères une installation manuelle à base de make install (ou même sans), il faut les placer dans les bons dossiers. Un paquet deb est le format standard pour l'installation des logiciels sur Ubuntu mais ce n'est pas le seul.

Hors ligne

#6 Le 08/02/2020, à 17:38

Christophe C

Re : gérer une traduction / localisation pour un logiciel

ok, merci. Il faut placer le .mo dans /usr/share/locale/LANG/LC_MESSAGES dans son deb, et il ira au même endroit dans le système, ça c'est facile.

Bon, j'ai à peu prêt compris la 1er partie : créer le .pot, puis les différents.po, dont le .po de référence, toujours en anglais (et dont les chaînes msgid (la VO) et msgstr (la trad) sont logiquement identiques. Je sais décompiler un .po (par exemple msgunfmt plank.mo > plank.po pour décompiler le .mo de plank). Et via poedit je peux créer un .mo à partir d'un .po.

Par contre, je n'ai pas compris comment intégrer les chaines dans mes variables de programme. Disons que dans la page 1 j'ai "Hello World". Et je veux le remplacer par "Bonjour tout le monde".

Je crée un .po avec :

msgid "Hello World"
msgstr "Bonjour tout le monde"

Je le "compile" en .mo avec poedit

Je le met dans /usr/share/locale/fr/LC_MESSAGES/

Mais comment récupérer les trad ?

Je peux lire le fichier de trad via un

source usr/share/locale/fr/LC_MESSAGES/lefichier.po

(je test sur la locale pour savoir si c'est fr ou en ou ru, ou es .... facile).
Mais ensuite ? Il n'y a pas de nom de variable dans un .po (et donc je suppose dans un .mo) donc j'avoue que je ne sais pas comment savoir quelle ligne msgstr interroger, c'est à dire comment je fait le lien entre la variable texte dans le logiciel (hello World") et sa trad ("Bonjour tout le monde").

Dernière modification par Christophe C (Le 08/02/2020, à 17:42)


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#7 Le 08/02/2020, à 17:44

Christophe C

Re : gérer une traduction / localisation pour un logiciel

Ah, je pense que c'est ça : https://ouep.eu/shell/internationalisat … ipts-bash/
je vais essayer de piger.

Edit : il manque la moitié des infos, beaucoup de chose sont sous-entendues et pas explicitées, et il n'y a pas d'exemple, mais je commence à comprendre. Il faut que je teste.

Dernière modification par Christophe C (Le 08/02/2020, à 17:52)


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#8 Le 08/02/2020, à 18:37

abelthorne

Re : gérer une traduction / localisation pour un logiciel

Pour ce qui est de ton cas particulier (bash), aucune idée, il faudrait voir quelles fonctions te proposent l'implémentation de gettext correspondante. kevlar donnait l'exemple de la fonction _() en C : on lui passe la chaîne d'origine et elle traduit dans la langue de l'utilisateur.

En PHP, avec Wordpress, j'ai par exemple deux fonctions (je ne sais pas si elles sont propres à WP ou si elles viennent de PHP) : __() pour traduire une chaîne et _e() pour la traduire et l'afficher (ça rajoute un echo). Si je fais :

_e("My great string");

j'obtiendrai l'affichage Ma super chaîne (en supposant qu'elle est bien traduite dans les .po/.mo).

D'après la page que tu indiques, il semblerait qu'en bash, la fonction de traduction soit tout simplement appelée t et doit juste être utilisée comme une commande devant une chaîne à traduire.

Hors ligne

#9 Le 08/02/2020, à 20:41

kevlar

Re : gérer une traduction / localisation pour un logiciel

Bonsoir, comme la conversation est intéressante, on va continuer un peu !
1- il faudrait tout simplement récupérer les sources d'un programme, pas trop long, pour comprendre.
Je vous montre comment je procède pour Searchmonkey, qui est programmé en C (voir le GitHub ici  GitHub  pour voir comment sont placés les fichiers à partir de la racine):
a/ on ouvre une console dans le répertoire /src qui contient les fichiers source .c et .h, puis on tape

xgettext -d searchmonkey -o searchmonkey.pot -k_ -s *.c

On obtient un fichier objet avec l'extension .pot, qui va servir de source pour le travail avec Poedit.
b/ puis copier searchmonkey.pot dans /po
Par convention, dans les sources d'un progamme, on met les traductions dans un répertoire /po

c/ Deux cas maintenant. Soit c'est la "première fois", alors on ouvre le fichier d'extension .pot avec Poedit, et on crée pour chaque langue cible un fichier avec le nom "qui va bien", cf. la suite Ou, autre cas, c'est une maise à jour, alors, comme on ne veut pas écraser les anciennes traductions, on fait un "merge", comme ceci (je vous laisse trouver les langues concernées ...)

 msgmerge --update fr_FR.po searchmonkey.pot
 msgmerge --update fr.po searchmonkey.pot
 msgmerge --update en_US.po searchmonkey.pot
 msgmerge --update en_UK.po searchmonkey.pot
 msgmerge --update en_GB.po searchmonkey.pot
 msgmerge --update ru_RU.po searchmonkey.pot
 msgmerge --update pt_PT.po searchmonkey.pot

d/ et maintenant on travaille avec Poedit sur les fichiers .po, en améliorant la traduction. Poedit est un programme convivial, rien à expliquer. Une fois satisfait, on fait au point suivant.
e/ on "fabrique" les fichiers binaires d'extension .mo comme ceci :

 msgfmt --output-file=fr_FR.mo fr_FR.po
 msgfmt --output-file=fr.mo fr.po
 msgfmt --output-file=en_US.mo en_US.po
 msgfmt --output-file=en_UK.mo en_UK.po
 msgfmt --output-file=en_GB.mo en_GB.po
 msgfmt --output-file=ru_RU.mo ru_RU.po
 msgfmt --output-file=pt_PT.mo pt_PT.po

Cette méthode est dépassée (j'en ait fait usage pour reconstruire Searchmonkey à partir du travail de son premier auteur, qui a utlisé les autotools), maintenant je n'utilise que les scripts autotools. Mais c'est tellement "complexe" de rentrer dans la logique des autotools que je recommande dans une première phase cette méthode plus "basique" qui a le mérite de permettre d'apprendre les choses et l'usage des différents outils. Il me semble que les versions actuelles d'Anjuta, l'EDI de Gnome ont l'air de prendre en main toutes ces phases, à voir, mais là encore je ne connais pas, je préfère les méthodes plus basiques.
Pour finir, il faudra Christophe, à terme, passer aux autototols, car les répertoires systèmes sont légèrement différents selon que l'on soit sous Ubuntu ou Debian, par exemple, et si l'on souhaite une compatibilité maxi, mieux vaut des outils d'installation qui automatisent tout çà.
Il faudra également prévoir l’installation dans le système (mais çà ne concerne plus les langues) des icones, fichiers .desktop, fichiers .ui (s'il y en a), etc.
Bon courage, au départ il faut prendre son temps, une fois rodé çà va tout seul.
Si le projet avance bien, et si besoin, je vous donnerai un tuto pour le paquet debian (mais le site ubuntu.fr est bien fait sur ce plan, je trouve).

Hors ligne

#10 Le 08/02/2020, à 21:59

kevlar

Re : gérer une traduction / localisation pour un logiciel

Pour finir, je viens de faire un test sous Anjuta : il gère vraiment tout, ne vous embêtez pas à faire les choses à la main comme moi :
- Anjuta propose un assistant, et permet d'importer un projet existant : compatible C, C++, Python, Vala.
- il permet de générer les scripts (liés aux autotools dont je parle au-dessus), en particulier pour l'internationalisation
- il crée pour vous les différents scripts pour make, make install, etc.
- et il vous permettra, j'espère, d'utiliser le script spécifique aux traductions, qui s'invoque via make update-po.
Et vous compléterez avec la méthode "à la main" de mes messages précédents, ainsi vous pourrez intervenir pour corriger les défaillances des scripts automatiques.
Avec tout çà, vos projets devraient s'internationaliser très vite !
Bonne suite.
PS encore quelques conseils :
- pour tester les traductions, je fais d'abord un sudo make install afin que les dites traductions soient bien placées où il se doit dans le système. ainsi, les messages en anglais se transforment en français !
- pour tester une autre langue que celle du système, je n'ai eu aucun succès avec la méthode préconnisée partout, qui consiste à lancer le programme comme ceci :

env LC_ALL=en_UK.UTF-8 nom_de_executable

J'ai donc créé un utlisateur dans que autre langue (que le français) que je cible, et je rentre dans Ubuntu via cette session spéciale, afin de vérifier que ma traduction est OK. Attention : l'anglais est la langue par défaut en cas d'absence de fichiers de traduction). Par exemple, si la langue du système utilisé est le latin, et que le fichiers .po latin n'existe pas, le programme parlera anglais. De même, si vous oubliez de traduire certains messages, ils resteront en anglais.

@abelthorne  : c'est rigolo cette proximité PHP <-> langage C, même logique de macros, merci pour cette info !

Dernière modification par kevlar (Le 08/02/2020, à 22:01)

Hors ligne

#11 Le 08/02/2020, à 23:57

metalux

Re : gérer une traduction / localisation pour un logiciel

Salut Christophe C,
Je ne fais que passer, je n'ai pas tout relu la discussion du coup je sais pas trop si tu cherches à extraire les traductions de scripts ou si au contraire tu cherches à en ajouter.
J'avais fais un script pour gagner un peu de temps dans la création des fichiers de traduction, je te le livre tel quel si tu y trouves des infos:
https://forum.ubuntu-fr.org/viewtopic.php?id=1980771
Si je suis à côté de la plaque, je prendrai le temps de lire en détail la discussion plus tard.

Hors ligne

#12 Le 09/02/2020, à 09:31

Christophe C

Re : gérer une traduction / localisation pour un logiciel

Merci à vous. Mon projet vise un peu à aider (c'est une interface graphique pour devilspie), mais c'est surtout pour moi, pour creuser certains aspects de la programmation et de ses à-côté.

L'outil est terminé, le paquet debian est fait et marche très bien (il reste quelques erreurs lintian, mais c'est anecdotique), mais tout est en français, et tant qu'à faire je me suis dit que je devais tout faire, y compris au moins une traduction .mo.

Le besoin est suffisamment modeste pour que je n'ai pas besoin de la grosse artillerie, mais je comprends que pour un gros projet, la localisation devient vite l'horreur : on change une virgule, et tout change derrière. A mon niveau, je n'ai pas vraiment ce problème, et je vais déjà essayer de tout gérer à l'éditeur, pour bien comprendre chaque étape. Mon souhait n'étant pas la productivité mais la compréhension, je préfère travailler lentement et en pas par pas.

@abelthorne : gettext est bien implémenté en bash, comme en C. La syntaxe serait (pas testé), la suivante : $"This is a string to translate". Il y a en fait d'autres solution, mais commençons par celle-là smile

Bon, j'y retourne smile

Dernière modification par Christophe C (Le 09/02/2020, à 09:36)


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#13 Le 09/02/2020, à 10:59

metalux

Re : gérer une traduction / localisation pour un logiciel

Christophe C a écrit :

Mon souhait n'étant pas la productivité mais la compréhension

Je ne sais pas si tu as vu le lien que j'avais mis dans la discussion concernant le script Bash translator. Si ce n'est pas le cas je t'invite à le lire, il est très intéressant et explique bien les difficultés qu'on peut rencontrer lors des traductions, et de plus en français. Je te remets le lien ici:
http://schplurtz.free.fr/wiki/envrac/bash-international

Hors ligne

#14 Le 10/02/2020, à 09:09

Christophe C

Re : gérer une traduction / localisation pour un logiciel

Ah oui, merci beaucoup. J'ai monté un petit script hier dans le genre de ton exemple, avec une spécificité importante : marche pas smile

J'ai laissé tomber pour aller voir un bon film smile, donc il faut que je reprenne tout cela à tête reposé, en suivant ton article, qui semble plus détaillé que mes bases initiales.

Donc merci  beaucoup !!


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#15 Le 10/02/2020, à 19:12

Christophe C

Re : gérer une traduction / localisation pour un logiciel

Voui, ce qui me manquait c'était ces 2 lignes en début de programme bash :
TEXTDOMAIN=nom-de-mon-programme
TEXTDOMAINDIR="/usr/share/locale"

La 1er ligne donnant le nom du programme et des fichiers de traduction, et la seconde donnant le domaine dans lequel se trouve les fichiers de trad.

Bon, reste à mettre en oeuvre, mais j'ai à peu près compris.

Intrinsèquement, je trouve ce système un peu compliqué. Mais peu importe ...

Merci pour le lien, c'était l'info qui me manquait. Désormais, mon test fonctionne nickel smile

Dernière modification par Christophe C (Le 10/02/2020, à 19:13)


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne