2008-11-28 130 views
8

是否有一種簡單的方法來解析用戶的HTTP_ACCEPT_LANGUAGE並在PHP中設置語言環境?如何在PHP中自動設置用戶的語言環境?

我知道了Zend框架必須做到這一點的方法,但我寧願不安裝整個框架只是使用該功能一位。

的PEAR I18Nv2包正處於測試階段,並沒有改變近三年來,所以我寧可不使用,如果可能的。

也不錯,如果它可以弄清楚服務器是否在Windows上運行,因爲Windows的語言環境字符串與世界其他地方不一樣...(德語是「德語」或「德語」,而不是「德」。)

回答

2

很好的解決方案是on its way

如果沒有,你需要能夠解析頭。它是以分號分隔的語言環境和屬性的逗號分隔列表。

它可以是這樣的:

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

,然後嘗試每種語言環境,直到setlocale()接受它。做好準備,他們沒有一個可以匹配。

不要以任何重要的東西爲基礎,或者讓用戶覆蓋它,因爲有些用戶可能配置錯誤的瀏覽器。


對於Windows語言環境,您可能需要將ISO 639-1名稱轉換爲ISO 639-2/3?

5

這並不容易,因爲它應該是(愚見)。首先,您必須從$_SERVER['HTTP_ACCEPT_LANGUAGE']中提取語言環境,並按q的值對它們進行排序。之後,您必須爲每個給定語言環境檢索適當的系統語言環境,這在* nix機器上應該沒有問題(您只需要處理正確的字符集),但在Windows上,您必須將語言環境轉換爲Windows語言環境,例如de_DE將爲German_Germany(如果您在應用中使用UTF-8,則還需要應對charset問題)。我認爲你必須建立一個查找表這個問題 - 有很多的語言環境;-)

不,你試試其他的,直到你(由大到小q值排序)後的一個語言環境中使用找到一個匹配setlocale()(如果給定的語言環境無法設置,函數將返回false)。

但隨後會有一個最後的障礙,以應付:

區域設置信息保存 每個進程,而不是每個線程。如果您 正在上 的Windows多線程 服務器API如IIS或Apache運行PHP而 腳本運行雖然腳本 本身從來沒有所謂的setlocale() 本身可能會遇到的區域設置突然 變化。發生這種情況是由於在同一時間 在不同的線程相同的過程的 運行的其他腳本 改變使用的setlocale 的processwide區域設置()。

(參見:http://de2.php.net/manual/en/function.setlocale.php

這意味着,你可以在腳本的執行過程中遇到的突然變化的語言環境,因爲用不同的區域設置其他用戶只需點擊您的網頁。

因此,上述Zend_Locale不依賴於PHP函數setlocale()(它只用於檢索系統區域設置信息),而是使用基於Unicode CLDR Project提供的數據的系統。這使組件獨立於所有這些setlocale()問題,但是這也引入了一些其他缺陷,例如缺乏對區域感知字符串操作(例如排序)的支持。

2

我知道了Zend框架有一個方法 要做到這一點,但我寧願不安裝 整個框架只是使用 一位的功能。

關於Zend的好消息是,您不需要全部安裝它。這是一個錯綜複雜的框架,您可以在不使用任何其他組件的情況下使用Zend_Locale。也許你想把它和Zend_Translate結合起來。

Check it out

相關問題