1. 程式人生 > >phpBB3.2 自動檢測瀏覽器語言

phpBB3.2 自動檢測瀏覽器語言

這是根據HTTP request header裡的Accept-Language資訊來處理的. 

首先看一下Accept-Language的格式

Accept-Language: <language>
Accept-Language: <locale>
Accept-Language: *

// Multiple types, weighted with the quality value syntax:
Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5

各部分的說明

<language>
  用含有兩到三個字元的字串表示的語言碼。
<locale>
  完整的語言標籤。除了語言本身之外,還會包含其他方面的資訊,顯示在中劃線("-")後面。最常見的額外資訊是國家或地區變種(如"en-US")或者表示所用的字母系統(如"sr-Lat")。其他變種諸如拼字法("de-DE-1996")等通常不被應用在這種場合。
*
  任意語言;"*"表示萬用字元。
;q= (q-factor weighting)
  值代表優先順序,用相對質量價值 表示,又稱為權重。

因為phpBB3的語言命名方式不同, 需要一些hard code. 因為我們安裝的語言包是固定的, 所以只需要處理對應的 zh_cmn_hans, zh_cmn_hant, en 就可以.

對應在phpBB3.2的修改在 phpbb/user.php 檔案

找到

if ($lang_override)
{
	$use_lang = basename($lang_override);
	$user_lang_name = (file_exists($this->lang_path . $use_lang . "/common.$phpEx")) ? $use_lang : basename($config['default_lang']);
	$this->data['user_lang'] = $user_lang_name;
}
else
{
	$user_lang_name = basename($config['default_lang']);
}

修改為

if ($lang_override)
{
	$use_lang = basename($lang_override);
	$user_lang_name = (file_exists($this->lang_path . $use_lang . "/common.$phpEx")) ? $use_lang : basename($config['default_lang']);
	$this->data['user_lang'] = $user_lang_name;
}
else
{
    $user_lang_name = basename($config['default_lang']);

    if ($request->header('Accept-Language'))
    {
        $accept_lang_header_ary = explode(',', $request->header('Accept-Language'));

        foreach ($accept_lang_header_ary as $accept_lang_header)
        {
            $accept_lang_ary = explode(';', $accept_lang_header);
            $accept_lang = $accept_lang_ary[0];
            // Because we know which languages we have, so just hard code it
            if ($accept_lang == 'zh' || $accept_lang == 'zh-CN' || $accept_lang == 'zh-SG') {
                $accept_lang = 'zh_cmn_hans';
            } elseif (strpos($accept_lang, 'zh') === 0) {
                $accept_lang = 'zh_cmn_hant';
            } elseif (strpos($accept_lang, 'en') === 0) {
                $accept_lang = 'en';
            }
            if (file_exists($this->lang_path . $accept_lang . "/common.$phpEx"))
            {
                $user_lang_name = $config['default_lang'] = $accept_lang;
                break;
            }
        }
    }
}

可以自行調節邏輯