Présentation

Les applications GNOME utilisent toutes le système de traduction gettext créé par le projet GNU. Le principe de gettext est de remplacer les chaînes de la version originale en anglais par les chaînes traduites au moment de l'exécution du logiciel.
L'ensemble des chaînes à traduire pour une application sont réunies dans un fichier .POT (Portable Object Template) localisé dans un répertoire po/ dans les sources de cette application. Chaque langue utilise ce fichier comme base pour démarrer une traduction. Une fois le fichier traduit, il est enregistré sous le nom XX.po, où XX est le code de la langue, par exemple fr.po. Les fichiers .po (Portable Object) sont par la suite transformés en fichier .mo (Machine Object) lors de la compilation.
Chaque application possède ainsi un fichier PO pour chacune des langues dans lesquelles elle est traduite (es.po, de.po, etc). Les modules hébergés sur le SVN de GNOME contiennent tous un répertoire nommé po contenant ces fichiers.
Pour davantage d'informations à ce sujet, consultez le manuel gettext ou les conseils destinés aux développeurs GNOME.

Structure d'un fichier po

Le traducteur travaille sur les fichiers .po. Ce sont de simples fichiers texte qui associent une chaîne originale à la chaîne traduite en fonction d'un fichier source. Ils se présentent typiquement comme ceci :

L'en-tête

Voici un exemple d'en-tête issu de la traduction du logiciel evince :

# French translation of evince.
# Copyright (C) 2005-2006 The Free Software Foundation, Inc.
# This file is distributed under the GNU General Public License Version 2.
#
# Vincent Carriere <carriere_vincent@yahoo.fr>, 2005.
# Christophe Merlet (RedFox) <redfox@redfoxcenter.org>, 2005-2006.
# Vincent Untz <vuntz@gnome.org>, 2005.
# Thomas Vergnaud <thomas.vergnaud@laposte.net>, 2006.
# Guillaume Desmottes <cass@skynet.be>, 2006.
# Jonathan Ernst <jonathan@ernstfamily.ch>, 2006.
# Robert-André Mauchin <zebob.m@gmail.com>, 2006-2007.
# Damien Durand <splinux@fedoraproject.org>, 2006.
#

Les lignes débutant par un dièse indiquent des commentaires. La première correspond à l'intitulé du fichier, et les deux suivantes à la licence du logiciel traduit. Il est impératif de prendre connaissance de la licence du logiciel avant de commencer toute traduction ! Viennent ensuite la liste des contributeurs à la traduction par ordre chronologique.
L'en-tête se poursuit avec la première chaîne. Celle-ci est particulière, elle contient toujours une chaîne originale vierge, et une chaîne traduite contenant des informations sur le fichier de traduction comme ceci :

msgid ""
msgstr ""
"Project-Id-Version: Evince 0.5.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2007-01-13 01:39+0100\n"
"PO-Revision-Date: 2007-01-13 09:03+0100\n"
"Last-Translator: Robert-André Mauchin <zebob.m@gmail.com>\n"
"Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n>1;\n"

Nous allons détailler le contenu de ces chaînes :

Il est impératif que cet en-tête soit présent afin que le fichier po soit valide. Son absence empêcherait la compilation du fichier. Notez également que chaque ligne se termine par « \n » indiquant un retour à la ligne.

Les chaînes à traduire

Une chaîne classique

Voici un exemple classique de chaîne à traduire issu d’evince :

#. this is EOF
#: ../backend/dvi/mdvi-lib/dviread.c:208
msgid "unexpected EOF\n"
msgstr ""

msgstr "Fin de fichier non attendue\n"

Notez que la version française doit respecter les sauts de ligne « \n » en fin de chaîne pour que le fichier soit valide. Mais rien n'empêche d'en ajouter plus que dans la chaîne originale, comme nous le verrons par la suite. Vous pouvez également faire des retours à la ligne dans votre traduction comme ceci :

msgstr "Fin de fichier "
"non attendue\n"

Cette disposition n'aura aucune incidence sur l'affichage de la chaîne traduite dans le programme, mais permet simplement de disposer la traduction sur plusieurs lignes afin que celle-ci soit plus lisible. Il est en général conseillé de ne pas dépasser une longueur de chaîne de plus de 80 colonnes, il faut alors couper la chaîne à traduire à la fin d'un mot puis continuer la chaîne à la ligne suivante. Il est d'usage de mettre l'espace séparant les mots à la fin de la chaîne coupée.
Les tabulations sont elles représentées par « \t ». Si vous avez à inclure des guillemets droits « " » ou une barre oblique inverse « \ » dans votre traduction, il faut faire précéder ceux-ci d'une barre oblique inverse comme ceci « \" » « \\ » pour que ceux-ci ne soit pas interprétés comme une fin de ligne ou un caractère spécial.

Les variables dans les chaînes

Vous allez également rencontrer des chaînes contenant des variables comme celles-ci :

#: ../shell/ev-page-action.c:77
#, c-format
msgid "(%d of %d)"
msgstr "(%d sur %d)"

Les variables commencent par un signe « % » Elles doit être présentes en même nombre que dans la chaîne anglaise, sinon le fichier ne sera pas considéré comme valide. La ligne débutant par un dièse et une virgule est ici suivi par le type de langage auquel appartient la variable. Dans notre cas il s'agit d'une variable de type C « #, c-format », mais cela peut également être « csharp-format », « python-format », etc.
Dans certains cas il peut être utile de ne pas afficher le contenu de la variable. Par exemple si la variable « %s » suivi du mot « page » contient toujours la valeur « 1 », il est préférable de traduire la chaîne en « une page », plutôt qu'en « %s page » ce qui afficherait « 1 page » pour l'utilisateur. Si l'on traduit alors la chaîne par « une page », il ne faut oublier pour autant que l'absence de variable dans la chaîne traduite provoque une erreur. Pour l'éviter nous ajoutons à la variable « %s » un zéro après le signe « % » comme ceci : « %0s ». Il n'y aura alors pas d'erreur et la valeur de la variable ne sera pas affichée. Concrètement cela donne :

#, c-format
msgid "Print %s page"
msgstr "Imprimer une %0s page"

Les chaînes à pluriel

gettext permet également de traduire les pluriels. Une chaîne avec un pluriel se présente ainsi :

#: ../shell/ev-view.c:4084
#, c-format
msgid "%d found on this page"
msgid_plural "%d found on this page"
msgstr[0] "Trouvé %d fois sur cette page"
msgstr[1] "Trouvés %d fois sur cette page"

On constate qu'il y a deux chaînes à traduire, la première commençant classiquement par « msgid » indique la chaîne au singulier, la seconde commençant « msgid_plural » indique la chaîne au pluriel. Les versions traduites débutent comme d'habitude par « msgstr » mais est en plus suivi d'un chiffre entre crochets. « msgstr[0] » indique la version traduite au singulier, et « msgstr[1] » ou avec des chiffres supérieurs indique les versions traduites au pluriel. En français on ne dépassera jamais la valeur de « 1 », mais dans certaines langues il existe plus d'une forme de pluriel.

Les chaînes à relire ou fuzzy

Dans le cas de mise à jour d'un fichier po lors de la modification des sources du logiciel, il est probable que de nouvelles chaînes soient ajoutées, et que d'autres soient modifiées. Dans ce dernier cas, la chaîne traduite est alors marquée comme « fuzzy » ou à relire comme dans l'exemple qui suit :

#: ../shell/ev-window.c:1605
#, fuzzy, c-format
msgid "Failed to create file “%s”: %s"
msgstr "Le chargement du document « %s » a échoué"

La chaîne traduite ne correspond pas à une traduction conforme de la chaîne originale, vous devez alors la corriger puis supprimer le mot-clé « ,fuzzy » comme ceci :

#: ../shell/ev-window.c:1605
#, c-format
msgid "Failed to create file “%s”: %s"
msgstr "La création du fichier « %s » a échoué : %s"

Vous pouvez aussi indiquer une chaîne comme « à relire » en ajoutant le mot-clé « fuzzy » si vous pensez que votre traduction est ambiguë et que vous souhaitez que le relecteur y fasse particulièrement attention. Dans ce cas il peut être utile d'y joindre un commentaire. Une chaîne marquée « fuzzy » sera affichée en anglais lors de l'exécution du programme.

Dans certains cas, la chaîne originale précédente se trouve en commentaire à la suite de la ligne fuzzy :

#| msgid "Failed to load file “%s”"

Ceci permet de voir plus facilement ce qui a changé dans la chaîne originale. Cette partie doit également être supprimée après la mise à jour de la traduction.

Les chaînes à contexte

Dans certains cas, plutôt que d'ajouter un commentaire, les développeurs indiquent un contexte de traduction directement dans la chaîne à traduire. La chaîne se présente alors ainsi : « contexte|chaîne à traduire ». Il faut alors faire très attention ne pas traduire le contexte qui se trouve devant la barre verticale « | », mais uniquement la chaîne située après cette barre. Voici un exemple issu de la traduction de gnome-panel :

#: ../gnome-panel/panel-menu-items.c:598
msgid "Desktop Folder|Desktop"
msgstr "Bureau"

Progressivement, cette syntaxe est remplacée par une nouvelle possibilité de gettext, la ligne msgctxt :

#: ../gnome-panel/panel-menu-items.c:598
msgctxt "Desktop Folder"
msgid "Desktop"
msgstr "Bureau"

Les lettres raccourcis

On trouve fréquemment dans l'interface des programmes des lettres soulignées (dans les menus, les textes d'options, etc.) qui permettent d'utiliser une application avec le clavier au lieu de la souris. Dans les fichiers po (pour les programmes basés sur GTK en tout cas), ceci apparaît sous la forme d'un caractère soulignement avant la lettre qui apparaîtra soulignée dans l'interface. Par exemple :

msgid "_File"
msgstr "_Fichier"

Dans l'idéal, on choisit la première lettre. Mais le but est d'éviter au maximum deux fois la même lettre soulignée dans une même interface. Ce n'est pas toujours possible, mais la seule façon de s'en assurer, c'est de tester la traduction « pour de vrai ».

Voici les règles à respecter dans l'ordre de priorité :

  1. Respecter en priorité les règles d'uniformisation pour les menus

  2. Éviter deux mêmes lettres raccourcis dans une même interface
  3. Utiliser de préférence la première lettre d'un mot
  4. Éviter si possible de placer le raccourci sur les lettre « courtes » (i, j, l)

Note : l'utilisation de la même lettre que l'anglais n'apporte rien

Les crédits des traducteurs

Il existe dans certaines traductions une chaîne particulière « msgid "translator-credits" ». Cette chaîne ne doit pas être traduite mot à mot, mais doit contenir le nom des contributeurs à la traduction. Voici par exemple les crédits de gnome-panel :

#. Translator credits
#: ../applets/clock/clock.c:2813 ../applets/fish/fish.c:588
#: ../applets/notification_area/main.c:158
#: ../applets/wncklet/showdesktop.c:531 ../applets/wncklet/window-list.c:783
#: ../applets/wncklet/window-menu.c:75
#: ../applets/wncklet/workspace-switcher.c:555
#: ../gnome-panel/panel-context-menu.c:133
msgid "translator-credits"
msgstr ""
"Mainteneur :\n"
"Christophe Merlet (RedFox) <redfox@redfoxcenter.org>\n"
"\n"
"Contributeurs :\n"
"Christophe Fergeau <teuf@users.sourceforge.net>\n"
"Baptiste Mille-Mathias <bmm80@free.fr>\n"
"Benoît Dejean <benoit@placenet.org>\n"
"Robert-André Mauchin <zebob.m@gmail.com>\n"
"Damien Durand <splinux@fedoraproject.org>"

Si vous avez apportez une contribution à la traduction, vous devez vous ajouter à cette liste en prenant soin de séparer les contibuteurs par un saut de ligne « \n ».

Les outils d'édition des fichiers po

Il existe certains outils spécialisés dans l'édition de fichier po. Parmi eux nous citerons :

Ces logiciels ont des fonctions avancées, comme la mise à jour automatique de l'en-tête, la recherche à travers les chaînes traduites ou originales, un glossaire, la gestion automatique des « fuzzy », etc.

Mais dans la majorité des cas un simple éditeur de texte comme Emacs,Vim ou gedit sera largement suffisant.

Emacs dispose d'un mode PO très utile, qui permet de se déplacer aisément sur les chaînes et d'afficher la chaîne à traduire dans son contexte (code source). Pour plus d'informations, consultez http://www.gnu.org/software/gettext/manual/html_node/gettext_7.html#SEC7. Pour afficher les espaces insécables dans Emacs 21 (actif par défaut avec Emacs 22), vous pouvez ajouter ce code dans votre .emacs :

;; espace insécable mise en évidence
;; faire un customize de nsbp-face pour obtenir la couleur de son choix
(make-face 'nbsp-face)
(require 'disp-table)
(aset standard-display-table
      (make-char 'latin-iso8859-1 (- ?\240 128))
      (vector (+ ?\267 (* 524288 (face-id 'nbsp-face)))))

Vim dispose également d'un mode PO : http://www.vim.org/scripts/script.php?script_id=695