1. 程式人生 > >關於TP5多語言BUG的解決辦法(直接上程式碼)

關於TP5多語言BUG的解決辦法(直接上程式碼)

按照手冊配置,預設語言沒有反應,跳轉頁面之後,也沒有檢測當前的語言,很尷尬!!!

//最大的bug在這裡

1.請用下面程式碼覆蓋 thinkPhp/library/think/Lang.php 裡面的detect()自動檢測語言方法

 

 /**
     * 自動偵測設定獲取語言選擇
     * @access public
     * @return string
     */
    public static function detect() {
// 自動偵測設定獲取語言選擇
        $langSet = Config::get('default_lang');
        if (isset($_GET[self::$langDetectVar])) {
// url中設定了語言變數
            $langSet = strtolower($_GET[self::$langDetectVar]);
            Cookie::set(self::$langCookieVar, $langSet, 3600);
        } elseif (Cookie::get(self::$langCookieVar)) {
// 獲取上次使用者的選擇
            $langSet = strtolower(Cookie::get(self::$langCookieVar));
        } elseif ($langSet) {
// 獲取預設語言
            Cookie::set(self::$langCookieVar, $langSet, 3600);
        } elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
// 自動偵測瀏覽器語言
            preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
            $langSet = strtolower($matches[1]);
            Cookie::set(self::$langCookieVar, $langSet, 3600);
        }
        if (empty(self::$allowLangList) || in_array($langSet, self::$allowLangList)) {
// 合法的語言
            self::$range = $langSet;
        }
        return self::$range;
    }

恭喜你,完成這步,你已經成功一大半了.

2. 後面的按照手冊配置,基本上就可以了,以下是控制器方法程式碼

 

public function lang(){
    $lang = input('?get.lang') ? input('get.lang') : 'zh';
    switch ($lang) {
        case 'zh':
            cookie('think_var', 'zh');
            break;
        case 'en':
            cookie('think_var', 'en');
            break;
        //其它語言
        default:
            cookie('think_var','zh');
    }
}

3.當然,還需要配置config.php,如下:

 

'lang_switch_on'         => true,
// 預設全域性過濾方法 用逗號分隔多個
'default_filter'         => '',
// 預設語言
'default_lang'           => 'zh',
//允許的語言列表
'lang_list' => ['zh','cht','en'],
'lang_auto_detect'       => true,
'VAR_LANGUAGE'          => 'lang',        // 預設語言切換變數

4.application下新建Lang資料夾配置好你所需要的語言:

檔名和config配置中的lang_list保持一致

5.語言包內容,是一個return array(所有語種返回陣列的鍵名保持一致,如下是中文和英文):

 

return array(
    //------------頭部-------------------
    "HEANDER_LANG"=>"中文簡體",
    "HEANDER_LANG_CHT"=>"中文繁體",
    "HEANDER_LANG_EN"=>"English",
    "HEADER_REG"=>"註冊",
    "HEADER_LOGIN"=>"登入", .....);
return array(
//------------頭部-------------------
    "HEANDER_LANG"=>"中文簡體",
    "HEANDER_LANG_CHT"=>"中文繁體",
    "HEANDER_LANG_EN"=>"English",
    "HEADER_REG"=>"Register",
    "HEADER_LOGIN"=>"Login", ......);

6.以上這些都配置好了之後,就可以在檢視上通過lang()進行替換操作了

 

<ul class="language">
    <li><a href="?lang=zh">{:lang('HEANDER_LANG')}</a></li>  //中文
    <li><a href="?lang=cht">{:lang('HEANDER_LANG_CHT')}</a></li> //繁體
    <li><a href="?lang=en">{:lang('HEANDER_LANG_EN')}</a></li>  //英文
</ul>

可以通過ajax去訪問控制器中的lang方法(第2步)進行切換語言

大功告成,希望對你有用,告辭!