ThinkPHP 2.0 多语言使用Bug

项目中使用到了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,刷新页面,一切就都正常了。

affiliate_link
Share this Post:
Digg Google Bookmarks reddit Mixx StumbleUpon Technorati Yahoo! Buzz DesignFloat Delicious BlinkList Furl

One Response to “ThinkPHP 2.0 多语言使用Bug”

Trackbacks are disabled.

  • iceweb says:

    真是个BUG,不错的解决方法!