Fichiers de langues - Structure, compilation, référence.
Structure
Comme je l'ai brièvement déjà abordé au premier chapitre, le fichier de langues est très simplement composé de paires identifiant/traduction. L'identifiant est une chaine de caractères comprise entre des guillements ", précédée par le mot clé "msgid". De même, une traduction est une chaine de caractères comprise entre des guillemets ", précédée du mot clé "msgstr". Une paire identifiant/traduction sera par exemple:
msgid "Bienvenue sur ma page personnelle !" msgstr "Welcome on my Homepage !"
Afin de faciliter la relecture, msgid et msgstr peuvent être définies sur plusieurs lignes. Dans ce cas, il faut indiquer que le message se fera sur plusieurs lignes en mettant la première chaîne à "". On aura donc:
msgid "" "Voici un message un peu plus long" " qui tient sur plusieurs lignes" msgstr "" "Here is a longer message" " in several lines"
Quelques astuces au passage:
- Il est courant d'oublier des espaces entre les mots lorsque les chaines sont sur plusieurs lignes. Faites attention à ce niveau.
- Si votre identifiant/traduction doit contenir un ", vous devez le précéder d'un \.
Voici par exemple le fichier de langue utilisé sur docs.eu.org.
Ce fichier de langue devra avoir pour nom le nom que vous aurez spécifié lors de l'appel à bindtextdomain, et avoir pour extension ".po". Il devra se trouver dans le répertoire /chemindevotredomaine/locale/fr_FR/LC_MESSAGES/.
Compilation
Avant de pouvoir être utilisé, le fichier de langue (.po) doit être compilé (en .mo), pour des raisons de performances avant tout. Pour cela, il y a le programme "msgfmt", Pour connaitre son utilisation, je vous conseille d'aller lire sa page de manuel. Cela donne par exemple:
msgfmt -o /domainedir/lang/locale/fr_FR/LC_MESSAGES/messages.mo /domainedir/lang/locale/fr_FR/LC_MESSAGES/messages.po
Ce qui vous donnera un fichier messages.mo dans le meme répertoire que le fichier de langue. Maintenant que nous avons notre fichier compilé, que nous avons spécifié quelle langue nous voulions utiliser (III/3), il ne nous reste plus qu'a faire référence aux identifiants de ce fichier de langue, qui sera remplacée par la traduction prise dans le fichier sélectionné.
NB: Dans 95% des cas, vous n'aurez pas les droits nécessaires pour exécuter un programme sur votre hébergeur. Vous devrez donc appeler les programmes en local, et uploader ensuite le résultat.
Référence
Et pour cela, rien de plus simple. Nous avons précisé auparavant que nous voulions utiliser le fichier /domainedir/lang/locale/fr_FR/LC_MESSAGES/messages.mo comme fichier de langue. Pour faire référence à la traduction correspondant à l'identifiant "Identifiant de chaine", il suffit de faire:
echo gettext("Identifiant de chaine");
Ou encore plus simplement, en utiliser le raccourci _():
echo _("Identifiant de chaine");
ou bien:
print _("Identifiant de chaine");
On aura dans notre fichier de langue:
msgid "Identifiant de chaine" msgstr "Traduction pour cet identifiant"
En bref: echo _("Identifiant de chaine"); affichera "Traduction pour cet identifiant". Maintenant, la question est: que mettre comme identifiant? De nombreuses personnes, dont je fais partie, mettent kom identifiant la totalité du texte en anglais. Ainsi, si par malheur gettext ne fonctionnait pas dû à une panne quelconque, le texte en anglais s'afficherait quand même. Mais cela a également des inconvénients; si par exemple une faute de frappe se glissait dans un de vos identifiants, vous êtes bon pour aller modifier cet identifiant dans tous vos fichiers de langue. Vous pouvez choisir de mettre comme identifiant id1, id2 etc, mais dans ce cas, en cas de panne de gettext tout votre site web est complètement inaccessible. Et de plus, il faudra ke vous fournissiez un fichier de langue d'exemple à vos traducteurs, car il est plus simple de traduire "un identifiant de titre" que "id1" :). A vous donc de faire votre choix de ce côté la.
Génération rapide de fichiers de langues
Il serait hélas bien ennuyeux de devoir rajouter manuellement à chaque
fois que l'on rajoute du texte à traduire dans une de nos pages web de
devoir le rajouter manuellement dans chaque fichier de langue. Pour cela,
GNU a prévu un programme qui va nous générer notre fichier de langue tout
seul. Il s'agit du programme xgettext dont voici la page de manuel.
En voici une utilisation basique:
xgettext -f ./filestotranslate.txt --default-domain=messages --c++ --sort-by-file --output=/domainedir/lang/locale/fr_FR/LC_MESSAGES/messages.po -k_
L'option --join-existing de rajouter les identifiants non encore présent au fichier de langue sans effacer vos précédentes modifications (traductions, commentaires). Le fichier filestotranslate.txt contient la liste des fichiers ou rechercher des identifiants.