Localisation de subscribe-to-comments (Jack)

Suite aux difficultés que Lise à rencontrées pour que s’affiche en français le plugin subscribe-to-comments, je me suis plongé dans le code dudit plugin, ce qui m’a amené à comprendre le mécanisme utilisé par WordPress pour l’internationalisation des fichiers.

Subscribe-to-comments

Il existe déjà de nombreuses ressources en ligne sur les problèmes de localisation des fichiers WordPress. Je vous invite à vous reporter à deux articles pour bien comprendre la problématique abordée ici :

  1. Explications générales et utilisation de poedit
  2. Utiliser les fichiers .pot, .po, .mo

La mécanique de WordPress pour la localisation

Si un plugin doit être localisé (c’est le cas de Subscribe-to-comments), il devra comporter un fichier .mo contenant les traductions des chaînes de caractères. On le trouve en général à 3 endroits :

  1. à la racine du répertoire plugins/
  2. dans le répertoire au nom du plugin subscribe-to-comments/ (usage préconisé pour WordPress)
  3. dans un répertoire nommé lang/, langs/ ou languages/ et situé dans le répertoire du plugin.

Dans chaque fichier de plugin destiné à être internationalisé de cette manière, il faut invoquer la fonction load_plugin_textdomain pour appeler le fichier .mo

Localisation de subscribe-to-comments

Dans subscribe-to-comments (ligne 806 chez moi) voici cette instruction :

load_plugin_textdomain('subscribe-to-comments');

La fonction load_plugin_textdomain est définie dans le fichier wp-includes/l10n.php

function load_plugin_textdomain($domain, $path = false) {
  $locale = get_locale(); // <em>on récupère la valeur de WPLANG définie dans wp-config</em>
  if ( empty($locale) ) // <em>si elle est vide</em>
    $locale = 'en_US'; // <em>anglais par défaut</em>
    if ( false === $path ) // <em>si aucun chemin n'a été spécifié</em>
      $path = PLUGINDIR; // <em>on définit $path sur la racine du répertoire plugins</em>
  $mofile = ABSPATH . "$path/$domain-$locale.mo"; // <em>emplacement du fichier de langue</em>
 
  load_textdomain($domain, $mofile);
}

Si on laisse cette fonction en l’état, le fichier de langue subscribe-to-comments-fr_FR.mo devra être téléchargé à la racine du répertoire plugins, c’est-à-dire wordpress/wp-content/plugins/

Si on veut qu’il soit dans un autre répertoire, alors il faut utiliser le deuxième paramètre de la fonction load_plugin_textdomain : $path

exemple

load_plugin_textdomain(‘subscribe-to-comments’,’wp-content/plugins/subscribe-to-comments/’);

Là, WordPress va chercher le fichier de langue dans le répertoire de notre plugin.

Note : attention aux mises à jours futures de ce plugin… En effet, il faudra refaire la manipulation pour chaque mise à jour.

Normalisation de développement des plugins

Vous pouvez avec ce mécanisme, très simplement placer vos fichiers de traduction où vous le souhaitez mais il me semble qu’on gagnerait en efficacité en normalisant l’arborescence des plugins, par exemple en créant systématiquement pour chaque plugin un répertoire du nom de ce plugin avec un répertoire lang/ à l’intérieur duquel on met tous les fichiers de langue .mo. Il suffirait alors de modifier la fonction load_plugin_textdomain dans l10n.php

function load_plugin_textdomain($domain, $path = false) {    
 
  $locale = get_locale();
  if ( empty($locale) ) $locale = 'en_US';
  if ( false === $path ) $path = PLUGINDIR;    
 
  $mofile = ABSPATH . "$path/$domain/lang/$domain-$locale.mo"; // <em>les fichiers de langue sont dans le répertoire lang/ de chaque plugin.</em>
 
  load_textdomain($domain, $mofile);
}

Note : ces remarques s’appliquent aussi aux feuilles de style ou aux fonctions javascript dont les appels et les définitions devraient être mieux normalisés, j’ai remarqué que trop de plugins pour WordPress nous obligent à définir des styles dans la css de notre thème (subscribe-to-comments par exemple)… A moins d’utiliser un thème qui comme celui de ce blog « supporte » ce plugin !

Les domaines de traduction de WordPress

Si parfois, en traduisant certaines chaînes de caractères, vous avez l’impression que celles-ci ne sont pas traduites, c’est sûrement que le domaine de traduction aura été mal défini.

Je m’explique 😉

Dans le fichier subscribe-to-comments, on a

_e('Back to regular view');

(chez moi ligne 1068).

La fonction _e (définie aussi dans l10n.php) affiche une chaîne passée en paramètre. Cette fonction attend 2 paramètres :

  1. $text = « Back to regular view »
  2. $domain = ‘default’ (par défaut)
// <em>Echo a translated string.</em>
function _e($text, $domain = 'default') {    
 
  echo translate($text, $domain);    
 
}

Si le « domaine » ($domain) n’est pas défini, alors le programme va chercher la traduction dans le fichier de langue général pour votre blog dans

wp-includes/languages/fr_FR.mo

Si ce paramètre est défini sur le domaine du plugin, alors il va chercher le fichier de traduction dans le répertoire de ce plugin.

Donc, s’il s’agit d’une traduction spécifique à ce plugin, il faut définir le domaine :

_e('Back to regular view', 'subscribe-to-comments');

Sinon, s’il s’agit d’une traduction récurrente, il y a de fortes chances à parier qu’elle est déjà définie dans le fichier général et donc vous n’avez pas besoin de définir son domaine :

_e('Back to regular view');

Voilà, vous savez tout maintenant de ce mécanisme ingénieux et vous serez à même de corriger tous les problèmes liés à la traduction de plugins 😉

 


Ecrit par jack - Site
musicien et enseignant multimédia

35 commentaires pour “Localisation de subscribe-to-comments (Jack)

  1. Qu’est-ce qui est anglais ? la page d’admin du plugin ou les messages reçus par les commentateurs ?
    Si ce sont les messages, il faut les personnaliser dans l’interface d’admin.

  2. Bonsoir,

    J’ ai bien mis le fichier subscribe-to-comments-fr_FR.mo est placé dans le répertoire wp-content/plugins mais c’est toujours en anglais …

    la version du composant=Version 2.1.2
    la version de WP =Version 2.8.4

    J’utilise le plugin localisation je sais pas si ça peut causer un conflit…

    mais dans l’admin c’est en français

  3. Curieux ! Sur ce blog,
    le répertoire subscribe-to-comments est placé dans répertoire wp-content/plugins,
    le fichier subscribe-to-comments-fr_FR.mo est placé dans le répertoire wp-content/plugins et la traduction est effective.

    • En fait, il y a une configuration où je suis passé à travers :
      /wp-admin/options-general.php?page=stc-options
      C’est là où on rentre les phrases traduites et non dans le fichier .po ou .mo

  4. Bonsoir,
    Il semble qu’il y ait quelques changements avec la v2.7 de wordpress.
    J’ai mis les fichiers à la racines des plugins et partout où je pouvais mais rien n’y fait…

  5. Bon j’ai trouver, betement en plus!!!

    il s’avere que dans la page admin du plugin, les texte personalise son « prioritaire » alors que je n’ai pas cocher la case « Personnaliser le style des messages »

    donc j’ai directement personnaliser mes messages et bien sur je les ait en francais.

    par contre, je ne sait pas pourquoi il y a ce « bug » mais bon ca marche

    Merci a tous!

  6. et dans le load_plugins_textdomain tu a mis le meme chemin?

    je v essayer et je vous tiendrait au courant

    merci de votre aide!

  7. pas facile de débuguer à distance mais voici le chemin de mon fichier .mo wp-content/plugins/subscribe-to-comments/lang/subscribe-to-comments-fr_FR.mo
    En espérant que ça puisse t’aider

  8. bon après moult essai de mettre la traduction française, je demande votre aide!
    j’ai wp 2.6.2, et subscribe to comment 2.1.2

    alors j’ai mis le .mo dans /plugins/ dans /subscribe-to-comments/ j’ai modifier le .php pour « aranger » le load_plugins_textdomain, mais rien n’y fait

    et je pige pas vraiment ce que je peut faire d’autre alors si vous avez une idée , aidez moi ça sera sympa

    Merci

  9. Comme je viens de l’écrire dans le dernier billet, il n’y a pas besoin de modifier le fichier source, mais seulement les fichiers de traduction avec PoEdit, qui avaient été mal compilés.
    Concernant les chaînes non traduites, elles concernent vraisemblablement toutes les traductions.

  10. Si je peux être plus clair, je cherchais à modifier les fichiers sources du plugin afin que PoEdit puisse récupérer les parties à traduire. C’est ce que je vais faire et je vais aussi contacter l’auteur de Statpress pour lui faire par de mon travail et qu’il puisse conserver le fichier de localisation ^^. Voilà

    Bonne journée
    Chacha

  11. Sans doute la fatigue aussi, mais je ne comprends toujours pas 😉
    Le fichier de traduction est déjà fourni avec le plugin. Si j’ai bien compris, ce qu’il fallait modifier, c’était l’appel de la fonction de traduction.
    Ne crois-tu pas qu’il faudrait contacter l’auteur du plugin, pour qu’on dispose d’une version unique du plugin et d’une version unique de la traduction ? Sinon, cela va être ingérable.
    Ou suis-je vraiment encore une fois à côte de la plaque ? 😉

  12. Autant pour moi, j’avais oublié de virer les apostrophes… Je suis confus, la fatigue sans doute des travaux manuels de la journée 😉

    Merci et excusez-moi pour mon manque de rigueur. Et surtout, un grand merci à vous. Je compte vous fournir la dernière version de Statpress avec toutes les localisations et aussi, la traduction qui viendra avec 😉

  13. Merci pour vos réponses rapides et claires ^^. J’ai donc essayer ce que Heirem m’a conseillé de faire mais malheureusement, cela ne fonctionne toujours pas lorsque je cherche à rapatrier les nouvelles chaînes Je vais donc m’en tenir là car je n’ai plus le temps nécessaire pour chercher encore. Si je trouve un moyen de le faire, je vous ferai signe.
    Merci encore !

  14. effectivement Heirem, tu as raison.
    Pour être complet (hum…) sur le sujet, la fonction _e() correspond à echo en php et provoque un affichage de la chaîne passée en paramètre tandis que la fonction __() retourne la chaîne traduite. Donc la fonction __() est nécessaire dans le cas de Chacha puisqu »il s’agit de passer une chaine traduite en paramètre à une fonction.
    Jusqu’à preuve du contraire 😉

  15. Bonjour Lise, et Bonjour Chacha,

    Si je puis me permettre d’intervenir … vu que je crois comprendre le problème de Chacha.

    D’une façon générale, sans rentrer dans les détails techniques, en matière de localisation (et non de traduction), quand la fonction WordPress _e(‘à traduire », »textdomain »)) ne fonctionne pas, il faut essayer __(‘à traduire », »textdomain »). Donc remplacer le « _e » par :

    « __ » (deux caractères soulignés).

    Ce qui devrait peut-être donner :

    iriValueTable(”date”,__(”Top days”, »statpress »),5);

    En espérant que cela puisse vous aider ….
    Heirem

  16. Je ne suis pas sûre d’avoir bien compris la question !
    Pour traduire un plugin, il faut utiliser PoEdit, pas besoin de se lancer dans le PHP !
    La question avec StatPress, c’est que vraisemblablement la fonction de traduction n’est pas appelée au bon endroit, ce qui est un peu le même problème qu’avec Subscribe to comments.

    Là, peut-être que Jack peut apporter une solution 😉

  17. Bonsoir à vous deux, Lise et Jack.

    Bravo d’abord pour ce blog, riche en enseignement, tant sur WordPress que sur le reste.

    Je viens vous demander, si ce n’est pas déplacé, si vous pourriez me dire s’il existe un moyen d’ajouter la fonction « _e » dans une autre fonction php. Je me suis arrêté en fait à la présentation du plugin Statpress que vous avez présenté et le commentaire que vous avez fait, soulignant la traduction partielle de l’extension. Je me suis donc dit, pourquoi pas le faire, quitte à se casser la tête ^^ ? Mais, ça fait un petit bout de temps que je cherche le moyen de faire ceci, et rien à faire ! Mes connaissances en php étant très limitée, je cherche un petit coup de pouce auprès de vous. Si je n’ai pas été clair, voici ce qui me fait buter:

    iriValueTable(« date », »Top days »,5);

    Voilà, c’est juste le Top days que je dois réussir à traduire, ensuite le reste se fera mécaniquement…
    Merci d’avance !
    Chacha

  18. Et en plus je le savais ! J’ai honte là …

    Faut pas 😉 on en est tous là 😉 comme des accolades, guillemets ou parenthèses non fermés !

    Et j’ai encore plus honte ! Il me suffisait d’aller voir plus en détail les options.

    Ne t’inquiète pas, tu n’es pas le seul 😉

    Merci encore

    De rien 😉

  19. Bon j’ai trouvé !
    Et j’ai encore plus honte ! 😳
    Il me suffisait d’aller voir plus en détail les options.
    Je pensais benoitement que le message entré en anglais dans « Personnaliser les messages pour les utilisateurs » allait être également traduit.

    Je crois qu’un peu de repos me serait nécessaire là …
    Merci encore 😉
    Heirem

  20. Et en plus je le savais !
    J’ai honte là … 😳

    Merci Lise je vais voir cela !
    Heirem

    ps : Oui, certains d’entre nous veillent tard le soir devant un ordi 😉

  21. Impossible d’accéder à la page id=356 / “Traduction d’un plugin pour WordPress” !
    Un petit problème de permaliens peut-être ?

    Oui, merci de me l’avoir signalé. Malgré ma vigilance 😉 une apostrophe avait été mal « traduite ».

    Je voulais te signaler que malgré mes nombreux essais il m’était toujours impossible de mettre en œuvre la traduction de Subscribe-to-comments. En plaçant le .po dans wp-content/ plugins ou pas.
    Jack a une idée ?

    Jack, je ne sais pas, mais moi, oui 😉
    Ce n’est pas le .po qui effectue la traduction, mais le fichier compilé .mo. C’est celui-ci que tu as placé dans wp-content/plugins ?

  22. pourquoi les auteurs de ces plugins n’ont pas été mis au courant de ces localisations ?

    Ils l’ont été mais ne nous ont pas répondu 😉

  23. Bonsoir Lise, Bonsoir Jack,

    Au delà de Subscribe-to-comments je viens de découvrir ton blog et tout le travail de localisation qui y est mis à disposition. Bravo et merci.

    Alors que j’étais moi même en train de plancher sur la localisation de Subscribe-to-comments, pour laquelle je rencontre des problèmes que tu n’évoque d’ailleurs pas, c’est en cherchant de l’aide que je suis arrivé chez toi.

    J’ai également trouvé celle d’Events-Calendar, dans une version ancienne et modifiée. C’est un plugin que j’ai moi-même localisé dernièrement. En fait, c’est mon premier travail de codage sous WordPress 😉 Alors je me suis demandé : pourquoi les auteurs de ces plugins n’ont pas été mis au courant de ces localisations ? Ce qui aurait été plus dans l’esprit de la blogosphère WordPress et surtout bien plus pratique pour tout le monde. Y compris ceux qui ne lisent pas notre langue. Lorsque j’ai proposé à Luke Howell mon travail sur son plugin j’ai été accueilli avec enthousiasme et cela à profité bien au delà de la communauté française. Tellement que … enfin je t’invite à jeter un œil sur mon jeune blog 😉

    Je viens de passer une petite journée rien que pour générer le fichier subscribe-to-comments-fr_FR.po. Parce que sur le répertoire des plugins WordPress rien n’indiquait qu’il existe déjà. Ni sur le site de son auteur, bien qu’il précise que la localisation ait été prévue. Oui je suis un peu naïf, et j’aurais dû un peu plus Googoliser ! Mais tout de même : Pourquoi ce clivage des langues et cette non mise en commun des travaux ?

    Pour l’heure, je vais télécharger la version de Subscribe-to-comments que tu proposes et l’analyser afin de comprendre mon problème. A savoir que, une fois quelques corrections de codes effectuées, la traduction s’effectue correctement dans la partie administration mais pas du tout dans le formulaire des commentaires (à coté de la case à cocher). C’est ballot n’est ce pas ?

    Amicalement
    Heirem

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Laisser ces deux champs tels quels :

Protégé par Invisible Defender. 317 892 spammeurs ont vu s'afficher une page d'erreur 403.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.