Detect Browser Language in PHP

最近某個已經上線的專案新增了製作多國語系介面的需求,流程上打算用 PHP 來偵測使用者瀏覽器的語言設定。

根據 HTTP Protocol,語言設定會跟著 header 回傳。所以在 $_SERVER 裡就有了,名為 $_SERVER[‘HTTP_ACCEPT_LANGUAGE’]。其內容大概上是長這個這樣子的:

en-us,zh-tw;q=0.7,en;q=0.3

en-us 就是指語系,可以參見 ISO 639 的列表。q 則是對使用者語系偏好的估值,加總為 1,以這個例子來說,我的語言偏好是使用 en-us 美式英語 與 zh-tw 臺灣繁中。

不過拿到這個字串還要經過 parse,好在已經有前人寫好相關的處理函式,茲轉貼如下,原出處在 The Future of the Web 部落格

<?php
$langs = array();

if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
    // break up string into pieces (languages and q factors)
    preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);

    if (count($lang_parse[1])) {
        // create a list like "en" => 0.8
        $langs = array_combine($lang_parse[1], $lang_parse[4]);

        // set default to 1 for any without q factor
        foreach ($langs as $lang => $val) {
            if ($val === '') $langs[$lang] = 1;
        }

        // sort list based on value
        arsort($langs, SORT_NUMERIC);
    }
}

// look through sorted list and use first one that matches our languages
foreach ($langs as $lang => $val) {
    if (strpos($lang, 'de') === 0) {
        // show German site
    } else if (strpos($lang, 'en') === 0) {
        // show English site
    }
}

// show default site or prompt for language
print_r($langs);
?>

列印的結果如下:

Array
(
    [en-us] => 1
    [zh-tw] => 0.7
    [en] => 0.3
)

123


Posted

in

by

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

Exit mobile version