Internationalisation des thèmes::partie 2::un peu de théorie
20 septembre 2006 par Marc Charlet
Le but de ce second billet est de vous familiariser avec les concepts mis en oeuvre par gettext. Après la lecture de ce billet, vous serez à même de vous vous lancer dans un passage à la moulinette gettext de tous les fichiers source de votre thème1
description de la méthode utilisée
Wordpress utilise la méthode GNU/gettext pour produire ses versions localisées2. Cette technologie est largement utilisée dans le monde des logiciels libres.
Gettext travaille au niveau des messages, ce qui veut dire que chaque message est traduit dans la langue de l'utilisateur. Chaque message passe au travers de l'une des deux fonctions3 suivantes:
- __($message) est utilisé lorsque le message est passé à une fonction php4
- _e($message) est utilisé lorsque le message est directement affiché à l'écran5
Le message affiché sera le message traduit dans la langue de l'utilisateur. Si les fonctions gettext ne trouvent aucune traduction, le $message d'origine sera affiché.
Gettext travaille avec trois types de fichiers:
- des fichiers avec l'extension POT qui sont des compilations dans des fichiers au format texte de l'ensemble des messages passés en arguments aux fonctions __() et e().
- des fichiers avec l'extension PO qui sont les fichiers qui contiennent les messages d'origine et leur traduction dans la langue de l'utilisateur.
- des fichiers avec l'extension MO qui sont les compilations 'machine' des fichiers PO correspondants.
(i)si vous voulez visualiser ce que contiennent et à quoi ressemblent ces différents fichiers, vous pouvez télécharger les fichiers de mon thème MistyLookI et les ouvrir dans un éditeur texte (sauf le fichier MO bien entendu)
Un exemple concret d'introduction des fonctions gettext dans un fichier source est donné ci-dessous.
Comment générer le fichier POT à partir des fichiers sources transformés et comment à partir du fichier POT générer les fichiers de traduction PO et MO correspondants fera l'objet de l'un des billets suivants.
Exemple pratique de transformation de fichier source
Prenons comme exemple le fichier index.php de notre thème green bridge
-
<?php get_header();?>
-
<div id="content">
-
<div id="content-main">
-
<?php if (have_posts()) : ?>
-
-
<?php while (have_posts()) : the_post(); ?>
-
-
<div class="post" id="post-<?php the_ID(); ?>">
-
<div class="posttitle">
-
<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h2>
-
<p class="post-info"><?php the_time('F jS, Y') ?> by <?php the_author_posts_link() ?> </p>
-
</div>
-
-
<div class="entry">
-
<?php the_content('Continue Reading »'); ?>
-
</div>
-
-
<p class="postmetadata">Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?> <?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?></p>
-
<?php comments_template(); ?>
-
</div>
-
-
<?php endwhile; ?>
-
-
<p align="center"><?php posts_nav_link(' - ','« Prev','Next »') ?></p>
-
-
<?php else : ?>
-
-
<h2 class="center">Not Found</h2>
-
<p class="center">Sorry, but you are looking for something that isn't here.</p>
-
<?php endif; ?>
-
</div><!-- end id:content-main -->
-
<?php get_sidebar();?>
-
<?php get_footer();?>
A la ligne 15:
-
<?php the_content('Continue Reading »'); ?>
le message 'Continue Reading »' est passé à la fonction the_content()
et à la ligne 28
-
<h2 class="center">Not Found</h2>
le message Not Found est directement affiché à l'écran
la ligne 15 transformée pour être compatible avec gettext devient donc6:
-
<?php the_content(__('Continue Reading »')); ?>
le message 'Continue Reading »' est d'abord passé au travers de la fonction __() dont le résultat est passé ensuite à la fonction the_content().
et la ligne 28 devient7
-
<h2 class="center"><?php _e('Not Found'); ?></h2>
Le message 'Not Found' est passé à la fonction _e() dont le résultat est l'affichage direct après traduction comme dans un classique:
la suite: travailler les sources pour les rendre compatibles gettext
- ceci est, bien évidemment, l'objet du prochain billet [retour]
- c'est à dire affichant les messages dans la langue du site [retour]
- ces fonctions sont définies dans le fichier wp-includes/wp-l10n.php [retour]
- comme par exemple la fonction the_content(), posts_nav_link() ou encore the_time() [retour]
- comme dans une fonction [echo] par exemple [retour]
- attention: ceci est une transformation minimale 'par défaut'. Il faudra, en réalité, lui rajouter au moins un paramètre (le $textdomain) mais ceci c'est pour plus tard... [retour]
- même remarque que pour la fonction __(), il manque le $textdomain [retour]
Tags: gettext, guide-débutant, mo, po, pot, thème, Traductions, utilitaire, Web, Wordpress
2 réponses à “Internationalisation des thèmes::partie 2::un peu de théorie”

Pour être précis, WordPress n’utilise pas les librairies GNU/gettext et PHP ne doit pas être “compilé” avec l’option gettext. WordPress utilise une classe PHP-gettext qui est compatible et simule partiellement le comportement de GNU/gettext. La librairie est dans wp-include/gettext.php.
/p
PS: Merci pour cette collection d’articles clairs qui inviteront, je l’espère, les utilisateurs à développer systématiquement des interfaces multilingues. C’est un problème récurrent auquel, nous les non-anglosaxons, sommes sensibles. Mais peu d’anglosaxon se soucient de réaliser directement des interfaces multilingues.
Merci pour la précision et pour l’appréciation.
J’ai effectivement écrit cette série d’articles avec l’espoir qu’elle donnera aux utilisateurs le goût du travail multilingue structuré et qu’elle les aidera à éviter l’écueil, trop souvent rencontré, de la traduction ‘franco-française’.
Pour terminer sur une note optimiste, je suis ravi de constater que de plus en plus de thèmes et de plugins, au comportement à priori anglosaxon unilingue, sont en fait déjà écrits avec de nombreuses parties compatibles multilingue, principalement des appels aux fonctions _e()…