Sostituisci la traduzione del tema principale sul tema secondario


12

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

Quindi ho creato un tema figlio che utilizza load_child_theme_textdomain()per ottenere la stessa cosa per le sue stringhe.

Esistono alcune stringhe tradotte per una determinata lingua sul tema principale che vorrei sostituire / sostituire nel tema secondario.

So che se fossero su un file modello, potrei sostituire il file e semplicemente cambiare il dominio di testo per quelle stringhe, ma sfortunatamente quelli di cui sto parlando sono usati in molti posti e anche nella dashboard (quindi all'interno di alcune funzioni filtro / azione ).

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

Non lo so, forse aggiungendo un file parent-theme.mo nella cartella delle lingue del tema figlio con solo quelle stringhe tradotte, o qualcosa del genere.

Risposte:


9

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

Premessa

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

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

Poi load_textdomaincarica il file .mo nella variabile textdomain globale, ma come si può leggere dalla fonte :

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

Se entrambi gli insiemi hanno la stessa stringa, verrà presa la traduzione dal valore originale.

Quindi, al fine di sovrascrivere / sostituire solo le stringhe del tema principale che vogliamo, dobbiamo caricare un file .mo personalizzato per il dominio di testo principale, contenente solo quelle stringhe tradotte, prima che il tema principale carichi il suo file .mo.


Soluzione

Alla fine, ho semplicemente creato una cartella con il nome del tema principale (solo per comodità) nella cartella delle lingue del tema figlio e ho inserito al suo interno i miei file .mo personalizzati per il dominio di testo principale (uno per la lingua, nel xx_XX.momodulo, dov'è xx_XXil codice della lingua).

E poi ho aggiunto una riga nel functions.phpfile del tema del mio bambino durante l' after_setup_themeazione, vicino a quella che carica il file .mo per il mio dominio del testo del tema del bambino:

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

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


Nota: avrei potuto usare load_child_theme_textdomaininvece di load_theme_textdomain, come detto nella premessa, sarebbe stato lo stesso.


4

È possibile utilizzare i file di lingua presenti nella cartella del tema figlio. Per prima cosa devi sapere quale dominio di testo sta usando il tema principale. Quindi crea i file .po e .mo con solo la tua lingua come nome del file (ad es. De_DE.po / de_DE.mo o nl_NL.po / nl_NL.mo) e inseriscili in una cartella all'interno della directory del tema figlio, "lingue" per esempio.

È quindi possibile inizializzare il dominio di testo con load_child_theme_textdomain():

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

Si noti che è possibile trovare il dominio di testo cercando chiamate di funzione simili __()o _e()all'interno dei file PHP del tema principale. Il secondo parametro è il dominio di testo:__( 'Translated text string', 'text_domain' );


grazie @redelschaap, alla fine la tua soluzione funzionerebbe fintanto che usi una cartella diversa per il dominio di testo principale da quella che usi per il dominio di testo figlio: quella è stata la cattura! :)
D79,

Puoi caricare più domini di testo all'interno del tema figlio. Ma potresti anche utilizzare il dominio di testo del tema principale per tutte le traduzioni, poiché le traduzioni vengono unite durante il caricamento dei file per lo stesso dominio di testo.
redelschaap,

0

Un aggiornamento del 2019 per Wordpress 5.0.1.

  1. I file NON devono contenere la lumaca padre o figlio. Ad esempio, la traduzione in spagnolo messicano dovrebbe contenere file child-theme-name / languages ​​/ es_MX.po e /child-theme-name/languages/es_MX.mo
  2. Il tema figlio funzioni.php dovrebbe avere il seguente codice. Si noti che la funzione load_child_theme_textdomain () primo parametro è la lumaca del tema PARENT, non quella 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' );
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.