这两天接到个需求要做多语言的判断,即访客打开链接的时候自动判断对方使用的语言,看了看亚马逊是通过浏览器accept-language来判断的并且存了cookie,但是并没有通过IP来判断。
通过搜索找到一些方法,但是并没有代码,在此贴出自己的代码,方便他人也是顺便记录一下
首先,判断语言优先级如下:
1.URL方式
2.COOKIE
3.浏览器accept-language
4.IP
一、URL方式
就是通过URL传参,比如:http://www.baidu.com?lang=zh_CN
通过GET方式获取到参数 然后设置相应的语言
二、COOKIE
cookie就是在之前的判断完之后 存入cookie,在浏览其他页面或再次打开的时候直接获取,不需要再次判断
三、浏览器
这个就是通过http请求头里的accept-language来获取到用户首选语言
四、IP
这个方式比较麻烦些,亚马逊并没有针对这种方式做判断,一般来说一个正常的用户通过浏览器访问是不会到这一步的,当然既然有这个需求也得实现它
1.第一步就是获取IP,通过各种搜索的结论就是 如果对方故意隐藏IP,是没有办法获取到真实IP的。。。。
但是这种极端的情况不考虑,因为我们要做的只是为了提升用户体验的功能
所以就用一般的获取IP方法就可以了 因为我忘了是从哪找的了 就不贴了
2.介绍一个神器 GeoLite2 https://dev.maxmind.com
当然这个是免费版的,如果收费的会更精确
通过这个IP库 就可以输入IP 返回国家代码 城市代码之类的
然后就可以判断使用何种语言了
代码如下:
1 require_once '../../../vendor/autoload.php'; 2 use GeoIp2DatabaseReader; 3 4 //支持的语言数组 5 $langs = [ 6 'zh_CN', 7 'en_US' 8 ]; 9 10 11 $lang = 'en_US'; 12 //优先判断客户手动选择的语言 13 if(isset($_GET [ 'lang' ])) { 14 $lang = $_GET ['lang']; 16 }else{ 17 //判断cookie中有没有设定语言 18 if(isset($_COOKIE['Lang'])){ 20 $lang = $_COOKIE['Lang']; 21 }else{ 22 //通过浏览器accept-language判断访客语言 23 $lang = getLanguage(); 24 25 //通过IP 查询国家得到语言 26 if(!$lang){ 27 $ip = client_ip(); 28 $reader = new Reader('../GeoLite2-Country.mmdb'); 29 try{ 30 $record = $reader->country($ip); 31 foreach ($arrLangs as $val){ 32 if(strpos($val,'_'.$record->country->isoCode) !==false){ 33 //包含 34 $lang = $val; 35 break; 36 } 37 } 38 }catch (Exception $e){ 39 echo $e->getMessage(); 40 } 41 } 42 } 43 } 44 45 //检查获取到语言是否支持 46 if(!in_array($lang,$arrLangs)){ 47 $lang = 'en_US'; 48 } 49 50 //设置cookie 51 setcookie('Lang',$lang,time()+10*60,'/');
官方使用IP库代码 https://dev.maxmind.com/minfraud/