项目中使用到了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,刷新页面,一切就都正常了。
真是个BUG,不错的解决方法!