關於TP5多語言BUG的解決辦法(直接上程式碼)
阿新 • • 發佈:2018-11-22
按照手冊配置,預設語言沒有反應,跳轉頁面之後,也沒有檢測當前的語言,很尷尬!!!
//最大的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步)進行切換語言
大功告成,希望對你有用,告辭!