Nous avons créé un plugin avec diverses fonctions dans cette série d’articles intitulée . Nous allons maintenant réaliser la sixième étape : l’internationalisation du plugin (rendre possible les traductions sans aller dans le code).

Bonn - EU flagQue voulons-nous faire ?

Je veux que si un non francophone utilisait cette extension, il puisse facilement traduire tout ce qui s’affiche, soit du côté de l’internaute, soit du côté de l’éditeur. Il est très improbable que cette fonctionnalité soit utilisée pour cette extension “d’apprentissage personnel”. Mais si un jour je veux faire une extension (ou un thème) pour d’autres, c’est essentiel de permettre la traduction (voire la modification dans la même langue) de certains textes. Il est inacceptable de devoir entrer dans le code puisqu’alors toute mise à jour annule notre travail.

Je ne sais pas comment on fait,  je vais apprendre à le faire en écrivant cet article.

Internationalisation, les principes

L’idée générale, c’est que les développeurs devraient envelopper les textes à traduire dans des fonctions spéciales puis WordPress s’occupe de tout pour que ces textes soient placés dans des fichiers POT (Portable Objects Template) que des volontaires pourront traduire. Ainsi, WordPress sait que mon installation est en français. Si des fichiers POT fr-FR existent, ce sont eux qui seront utilisés pour générer les textes.

“Internationalization is the process of developing your plugin so it can easily be translated into other languages. Localization describes the subsequent process of translating an internationalized plugin.Internationalization is often abbreviated as i18n (because there are 18 letters between the i and the n) and localization is abbreviated as l10n (because there are 10 letters between the l and the n.)” –  WordPress Codex

La notion de text domain

Ce ‘text domain’ définit tout le texte qui appartient au plugin. Ce ‘text domain’ doit-être le ‘slug’ du plugin.

Dans mon cas, le répertoire du plugin s’intitule ‘ald-functions-knowledge-PP’. Si je comprends bien, c’est le ‘slug’ de mon plugin. Mais c’est long… Le text domain doit utiliser des tirets, pas des _. Ce nom doit être unique, pour que WordPress ne se retrouve pas avec deux text domains dans une même installation.

Le ‘text domain’ devrait être indiqué en haut du plugin. J’essaie d’utiliser le ‘slug’ mais raccourci. Le domain path, est le sous-répertoire dans lequel on trouvera les fichiers de traduction. Voici à quoi ça ressemble :

/*
* Plugin Name: ALD fonctions pour wp-knowledge-base
* Text Domain: ald-functions-kn
* Domain Path: /languages
*/

 comment rendre une chaine de caractères traduisible ?

La fonction de base est  __()  : elle traduit la chaîne de caractère et la renvoie. On trouve également _e() , qui fait la même chose mais la renvoie dans echo (l’affiche à l’écran). Et esc_attr_e()  passe la chaine dans __(), puis fait esc_attr() dessus avant de l’afficher avec echo.

Les contraintes du code php quand on internationalise

Pour en savoir plus, se référer à mes sources : Internationalization: You’re probably doing it wrong et le Codex WordPress. Il y a beaucoup de subtilités dans lesquelles je ne veux pas entrer pour ce premier essai. Mais il est essentiel de savoir que ça peut être très très compliqué. Certains langages ont par exemple plusieurs pluriels, et on doit donc prévoir “singulier”, “pluriel” et “compte” afin de définir la forme du pluriel selon le nombre qui précède. Le code suivant, qui utilise sprintf est la bonne manière de prévoir la traduction d’une phrase dans laquelle un mot peut avoir des pluriels. La phrase est toute entière contenue dans une chaine de caractères, ce qui permet des traductions dans toutes les langues, même celles qui placent le complément d’objet en début de phrase et le verbe en dernier.

$string = sprintf( _n('You have %d taco.', 'You have %d tacos.', $number, 'plugin-domain'), $number );

sprintf( __( 'Your city is %s.', 'espw-plugin' ), $city );

Les formes suivantes permettent de générer des traductions lorsqu’il n’y a pas à compter pour faire des pluriels

// la variable $hello peut être traduite
$hello = __( 'Bonjour cher utilisateur !', 'my-text-domain' ); 

// La chaine sera "echo" au navigateur 
_e( 'Votre pub ici', 'my-text-domain' ) ;

// évite que le code HTML soit dans la chaine à traduire
echo '<h2>' . __( 'Blog Options', 'my-text-domain' ) . '</h2>'; 

// va "echo" la chaine de caractères
echo __( 'Using this option you will make a fortune!', 'my-text-domain' );
// ou plus court
_e( 'Using this option you will make a fortune!', 'my-text-domain' );

Enfin, il peut arriver que des commentaires soient nécessaires pour indiquer le contexte d’une traduction. Imaginez par exemple qu’on vous demande de traduire le mot “port” dans une autre langue : s’agit-il d’un port pour bateaux, d’un port d’ordinateur, d’un port de charge, … ? On utilisera alors __x et -ex, similaires à __ et à _e, mais avec une variable supplémentaire, le contexte :

_x( 'port', 'pour les bateaux', 'my-text-domain' );
_x( 'port', 'sur un ordinateur', 'my-text-domain' );
_ex( 'port', 'sur un ordinateur', 'my-text-domain' );

Passons à la pratique !

Comment est-ce que je saurai si ça fonctionne ?

Je vais créer un modèle de page dans lequel j’insèrerai des boutons dont le contenu pourra être traduit ou non.

Ensuite, je vais modifier mon plugin pour qu’il soit “internationalisé” puis je vérifierai que des fichiers POT sont générés et contiennent bien les textes que je souhaitais. On apprends en faisant !

Création du modèle

Je l’appelle testAL-page.php. Il contient :

<?php
/**
* Template Name: test template for internationalisation.
*
* @link http://parcours-performance.com/anne-laure-delpech/#ald
* @since 1.1.1
*
* @package ald-functions
* @subpackage ald-functions/includes
*/

get_header(); ?>

<div id="primary" class="content-area col-md-8">
<main id="main" class="site-main" role="main">
<?php 
$texte1 = '<a href = "">' . __( 'ici', 'ald-functions-knowledge' ) . '</a>' ;
printf( __( 'Ceci est un test pour le plugin décrit %s', 'ald-functions-knowledge' ), $texte1 ) ; 
?>
<hr />
<a href='#' class='button'><?php _ex( 'port', 'sur un ordinateur', 'ald-functions-knowledge' ); ?></a>
<hr />
<a href='#' class='button'><?php _e( 'bouton 2', 'ald-functions-knowledge' ) ; ?></a>
<hr />
<?php echo "<a href='#' class='button'>" . __( 'Bouton 3', 'ald-functions-knowledge' ) . "</a>" ; ?>
<hr />
</main><!-- #main -->
</div><!-- #primary -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

Evidemment, il ne peut pas fonctionner (être visible lorsque je crée une nouvelle page) si je ne crées pas une nouvelle fonction pour ça dans mon plugin. Je la crée, mais ce sera l’objet du prochain article de cette série .

La page “https://knowledge.parcours-performance.com/test-internationalisation/” est créée avec ce template.

Générer un fichier de traduction

On utilisera Poedit, logiciel gratuit et omniprésent pour les traductions de plugins ou thèmes.

On télécharge Poedit ici puis on suit ce bon tutoriel (écrit par un français, mais il est en anglais ! ). Malheureusement poedit a été modifié depuis tous les tutoriels que j’ai trouvé. Je n’arrive donc pas à générer un fichier .pot sans indiquer la langue.

Néanmoins l’expérience valide que l’internationalisation est bien réalisée car tous les mots affichés sur la page https://knowledge.parcours-performance.com/test-internationalisation/ sont bien identifiés pour être traduits.

poedit les mots à traduire               poeedit chemin

Vous pouvez voir le contenu complet de cette extension telle qu’elle est à la fin de cet article ici, sur github.

Mise à jour du 3/10/2015 : J’explique dans un autre article comment créer un fichier d’internationalisation (pot) avec poedit (version pro dont j’ai acheté la licence).

Conclusion :

Notre plugin peut maintenant être traduit dans d’autres langues. Le prochain article de cette série  concernera le chargement de ‘templates’ (modèles) spécifiques au plugin.

0 0 voter
Évaluation de l'article
0
Would love your thoughts, please comment.x
()
x