ThinkPHP 2.0 多语言使用Bug

浏览:783 发布日期:2010/08/10
- 普通 - 未处理
[i=s] 本帖最后由 greenhawk 于 2010-8-10 00:49 编辑 [/i]

项目中使用到了thinkphp2.0的多语言功能,发现一些bug

语言配置如下:'LANG_SWITCH_ON'    =>  true, 
'DEFAULT_LANG'         =>  'en-us', 
'LANG_AUTO_DETECT' =>  true,  
在Lang目录下创建en-us,zh-cn,zh-tw目录

ThinkPHP使用$_SERVER['HTTP_ACCEPT_LANGUAGE']来自动检测浏览器支持语言,
然后保存到cookie中,并读取相应的语言包。

这里有两个问题:
1. 浏览器的返回值的大小写不同, 如Firefox:en-us, 谷歌chrome:en-US
返回值是小写的时候没有问题,大写的时候(chrome)就会产生找不到语言包的情况。

2. 浏览器的支持语言不存在的时候,也会产生找不到语言包的情况。
比如说有的浏览器返回值是 en-gb

解决办法如下,

打开/ThinkPHP/Lib/Think/Core/App.class.php文件,查看checkLanguage()函数,找到:elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { // 自动侦测浏览器语言
        preg_match('/^([a-z\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);    
        $langSet = strtolower($matches[1]); 
        cookie('think_language',$langSet,3600);
}
替换以上代码为:elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { // 自动侦测浏览器语言
        preg_match('/^([a-z\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);    
        $langSet = strtolower($matches[1]); 
         // If language not exist, use default 
    if (false === @file_exists(LANG_PATH.$langSet.'/common.php'))
           $langSet = C('DEFAULT_LANG');  
        cookie('think_language',$langSet,3600); 
}
修改完成后,一定记得清除/Runtime/~runtime.php文件,然后清除浏览器的cookie,刷新页面,一切就都正常了。
评论()
后面还有条评论,点击查看>>