Astuce WordPress : conserver la traduction de son thème lors d’une mise à jour
- 1 - Traduire un thème WordPress
- 2 - 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.
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 )
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.
Il faudrait vraiment une solution native et imposer la possibilité de traduction sur tous les thèmes validés sur le site officiel.
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.
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 !
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.
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 ?
Brice Emry,
J’ai lu trop vite… mes excuses.
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.
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. :-)
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.
.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
“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 ?
Cette ligne est mise par le créateur du thème. Cet article n’est pas pour ajouter une traduction à un thème non traduit, mais remplacer le contenu de la traduction existante.
Ok merci
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+
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 ?
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 ! ??
@+
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 ?
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 !
ça ne suffit pas, à mon avis, car il faut dans la fonction de génération de la chaine _e(‘texte à traduire’, ‘domainedetraductionbp’) de Buddy Press remplacer domainedetraductionbp par “domaine”
Je viens de comprendre à quoi ça sert ! Je vais pouvoir “fixer” la traduction du thème Hueman !
Faut que je mette des “likes” sur les commentaires :)
Ce que tu ne dis pas, c’est que ça marche aussi avec les plugins et leur traduction – ah ben tiens, je vais pouvoir mettre mon S2member en français pour de bon.
Oui j’ai découvert ça après :D il faut que je mette l’article à jour !
Bonjour,
et si la mise à jour du thème inclus de nouveaux items ? il faudrait faire une sorte de merge (fusion) entre le fichier déjà traduit et le nouveau. Comment envisager une telle problématique ?
En vous remerciant par avance.
Bien cordialement
Oui mais c’est très rarement le cas… de plus si la traduction n’est pas trouvée dans le fichier dans languages/themes/ elle est recherchée ensuite dans le fichier.mo du theme
Merci Marie-Aude de ta réponse si prompte ;o)
Faut dire que je débute en WP. Je me pose peut-être des questions qui n’ont pas lieu d’être. Donc l’idée c’est de poser le fichier traduit dans languages/themes/ et de compléter le fichier du thème (donc la mise à jour) dans le thème. C’est bien ça ?
Merci, merci, merci … je partage
Ah ah, je pense que cet article est obsolète depuis que les traductions se font de plus en plus sur translate.wordpress.org car les traductions officielles sont envoyées directos dans ce répertoire commun écrasant toute tentative de personnalisation.
Les solutions ? Loco Translate (qui permet de garder une translation personnalisée séparée) ou http://www.echodesplugins.li-an.fr/plugins/wp-custom-mo-file/
Oui, tu as raison. Faut que je mette à jour…
Oula, ta solution est technique. Il faudrait faire un exemple concret pour nous autres, pauvre béotiens.
Bonjour,
Merci pour vos tutos.
J’ai créé un thème enfant du thème twentysixteen.
Je souhaite modifier quelques traduction pour mon theme enfant.
J’ai modifier les fichier de mon theme parent avec poedit.
j’ai mis les fichiers dans le dossier wp-content/languages/themes avec le nom du textdomain que j’ai insérer dans l’entête de mon fichier style.css de mon thème enfant :
wpakro-fr_FR.mo et wpakro-fr_FR.po
et j’ai mis le code ci-dessous dans le fichier funtions.php de mon thème enfant.
// prise en compte du dossier de traduction du theme enfant à la place du parent
function my_child_theme_setup() {
load_child_theme_textdomain( ‘twentysixteen’, site_url() . ‘/wp-content/languages/themes’ );
}
add_action( ‘after_setup_theme’, ‘my_child_theme_setup’ );
Mais rien ne fonctionne pas de prise en compte des traductions modifié de mon thème enfant, il prend toujours le thème parent ?
Et ce que le code du fichier functions.php et bon.
Et ce que je dois mettre autre chose pour déclarer le texdomain de mon theme enfant ?
là je bloque.
Merci