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