在PHP中检测客户端区域设置的最简单方法

时间:2008-11-18 01:07:34

标签: php locale

我希望能够使用PHP在我的网站上检测访问者所在的国家/地区。

请注意,我不是试图将此作为安全措施或任何重要的事情,只是改变一些单词的拼写(美国人似乎相信单词“enrollment”有2个Ls ... 。疯狂的yanks),或许可以在“选择你的国家/地区”列表中提供默认选项。

因此,使用Geolocation数据库有点过头了,我真的不想为此安装新的PHP库,所以最简单/最简单的方法是什么访客来自哪个国家?

12 个答案:

答案 0 :(得分:25)

PHP提供了一个自5.3.0以来的函数来将$ _SERVER [' HTTP_ACCEPT_LANGUAGE']变量解析为语言环境。

http://www.php.net/manual/en/locale.acceptfromhttp.php

$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale; // returns "en_US"

答案 1 :(得分:21)

无法保证,但大多数浏览器会提交一个Accept-Language HTTP标头,如果他们来自美国,则会指定en-us。但是,一些较旧的浏览器只表示它们是en。并非所有机器都已正确设置以指示他们喜欢的区域设置。但这是一个很好的初步猜测。

英语 - 英国用户通常将他们的系统或用户区域设置为英语 - 英语,在默认浏览器配置中,应该将en-gb作为Accept Language标头。 (这个说明的早期版本;这是一个错字,抱歉。)其他国家也有en语言,如en-za(南非),并且,主要在理论上,像en-jp这样的组合也是可能的。

然而,基于地理IP的猜测在首选语言/语言环境中不太可能是正确的。 Google认为基于IP地址定位的内容协商是有道理的,当我在日本或韩国时,这真让我烦恼......

答案 2 :(得分:13)

您可以查看大多数浏览器将发送的HTTP_ACCEPT_LANGUAGE标题(来自$ _SERVER)。

查看Zend_Locale的示例,或者您甚至可能想要使用lib。

答案 3 :(得分:6)

您可以进行一些IP比较,不用使用整个库来执行此操作。

解决方案#1

使用API​​,这样就不需要你了。这是一个让您了解国家/地区的网络API:

 Example: http://api.hostip.info/get_html.php?ip=12.215.42.19
 Return : Country: UNITED STATES (US)

解决方案#2

但是,您是否认为使用浏览器代理语言?你或许可以从中知道英语的类型。

解决方案#3

这个名为BlockCountry的网站让您按国家/地区列出知识产权清单。当然,您不想阻止,但您可以使用IP列表并比较它们(获取所有美国IP ...)这可能不准确...

答案 4 :(得分:2)

鉴于您声明的目的,Accept-Language标头比基于IP的地理位置更合适。实际上,这正是Accept-Language的目的。

答案 5 :(得分:2)

解析$ _SERVER [“HTTP_ACCEPT_LANGUAGE”]以获取国家/地区和浏览器的区域设置

答案 6 :(得分:1)

为了识别您的访问者国家/地区,我使用了GeoIP扩展程序,非常简单易用。

答案 7 :(得分:1)

我使用HTTP_ACCEPT_LANGUAGE

    $localePreferences = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
    if(is_array($localePreferences) && count($localePreferences) > 0) {
       $browserLocale = $localePreferences[0];
       $_SESSION['browser_locale'] = $browserLocale;
    }

答案 8 :(得分:0)

我使用http://countries.nerd.dk服务进行IP到国家/地区的映射。它工作得很好,并且基于DNS,也很好地缓存。

如果您不想依赖外部服务,也可以下载供本地使用的数据库。

答案 9 :(得分:0)

GeoIP扩展是不错的选择。

答案 10 :(得分:0)

或者您可以执行以下操作:

http://www.maxmind.com/app/geoip_country

下载'geoip.dat'和geoip.inc

在geoip.inc标题中你会发现如何使用它(例如初始化和其余的......)

答案 11 :(得分:0)

有一件事是语言浏览者想要的,第二件事 - 你可以服务:

$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 =&gt;所以唯一正确的语言环境是pl_PL.UTF-8。

如果没有找到成功的比较 - 根本没有setlocale。