在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; }