Ü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¶
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¶
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:
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:
- Steht die Zeichenkette in der
.pound istmsgstrgefüllt? - Ist
npm run i18n:buildgelaufen? - Ist Update language strings in der Admin-Bar ausgeführt?
- 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.