2008-11-28 25 views
8

Czy istnieje łatwy sposób na przeanalizowanie HTTP_ACCEPT_LANGUAGE użytkownika i ustawienie locale w PHP?Jak automatycznie ustawić ustawienia narodowe użytkownika w PHP?

Wiem, że środowisko Zend ma metodę, ale wolałbym nie instalować całej struktury tylko po to, aby użyć tej jednej funkcjonalności.

Pakiet PEAR I18Nv2 jest w wersji beta i nie był zmieniany przez prawie trzy lata, więc wolałbym go nie używać, jeśli to możliwe.

Równie dobrze byłoby, gdyby można było zorientować się, czy serwer działa w systemie Windows, czy nie, ponieważ ciągi znaków narodowych systemu Windows różnią się od reszty świata ... (niemiecki to "deu" lub "niemiecki" zamiast " "de".)

Odpowiedz

2

Przyjemnym rozwiązaniem jest on its way.

Bez tego należy przeanalizować nagłówek. Jest to rozdzielana przecinkami lista rozdzielonych średnikami ustawień regionalnych i atrybutów.

To może wyglądać następująco:

en_US, en;q=0.8, fr_CA;q=0.2, *;q=0.1 

a następnie spróbuj każdego ustawienia aż setlocale() akceptuje. Bądź przygotowany, że żadna z nich nie pasuje.

Nie należy opierać na nim niczego zbyt ważnego lub pozwolić użytkownikom na zastąpienie go, ponieważ niektórzy użytkownicy mogą mieć źle skonfigurowane przeglądarki.


W przypadku ustawień regionalnych Windows, być może trzeba przekonwertować nazwy ISO 639-1 na ISO 639-2/3?

5

To nie jest takie proste, jak być powinno (w mojej skromnej opinii). Przede wszystkim musisz wyodrębnić ustawienia regionalne z $_SERVER['HTTP_ACCEPT_LANGUAGE'] i posortować je według ich wartości q. Następnie musisz pobrać odpowiednie ustawienia regionalne dla każdego z podanych ustawień, co nie powinno stanowić problemu na maszynie * nix (możesz tylko poradzić sobie z poprawnym zestawem znaków), ale w systemie Windows musisz przetłumaczyć ustawienia regionalne na Ustawienia regionalne Windows, np de_DE będzie German_Germany (ponownie musisz poradzić sobie z problemami z zestawem znaków, jeśli używasz na przykład UTF-8 w swojej aplikacji). Myślę, że musisz zbudować tabelę odnośników dla tego problemu - i istnieje wiele ustawień lokalnych ;-)

Nie próbujesz jednego locale po drugim (posortowane z malejącymi wartościami q), dopóki nie znajdziesz dopasowania za pomocą setlocale() (funkcja zwróci false, jeśli nie można ustawić określonych ustawień narodowych).

Ale wtedy nie będzie to ostatnia przeszkoda do radzenia sobie z:

informacje locale jest utrzymywana na proces, nie za wątku. Jeśli PHP działa na serwerze wielowątkowych API jak IIS lub Apache na Windows może wystąpić nagłe zmiany ustawień regionalnych podczas skrypt jest uruchomiony skrypt chociaż sama nigdy nazywa setlocale() się. Dzieje się tak ze względu na inne skrypty działające w różnych wątkach z tego samego procesu w tym samym czasie zmiana ustawień regionalnych na cały proces za pomocą setlocale().

(patrz: http://de2.php.net/manual/en/function.setlocale.php)

Oznacza to, że można wystąpić nagłe zmiany ustawień narodowych podczas wykonywania skryptu, ponieważ inny użytkownik z innej lokalizacji, położonym zaledwie hit swojej strony internetowej.

Dlatego wspomniana nie opiera się na funkcji PHP setlocale() (służy tylko do pobierania informacji o ustawieniach regionalnych), ale zamiast tego używa systemu opartego na danych dostarczonych przez Unicode CLDR Project. To sprawia, że ​​komponent jest niezależny od wszystkich tych problemów, ale także wprowadza pewne inne niedociągnięcia, takie jak brak obsługi operacji ciągów znaków w języku locale (sortowanie na przykład).

2

wiem Zend Framework ma metodę aby to zrobić, ale raczej nie chciałbym zainstalować cały framework prostu w obsłudze, że jeden bit funkcjonalności.

Dobrą wiadomością na temat Zend jest to, że nie trzeba instalować wszystkiego. Jest to luźno powiązana struktura i możesz po prostu użyć Zend_Locale bez użycia żadnego z innych składników. Może chcesz połączyć to z Zend_Translate.

Check it out

1

Jest http_negotiate_language, ale to zależy od http-rozszerzenie. Ewentualnie zobacz komentarze na stronie podręcznika, dotyczące implementacji przestrzeni użytkownika.