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.

Ensuite, j'ai créé un thème enfant qui utilise load_child_theme_textdomain() pour obtenir 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 se trouvaient dans un fichier de modèle, je pourrais remplacer le fichier et changer simplement le domaine de texte de ces chaînes, mais malheureusement, celles dont je parle sont utilisées à de nombreux endroits et également dans le tableau de bord / fonctions d’action).

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

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

    
posée d79 01.05.2015 - 02:32

2 réponses

10

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 obtiennent le langage actuel (avec get_locale() ) et ajoutent le fichier .mo relatif au chemin d'accès passé en argument;
  • puis ils appellent load_textdomain() en passant comme argument le textdomain et le chemin résultant vers le fichier .mo.

Ensuite, load_textdomain charge le fichier .mo dans la variable globale textdomain, mais comme on peut le lire à partir du 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.

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

Solution

En fin de compte, j’ai simplement créé un dossier avec le nom du thème parent (juste pour des raisons de commodité) dans le dossier des langues du thème enfant et y ai placé mes fichiers .mo personnalisés pour le domaine texte parent (un pour la langue). la forme xx_XX.mo , où xx_XX est le code de langue).

Et ensuite, j'ai ajouté une ligne dans mon fichier functions.php de thème enfant lors de l'action after_setup_theme , près de celui qui charge le fichier .mo pour le textdomain de mon 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' );
} );

Etant donné que le fichier functions.php du thème enfant est chargé avant celui du parent, cet ensemble de chaînes aura la priorité sur la traduction du thème parent (ou j'aurais pu simplement définir la priorité à l'aide du troisième paramètre de add_action fonction).

Remarque: j'aurais pu utiliser load_child_theme_textdomain au lieu de load_theme_textdomain , comme indiqué dans le principe, cela aurait été la même chose.

    
réponse donnée d79 20.05.2015 - 00:48
4

Vous pouvez utiliser les fichiers de langue contenus dans votre dossier de thème enfant. Vous devez d’abord savoir quel domaine de texte est utilisé par le thème parent. Créez ensuite 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 mettez-les dans un dossier du répertoire de votre thème enfant, "languages" 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 tels que __() 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' );

    
réponse donnée redelschaap 15.05.2015 - 09:31

Lire d'autres questions sur les étiquettes