Gettext mit PHP unter Windows 11
Ja, ich habe es geschafft, nachdem ich nur 8 Stunden zwischen Tests und Debugging verbracht habe, habe ich erfolgreich gettext auf Windows für meine lokale PHP-Umgebung aktiviert! Wenn Sie das hier lesen, haben Sie wahrscheinlich auch so zu kämpfen wie ich heute.
Wichtige Prämisse: In meinem Fall habe ich Laragon und PHP 8.1.10 mit Apache als Webserver verwendet. Mit anderen Umgebungen wie XAMP oder WAMP, oder mit Nginx und anderen PHP-Versionen kann es anders funktionieren.
Tabelle der Inhalte
- Vorbereiten der PHP-Umgebung
- Das regionale Sprachformat von Windows
- Wie gettext mit PHP unter Windows funktioniert
- Abfrage der Benutzersprache vom Browser
- Automatisches Übersetzen der PHP-Dateien mit xgettext und msgfmt
- Modifizierung der Umgebungsvariablen unter Windows
- Ändern der Systemvariable PATH
- Hinzufügen einer neuen Variable mit dem Pfad zu den ausführbaren Dateien von gettext
- Ausführen der Befehle zum automatischen Kompilieren und Aktualisieren der PO-Dateien
- Alle PHP-Dateien auf einmal übersetzen
- Automatisches Kompilieren der MO-Dateien
- Entfernen veralteter Strings, die nicht mehr benötigt werden
- Wie man mit PoEdit manuell übersetzt
- Ändern von PO-Dateien mit einem Texteditor
- Schlussfolgerungen
- Lesen Sie auch
Vorbereiten der PHP-Umgebung
Als erstes müssen wir die gettext-Erweiterung in PHP aktivieren, indem wir die php.ini bearbeiten
# php.ini Erweiterung=gettext
Dann überprüfen wir, ob sie mit phpinfo aktiviert wurde:
// index.php phpinfo();
Die Ausgabe muss uns zeigen, dass gettext tatsächlich aktiviert ist:
Das könnte Sie auch interessieren: Wie man Matomos Server Side Tracking verwendet
Windows regionales Sprachformat
Ich weiß, es klingt unglaublich, aber die Verwendung von gettext hängt vom Regionalformat der Sprache ab, die wir unter Windows haben. Ich habe Stunden damit verbracht, zu diesem Ergebnis zu kommen, aber es ist so, zumindest für mich.
Schauen wir uns also unser Regionalformat an:
Wir können die Sprachcodes auch in den Microsoft-Dokumenten finden:
Im Allgemeinen brauchen wir nur die Codes mit zwei Buchstaben, "it" für Italienisch, "en" für Englisch usw. Möglicherweise müssen Sie einen spezifischeren Code verwenden, wie "it-IT" oder "en-US". Beachten Sie, dass Windows den Bindestrich verwendet , während Unix den Unterstrich benutzt. Unter Linux haben Sie "fr_FR", während Windows "fr-FR" verwendet.
Wir werden diesen Code mit setlocale in PHP und, wie wir gleich sehen werden, für die Textdomäne verwenden.
Wie funktioniert gettext mit PHP unter Windows?
Kurz und bündig: Angenommen, wir haben "Italienisch" als Regionalsprache eingestellt (siehe oben). Gettext sucht nach MO-Dateien im Ordner "it" in dem Pfad, den wir in PHP mit den Funktionen auf der Textdomain angeben:
$language = 'fr'; // Französisch, oder ich könnte auch fr-FR verwenden $domain = 'mydomain_' . $language; // Die Domain wird mydomain_fr sein, also wird PHP nach der Datei mydomain_fr suchen.mo setlocale(LC_ALL, $language); bindtextdomain($domain, 'C:\laragon\usr\locale'); // PHP wird in diesem Pfad nach dem Ordner "it" suchen, basierend auf dem Sprachcode des Regionalformats auf unserem System textdomain($domain); bind_textdomain_codeset($domain, 'UTF-8'); # Alle meine .mo-Dateien müssen sich daher in C:\laragon\usr\locale\it befinden
Bitte beachten Sie, dass wir unter Windows LC_ALL verwenden, wir haben weder LC_MESSAGES noch LC_TIME , die unter Unix verwendet werden . LC_ALL wird für alle Locales verwendet, wie in der PHP-Dokumentation für setlocale beschrieben.
Schließlich handelt es sich bei gettext um eine GNU-Software.
Abfrage der Benutzersprache vom Browser
Wenn wir wissen wollen, in welcher Sprache der Benutzer surft, können wir das so machen:
$language = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
Dies ist nur ein Header, der vom Browser gesendet wird. Es kann sein, dass er gar nicht gesetzt ist, also stellen Sie sicher, dass Sie ein Standardgebietsschema wie "en" definieren.
Mit dieser Einrichtung müssen alle .mo-Dateien dieser Struktur folgen:
C:\laragon\ - usr - locale - it (Sprachcode für mein regionales Format unter Windows) .\mydomain_fr.mo ---> dies ist die Datei, die geladen wird, weil ich locale() auf "fr" gesetzt habe .\mydomain_it.mo .\mydomain_es.mo
Wir können die $domain ändern, um eine andere MO-Datei für ein anderes Projekt zu verwenden (myotherdomain_fr.mo) und wir können die $language ändern, um die MO-Datei für eine andere Sprache zu verwenden (mydomain_es.mo).
Automatisches Übersetzen der PHP-Dateien mit xgettext und msgfmt
Dieser Schritt ist optional und nur dann sinnvoll, wenn wir die PO-Dateien automatisch kompilieren und aktualisieren müssen, wenn wir neue Textstrings in unsere PHP-Website oder -Anwendung eingefügt haben.
Auch unter Windows können wir mit xgettext und msgfmt die gleichen Aktionen durchführen wie unter Unix .
Alle Zeichenketten, die mit der Funktion php gettext() oder ihrem Alias _() verwendet werden, werden in einer PO-Datei konfiguriert, um übersetzt zu werden. Dies geschieht automatisch, was uns viel Zeit spart!
Beispiel für übersetzbare Strings:
# index.php _('Seitentitel') _('Mein Text') gettext('Ein anderer Text')
Schauen wir uns an, wie man das macht:
- Laden wir gettext für Windows aus dem Github-Repository von Michele Locali herunter, dem wir dafür danken. Falls der Download nicht funktioniert, habe ich die neueste gettext-Version hier hochgeladen: gettext 0.21 Windows
- Alternativ können wir auch Poedit installieren, eine Open-Source-Software , die eine grafische Oberfläche zum Bearbeiten von PO-Dateien und zum Erzeugen von MO-Dateien bietet
- Im Poedit-Installationsordner finden wir GettextTools\bin , wo wir die ausführbaren Dateien für Windows (.exe.) für xgettext und msgfmt finden
- An dieser Stelle konfigurieren wir den Pfad in den Windows-Systemvariablen, unten sind die Screenshots mit den zu befolgenden Schritten:
- Wir suchen unter Windows nach Umgebungsvariablen bearbeiten
- Dann klicken wir auf Umgebungsvariablen
- In den Systemvariablen ändern wir unten den Pfad, oder fügen ihn hinzu, falls er nicht vorhanden ist
- Wir fügen eine neue Variable mit dem Pfad hinzu, der zu Poedit\GettextTools\bin führt
In der Praxis werden die Path-Variablen verwendet, um bestimmte Befehle wie xgettext und msgfmt von jedem Punkt des Terminals aus ausführbar zu machen , oder zum Beispiel cwebp , wenn wir die WebP-Bibliotheken verwenden, oder ffmpeg , wenn wir ein Video konvertieren wollen.
Ändern der Umgebungs-Systemvariablen unter Windows
Über die Suchleiste unter Windows können wir das Tool zum Bearbeiten der Systemvariablen öffnen:
Ändern der Systemvariablen PATH
Ändern wir die Path-Variable für unser System, oder eventuell nur für unseren Benutzer, wenn wir das bevorzugen:
Hinzufügen einer neuen Variable mit dem Pfad der ausführbaren Dateien von gettext
Jetzt fügen wir eine neue Variable für Path hinzu, die den Pfad zum gettext-Ordner mit den ausführbaren Dateien enthält:
Ich muss dem Benutzer Desintegr von StackOverflow Anerkennung zollen, denn dank ihm habe ich entdeckt, dass sich die ausführbaren Windows-Dateien im GettextTools-Ordner von Poedit befinden.
Ausführen der Befehle zum automatischen Kompilieren und Aktualisieren der PO-Dateien
Nachdem wir diese Operationen durchgeführt haben, um xgettext und msgfmt global zu setzen, können wir mit dem nächsten Schritt fortfahren. Eigentlich könnten wir die ausführbaren Dateien auch direkt aus dem Poedit-Ordner starten, aber es ist viel bequemer, die Umgebungsvariablen zu setzen.
Wenn wir uns für PoEdit entschieden haben, ist die ausführbare Datei msgattrib nicht in den GettextTools enthalten. Um es zu verwenden, müssen wir, wie bereits erwähnt, gettext für Windows aus dem Github-Repository von Michele Locali herunterladen . In diesem Fall sollte die Umgebungsvariable für Path auf den Pfad zeigen, in dem wir gettext abgelegt haben, zum Beispiel C:\Programme\gettext
REM Übersetzen einer einzelnen Datei, in diesem Fall einer PHP-Datei xgettext -d it -p \path\to\project\locale\it -L PHP --from-code=UTF-8 --no-location -j \path\to\project\index.php REM Kompilieren von MO-Dateien msgfmt -D \path\to\project\locale\it it.po -o \path\to\project\locale\it\LC_MESSAGES\mydomain_it.mo
Hinweis: Um von gettext erkannt zu werden, müssen Zeichenketten mit der Funktion gettext() oder ihrem Alias _() verwendet werden. Siehe die gettext-Dokumentation.
Wenn Sie die Fehlermeldung "No such file or directory" für die PO-Datei erhalten, liegt das wahrscheinlich daran, dass wir die PO-Datei zuerst erstellen müssen. Sie wird nicht von gettext erstellt, sondern muss bereits existieren. Wir können sie als einfache Textdatei erstellen oder PoEdit verwenden.
Alle PHP-Dateien auf einmal übersetzen
Wir können diesen Code an unsere Bedürfnisse anpassen und ihn als .bat-Datei speichern:
@echo off REM hier können wir die Zählung und die Pause weglassen, wenn wir sie nicht brauchen SET count=1 REM wir fragen den Benutzer nach der Sprache, z.B. es oder fr SET /p language=Enter language:
FOR /f "tokens=*" %%G IN ('dir *.php /b /s') DO (call :subroutine "%%G") pause GOTO :eof :subroutine REM hier können wir auch die echo und set Befehle weglassen echo %count%:%1 REM wir fügen --no-location hinzu, wenn wir den Pfad, wo die Übersetzung gefunden wurde, aus der PO Datei entfernen wollen xgettext.exe -j %1 -d %language% -p \path\to\locale\it -L PHP --from-code=UTF-8 set /a count+=1 GOTO :eof
Diese BAT-Datei speichert in \path\to\locale\it die Datei it.po mit allen vorkompilierten Zeichenfolgen für jedes gefundene PHP . Wir können die Verwendung von "pause" vermeiden, wenn wir wollen, dass das Terminal geschlossen wird, sobald es die Aufgabe erledigt hat.
Hinweis: Dieses Skript sucht nach allen PHP-Dateien innerhalb desselben Ordners und der Unterordner, beginnend mit dem Ort, an dem sich die BAT-Datei befindet. Wir können den Bereich der Ordner erweitern oder reduzieren, indem wir einfach die BAT-Dateien im Ordnerbaum verschieben .
Ich muss mich bei der Dokumentation über die FOR-Schleife auf CMD von SS64 bedanken, denn ich hatte Schwierigkeiten, die Schleife zum Laufen zu bringen.
Die Anzahl ist nur etwas Nützliches, um eine bessere Ausgabe in der Eingabeaufforderung zu haben.
Wir fügen --no-location hinzu, wenn wir den Pfad, in dem die Übersetzung gefunden wurde, aus der PO-Datei entfernen wollen.
Der folgende Fehler kann ignoriert werden, er wird wahrscheinlich durch die Verwendung des Attributs -j innerhalb der for-Schleife verursacht.
Charset "CHARSET" ist kein portabler Kodierungsname. Die Konvertierung der Nachricht in den Zeichensatz des Benutzers funktioniert möglicherweise nicht.
Automatisches Kompilieren der MO-Dateien
Wenn Sie PoEdit nicht zum Erstellen der MO-Datei verwenden und dies automatisch tun möchten, können Sie diesen Code in einer BAT-Datei speichern, nachdem Sie ihn an Ihre Bedürfnisse angepasst haben:
@echo off REM fragt den Benutzer nach der Sprache, z.B. es oder fr, und der Domain, z.B. "my_project" SET /p language=Enter language:
SET /p domain=Domain eingeben: msgfmt -D \path\to\locale\%language% %language%.po -o \path\to\locale\%language%\LC_MESSAGES\mydomain_%language%.mo
Sie können die Eingaben für Sprache und Domäne entfernen, wenn Sie dies wünschen. Vielen Dank an Instantsoup von StackOverflow für die Idee.
Entfernen Sie veraltete Zeichenketten, die nicht mehr benötigt werden
REM Um die PO-Dateien zu aktualisieren, entfernen Sie die nicht mehr benötigten Zeichenfolgen aus den PHP-Dateien: REM 1) Erstellen Sie die PO SET /p sourcelanguage=Geben Sie die Sprache ein, auf die verwiesen werden soll:
SET /p destinationlanguage=Geben Sie die Zielsprache ein:
xgettext -d %sourcelanguage% -p \path\to\project\locale\%sourcelanguage% -L PHP --from-code=UTF-8 --no-location -j file.php REM 2) Machen Sie einen Vergleich zwischen it.po und en.po, dann markieren Sie die zusätzlichen Strings, die nicht in it.po enthalten sind, als veraltet msgattrib --set-obsolete --ignore-file=\path\to\project\locale\%sourcelanguage%.po -o \path\to\project\locale\%destinationlanguage%.po \path\to\project\locale\%destinationlanguage%.po REM 3) Veraltete Zeichenfolgen entfernen msgattrib --no-obsolete -o \path\to\project\locale\%destinationlanguage%.po \path\to\project\locale\%destinationlanguage%.po
Wir speichern den obigen Code als .bat-Datei, nachdem wir ihn an unsere Bedürfnisse angepasst haben.
Nachdem wir die PO-Datei erstellt haben, führen wir msgattrib aus, das die Zeichenketten findet, die noch in en.po, aber nicht mehr in it.po enthalten sind, die zusätzlichen Zeichenketten als veraltet markiert und sie dann entfernt.
Bitte beachten Sie, dass msgattrib nicht übersetzte Zeichenketten, bei denen msgstr leer ist, entfernt, wenn es diese findet.
Wie man mit PoEdit manuell übersetzt
Es ist klar, dass wir früher oder später die Texte auch übersetzen müssen, oder sie an Übersetzer weitergeben müssen.
PO (Portable Object) -Dateien sind "menschenlesbar", wir können sie mit jedem Texteditor öffnen und bearbeiten. MO (Machine Object) -Dateien hingegen sind nur für den Computer lesbar, es handelt sich um Binärdateien. Auch Portable Object Template (POT) -Dateien sind eine Vorlage für die Erstellung von PO-Dateien, aber sie sind optional.
Hier ist ein Beispiel für eine PO-Datei :
# it.po msgid "This is a title" msgstr "Questo è un titolo" msgid "Some other text" msgstr "Dell'altro testo"
Wir haben also die msgid , die die zu übersetzende Zeichenkette angibt, und die msgstr , die die tatsächliche Übersetzung in der gewünschten Sprache angibt.
Wir können diese POs mit dem Editor oder mit PoEdit bearbeiten : Beachten Sie, dass wir mit PoEdit nur die endgültigen Übersetzungen bearbeiten können, nicht aber die ursprünglichen Zeichenketten:
Oben stehen die im PO vorhandenen Zeichenfolgen, unten der Ausgangstext (msgid) und die Übersetzung (msgstr).
Auf der rechten Seite befinden sich auch die Übersetzungsvorschläge, die allerdings eine kostenpflichtige Funktion sind.
Wir speichern die PO-Datei und die MO-Datei wird automatisch im selben Ordner erstellt. Wir können auch nur die MO-Datei erzeugen , indem wir auf Datei > MO kompilieren gehen.
Ändern von PO-Dateien mit einem Texteditor
Wie wir gesehen haben, können wir die PO-Dateien mit einem beliebigen Editor bearbeiten. Ich persönlich verwende VSCodium und habe die gettext-Erweiterung für die Syntaxhervorhebung installiert. Wir könnten auch Notepad++ oder das gute alte Windows Notepad verwenden.
Wenn wir fertig sind, können wir die PO-Datei speichern und die vorherige Datei überschreiben. Um sie in MO zu konvertieren, müssen wir PoEdit verwenden oder den Befehl msgfmt ausführen.
Schlussfolgerungen
Wichtig ist, dass sich alle MO-Dateien im gleichen Ordner befinden, der auf unserem Windows-Regionalformat basiert!
Wenn dieser Artikel hilfreich für Sie war, folgen Sie mir auf Facebook und Youtube! Hinterlassen Sie unten einen Kommentar , um mir mitzuteilen, was Sie denken oder ob Sie Schwierigkeiten beim Einrichten von gettext hatten!
Lies auch
- Wie man WEM-Dateien in abspielbare OGG- und MP3-Audiodateien umwandelt
- Wie man mehrere Videos einfach und schnell mit FFMPEG concatenate zusammenfügt
Wenn Sie können, unterstützen Sie meine Arbeit! Bildnachweis für die Vorschau: Unsplash