Überschreiben Sie die Standard-WordPress-Kernübersetzung

11

WordPress ist auf Niederländisch eingestellt. Wenn ich get_the_archive_title()mein Thema richtig verwende, wird "Kategorie: Kategoriename" auf einer Kategoriearchivseite ausgegeben. Ich möchte jedoch, dass "Sectie: Category-name" gelesen wird.

Ich möchte die niederländische Sprachdatei im Ordner wp-content / language nicht ändern, da dies durch WordPress-Updates aktualisiert wird.

Ich habe versucht, diese Übersetzungsdatei zu kopieren, die "Kategorie" -Übersetzung zu ändern und die neue Datei "nl_NL.mo" in mein Thema / meine Sprachen einzufügen. Dies hatte keine Auswirkung.

Wie kann ich für einige Zeichenfolgen eine andere Übersetzung erzielen, ohne die Kernübersetzungsdateien zu ändern?

Florian
quelle

Antworten:

15

Sie könnten gettext filter verwenden :

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

Wenn Sie eine Übersetzung nach Kontext gettext_with_contextfiltern müssen , verwenden Sie filter :

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

Eine Übersetzung mit Kontext bedeutet, dass in der Funktion gettext, mit der die Zeichenfolge übersetzt wird, ein Kontext angegeben wird. Dies ist beispielsweise ohne Kontext:

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

Und das ist mit dem Kontext:

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

Ähnliche Filter sind für mehrere Übersetzungen ( [_n()][2]und [_nx()][2]) verfügbar : ngettextund ngettext_with_context.

Cybmeta
quelle
1
Das hat funktioniert! Ich musste "Categorie:% s" und "Sectie:% s" machen, weil der Text genau wie in der Übersetzungsdatei sein muss.
Florian
Oh ja, das ist richtig. Ich kannte den genauen zu übersetzenden Text nicht.
Cybmeta
1
Großartiger Code - beachten Sie jedoch, dass der gettextFilter keine Übersetzungen abfängt , die eine "Kontext" -String verwenden . Diese benötigen gettext_with_context .
Manu
Vielen Dank für diese großartige Lösung. Da ich ein untergeordnetes Thema erstelle und bereit bin, einige Übersetzungen des übergeordneten Themas zu überschreiben, habe ich den vorgeschlagenen Funktionskörper durch die folgende Zeile ersetzt return $domain != 'child-domain' && ( $new = __( $original, 'child-domain' ) ) != $original ? $new : $translated;. Auf diese Weise kann ich die überschreibenden Übersetzungen in der PO-Datei des untergeordneten Themas verwalten, anstatt sie im Funktionscode verkabeln zu lassen.
Franco
Danke Cybmeta! Ich habe diese Technik verwendet, um den Kerntext mit einem Plugin zu ändern, das ich im Repo veröffentlicht habe. Ich habe diesen Beitrag im Code gutgeschrieben. wordpress.org/plugins/…
John Dee