Zum Inhalt

Übersetzungen

Die Textdomain

Die Textdomain des Themes ist twtheme. Alle übersetzbaren Zeichenketten laufen über die WordPress-Funktionen:

__('Save modules', 'twtheme');
esc_html__('Modules saved.', 'twtheme');
_n('%s module', '%s modules', $count, 'twtheme');

Ein Child-Theme benutzt seine eigene Textdomain und lädt sie selbst:

add_action('after_setup_theme', 'projekt_setup', 20);
function projekt_setup(): void
{
    load_child_theme_textdomain('projekt', get_stylesheet_directory() . '/languages');
}

Die Dateien

Datei Wofür
languages/twtheme.pot Vorlage mit allen gefundenen Zeichenketten
languages/twtheme-de_DE.po die deutsche Übersetzung, hier wird gearbeitet
languages/twtheme-de_DE.mo kompilierte Fassung für PHP
languages/twtheme-de_DE.l10n.php schnellere PHP-Fassung
languages/*.json Übersetzungen für JavaScript, je Skript-Handle

Bearbeitet wird ausschließlich die .po. Alles andere entsteht daraus.

Die JSON-Dateien sind nötig, weil der Blockeditor seine Zeichenketten im JavaScript übersetzt und dafür ein eigenes Format braucht.

Der Ablauf

1. Neue Zeichenketten einsammeln

npm run i18n:pot

Durchsucht das Theme und schreibt languages/twtheme.pot. Ausgenommen sind node_modules, assets, source und includes/engine/assets — dort stehen gebaute Dateien, deren Zeichenketten schon aus den Quellen kommen.

Setzt WP-CLI voraus.

2. Übersetzen

Die neuen Einträge aus der .pot in languages/twtheme-de_DE.po übertragen und ausfüllen. Dafür genügt ein Texteditor; bequemer ist ein Werkzeug wie Poedit.

Für viele Einträge auf einmal ist msgmerge der Weg:

msgmerge --previous --backup=off -U languages/twtheme-de_DE.po languages/twtheme.pot
msgfmt --check --statistics -o /dev/null languages/twtheme-de_DE.po

msgmerge übernimmt exakte Treffer unverändert und markiert nur dort fuzzy, wo es keinen exakten, aber einen ähnlichen msgid findet — also genau dort, wo sich der englische Ausgangstext geändert hat. --previous schreibt den alten msgid als #| msgid daneben, sodass sichtbar ist, was sich geändert hat. Die Zahl hinter translated darf gegenüber vorher nicht fallen.

msgfmt schreibt fuzzy-Einträge nicht in die .mo. Sie sind damit unwirksam, bis jemand die Markierung entfernt.

3. Bauen

npm run i18n:build

Erzeugt in einem Durchgang alles Übrige:

Schritt Ergebnis
msgfmt die .mo-Datei
i18n:php die .l10n.php-Datei
i18n:json die JSON-Dateien für JavaScript, samt Umbenennung

Setzt msgfmt aus den Gettext-Werkzeugen voraus. Auf macOS über Homebrew:

brew install gettext

4. Ins Languages-Verzeichnis kopieren

Damit WordPress die neuen Übersetzungen sieht, müssen sie im Languages-Verzeichnis der Installation liegen. Dafür gibt es einen Knopf in der Admin-Bar: TWtheme → Update language strings.

Er kopiert .po, .mo und die JSON-Dateien an ihren Platz.

Die Einzelschritte

Falls nur ein Teil gebraucht wird:

npm run i18n:pot    # Vorlage neu erzeugen
npm run i18n:php    # nur die .l10n.php
npm run i18n:json   # nur die JSON-Dateien

Wenn eine Übersetzung nicht erscheint

Der Reihe nach prüfen:

  1. Steht die Zeichenkette in der .po und ist msgstr gefüllt?
  2. Ist npm run i18n:build gelaufen?
  3. Ist Update language strings in der Admin-Bar ausgeführt?
  4. Bei Texten im Editor: Gibt es eine passende JSON-Datei für den Skript-Handle?

Der vierte Punkt ist die häufigste Ursache bei Blocktexten. Die JSON-Dateien tragen den Skript-Handle im Namen; ändert sich der Handle, muss npm run i18n:json erneut laufen.

Veraltete Pfade in der .pot legen Editor-Übersetzungen still

WordPress findet die JSON-Datei zu einem Skript über einen md5-Hash des Skriptpfads. Dieser Pfad kommt aus der .pot. Wandert eine Datei im Theme an eine andere Stelle, ohne dass npm run i18n:pot danach läuft, zeigt der Hash ins Leere: Die JSON-Datei existiert, wird aber nie geladen, und der Block bleibt englisch — ohne Fehlermeldung.

Stand August 2026 betrifft das 16 der 46 Einträge im Manifest, weil die .pot noch die Pfade von vor der Modulumsortierung trägt. Ein npm run i18n:pot mit anschließendem msgmerge räumt das auf, ändert dabei aber alle Referenzen und damit sämtliche Sprachdateien. Das gehört deshalb in einen eigenen Durchgang auf eigenem Branch.

Englische Zeichenketten

Unter scripts/ liegen i18n-apply-en.mjs und i18n-apply-en.py. Sie sind Hilfsmittel für die englische Fassung und nicht Teil des normalen Ablaufs.

Was der Code sagt und was der Anwender sieht

Die Zeichenketten im Code sind englisch, die Übersetzung ist deutsch. Das erklärt einen Umstand, der beim Nachschlagen auffällt: Ein Modul heißt im Code maintenance und trägt den Namen Maintenance Mode, während die Oberfläche Wartungsmodus zeigt.

Diese Dokumentation nennt bei Modulen und Blöcken beides — den technischen Slug zum Suchen im Code und die Beschriftung zum Wiederfinden im Backend.

Mehrsprachige Seiten

Für mehrsprachige Projekte gibt es eine Polylang-Anbindung in includes/plugins/polylang.php. Sie bringt den Shortcode [twtheme_language_switcher] und zwei Filter mit:

Filter Zweck
twtheme_pll_hidden_post_types Inhaltstypen, die nicht übersetzt werden
twtheme_pll_synced_meta_map Felder, die zwischen Sprachen synchron bleiben

Der zweite ist wichtig für Konfigurations-Inhaltstypen wie Slider oder Modals: Deren Felder sollen in allen Sprachen gleich sein, nicht je Sprache gepflegt werden.

Weiter