我有一個網站,裡面有三種語言都是用html做的而已,想要讓程式自動判斷瀏覽器的語言直接轉向,所以我在網站上找到PHP的語法
<?php
error_reporting(E_ALL ^ E_NOTICE);
preg_match('/^([a-z\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
$lang = $matches[1];
switch ($lang) {
case 'en' :
header('Location: en/');
break;
case 'zh-tw' :
header('Location: tw/');
break;
case 'es' :
header('Location: sp/');
break;
default:
header('Location: en/');
break;
}
?>
這段程式碼在IE和Firefox都可以正確的執行,只有Chrome和Opera無法正確的執行。因為我不太懂PHP,一直Google又找不出解答,也試了不同方式都沒用,請問有人知道為什麼嗎?該怎麼做?謝謝各位。
其他人都已告訴你找問題的方法,我補充一下:
你可以先把$lang顯示出來,也就是在switch那一行之下打
echo $lang;(記得switch的部份要先註解掉,不然執行後,還是會跳頁…)
執行後,你會看到使用chrome得到的值是 「zh-TW」,而你的switch條件中,列的是「zh-tw」,在IE與Firefox雖然判斷無誤,但chrome也許比較嚴謹,有區分大小寫,所以不符合「zh-tw」字串的結果,就執行了default,於是應該是要跳頁至示/tw,反而跳至/en了…這應該就是你問題的原因。
簡單的說,就是把zh-tw改為zh-TW即可。但你也許有其他語系的需求,所以…你最好還是在寫的時候,先測一下$lang得到的值,再做判斷用…
遊覽器若沒有回傳
HTTP_ACCEPT_LANGUAGE
給Web-Server的話
或是回傳的字串不是你想的那幾種的話
你的PHP當然不會轉址囉
建議改由用戶端以JavaScript去判斷吧?
應該要自己拆字串
或是
你把 switch ($lang) 那段先註解掉
先用
echo $_SERVER['HTTP_ACCEPT_LANGUAGE'];
與
print_r($matches);
以 Chrome和Opera 測過
看到底 $matches 是拆出哪些東西?
IE:zh-tw,en-US;q=0.7,es-ES;q=0.3Array ( [0] => zh-tw [1] => zh-tw )
Firefox:zh-tw,en-us;q=0.8,en;q=0.5,es;q=0.3Array ( [0] => zh-tw [1] => zh-tw )
Chrome:zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4,es;q=0.2Array ( [0] => zh-TW [1] => zh-TW )
Opera:zh-TW,zh;q=0.9,en;q=0.8,es;q=0.7Array ( [0] => zh-TW [1] => zh-TW )
以上就是個瀏覽器拆出的訊息。發現只差在大小寫得分別,但不太了解q=0.9,q=0.8,q=0.7的意義...。