Multi-language-PHP-Anwendung: best practice?
Ich würde gerne Ihr feedback über die Art und Weise, die ich implementiert multi-language-support auf meine PHP-MVC-web-app. Das ist, wie ich getan habe:
- in den /app Ordner die ich erstellt ein /languages-Ordner enthält eine Datei pro Sprache (english.php, spanish.php etc.)
- jede Datei enthält eine Reihe von Variablen mit dem gleichen Namen in einzelnen Dateien mit den Texten zum Rendern der Ansichten
- diese Variablen werden dann ausgegeben in den verschiedenen Ansichten
- eine "Sprache" cookie-variable wird aktualisiert, wenn der Benutzer die Sprache ändert
- in die Steuerung der einzelnen views habe ich auch eine language-Datei auf dem folgenden format:
include $_SERVER['DOCUMENT_ROOT'] . "/app/languages/" . $_COOKIE["Sprache"] . ".php";
Klingt ziemlich nett zu mir. Haben Sie irgendwelche negativen Gedanken über diese Methode?
- Verwenden Sie nicht den cookie-Wert und ohne Prüfung, wird ein cookie kann verändert werden, indem der client!
- Ein paar Dinge, möchten Sie vielleicht die Sprache ein Teil der URL. So, die bots können Ihre Website indizieren. Auch, möchten Sie vielleicht, um den Inhalt zu verschieben, um die DB anstatt es in eine Datei, weil dann wird es einfacher für Sie, um neue Sprachen hinzufügen
- gute Punkte, danke für den Hinweis aus der Validierung zeigen! Ich erwäge verschieben auf die DB. Ich schließlich dachte Umweg über eine Datei ist möglicherweise eine bessere Leistung her... Aber möglicherweise schwieriger zu pflegen, in der Tat. Wenn ich ging durch die DB-option, ich dachte, es entwerfen (ich bin mit mySQL) erstellen Sie ein Feld Sprache, und dann ein Feld pro Seite (index.php, home.php etc), die jeweils mit einem array der verschiedenen Texte zu Rendern auf jeder Seite. Was denkst du?
- Welche version von PHP verwenden Sie?
- Ich bin mit 5.3.2
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie bist du auf PHP 5.3.2, ich würde definitiv empfehlen, Check-out die intl - Erweiterung, wenn Sie können. Es ist voller praktischer Funktionen und Klassen zu helfen, in i18n. Zum Beispiel können Sie das folgende snippet zu erzeugen, eine "best-fit" - Sprache für Ihre Besucher-von denen, die Sie zur Verfügung haben:
Gibt es auch eine Menge mehr zu denken, als gerade Wort-für-Wort-Ersetzungen. Unterschiedliche Sprachen unterschiedliche Konventionen. Es gibt eine Menge von Informationen in diesem Zend Artikel, dass könnte sich als nützlich erweisen.
Mein code verwendet XSL für das templating so persönlich, wenn es um die übersetzungen, die ich verwenden XML-Sprache Dateien und XPath-Abfragen so, dass die language-Datei verstanden werden kann, direkt durch Vorlagen, aber auch für PHP verfügbar für die Formatierung von strings mit MessageFormatter.
Ich würde vermeiden, mit der Datenbank zu speichern, um ehrlich zu sein, einfach für die Leistung.
Könnte man auch Parsen, der den accept-language-header, um zu entscheiden, was tun.
Mir so aussieht. Es ist nicht narrensicher, aber es könnte ein Weg sein, um den entsprechenden cookie automatisch.
nur einige Gedanken
Als Sie sind nur Daten in den Sprachdateien, würde ich empfehlen, mit GetText. Es ist eine Portierung des standard-GetText-von C++ für die Internationalisierung, es gibt Unmengen an tools, um den Aufbau der Sprachdateien und ist sehr schnell aufgrund kompilierten Dateien während der Laufzeit.
Sie im wesentlichen bauen Sie Ihre Daten-Dateien (z.B. fr.po, en.po) mit einer Art INI-Datei-format und kompilieren Sie diese Dateien spezialisiert .mo-Dateien (fr.mo, en.mo, ...) und einfach-echo der internationalized strings mit der statischen Funktion
_()
z.B.echo _("Hello World");
produzieren würde, die Deutsche AusgabeHallo Welt
oder (wenn keine übersetzung verfügbar ist in der .mo-Dateien), die Standard-ZeichenfolgeHello World
.Als für die Wahl der richtigen Sprache: das hängt von Ihren Anforderungen ab. Wie bereits erwähnt, sollten Sie die
Accept-language
-Header des Browsers und vielleicht möchten hinzufügen von Unterstützung für ein überschreiben durch session-Informationen.