iT邦幫忙

0

PHP判斷網頁語言自動轉向

php

我有一個網站,裡面有三種語言都是用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又找不出解答,也試了不同方式都沒用,請問有人知道為什麼嗎?該怎麼做?謝謝各位。

wordsmith iT邦高手 1 級 ‧ 2010-08-26 11:57:19 檢舉
也許可以把$lang echo出來看看,看在Chrome和Opera給的是什麼字串,再作後續的處理
harryvic iT邦新手 3 級 ‧ 2010-08-26 14:59:14 檢舉
感謝您,已經知道是大小寫的問題,期間也曾經嘗試過要用語言陣列的方法,但好像不行...

2 個回答

10
dasu88
iT邦研究生 5 級 ‧ 2010-08-26 13:47:08
最佳解答

其他人都已告訴你找問題的方法,我補充一下:
你可以先把$lang顯示出來,也就是在switch那一行之下打
echo $lang;(記得switch的部份要先註解掉,不然執行後,還是會跳頁…)
執行後,你會看到使用chrome得到的值是 「zh-TW」,而你的switch條件中,列的是「zh-tw」,在IE與Firefox雖然判斷無誤,但chrome也許比較嚴謹,有區分大小寫,所以不符合「zh-tw」字串的結果,就執行了default,於是應該是要跳頁至示/tw,反而跳至/en了…這應該就是你問題的原因。
簡單的說,就是把zh-tw改為zh-TW即可。但你也許有其他語系的需求,所以…你最好還是在寫的時候,先測一下$lang得到的值,再做判斷用…

wordsmith iT邦高手 1 級 ‧ 2010-08-26 14:27:10 檢舉

dasu88提到:
你會看到使用chrome得到的值是 「zh-TW」

如果只是大小寫的差異,那就把$lang用strtolower($lang)處理過就好了

harryvic iT邦新手 3 級 ‧ 2010-08-26 14:58:06 檢舉

感謝player、dasu88和wordsmith幫忙解答,我在

<pre class="c" name="code">$lang = $matches[1];

下面新增一行

<pre class="c" name="code">$lang = strtolower($lang); 

把它轉成小寫就OK了,非常感謝各位的協助。

13
player
iT邦大師 1 級 ‧ 2010-08-26 13:00:01

遊覽器若沒有回傳

HTTP_ACCEPT_LANGUAGE

給Web-Server的話
或是回傳的字串不是你想的那幾種的話
你的PHP當然不會轉址囉

建議改由用戶端以JavaScript去判斷吧?
應該要自己拆字串

或是
你把 switch ($lang) 那段先註解掉
先用
echo $_SERVER['HTTP_ACCEPT_LANGUAGE'];

print_r($matches);
以 Chrome和Opera 測過
看到底 $matches 是拆出哪些東西?

harryvic iT邦新手 3 級 ‧ 2010-08-26 14:55:41 檢舉

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的意義...。

我要發表回答

立即登入回答