Remplacer la traduction du thème parent sur le thème enfant

12

J'ai un thème parent qui utilise correctement load_theme_textdomain()pour charger toutes les chaînes traduites dans de nombreuses langues.

J'ai ensuite créé un thème enfant qui utilise load_child_theme_textdomain()pour réaliser la même chose pour ses chaînes.

Il y a certaines chaînes traduites pour une langue particulière sur le thème parent que je voudrais remplacer / remplacer dans le thème enfant.

Je sais que s'ils étaient sur un fichier de modèle, je pourrais remplacer le fichier et simplement changer le domaine de texte pour ces chaînes, mais malheureusement ceux dont je parle sont utilisés à de nombreux endroits et également dans le tableau de bord (donc à l'intérieur de certaines fonctions de filtrage / action ).

Ma question est donc la suivante: existe-t-il un moyen de remplacer ces chaînes traduites à l'intérieur du thème enfant sans avoir à remplacer les fichiers de modèle parent ou les fonctions?

Je ne sais pas, peut-être en ajoutant un fichier parent-theme.mo dans le dossier des langues du thème enfant avec seulement ces chaînes traduites, ou quelque chose comme ça.

d79
la source

Réponses:

9

Je pense avoir trouvé une solution, mais avant un peu

Prémisse

load_theme_textdomain()et load_child_theme_textdomain()sont fondamentalement égaux, la seule différence est le chemin par défaut qu'ils utilisent:

  • ils récupèrent la langue courante (en utilisant get_locale()) et ajoutent le fichier .mo relatif au chemin passé en argument;
  • puis ils appellent load_textdomain()passer comme argument à la fois le domaine de texte et le chemin d'accès résultant vers le fichier .mo.

load_textdomainCharge ensuite le fichier .mo dans la variable globale de domaine de texte, mais comme nous pouvons le lire à partir de la source :

Si le domaine existe déjà, les traductions seront fusionnées.

Si les deux ensembles ont la même chaîne, la traduction de la valeur d'origine sera prise.

Ainsi, afin de remplacer / remplacer uniquement les chaînes du parent de thème que nous voulons, nous devons charger un fichier .mo personnalisé pour le domaine de texte parent, contenant uniquement les chaînes traduites, avant que le thème parent ne charge son fichier .mo.


Solution

À la fin, j'ai simplement créé un dossier avec le nom du thème parent (juste pour plus de commodité) dans le dossier des langues du thème enfant, et y ai placé mes fichiers .mo personnalisés pour le domaine de texte parent (un pour la langue, sous la xx_XX.moforme, où xx_XXest le code de langue).

Et puis j'ai ajouté une ligne dans mon functions.phpfichier de thème enfant pendant l' after_setup_themeaction, près de celle qui charge le fichier .mo pour mon domaine de texte de thème enfant:

add_action( 'after_setup_theme', function () {
    // load custom translation file for the parent theme
    load_theme_textdomain( 'parent-textdomain', get_stylesheet_directory() . '/languages/parent-theme' );
    // load translation file for the child theme
    load_child_theme_textdomain( 'my-child-theme', get_stylesheet_directory() . '/languages' );
} );

Étant donné que le functions.phpfichier du thème enfant est chargé avant celui du parent, cet ensemble de chaînes aura priorité sur la traduction du thème parent (ou j'aurais pu simplement définir la priorité en utilisant le troisième paramètre de la add_actionfonction).


Remarque: j'aurais pu utiliser load_child_theme_textdomainau lieu de load_theme_textdomain, comme dit dans la prémisse, cela aurait été le même.

d79
la source
4

Vous pouvez utiliser des fichiers de langue qui se trouvent dans votre dossier de thème enfant. Vous devez d'abord savoir quel domaine de texte le thème parent utilise. Ensuite, créez les fichiers .po et .mo avec uniquement votre langue comme nom de fichier (par exemple de_DE.po / de_DE.mo ou nl_NL.po / nl_NL.mo) et placez-les dans un dossier dans votre répertoire de thème enfant, "langues" par exemple.

Vous pouvez ensuite initialiser le domaine de texte avec load_child_theme_textdomain():

load_child_theme_textdomain( 'the_text_domain', get_stylesheet_directory() . '/languages/' );

Notez que vous pouvez trouver le domaine de texte en recherchant des appels de fonction comme __()ou _e()dans les fichiers PHP du thème parent. Le deuxième paramètre est le domaine de texte:__( 'Translated text string', 'text_domain' );

redelschaap
la source
merci @redelschaap, à la fin votre solution fonctionnerait tant que vous utilisez un dossier différent pour le domaine de texte parent de celui que vous utilisez pour le domaine de texte enfant: c'était le hic! :)
d79
Vous pouvez charger plusieurs domaines de texte à partir de votre thème enfant. Mais vous pouvez également utiliser le domaine de texte du thème parent pour toutes les traductions, car les traductions sont fusionnées lors du chargement de fichiers pour le même domaine de texte.
redelschaap
0

Une mise à jour 2019 pour Wordpress 5.0.1.

  1. Les fichiers ne doivent PAS contenir de slug parent ou enfant. Par exemple, pour fournir une traduction espagnole du Mexique, les fichiers child-theme-name / languages ​​/ es_MX.po et /child-theme-name/languages/es_MX.mo
  2. Le thème enfant functions.php devrait avoir le code suivant. Notez que le premier paramètre de la fonction load_child_theme_textdomain () est le slug du thème PARENT, pas celui de l'enfant:
function child_theme_slug_setup() {
    load_child_theme_textdomain( 'parent-theme-slug', get_stylesheet_directory() . '/languages' );
}
add_action( 'after_setup_theme', 'child_theme_slug_setup' );
César
la source