Suprascrie traducerea temei părinte în tema copil

1 mai 2015, 03:32:14
Vizualizări: 22.8K
Voturi: 13

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.

0
Toate răspunsurile la întrebare 3
0
11

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.

20 mai 2015 01:48:35
2

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' );

15 mai 2015 10:31:29
Comentarii

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! :)

d79 d79
20 mai 2015 01:58:47

Poți încărca mai multe domenii de text din tema copil. Dar ai putea de asemenea să folosești pur și simplu domeniul de text al temei părinte pentru toate traducerile, deoarece traducerile sunt unite la încărcarea fișierelor pentru același domeniu de text.

redelschaap redelschaap
20 mai 2015 07:37:44
0

O actualizare din 2019 pentru WordPress 5.0.1.

  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
  2. 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' );
4 apr. 2019 18:25:24