Sovrascrivere la traduzione del tema genitore nel tema figlio

1 mag 2015, 03:32:14
Visualizzazioni: 22.8K
Voti: 13

Ho un tema genitore che usa correttamente load_theme_textdomain() per caricare tutte le stringhe tradotte in diverse lingue.

Poi ho creato un tema figlio che utilizza load_child_theme_textdomain() per ottenere lo stesso risultato per le sue stringhe.

Ci sono alcune stringhe tradotte per una particolare lingua nel tema genitore che vorrei sostituire/sovrascrivere nel tema figlio.

So che se fossero in un file template potrei sostituire il file e semplicemente cambiare il textdomain per quelle stringhe, ma sfortunatamente quelle di cui parlo sono utilizzate in molti posti e anche nella dashboard (quindi all'interno di alcune funzioni filter/action).

Quindi la mia domanda è: esiste un modo per sostituire quelle stringhe tradotte all'interno del tema figlio senza dover sostituire i file template o le funzioni del tema genitore?

Non so, magari aggiungendo un file parent-theme.mo all'interno della cartella languages del tema figlio con solo quelle stringhe tradotte, o qualcosa del genere.

0
Tutte le risposte alla domanda 3
0
11

Penso di aver trovato una soluzione, ma prima un po' di

Premessa

load_theme_textdomain() e load_child_theme_textdomain() sono sostanzialmente uguali, l'unica differenza è il percorso predefinito che utilizzano:

  • ottengono la lingua corrente (usando get_locale()) e aggiungono il relativo file .mo al percorso passato come argomento;
  • poi chiamano load_textdomain() passando come argomento sia il textdomain che il percorso risultante del file .mo.

Quindi load_textdomain carica il file .mo nella variabile globale del textdomain, ma come possiamo leggere dal sorgente:

Se il dominio esiste già, le traduzioni verranno unite.

Se entrambi i set hanno la stessa stringa, verrà presa la traduzione dal valore originale.

Quindi, per sovrascrivere/sostituire solo le stringhe del tema genitore che vogliamo, dobbiamo caricare un file .mo personalizzato per il textdomain del genitore, contenente solo quelle stringhe tradotte, prima che il tema genitore carichi il suo file .mo.


Soluzione

Alla fine, ho semplicemente creato una cartella con il nome del tema genitore (solo per comodità) nella cartella languages del tema figlio, e ho inserito al suo interno i miei file .mo personalizzati per il textdomain del genitore (uno per lingua, nel formato xx_XX.mo, dove xx_XX è il codice della lingua).

E poi ho aggiunto una riga nel mio file functions.php del tema figlio durante l'azione after_setup_theme, vicino a quella che carica il file .mo per il textdomain del mio tema figlio:

add_action( 'after_setup_theme', function () {
    // carica il file di traduzione personalizzato per il tema genitore
    load_theme_textdomain( 'parent-textdomain', get_stylesheet_directory() . '/languages/parent-theme' );
    // carica il file di traduzione per il tema figlio
    load_child_theme_textdomain( 'my-child-theme', get_stylesheet_directory() . '/languages' );
} );

Poiché il file functions.php del tema figlio viene caricato prima di quello del genitore, questo set di stringhe avrà la precedenza sulla traduzione del tema genitore (o avrei potuto semplicemente impostare la priorità usando il terzo parametro della funzione add_action).


Nota: Avrei potuto usare load_child_theme_textdomain invece di load_theme_textdomain, come detto nella premessa sarebbe stato lo stesso.

20 mag 2015 01:48:35
2

Puoi utilizzare i file di lingua che si trovano nella cartella del tuo child theme. Prima di tutto devi conoscere quale text domain utilizza il tema genitore. Poi crea i file .po e .mo utilizzando solo il nome della tua lingua come nome del file (ad esempio it_IT.po/it_IT.mo) e inseriscili in una cartella all'interno della directory del tuo child theme, ad esempio "languages".

Successivamente puoi inizializzare il text domain con load_child_theme_textdomain():

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

Nota che puoi trovare il text domain cercando le chiamate a funzioni come __() o _e() all'interno dei file PHP del tema genitore. Il secondo parametro è il text domain: __( 'Testo da tradurre', 'text_domain' );

15 mag 2015 10:31:29
Commenti

grazie @redelschaap, alla fine la tua soluzione funzionerebbe purché tu usi una cartella diversa per il textdomain del tema genitore da quella che usi per il textdomain del tema figlio: era questo il trucco! :)

d79 d79
20 mag 2015 01:58:47

Puoi caricare più text domain dal tuo tema figlio. Ma potresti anche semplicemente usare il text domain del tema genitore per tutte le traduzioni, dato che le traduzioni vengono unite quando si caricano file per lo stesso text domain.

redelschaap redelschaap
20 mag 2015 07:37:44
0

Un aggiornamento del 2019 per WordPress 5.0.1.

  1. I file NON devono contenere lo slug del tema genitore o figlio. Ad esempio, fornendo una traduzione per lo spagnolo messicano dovrebbero esserci i file child-theme-name/languages/es_MX.po e /child-theme-name/languages/es_MX.mo
  2. Il file functions.php del tema figlio dovrebbe contenere il seguente codice. Notare che il primo parametro della funzione load_child_theme_textdomain() è lo slug del tema GENITORE, non quello del figlio:
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