Übergeordnete Themenübersetzung für untergeordnetes Thema überschreiben


11

Ich habe ein übergeordnetes Thema, mit load_theme_textdomain()dem alle übersetzten Zeichenfolgen in vielen Sprachen korrekt geladen werden.

Dann habe ich ein untergeordnetes Thema erstellt, mit load_child_theme_textdomain()dem dasselbe für die Zeichenfolgen erreicht wird.

Es gibt bestimmte übersetzte Zeichenfolgen für eine bestimmte Sprache im übergeordneten Thema, die ich im untergeordneten Thema ersetzen / überschreiben möchte.

Ich weiß, wenn sie in einer Vorlagendatei wären, könnte ich die Datei ersetzen und einfach die Textdomäne für diese Zeichenfolgen ändern, aber leider werden diejenigen, von denen ich spreche, an vielen Stellen und auch im Dashboard verwendet (also in einigen Filter- / Aktionsfunktionen) ).

Meine Frage lautet also: Gibt es eine Möglichkeit, diese übersetzten Zeichenfolgen innerhalb des untergeordneten Themas zu ersetzen, ohne dass übergeordnete Vorlagendateien oder Funktionen ersetzt werden müssen?

Ich weiß nicht, vielleicht füge ich eine Datei parent-theme.mo in den Ordner languages ​​des untergeordneten Themas ein, in der nur die Zeichenfolgen übersetzt sind, oder so ähnlich.

Antworten:


9

Ich denke, ich habe eine Lösung gefunden, aber bevor ein wenig

Prämisse

load_theme_textdomain()und load_child_theme_textdomain()sind grundsätzlich gleich, der einzige Unterschied ist der Standardpfad, den sie verwenden:

  • Sie erhalten die aktuelle Sprache (mit get_locale()) und fügen die relative .mo- Datei dem als Argument übergebenen Pfad hinzu.
  • Dann rufen load_textdomain()sie als Argument sowohl die Textdomäne als auch den resultierenden Pfad zur .mo-Datei auf.

load_textdomainLädt dann die .mo-Datei in die globale Textdomänenvariable, aber wie wir aus der Quelle lesen können :

Wenn die Domain bereits existiert, werden die Übersetzungen zusammengeführt.

Wenn beide Sätze den gleichen String haben, wird die Übersetzung vom ursprünglichen Wert übernommen.

Um also nur die Zeichenfolgen des übergeordneten Themas zu überschreiben / ersetzen, müssen Sie eine benutzerdefinierte Mo-Datei für die übergeordnete Textdomäne laden, die nur die übersetzten Zeichenfolgen enthält, bevor das übergeordnete Thema die Mo-Datei lädt.


Lösung

Am Ende habe ich einfach einen Ordner mit dem Namen des übergeordneten Themas (nur zur Vereinfachung) in den Ordner für die Sprachen des untergeordneten Themas erstellt und meine benutzerdefinierten .mo-Dateien für die übergeordnete Textdomäne (eine für die Sprache) in das xx_XX.moFormular eingefügt. wo xx_XXist der Sprachcode).

Und dann habe ich functions.phpwährend der after_setup_themeAktion eine Zeile in meine untergeordnete Designdatei eingefügt, die sich in der Nähe der Zeile befindet , in der die .mo-Datei für die Textdomäne meines untergeordneten Themas geladen wird:

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

Da die functions.phpDatei des untergeordneten Themas vor der des übergeordneten Themas geladen wird, hat dieser Satz von Zeichenfolgen Vorrang vor der Übersetzung des übergeordneten Themas (oder ich hätte die Priorität einfach mithilfe des dritten Parameters der add_actionFunktion festlegen können).


Hinweis: Ich hätte load_child_theme_textdomainanstelle von verwenden können load_theme_textdomain, wie in der Prämisse gesagt, wäre es das gleiche gewesen.


4

Sie können Sprachdateien verwenden, die sich in Ihrem untergeordneten Themenordner befinden. Zuerst müssen Sie wissen, welche Textdomäne das übergeordnete Thema verwendet. Dann erstelle die .po und .mo Dateien mit nur deiner Sprache als Dateiname (zB de_DE.po / de_DE.mo oder nl_NL.po / nl_NL.mo) und lege sie in einen Ordner innerhalb deines untergeordneten Themenverzeichnisses, "languages" beispielsweise.

Anschließend können Sie die Textdomäne initialisieren mit load_child_theme_textdomain():

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

Beachten Sie, dass Sie die Textdomäne finden können, indem Sie nach Funktionsaufrufen wie __()oder _e()innerhalb der PHP-Dateien des übergeordneten Themas suchen . Der zweite Parameter ist die Textdomäne:__( 'Translated text string', 'text_domain' );


danke @redelschaap, am Ende würde deine Lösung funktionieren, solange du einen anderen Ordner für die übergeordnete Textdomäne verwendest als für die untergeordnete Textdomäne: das war der Haken! :)
d79

Sie können mehrere Textdomänen aus Ihrem untergeordneten Design laden. Sie können aber auch einfach die übergeordnete Designtextdomäne für alle Übersetzungen verwenden, da die Übersetzungen beim Laden von Dateien für dieselbe Textdomäne zusammengeführt werden.
Redelschaap

0

Ein 2019 Update für Wordpress 5.0.1.

  1. Die Dateien dürfen KEINE übergeordneten oder untergeordneten Slugs enthalten. Wenn Sie beispielsweise eine spanisch-mexikanische Übersetzung bereitstellen, müssen die Dateien child-theme-name / languages ​​/ es_MX.po und /child-theme- name/languages/es_MX.mo vorhanden sein
  2. Die child theme functions.php sollte den folgenden Code haben. Beachten Sie, dass der erste Parameter der Funktion load_child_theme_textdomain () der PARENT-Theme-Slug ist und nicht der des Kindes:
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' );
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.