Projet

Général

Profil

Gestion traduction » Historique » Version 9

Benjamin Bohard, 03/09/2014 16:28

1 1 Benjamin Bohard
h1. Gestion traduction
2 1 Benjamin Bohard
3 1 Benjamin Bohard
h2. Besoins
4 1 Benjamin Bohard
5 1 Benjamin Bohard
Pouvoir mettre à jour les fichiers de traduction distribués dans les paquets.
6 1 Benjamin Bohard
7 2 Benjamin Bohard
Idéalement, il faut :
8 2 Benjamin Bohard
* un mécanisme permettant de mettre à jour les fichiers .po pour chaque langue déjà traduite et le fichier .pot pouvant servir de point de départ à la traduction dans une nouvelle langue ;
9 6 Benjamin Bohard
* un mécanisme permettant d'être sûr que la version compilée installée est bien à jour.
10 2 Benjamin Bohard
11 1 Benjamin Bohard
h2. Procédures
12 1 Benjamin Bohard
13 3 Benjamin Bohard
Les fichiers de traduction sont installés sous forme compilée (.mo).
14 1 Benjamin Bohard
Ces fichiers compilés ne sont pas éditables directement.
15 3 Benjamin Bohard
Ils sont générés à partir de fichiers texte (.po).
16 1 Benjamin Bohard
17 1 Benjamin Bohard
La mise à jour des fichiers de traduction est faite en trois étapes :
18 1 Benjamin Bohard
# extraction des chaînes de caractères à traduire dans un ensemble de fichiers (création ou mise à jour des fichiers .po),
19 1 Benjamin Bohard
# édition des fichiers .po,
20 1 Benjamin Bohard
# compilation des fichiers .mo à partir des fichiers .po.
21 1 Benjamin Bohard
22 1 Benjamin Bohard
L'extraction des chaînes de caractères à traduire est possible par l'emploi de la commande xgettext (également conseillée par l'auteur de pygettext depuis qu'elle gère le code python).
23 1 Benjamin Bohard
Le passage des .po aux .mo et inversement est possible par l'emploi des commandes msgfmt et msgunfmt réciproquement.
24 1 Benjamin Bohard
25 6 Benjamin Bohard
Les fichiers .po et .mo sont redondants et il n'est pas nécessaire de conserver les deux formats dans les dépôts.
26 1 Benjamin Bohard
Les fichiers .mo ne sont utiles que pour l'exécution des programmes traduits et les fichiers .po sont plus facilement exploitables dans un contexte de dépôt git.
27 1 Benjamin Bohard
28 1 Benjamin Bohard
h2. Implémentation
29 1 Benjamin Bohard
30 2 Benjamin Bohard
h3. À ce jour, dans les dépôts eole
31 2 Benjamin Bohard
32 1 Benjamin Bohard
Les dépôts mettant actuellement en place une gestion de la traduction sont :
33 1 Benjamin Bohard
* eole-sso ;
34 1 Benjamin Bohard
* eoleflask-aaa ;
35 1 Benjamin Bohard
* eole-bacula ;
36 1 Benjamin Bohard
* zephir-client ;
37 1 Benjamin Bohard
* python-pyeole ;
38 1 Benjamin Bohard
* ead ;
39 1 Benjamin Bohard
* creole ;
40 1 Benjamin Bohard
* tiramisu.
41 1 Benjamin Bohard
42 1 Benjamin Bohard
L'idée retenue dans l'ead, eole-sso, est l'inclusion du fichier .po dans le dépôt avec un script permettant de générer le .mo.
43 1 Benjamin Bohard
Dans le cas de l'ead, le .po et le script sont installés (ils sont placés dans le répertoire i18n qui est installé de manière globale).
44 1 Benjamin Bohard
Dans le cas de eole-sso, le .po et le script ne sont pas installés ; seul le .mo est dans un répertoire installé.
45 1 Benjamin Bohard
Dans les deux cas, le script générant les .mo n'est pas lancé automatiquement.
46 1 Benjamin Bohard
47 1 Benjamin Bohard
Dans eoleflask-aaa, le fichier .po (et un fichier .pot) est dans un répertoire translations mais aucun dispositif ne semble en place pour compiler le .mo.
48 1 Benjamin Bohard
49 1 Benjamin Bohard
Dans eole-bacula, le .po est celui de bacula recompilé.
50 5 Benjamin Bohard
L'ensemble du dossier lang est installé (.po, script pour compiler le .mo et le .mo lui-même).
51 1 Benjamin Bohard
Le script ne gère pas la mise à jour des fichiers .po et doit être lancé manuellement. 
52 1 Benjamin Bohard
53 1 Benjamin Bohard
Zephir-client dispose d'une cible dans le Makefile situé dans data/monitor pour générer le .mo à partir du .po et d'une cible pour extraire les chaînes de caractères.
54 1 Benjamin Bohard
55 1 Benjamin Bohard
Python-pyeole lance la commande msgfmt dans le setup.py qui assure la compilation des .mo.
56 1 Benjamin Bohard
57 2 Benjamin Bohard
Creole ne met à disposition que le fichier .mo.
58 2 Benjamin Bohard
59 1 Benjamin Bohard
Tiramisu dispose de trois cibles (utilisées dans le .PHONY) dans le Makefile pour extraire les chaînes de caractères, compiler les .mo et les installer.
60 2 Benjamin Bohard
61 2 Benjamin Bohard
h3. bilan
62 2 Benjamin Bohard
63 2 Benjamin Bohard
Seul les dépôts tiramisu et zéphir-client prennent en charge les trois étapes : extraction des chaînes de caractères, compilation et installation des .mo.
64 2 Benjamin Bohard
Aucun n'assure, a priori, la mise à jour des fichiers .po déjà existant.
65 2 Benjamin Bohard
66 2 Benjamin Bohard
Tiramisu déclenche automatiquement l'extraction des chaînes de caractères et la compilation directement après.
67 2 Benjamin Bohard
68 2 Benjamin Bohard
Les projets python utilisent soit les mécanismes du Makefile, soit ceux du setup.py.
69 2 Benjamin Bohard
70 2 Benjamin Bohard
Les .po et les scripts se retrouvent parfois installés.
71 2 Benjamin Bohard
72 2 Benjamin Bohard
Deux trois questions :
73 2 Benjamin Bohard
* est-ce que les fichiers .mo doivent tous être installés dans /usr/share/locale/ ?
74 2 Benjamin Bohard
* est-ce que la procédure est suffisamment générique pour l'intégrer dans le Makefile de eole-skeletor ?
75 2 Benjamin Bohard
76 2 Benjamin Bohard
h2. Proposition
77 2 Benjamin Bohard
78 3 Benjamin Bohard
# si nécessaire, mettre à jour tous les fichiers .po déjà créés et écraser le fichier .pot servant à initier les nouvelles traductions (cible du Makefile appelée manuellement),
79 4 Benjamin Bohard
# si les fichiers .po ont été mis à jour, les éditer,
80 4 Benjamin Bohard
# compiler les fichiers .mo dans un répertoire installé à chaque construction de paquet (cible Makefile lancée automatiquement).
81 7 Benjamin Bohard
82 7 Benjamin Bohard
Les utilitaires à disposition (voir également la documentation gettext au format texinfo, chapitre 9):
83 7 Benjamin Bohard
* xgettext : extraction de chaînes de caractères et création d'un catalogue vide ou ajout des chaînes à un catalogue déjà existant ;
84 7 Benjamin Bohard
* msginit : création d'un catalogue .po pour une langue donnée, à partir d'un catalogue vide .pot ;
85 7 Benjamin Bohard
* msgfmt : compilation d'un catalogue .po au format binaire .mo ;
86 7 Benjamin Bohard
* msgunfmt : décompilation d'un catalogue au format binaire .mo en un catalogue .po ;
87 7 Benjamin Bohard
* msgmerge : assemblage d'un catalogue avec traductions et d'un catalogue avec références mises à jour.
88 8 Benjamin Bohard
89 8 Benjamin Bohard
h3. Arborescence des projets
90 8 Benjamin Bohard
91 8 Benjamin Bohard
Le fonctionnement de gettext nécessite de disposer, pour chaque langue, d'un fichier portant le même nom.
92 8 Benjamin Bohard
Sur le serveur, cela est rendu possible par l'organisation en arborescence avec un répertoire par langue, variante linguistique.
93 8 Benjamin Bohard
94 8 Benjamin Bohard
Dans le dépôt, on propose de distinguer les différentes langues en utilisant également une arborescence :
95 8 Benjamin Bohard
<pre>
96 8 Benjamin Bohard
|
97 8 Benjamin Bohard
`-- translations
98 8 Benjamin Bohard
    |-- creole.pot
99 8 Benjamin Bohard
    |-- en
100 8 Benjamin Bohard
    |   `-- creole.po
101 8 Benjamin Bohard
    `-- fr
102 8 Benjamin Bohard
        `-- creole.po
103 8 Benjamin Bohard
</pre>
104 8 Benjamin Bohard
Le niveau de répertoire LC_MESSAGES présent sur les serveurs n'est pas reproduit dans les dépôts.
105 8 Benjamin Bohard
106 8 Benjamin Bohard
Au moment de la compilation, on recherchera tous les fichiers correspondant au motif translations/*/*.po.
107 8 Benjamin Bohard
108 8 Benjamin Bohard
h3. Mise à jour des .pot et des .po
109 8 Benjamin Bohard
110 8 Benjamin Bohard
La mise à jour des fichiers .pot et .po est une opération lancée si besoin.
111 8 Benjamin Bohard
112 8 Benjamin Bohard
Les informations nécessaires pour générer le .pot sont un nom de projet (domaine, également utilisé pour le nom de paquet) et les répertoires ou fichiers dans lesquels chercher les chaînes de caractères.
113 9 Benjamin Bohard
Ces informations doivent être fournies en paramètres au script assurant la génération du .pot et la mise à jour des .po (en cas de chaîne vide, le message d'origine est utilisé).
114 8 Benjamin Bohard
Ces informations seront fournies sous la forme d'un fichier texte structuré par des tabulations comme suit :
115 8 Benjamin Bohard
<pre>
116 8 Benjamin Bohard
projet\tfichier1.po fichiers2*.po
117 8 Benjamin Bohard
</pre>
118 8 Benjamin Bohard
119 8 Benjamin Bohard
h3. Compilation des .mo
120 8 Benjamin Bohard
121 8 Benjamin Bohard
La compilation des .mo sera faite à la compilation des paquets : le .mo ne sera pas présent dans le dépôt.
122 8 Benjamin Bohard
Les cibles ajoutées dans eole.mk seront tous les fichiers .po disponibles.
123 8 Benjamin Bohard
La recette compilera les .po en .mo directement dans $(DESTDIR)/usr/share/locale/…