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;
            }
        }
    }
}

可以自行调节逻辑

原文地址:https://www.cnblogs.com/milton/p/10025066.html