Wenn ihr ein Plugin oder Theme übersetzen möchtet, dann würde ich euch immer empfehlen dies mit der kostenlosen Software Poedit zu machen, die es für Windows, Linux und Mac gibt. Die Pro-Version bringt ein paar spezielle WordPress-Funtionalitäten mit, aber die sind nicht unbedingt notwendig. Dennoch kann ich diese absolut empfehlen. Für einen einmaligen Kaufpreis ist die Software recht günstig und sie kann euch viel Zeit sparen, besonders bei der Übersetzung von Themes, die sehr ähnliche Strings haben.
Aber in diesem Beitrag soll es nicht darum gehen, wie ihr mit Poedit Plugins oder Themes übersetzt. Stattdessen will ich euch zeigen, wie ihr das nur mit ein paar Befehlen auf der Kommandozeile umsetzen könnt. Also auch wenn ihr keine zusätzlich Software (oder Plugins) verwenden könnt, ist es möglich.
Erstellen eines Übersetzungs-Templates
Der erste Schritt ist die Erstellung einer POT (Portable Object Template) Datei mit allen Strings, die euer Plugin/Theme verwendet. Wenn ich Poedit verwende, dann überspringe ich diesen Schritt meistens und verwende eine sprachspezifische Vorlage, die es Poedit erlaubt nach übersetzbaren Strings zu suchen. Der einfachste Weg ist aber die Verwendung eines WP-CLI Befehls um eine solche Datei zu erstellen:
wp i18n make-pot . languages/text-domain.pot
Wenn ihr diesen Befehl ausführt werden alle PHP und JavaScrupt Datein nach Strings durchsucht, deren Text-Domain gleich dem Namen des Plugin/Theme-Ordner ist. Es erstellt eine POT Datei im languages
Ordner (ihr müsst einen solchen Ordner eventuell vorher erstellen). Dieser Befehl kennt alle Übersetzungsfunktionen von WordPress (die gleichen Funktionen, die ich in meiner Vorlage stehen habe).
Erstellen einer sprachspezifischen Übersetzung
Ale nächstes erstellen wir eine Übersetzung für eine Sprache, indem wir die POT Datei in eine PO (Portable Object) Datei kopieren. Hierzu wird die „Locale“ für die Sprache angehängt:
cp languages/text-domain.pot languages/text-domain-de_DE.po
Nun könnt ihr diese Datei in einem Texteditor öffnen und die Strings manuell übersetzen. Im Header der Datei könnt ihr noch die Sprache festlegen, technisch ist es aber nicht unbedingt notwendig.
Erstellen der binären Übersetzungsdatei
WordPress verwendet MO (Machine Object) Dateien, um Übersetzungen zu laden. Auch hierzu gibt es einen Befehl, der in vielen Betriebssystemen verfügbar ist (oder unter Windows in der Git-Bash, cygwin oder ähnlichem enthalten ist):
msgfmt languages/text-domain-de_DE.po -o languages/text-domain-de_DE.mo
Mehr braucht es nicht, um Übersetzungen zu erstellen. Ihr könnt nun überprüfen, ob die Übersetzungen in eurer WordPress-Installation verwendet werden (nachdem ihr natürlich sichergestellt habt, dass ihr eine entsprechende load_textdomain
in eurem Plugin/Theme habt, der die Übersetzungsdatei lädt).
Bonus: Übersetzungen aktualisieren
Jedes Mal, wenn ihr Änderungen an den Strings vornehmt, müsst ihr die Übersetzungsdateien aktualisieren. Wenn ihr Poedit verwendet (und es richtig konfiguriert habt), könnt einfach nach diesen neuen Strings suchen lassen. Wenn ihr aber nur das Terminal verwendet ist die ebenfalls möglich. Führt dazu folgenden erneut Befehl aus:
wp i18n make-pot . languages/text-domain.pot
Dies generiert jedes mal eine neue Vorlagendatei und überschreibt die bestehende. Da POT Dateien keine übersetzen Stings enthalten (da sie nicht für eine spezifische Sprache verwendet werden) ist das kein Problem. Aber wie aktualisiert ihr eine sprachspezifische Übersetzungsdatei, ohne alle Strings erneut zu übersetzen? Hierzu könnt ihr das merge
Argument verwenden:
wp i18n make-pot . languages/text-domain-de_DE.po --merge=languages/text-domain-de_DE.po
Das scannt erneut alle PHP und JavaScript Dateien aus dem aktuellen Ordner und „merged“ es mit der bestehenden Sprachdatei und schreibt alles in diese zurück. Nur Strings, die noch nicht in diese Datei vorhanden sind, werden neu hinzugefügt. Bereits übersetzte Strings bleiben erhalten. Der einzige Nachteil: der Befehl entfernt keine Strings, die nicht mehr in euren PHP oder JavaScript Dateien vorhanden sind.
Fazit
Wenn ihr sehr einfach Übersetzungen von Plugins oder Themes anfertigen wollt, dann verwendet am besten Poedit oder ähnliche Lösungen. Aber in den Fällen, in denen ihr diese nicht verwenden könnt, habt ihr auch über das Terminal die Möglichkeit zu übersetzen.
Ein Gebiet, bei dem der wp i18n make-pot
Befehl sehr nützlich sein kann ist der Einsatz in eurem CI/CD-Workflow. Hier erstellt ihr einen Task, der diesen Befehl ausführt und immer eine aktuelle POT Datei zu euren aktuellen Entwicklungsstand erstellt.
Das ist ein Tipp ohne Tiefgang. Was ist z.B. wenn PoEdit die Strings nicht erkennt, weil keine pot-Datei vorliegt oder nicht nach Standard vorgegangen wurde?
Ich weiß ja, man verrät nicht alle Geheimnisse, aber wozu dann dieser Artikel?
Ich stehe nämlich vor dem Problem das bekannte Plugin WP Armour übersetzen zu wollen, von dem es auf der Entwickler-Seite aber selber heißt, es sei nicht für Übersetzen vorbereitet. Wenn schon Poedit, dann gehören solche vorbereitenden Fragen dazu.
Grüße
Ralph
Hallo Ralph,
ich finde deinen Kommentar sehr respektlos. Du unterstellst mir, dass ich absichtlich „Geheimnisse“ zurückhalte.
In meinem Beitrag erkläre ich, wie man ein Plugin übersetzt, ohne dabei auf Software wie Poedit angewiesen zu sein. Das ist eben möglich.
Der Beitrag beschreibt von der Übersetzung eines Plugins den „Localization“ (L10n) Teil, aber nicht den „Internationalization“ (I18n) Teil. Genau das ist das Problem mit WP Armor und das wird auch so anzeigt:
Grundvoraussetzung dafür, dass ein Plugin überhaupt übersetzt werden kann, ist die Verwendung von entsprechenden Übersetzungsfunktionen im Code des Plugin. Das wurde im Plugin an keiner einzigen Stelle getan. Stattdessen sind alle Texte statisch hinterlegt.
Damit ist es schlicht unmöglich, das Plugin zu übersetzen. Nicht über den von mir vorgestellten Weg, nicht mit Poedit, nicht mit einem Plugin und auch sonst nicht. Es ist erst dann möglich, wenn das Plugin „properly prepared for localization“ ist. Ich würde dir also empfehlen, im Plugin-Support-Forum ein Ticket zu erstellen und darum zu bitten, dass das Plugin entsprechend angepasst wird.