Wie stelle ich das Gebietsschema eines Benutzers in PHP automatisch ein?

8

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 ".)

    
Sean 28.11.2008, 23:27
quelle

4 Antworten

2

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?

    
Kornel 29.11.2008, 02:09
quelle
5

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).

    
Stefan Gehrig 29.11.2008 10:39
quelle
2
  

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.

Schauen Sie es sich an

    
markus 29.11.2008 11:04
quelle
1

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.

    
troelskn 29.11.2008 12:02
quelle