Suprascrie traducerea temei părinte în tema copil
Am o temă părinte care folosește corect load_theme_textdomain()
pentru a încărca toate șirurile traduse în mai multe limbi.
Apoi am creat o temă copil care folosește load_child_theme_textdomain()
pentru a obține același lucru pentru șirurile sale.
Există anumite șiruri traduse pentru o anumită limbă în tema părinte pe care aș dori să le înlocuiesc/suprascriu în tema copil.
Știu că dacă ar fi într-un fișier șablon, aș putea înlocui fișierul și pur și simplu să schimb domeniul text pentru acele șiruri, dar din păcate cele despre care vorbesc sunt folosite în multe locuri și de asemenea în panoul de administrare (deci în interiorul unor funcții filter/action).
Așadar întrebarea mea este: există vreo modalitate de a înlocui acele șiruri traduse în tema copil fără a trebui să înlocuiesc fișierele șablon sau funcțiile părinte?
Nu știu, poate adăugând un fișier parent-theme.mo în interiorul directorului languages al temei copil cu doar acele șiruri traduse, sau ceva de genul acesta.

Cred că am găsit o soluție, dar mai întâi câteva
Premise
load_theme_textdomain()
și load_child_theme_textdomain()
sunt practic egale, singura diferență fiind calea implicită pe care o folosesc:
- ele obțin limba curentă (folosind
get_locale()
) și adaugă fișierul .mo relativ la calea transmisă ca argument; - apoi apelează
load_textdomain()
transmitând ca argument atât textdomain-ul cât și calea rezultată către fișierul .mo.
Apoi load_textdomain
încarcă fișierul .mo în variabila globală textdomain, dar după cum putem citi din sursă:
Dacă domeniul există deja, traducerile vor fi îmbinate.
Dacă ambele seturi au același șir de caractere, se va lua traducerea din valoarea originală.
Deci, pentru a suprascrie/înlocui doar șirurile din tema părinte pe care le dorim, trebuie să încărcăm un fișier .mo personalizat pentru textdomain-ul părintelui, care să conțină doar acele șiruri traduse, înainte ca tema părinte să-și încarce fișierul .mo.
Soluție
În final, am creat pur și simplu un folder cu numele temei părinte (doar pentru comoditate) în folderul languages al temei copil și am pus în el fișierele mele .mo personalizate pentru textdomain-ul părintelui (câte unul pentru fiecare limbă, în formatul xx_XX.mo
, unde xx_XX
este codul limbii).
Apoi am adăugat o linie în fișierul functions.php
al temei copil în timpul acțiunii after_setup_theme
, lângă cea care încarcă fișierul .mo pentru textdomain-ul temei copil:
add_action( 'after_setup_theme', function () {
// încarcă fișierul de traducere personalizat pentru tema părinte
load_theme_textdomain( 'parent-textdomain', get_stylesheet_directory() . '/languages/parent-theme' );
// încarcă fișierul de traducere pentru tema copil
load_child_theme_textdomain( 'my-child-theme', get_stylesheet_directory() . '/languages' );
} );
Deoarece fișierul functions.php
al temei copil este încărcat înaintea celui al părintelui, acest set de șiruri va avea prioritate față de traducerea temei părinte (sau aș fi putut seta prioritatea folosind al treilea parametru al funcției add_action
).
Notă: Aș fi putut folosi load_child_theme_textdomain
în loc de load_theme_textdomain
, după cum s-a menționat în premise, ar fi fost același lucru.

Puteți utiliza fișierele de limbă care se află în directorul temei copil. Mai întâi trebuie să aflați ce domeniu de text utilizează tema părinte. Apoi creați fișierele .po și .mo doar cu limba dumneavoastră ca nume de fișier (de exemplu, ro_RO.po/ro_RO.mo) și plasați-le într-un folder din directorul temei copil, de exemplu "languages".
Apoi puteți inițializa domeniul de text cu load_child_theme_textdomain()
:
load_child_theme_textdomain( 'the_text_domain', get_stylesheet_directory() . '/languages/' );
Rețineți că puteți găsi domeniul de text căutând apeluri de funcții precum __()
sau _e()
în fișierele PHP ale temei părinte. Al doilea parametru este domeniul de text: __( 'Textul tradus', 'text_domain' );

mulțumesc @redelschaap, în final soluția ta ar funcționa atâta timp cât folosești un folder diferit pentru textdomain-ul părinte față de cel folosit pentru textdomain-ul copil: asta era problema! :)

O actualizare din 2019 pentru WordPress 5.0.1.
- Fișierele NU trebuie să conțină slug-ul părintelui sau al copilului în ele. De exemplu, furnizarea traducerii în spaniolă mexicană ar trebui să aibă fișierele child-theme-name/languages/es_MX.po și /child-theme-name/languages/es_MX.mo
- Fișierul functions.php al temei copil ar trebui să conțină următorul cod. Observați că primul parametru al funcției load_child_theme_textdomain() este slug-ul temei PĂRINTE, nu al copilului:
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' );
