Astuce WordPress : conserver la traduction de son thème lors d'une mise à jour

Les traductions sont stockées dans les fichiers .po (version utilisateur) et .mo (machine).

Quand on traduit un thème, malheureusement, lors d'une mise à jour, WordPress supprime le dossier du thème et recharge la totalité du dossier de la nouvelle version. Et notre belle traduction est perdue...

Il existe une astuce, qui permet de la conserver, c'est de la stocker dans le dossier /​wp-​​content/​languages/​themes

Il faudra aussi changer le nom du fichier : au lieu de le laisser sous la forme fr_FR.po /​ fr_FR.mo il faut lui ajouter le nom du thème, ou plus exactement le "textdomain".

Etape 1 : identifier le textdomain

Il est chargé dans le fichier functions.php du thème.

Il suffit de localiser la fonction load_​theme_​textdomain et de prendre le premier paramètre.

Ainsi, dans Magnificent, le thème d'Elegant Theme dont la mise à jour m'a forcée à trouver cette astuce, on a dans le fichier functions.php l'instruction suivante :

load_theme_textdomain('Magnificent',$template_dir.'/lang');

Le textdomain est donc "Magnificent" (avec la majuscule)

Etape 2 : renommer les fichiers de traduction

J'ai pris les fichier fr_FR.po et .mo que j'avais enregistrés dans le dossier du thème, et je les renomme respectivement

Magnificent-fr_FR.po et Magnificent-fr_FR.po

A cet instant, le thème n'est plus traduit. Quand ils sont stockés dans le dossier du thème, les fichiers de traduction ne doivent avoir que l'identifiant de la langue comme nom.

Etape 3 : les déplacer dans le dossier commun des traductions des thèmes

Aussitôt déplacés via FTP dans ce dossier, le thème est à nouveau traduit ! Et le gros avantage, c'est que ces fichiers là ne sont pas touchés lors d'une mise à jour du thème : la traduction ne disparait pas.

Screenshot de l'espace ftp d'un site wordpress

En stockant les fichiers dans le dossier global dans wp-​​content, les traductions sont conservées

Attention : cette astuce ne marche pas quand le thème est traduit et que vous modifiez la traduction ! Car les fichiers stockés dans le dossier du thème sont prioritaires.

Dans ce cas, il y a deux méthodes :

  • la plus simple, si il s'agit juste de la traduction : stocker les fichiers sur le PC et les uploader à nouveau lors de chaque mise à jour
  • un peu plus compliquée, si vous avez un thème enfant : les traductions sont chargées via une action, il faut donc utiliser dans le thème enfant remove_​action , puis faire une nouvelle action, avec le chargement du textdomain qui pointe vers un autre répertoire. Dans ce cas, je recommande de faire deux répertoires dans le thème enfant, un /​lang/​domainparent et un /​lang pour stocker les chaines spécifiques au thème enfant.

(Je n'ai pas testé, mais je pense que cela doit marcher aussi pour les plugins, avec un dossier wp-​​content/​languages/​plugins )

Parcourir la sériePrécédent article

20 commentaires

  1. Merci pour cet article extrêmement utile.
    C'est vraiment une très bonne idée d'avoir traité cette question, ce qui évitera à de nombreux webmasters de perdre de longues heures à retricoter une traduction de leur thèmes.

    Répondre à Gilles C.
  2. Il faudrait vraiment une solution native et imposer la possibilité de traduction sur tous les thèmes validés sur le site officiel.

    Répondre à Audiofeeline
  3. Hello,
    Excellente solution que je vais m'empresser de tester pas plus tard que dès que ça sera possible ;-)

    Le problème se posant aussi pour les traductions d'extensions, j'utilise pour ma part un "mix" entre la solution la plus simple et celle décrite ici, c'est à dire que je dépose dans /​wp-​​content/​languages une copie des fichiers de traductions (après les avoir renommé pour savoir ce qu'ils traduisent).
    Résultat : quand je mets à jour un thème ou une extension il ne me reste plus qu'à redéplacer la traduction dans son répertoire d'origine, cette solution a l'avantage d'avoir accès aux trads de n'importe quel poste de travail et pas seulement de celui où sont stockées les trads :)

    La bise,
    Didier.

    Répondre à Wolforg
  4. SunnaComparateurPrix Auteur mars 29, 2014 (4:36 )

    Moi qui comptais sur une traduction à moyen terme, je vais être sur mes gardes ! Merci beaucoup du partage. Les mises à jour, c'est souvent une cause de dérèglements de nombreux sites !

    Répondre à SunnaComparateurPrix
  5. Bonjour, Très intéressante l'astuce. Mais est-​​ce évident pour les débutants? moi ce que je vais toujours pour ne pas perdre mes traductions c'est de toujours utiliser un thème enfant et effectuer mes traductions dessus. Je ne traduit que les fichiers nécessiteux.

    Répondre à Brice Emry
  6. Bonjour,

    La préservation de la localisation ne pourrait-​​elle pas se faire plus simplement, par la mise en place d'un thème enfant ?

    Répondre à Mélodie
  7. Brice Emry,
    J'ai lu trop vite… mes excuses.

    Répondre à Mélodie
  8. Personnellement, je pense que faire un thème enfant "juste" pour la traduction est trop lourd. On oublie souvent de penser performance... il ne faut pas oublier par exemple, que lorsqu'il y a un thème enfant, pour chaque fichier du thème parent, WordPress vérifie si il existe dans le thème enfant.

    Répondre à Marie-Aude
  9. Merci pour cette bonne astuce que je retiens aussi et mettrais en pratique.

    J'avais pour ma part résolu le problème en créant des thèmes enfants sur des sites dont je m'occupe, mais pas à seule à fin de préserver la traduction, en effet..

    La création d'un thème enfant a bien des avantages, relativement à la personnalisation du css , celles de certaines fonctions, mais aussi dans ce cas, celle de copier le dossier "lang" du thème, avec ses traductions, dans le dossier du thème enfant. Partant de là, plus aucun soucis à se faire lors des mises à jour du thème...

    Limiter au maximum le contenu du thème enfant est toutefois garant de minimiser la perte sur ce point important des performances, en effet. :-)

    Répondre à Yann De Saulcourt
  10. Grand merci pour cette astuce qui peut en sauver plus d'un et que je mets sous le coude !!
    Cela évitera à pas mal de webmaster sous WP d'éviter de perdre du temps à refaire leur traduction de leur site enfin du thème en question.

    Répondre à Covepa Michels Packaging
  11. .Encore une astuce qui va me faire gagner du temps , merci à lumiere de lune , je vais pouvoir enfin me concacrer à autre chose que de la traduction .
    Eric

    Répondre à eric
  12. "lors d’une mise à jour, WordPress supprime le dossier du thème et recharge la totalité du dossier de la nouvelle version"

    Le fichier functions.php étant dans le réperoire du thème notre chère ligne

    load_theme_textdomain('Magnificent',$template_dir.'/lang');

    ne devrait-​​elle pas disparaître ?

    Répondre à Thibaud
  13. Bonjour,
    Bon je vais essayer d'appliquer la méthode à la modification de traduction de BP !!

    J'ai la version 2.0.2_fr et je voudrai crée une version buddy-​​H_​fr avec juste qq chaines à changer et faire une nouvelle action.
    J'envisage de créer un sous répertoire sous le thème enfant.

    1/​ mon fichier buddy-​​H_​fr peut-​​il comporter juste les qq chaines pour éviter de surcharger avec un gros fichier ?

    2/​ lors du dépot de la nouvelle version BP 2.1 sous wp-​​content/​languages/​plugins il est d'abords chargé avec de nouvelles chaînes mais mon adaptation de mes quelques chaines buddy-​​H_​fr viennent "surcharger" les chaines de la version traduite officiel

    Merci
    A+

    Répondre à Herve
    • Bonjour

      dans le cas d'un thème enfant, on peut loader un textdomain spécifique pour le thème enfant. Il sera chargé à chaque fois que l'instruction de traduction
      _​e( 'My string to translate', 'textdomain' ) appelle le textdomain du child.

      Donc on a deux possibilités :
      – les chaines dont on modifie la traduction se trouvent dans des fichiers modifiés dans le thème enfant -> il suffit de quelques chaines dans le fichier fr_​FR du thème enfant, elles seront chargées comme telles
      – les chaines se trouvent dans des fichiers non-​​modifiés : dans ce cas, il faut éviter de les modifier juste pour changer le textdomain, et il faut modifier la traduction, selon la méthode que je donne.

      En cas de modification de la traduction selon ma méthode, c'est un fichier entier qui va être chargé, au lieu d'un autre. Il doit donc contenir la totalité des chaines.

      J'espère que j'ai été claire ?

      Répondre à Marie-Aude
  14. Bonjour Marie-​​Aude,
    Merci de m'avoir répondu rapidement en cette période encore estivale. :-)
    Il me semble avoir compris ton tuto mais moins ta réponse.
    Je suis vraiment dans le cas ou il existe une traduction "officielle" de BP et ou je veux "seulement surcharger" qq termes dans un fichier modifié sous le thème enfant.

    J'ai trouvé ce snippet :
    add_​action( 'after_​setup_​theme', 'changeLanguage' );
    function changeLanguage(){
    unload_​textdomain( 'domaine' );
    load_plugin_textdomain('domaine', false, '../themes/nomDeMonTemplate/languages/buddy-​​H_​fr.po');
    }

    Est-​​ce que je dois charger ce fichier po allégé ou alors un autre type de fichier ou alors je n'ai rien compris ! ??
    @+

    Répondre à rvNux
    • Honnêtement, je ne saurais pas te dire, car cela semble être un "truc" très spécial. Ce que je comprends du code, c'est qu'il empêche le chargement d'une traduction (unload_​textdomain) pour la remplacer par une traduction dépendante d'un plugin donné.
      Vu comme ça et sans voir le détail du reste, ça ne me semble pas correspondre à ton besoin, surtout si le fichier buddy-H_fr.po est "allégé". Car si il est "allégé" le unload_​textdomain peut empêcher le chargement d'une traduction.
      Maintenant "domaine' est une formulation générique, qui devrait être remplacée par un textdomain spécifique pour être efficace.

      En revanche, via un plugin, c'est un code que tu peux utiliser pour remplacer un fichier de traduction complet par un autre. ça me parait simplement plus lourd que ma méthode. A tester ?

      Répondre à Marie-Aude
      • oui effectivement ce blocage ne me va pas car il s'agit de la traduction principale.
        mais est-​​ce qu'un simple
        load_plugin_textdomain('domaine', false, '../themes/nomDeMonTemplate/languages/buddy-​​H_​fr.po'); ne suffirait pas dans functions.php mais je ne voudrai pas que cela pose problème !

        Répondre à rvNux

Commenter

*

*

*Informations requises Merci de donner les informations requises

  • Pas de liens raccourcis
  • L'auteur doit s'identifier avec son pseudo, son nom, son prénom ou s'il le veut le nom de son entreprise ou de son site, sauf si celui-ci correspond à des mots clés. Toutes les combinaisons sont permises dans ce cadre.
  • L'url peut être celle d'un site ou profil de réseau social, uniquement la page d'accueil
  • Pas d'adresse email jetable