首页// 关于TP5多语言BUG的解决办法(直接上代码)

关于TP5多语言BUG的解决办法(直接上代码)

作者:神奇   分类:   时间:2019-01-21 19:08:17  标签:


按照手册配置,默认语言没有反应,跳转页面之后,也没有检测当前的语言,很尴尬!!!

//最大的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>
    <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步)进行切换语言


大功告成,希望对你有用,告辞!


温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!

评论:

发表评论:

code