Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So führen oder laden Sie .po/.mo-Dateien zur Lokalisierung in PHP

Zunächst müssen Sie PHP mitteilen, welches Gebietsschema und welche Domäne Sie verwenden.

putenv("LANG=da_DK"); 
setlocale('LC_ALL', "da_DK"); 
bindtextdomain("mycatalog", "./locale/");  
textdomain("mycatalog");

In diesem Fall habe ich eine dänische Übersetzung und eine Datei namens mycatalog.mo (und .po). Diese Dateien werden (von Ihrem Stammverzeichnis) hier abgelegt:locale/da_DK/LC_MESSAGES/mycatalog.mo/po

Um Ihre Übersetzung anzuzeigen, gehen Sie wie folgt vor:

echo _("Hello world");   // Which would become "Hej verden"

_(); ist ein Alias ​​von gettext(); Das Schlaue an Gettexten ist, dass Sie ohne Übersetzung keinen hässlichen Sprachcode wie "MSG_HELLO_WORLD" in Ihrer Benutzeroberfläche haben, sondern eine bessere Alternative:Einfach den reinen englischen Text.

In der Datei messages.po müssen Sie alle Nachrichten (Groß-/Kleinschreibung und auch in Bezug auf verwendete Kommas, Punkte, Doppelpunkte usw.) auf diesem Formular haben:

msgid "Hello world!"
msgstr "Hej verden!"

Wenn Sie dies zu Ihrer .po-Datei hinzugefügt haben, öffnen Sie diese Datei in poedit, klicken Sie auf "Speichern" und es wird eine .mo-Datei generiert. Diese Datei wird in dasselbe Verzeichnis wie die .po-Datei hochgeladen (normalerweise so etwas wie \locale\da_DK\LC_MESSAGES\ aus dem Skriptstammverzeichnis)

Um dynamische/variable Inhalte zu übersetzen, können Sie unter anderem sprintf auf diese Weise verwenden:

echo sprintf(_("My name is %s"), $name);

In diesem Fall erscheint %s in der .po-Datei; Wenn Sie die übersetzte Zeichenfolge haben (die %s enthält), stellt sprintf sicher, dass %s durch den Variableninhalt ersetzt wird. WENN die Variable auch übersetzt werden muss, können Sie dies tun:

echo sprintf(_("The color of my house is %s"), _($color));

Dann brauchen Sie nicht für jede Farbe einen ganzen Satz, sondern bekommen die Farben trotzdem übersetzt.

Es ist wichtig zu beachten, dass das erste Mal, wenn eine .mo auf dem Server ausgeführt wird, zwischengespeichert wird - und es keine Möglichkeit gibt, diese Datei aus dem Cache zu entfernen, ohne neu zu starten (Apache oder ähnliches selbst sollte ausreichen). Das bedeutet, dass alle Änderungen, die Sie nach der ersten Verwendung an der .mo-Datei vornehmen, nicht wirksam werden. Es gibt eine Reihe von Hacks, um dies zu umgehen, aber ehrlich gesagt sind sie meistens nicht sehr hübsch (sie beinhalten das Kopieren der .mo, das Hinzufügen der Zeit() dahinter und das erneute Importieren und Zwischenspeichern). Dieser letzte Absatz ist nur dann von Bedeutung, wenn Sie nicht alles auf einmal, sondern in Stücken übersetzen.

Wenn Sie irgendwann Ihr eigenes Übersetzungstool erstellen möchten, hilft Ihnen dieses Tool, .po mit PHP in .mo umzuwandeln:

http://www.josscrowcroft.com/2011/code/php-mo-convert-gettext-po-file-to-binary-mo-file-php/