Sostituisci la traduzione di base di WordPress predefinita


11

WordPress è impostato in lingua olandese. Quando uso il get_the_archive_title()mio tema, genera correttamente "Categorie: nome-categoria" in una pagina di archivio delle categorie. Comunque mi piacerebbe che leggessi "Sectie: nome-categoria".

Non voglio cambiare il file della lingua olandese nella cartella wp-content / languages, perché verrà aggiornato dagli aggiornamenti di WordPress.

Ho provato a copiare quel file di traduzione, alterando la traduzione di "categoria" e inserendo il nuovo file nl_NL.mo in my-theme / languages. Questo non ha avuto alcun effetto.

Come posso ottenere una traduzione diversa per alcune stringhe senza alterare i file di traduzione di base?

Risposte:


15

È possibile utilizzare il filtro gettext :

add_filter( 'gettext', 'cyb_filter_gettext', 10, 3 );
function cyb_filter_gettext( $translated, $original, $domain ) {

    // Use the text string exactly as it is in the translation file
    if ( $translated == "Categorie: %s" ) {
        $translated = "Sectie: %s";
    }

    return $translated;
}

Se è necessario filtrare una traduzione con contesto, utilizzare il gettext_with_contextfiltro :

add_filter( 'gettext_with_context', 'cyb_filter_gettext_with_context', 10, 4 );
function cyb_filter_gettext_with_context( $translated, $original, $context, $domain ) {

    // Use the text string exactly as it is in the translation file
    if ( $translated == "Categorie: %s" ) {
        $translated = "Sectie: %s";
    }

    return $translated;
}

Una traduzione con contesto significa che viene fornito un contesto nella funzione gettext utilizzata per tradurre la stringa. Ad esempio, questo è senza contesto:

$translated = __( 'Search', 'textdomain' );

E questo è con il contesto:

$translated = _x( 'Search', 'form placeholder', 'textdomain' );

Filtri simili sono disponibili per traduzioni plurali ( [_n()][2]e [_nx()][2]): ngettexte ngettext_with_context.


1
Ha funzionato! Ho dovuto fare "Categorie:% s" e "Sectie:% s" perché il testo deve essere esattamente come nel file di traduzione.
— Florian,

Oh sì, è corretto. Non conoscevo il testo esatto da tradurre.
— cybmeta,

1
Ottimo pezzo di codice: basta essere consapevoli del fatto che il gettextfiltro non rileverà le traduzioni che usano una stringa "contesto", queste avranno bisogno di gettext_with_context .
— Manu,

Grazie per questa ottima soluzione. Mentre sto costruendo un tema figlio e sono disposto a scavalcare alcune delle traduzioni del tema genitore, ho sostituito il corpo della funzione proposta con la seguente riga return $domain != 'child-domain' && ( $new = __( $original, 'child-domain' ) ) != $original ? $new : $translated;. In questo modo, posso gestire le traduzioni prioritarie nel file PO del tema figlio invece di averle cablate nel codice funzione.
— Franco,

Grazie cybmeta! Ho usato questa tecnica per cambiare il testo principale con un plugin che ho pubblicato nel repository. Ho accreditato questo post nel codice. wordpress.org/plugins/…
— John Dee,
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.