PHP判斷客戶端瀏覽器的語言,加強後續用戶體驗

因為本站使用的是繁體漢字,而我們大陸的大部分人都是使用的簡體漢字,所以我在頂端導航處加了“繁簡切換”功能。考慮到更好的用戶體驗,所以我決定在正文部分加上一些警示文字。但是呢,如果來訪的用戶如果是台灣或者香港地區的,那麼警示文字顯得有些多餘且沒必要,所以需要對其進行語言判斷。網上很多用到的方法大都是對來訪的ip進行判斷,但是如果用戶使用了代理或者在外等一些情況,那麼可能會顯得有些不准確。所以我考慮了下通過瀏覽器的語言設置進行判斷,雖然說不能排除某一小部分人可能喜歡用英文的語言設置,但是大部分還是奏效的。


實現的原理:

瀏覽器發給web服務器的 HTTP Headers Information 中包含了這樣一個信息 Accept-Language這個信息就是,瀏覽器中 工具->Internet選項->常規 下的 語言,它就是用來設置瀏覽器可接受的語言首選項的, 它可以是多種可接受語言的優先排序列。
  以PHP為例,用戶可接受的語言信息,放在$_SERVER['HTTP_ACCEPT_LANGUAGE']裏,變量信息是類似這樣的 “zh-cn”,如果是多語言列,是類似 “zh-cn,en;q=0.8,ko;q=0.5,zh-tw;q=0.3″這樣的情況。

戳我進入判斷當前使用的瀏覽器的語言設置

因為本人對php幾乎一竅不通,當時就直接用if語句寫個個判斷,如下:

1
2
3
4
5
6
<?
if($_SERVER['HTTP_ACCEPT_LANGUAGE']=="zh-cn" )
{
echo "经雷达探测,您使用的语言为新中国的简体汉字,为避免晕车,请使用顶端导航的繁简切换功能,謝謝 !";//当是簡體中文的时候
}
?>

但是你的瀏覽器可能并不是只有一種語言設置,例如firefox默認的語言設置就是zh-cn,zh;q=0.5,opera國際版的是zh-CN,en;q=0.9,fr;q=0.8,ja;q=0.7,de;q=0.6,es;q=0.5,it;q=0.4,pt;q=0.3,pt-PT;q=0.2,nl;q=0.1,sv;q=0.1,nb;q=0.1,da;q=0.1,fi;q=0.1,ru;q=0.1,pl;q=0.1,zh-TW;q=0.1,ko;q=0.1,所以此法並不可取。google了近半個小時,查到了php的preg_match()函數,大體就是可以自定義一個規則來和某一個參數進行匹配,所以判斷的語句修改成如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
error_reporting(E_ALL ^ E_NOTICE);
 
preg_match('/^([a-z\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);// 分析 HTTP_ACCEPT_LANGUAGE 的屬性
$lang = $matches[1];// 取第一語言設置
 
switch ($lang) {
        case 'zh-cn' :
                echo "经雷达探测,您使用的语言为新中国的简体汉字,为避免晕车,请使用顶端导航的繁简切换功能,谢谢 !";
                break;
        default:
                echo "經雷達探測,您使用的語言目前超出本站的想像範圍,您確定您看得懂中文?";
                break;
}
?>

部分瀏覽器的語言顯示大小寫可能有問題,比如我所使用的opera顯示的是zh-CN,所以我們要繼續完善它,成品如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
error_reporting(E_ALL ^ E_NOTICE);
 
preg_match('/^([a-z\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);// 分析 HTTP_ACCEPT_LANGUAGE 的屬性
$lang = $matches[1];// 這裏只取第一語言設置 (其他可根據需要增強功能,這裏只做簡單的方法演示)
 
switch ($lang) {
        case 'zh-cn' :
                echo "经雷达探测,您使用的语言为新中国的简体汉字,为避免晕车,请使用顶端导航的繁简切换功能,谢谢 !";
                break;
        case 'zh-CN' :
                echo "经雷达探测,您使用的语言为新中国的简体汉字,为避免晕车,请使用顶端导航的繁简切换功能,谢谢 !";
                break;
        case 'zh-hk' :
                echo "經雷達探測,您使用的語言為中國傳統繁體漢字,為本站所推崇文字,祝您旅途愉快!";
                break;
        case 'zh-HK' :
                echo "經雷達探測,您使用的語言為中國傳統繁體漢字,為本站所推崇文字,祝您旅途愉快!";
                break;
        case 'zh-tw' :
                echo "經雷達探測,您使用的語言為中國傳統繁體漢字,為本站所推崇文字,祝您旅途愉快!";
                break;
        case 'zh-TW' :
                echo "經雷達探測,您使用的語言為中國傳統繁體漢字,為本站所推崇文字,祝您旅途愉快!";
                break;
        case 'en-us' :
                echo "經雷達探測,您使用的語言為英文,您確定你看得懂中文?";
                break;
        default:
                echo "經雷達探測,您使用的語言目前超出本站的想像範圍,您確定您看得懂中文?";
                break;
}
 
?>

具體的效果可見本blog的文章上端的提示文字,或者把代碼存成php放在自己網絡空間測試。如發現顯示不準確,請訪問http://guaniu.com/test/lang.php探測你的瀏覽器的語言設置,然後給我回覆,謝謝!

作者:Leeiio
原文链接:PHP判斷客戶端瀏覽器的語言,加強後續用戶體驗