在PHP中检测客户端语言环境的最简单的方法
我希望能够使用PHP在我的网站上检测访客来自哪个国家。
请注意,我并不是试图用这个作为安全措施或任何重要的东西,只是改变一些单词的拼写(美国人似乎认为“招生”这个词有2个疯狂的猛拉) ,也许在“select你的国家”列表中给出默认选项。
因此,使用地理定位数据库是一个非常重要的问题,我真的不想为了这个而安装新的PHP库,那么什么是访问者来自哪个国家的最简单最简单的方法是什么?
不保证,但是大多数浏览器提交一个Accept-Language HTTP头,它指定了来自美国的en-us。 尽pipe如此,一些较旧的浏览器仅表示它们是en。 并不是所有的机器都设置正确,以表明他们喜欢哪个地区。 但这是一个很好的猜测。
基于英国的用户通常将他们的系统或用户区域设置为英国英国,在默认的浏览器configuration中应该使en-gb成为接受语言标头。 (这是一个早期版本的英国人,这是一个错字,对不起)。其他国家也有地方,比如en-za(南非),主要从理论上讲,像en-jp这样的组合也是可能的。
然而,基于地理IP的猜测不太可能在首选语言/区域设置上正确。 Google认为基于IP地址地理定位的内容协商是有道理的,当我在日本或韩国的时候,这真的让我很烦恼…
PHP从5.3.0开始提供了一个函数来将$ _SERVER ['HTTP_ACCEPT_LANGUAGE']variablesparsing为一个语言环境。
http://www.php.net/manual/en/locale.acceptfromhttp.php
$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']); echo $locale; // returns "en_US"
您可以查看大多数浏览器将发送的HTTP_ACCEPT_LANGUAGE
头(从$ _SERVER)。
看看Zend_Locale的例子,或者你甚至可能想使用lib。
你可以做一些知识产权比较, 而不需要整个图书馆去做。
解决scheme#1
使用API,这样就不需要从你的身边。 这是一个让你知道国家的networkingAPI:
Example: http://api.hostip.info/get_html.php?ip=12.215.42.19 Return : Country: UNITED STATES (US)
解决scheme#2
但是,你有没有想过使用浏览器代理语言? 你可能能够从中知道英语的types。
解决scheme#3
这个名为BlockCountry的网站让你有一个国家的IP列表。 当然,你不想阻止,但你可以使用IP列表,并比较它们(获取所有美国IP …),这可能不准确…
鉴于您所说明的目的,Accept-Language标头是比基于IP的地理定位更合适的解决scheme。 事实上,这正是接受语言的预期目的。
parsing$ _SERVER [“HTTP_ACCEPT_LANGUAGE”]以获取国家和浏览器的语言环境
或者您可以执行以下操作:
从http://www.maxmind.com/app/geoip_country下载“geoip.dat”和geoip.inc
在geoip.inc头文件中,你会发现如何使用它(例如初始化和其他…)
GeoIP扩展是不错的select。
为了识别您的访问者国家,我使用了GeoIP扩展,使用非常简单。
http://countries.nerd.dk服务是我用于IP到国家的映射。; 它工作得很好,基于DNS,也caching得很好。
如果您不想依靠外部服务,也可以下载数据库以供本地使用。
有一件事是语言观众想要的,其次 – 你可以服务的是:
$SystemLocales = explode("\n", shell_exec('locale -a')); $BrowserLocales = explode(",",str_replace("-","_",$_SERVER["HTTP_ACCEPT_LANGUAGE"])); // brosers use en-US, Linux uses en_US for($i=0;$i<count($BrowserLocales);$i++) { list($BrowserLocales[$i])=explode(";",$BrowserLocales[$i]); //trick for "en;q=0.8" for($j=0;$j<count($SystemLocales);$j++) { if ($BrowserLocales[$i]==substr($SystemLocales[$j],0,strlen($BrowserLocales[$i]))){ setlocale(LC_ALL, $SystemLocales[$j]); break 2; // found and set, so no more check is needed } } }
例如,矿山系统只服务于:
- C
- POSIX
- pl_PL.UTF-8
而我的浏览器语言是:pl,en-US,en =>所以唯一正确的语言环境是pl_PL.UTF-8。
当没有find成功的比较 – 根本没有setlocale。
我使用HTTP_ACCEPT_LANGUAGE
$localePreferences = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']); if(is_array($localePreferences) && count($localePreferences) > 0) { $browserLocale = $localePreferences[0]; $_SESSION['browser_locale'] = $browserLocale; }