it-swarm.com.de

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

Ich habe ein übergeordnetes Thema, das richtig load_theme_textdomain() verwendet, um alle übersetzten Zeichenfolgen in vielen Sprachen zu laden.

Dann habe ich ein untergeordnetes Thema erstellt, das load_child_theme_textdomain() verwendet, um dasselbe für die Zeichenfolgen zu erreichen.

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 die übergeordneten Vorlagendateien oder Funktionen ersetzen zu müssen?

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

12
d79

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 zu dem als Argument übergebenen Pfad hinzu.
  • dann rufen sie load_textdomain() auf und übergeben als Argument sowohl die Textdomäne als auch den resultierenden Pfad zur .mo-Datei.

Dann lädt load_textdomain die .mo-Datei in die globale textdomain-Variable, aber wie wir aus dem source 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 seine Mo-Datei lädt Datei.


Lösung

Am Ende habe ich einfach einen Ordner mit dem Namen des übergeordneten Themas (nur zur Vereinfachung) im Ordner für untergeordnete Themensprachen erstellt und darin meine benutzerdefinierten .mo-Dateien für die übergeordnete Textdomäne (eine für Sprache) im Formular xx_XX.mo abgelegt , wobei xx_XX der Sprachcode ist).

Und dann habe ich während der Aktion functions.php eine Zeile in die after_setup_theme-Datei meines untergeordneten Themas eingefügt, in der Nähe derjenigen, die die .mo-Datei für die Textdomäne meines untergeordneten Themas lädt:

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.php-Datei 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_action-Funktion festlegen können).


Anmerkung: Ich hätte load_child_theme_textdomain anstelle von load_theme_textdomain verwenden können, wie in der Prämisse gesagt, es wäre dasselbe gewesen.

10
d79

Sie können Sprachdateien verwenden, die sich in Ihrem untergeordneten Themenordner befinden. Zuerst müssen Sie wissen, welche Textdomäne das übergeordnete Thema verwendet. Erstellen Sie dann die .po- und .mo-Dateien mit nur Ihrer Sprache als Dateinamen (z. B. de_DE.po/de_DE.mo oder nl_NL.po/nl_NL.mo) und legen Sie sie in einem Ordner in Ihrem untergeordneten Themenverzeichnis ab, "languages". zum Beispiel.

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

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() in den PHP -Dateien des übergeordneten Themas suchen. Der zweite Parameter ist die Textdomäne: __( 'Translated text string', 'text_domain' );

4
redelschaap

Ein 2019 Update für Wordpress 5.0.1.

  1. In den Dateien darf KEIN Parent- oder Child-Slug enthalten sein. 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' );
0
Cesar