Zastąp domyślne tłumaczenie rdzenia WordPress

11

WordPress jest ustawiony na język holenderski. Kiedy używam get_the_archive_title()mojego motywu poprawnie wyświetla „Kategoria: nazwa kategorii” na stronie archiwum kategorii. Chciałbym jednak przeczytać „Sectie: Category-name”.

Nie chcę zmieniać holenderskiego pliku językowego w folderze wp-content / languages, ponieważ zostanie on zaktualizowany przez aktualizacje WordPress.

Próbowałem skopiować ten plik tłumaczenia, zmienić tłumaczenie „kategorii” i umieścić nowy plik nl_NL.mo w my-theme / languages. To nie miało żadnego efektu.

Jak mogę uzyskać inne tłumaczenie niektórych ciągów bez zmiany podstawowych plików tłumaczeń?

Florian
źródło

Odpowiedzi:

15

Możesz użyć filtra 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;
}

Jeśli chcesz filtrować tłumaczenie z kontekstem, użyj gettext_with_contextfiltru :

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

Tłumaczenie z kontekstem oznacza, że ​​kontekst jest podany w funkcji gettext używanej do tłumaczenia łańcucha. Na przykład jest to bez kontekstu:

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

I to w kontekście:

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

Podobne filtry są dostępne dla tłumaczeń w liczbie mnogiej ( [_n()][2]i [_nx()][2]): ngettexti ngettext_with_context.

cybmeta
źródło
1
To się udało! Musiałem zrobić „Categorie:% s” i „Sectie:% s”, ponieważ tekst musi być dokładnie taki sam jak w pliku tłumaczenia.
Florian
O tak, to prawda. Nie znałem dokładnego tekstu do przetłumaczenia.
cybmeta
1
Świetny fragment kodu - pamiętaj tylko, że gettextfiltr nie przechwyci tłumaczeń, które używają ciągu „kontekstowego”, będą one wymagały gettext_with_context .
Manu
Dzięki za to świetne rozwiązanie. Gdy buduję motyw podrzędny i chcę zastąpić niektóre tłumaczenia motywu nadrzędnego, zastąpiłem proponowaną treść funkcji następującym wierszem return $domain != 'child-domain' && ( $new = __( $original, 'child-domain' ) ) != $original ? $new : $translated;. W ten sposób mogę porządkować nadrzędne tłumaczenia w pliku PO motywu potomnego zamiast umieszczać je w kodzie funkcji.
Franco
Dzięki cybmeta! Użyłem tej techniki do zmiany podstawowego tekstu za pomocą wtyczki opublikowanej w repozytorium. Zapisałem ten post w kodzie. wordpress.org/plugins/…
John Dee