最近某個已經上線的專案新增了製作多國語系介面的需求,流程上打算用 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
Leave a Reply