App.class.php中自动侦测多语言函数BUG

浏览:305 发布日期:2010/04/12
- 普通 - 未处理
由于最近要做一个多语言的项目,所以要调试下ThinkPHP2.0 的多语言功能,发现此BUG

语言配置如下: 
'DEFAULT_LANG'   => 'zh-cn',
'LANG_SWITCH_ON'        => ture,   // 开启多语言包功能
'LANG_AUTO_DETECT'      => true,   // 自动侦测语言 开启多语言功能后有效
然后在Lang目录下创建zh-cn,zh-tw目录,为了方便测试我放了common.php公共语言包

接着发现在模版中使用快捷输出语言变量{%welcome},始终输出WELCOME

查看源码App.class.php的checkLanguage方法发现如下代码有点问题,请官方人员检查

// 启用了语言包功能
// 根据是否启用自动侦测设置获取语言选择
if (C('LANG_AUTO_DETECT')){
if(isset($_GET[C('VAR_LANGUAGE')])){// 检测浏览器支持语言
$langSet = $_GET[C('VAR_LANGUAGE')];// url中设置了语言变量
cookie('think_language',$langSet,3600);
}elseif(cookie('think_language'))// 获取上次用户的选择
$langSet = cookie('think_language');
elseif(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){// 自动侦测浏览器语言
preg_match('/^([a-z\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
$langSet = $matches[1];
cookie('think_language',$langSet,3600);
}
}

如上红色代码部分,因为$_SERVER['HTTP_ACCEPT_LANGUAGE'] 是获取的浏览器的变量,各个浏览器各有不同,比如大小写
以简体中文为例各浏览器的返回值:
Firefox:zh-cn
IE8:zh-CN
Opera:zh-CN
Safari:zh-CN
IE内核的搜狗浏览器:zh-cn
谷歌chrome:zh-CN
...

还有更多浏览器,大小写各不相同,因为我的项目部署在lamp环境下,所以严格区分目录,文件名大小写,因为出现各个浏览器执行结果不一致(如上浏览器我只能在搜狗和firefox才能正确加载到语言包),

建议修改把
preg_match('/^([a-z\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
修改为
preg_match('/^([a-z\-]+)/i', strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']), $matches);
[/color]
[color=black]即全部转成小写,
不知道我的修改对不对,请官方检查
评论(
后面还有条评论,点击查看>>