Gibt es eine einfache Möglichkeit, die HTTP_ACCEPT_LANGUAGE des Benutzers zu analysieren und das Gebietsschema in PHP zu setzen?
Ich weiß, dass das Zend-Framework eine Methode dafür hat, aber ich würde lieber nicht das gesamte Framework installieren, nur um diese ein bisschen Funktionalität zu nutzen.
Das Paket PEAR I18Nv2 befindet sich in der Beta-Phase und wurde seit fast drei Jahren nicht mehr geändert. Daher würde ich es lieber nicht verwenden, wenn es möglich ist.
Auch wäre es schön, wenn es herausfinden könnte, ob der Server unter Windows läuft oder nicht, da Windows Gebietsschemastrings sich vom Rest der Welt unterscheiden ... (Deutsch ist "deu" oder "deutsch" statt " de ".)
Schöne Lösung ist auf dem Weg .
Ohne dass Sie diesen Header parsen müssen. Es ist eine durch Kommas getrennte Liste von Semikolon-getrennten Gebietsschemas und Attributen.
Es kann so aussehen:
%Vor% und probiere jedes Gebietsschema aus, bis setlocale()
es akzeptiert. Bereite dich darauf vor, dass keiner von ihnen zusammenpasst.
Beruhen Sie sich nicht darauf, etwas zu Wichtiges zu tun oder erlauben Sie Benutzern, es zu überschreiben, weil einige Benutzer möglicherweise falsch konfigurierte Browser haben.
Für das Windows-Gebietsschema müssen Sie möglicherweise ISO 639-1-Namen in ISO 639-2 / 3 konvertieren?
Es ist nicht so einfach wie es sein sollte (meiner bescheidenen Meinung nach). Zuerst müssen Sie die Locales aus $_SERVER['HTTP_ACCEPT_LANGUAGE']
extrahieren und nach ihren q
-Werten sortieren. Anschließend müssen Sie für jedes der gegebenen Gebietsschemas das entsprechende Gebietsschema des Systems abrufen, was auf einem * nix-Rechner kein Problem sein sollte (Sie müssen möglicherweise nur mit dem korrekten Zeichensatz zurechtkommen), aber unter Windows müssen Sie die Gebietsschemas in übersetzen Windows-Ländereinstellungen, z de_DE
wird German_Germany
sein (wieder müssen Sie auch mit Zeichensatzproblemen fertig werden, wenn Sie beispielsweise UTF-8 in Ihrer App verwenden). Ich denke, Sie müssen eine Nachschlagetabelle für dieses Problem erstellen - und es gibt viele Gebietsschemata; -)
Nein, Sie versuchen ein Gebietsschema nach dem anderen (sortiert mit absteigenden q
-Werten), bis Sie eine Übereinstimmung mit setlocale()
(Die Funktion gibt false
zurück, wenn das angegebene Gebietsschema nicht festgelegt werden konnte).
Aber dann wird es ein letztes Hindernis geben:
Die Gebietsschema-Information wird beibehalten pro Prozess, nicht pro Thread. Wenn du laufen PHP auf Multithread Server API wie IIS oder Apache auf Windows kann plötzlich auftreten Änderungen der Gebietsschemaeinstellungen während a Skript läuft obwohl das Skript selbst nie genannt setlocale () selbst. Dies geschieht aufgrund anderer Skripts, die in verschiedenen Threads ausgeführt werden des gleichen Prozesses zur gleichen Zeit Ändern des systemweiten Gebietsschemas mit setlocale ().
(siehe: Ссылка )
Dies bedeutet, dass Sie während der Ausführung eines Skripts plötzliche Gebietsschemaänderungen feststellen können, da ein anderer Benutzer mit einem anderen Gebietsschema Ihre Webseite gerade erreicht.
Daher hängt die erwähnte Zend_Locale
nicht von der PHP-Funktion setlocale()
( Es wird nur zum Abrufen der Informationen zum Systemgebietsschema verwendet. Stattdessen wird ein System verwendet, das auf den Daten basiert, die vom Unicode-CLDR-Projekt bereitgestellt werden. Dies macht die Komponente unabhängig von all diesen setlocale()
Problemen, aber dies bringt auch einige andere Mängel mit sich, wie zum Beispiel das Fehlen von Unterstützung für länderspezifische Zeichenkettenoperationen (Sortieren zum Beispiel).
Ich weiß, dass das Zend Framework eine Methode hat um das zu tun, aber ich würde lieber nicht installieren das ganze Framework nur um das zu nutzen ein bisschen Funktionalität.
Die gute Nachricht von Zend ist, dass Sie nicht alles installieren müssen. Es ist ein lose gekoppeltes Framework und du kannst einfach Zend_Locale verwenden, ohne eine der anderen Komponenten zu verwenden. Vielleicht möchtest du es mit Zend_Translate kombinieren.
Es gibt http_negotiate_language
, aber es hängt von der http-Erweiterung ab . Alternativ finden Sie die Kommentare auf der Manpage für eine Benutzerland-Implementierung.
Tags und Links php locale internationalization