在PHP中检测客户端语言环境的最简单方法

33

我希望能够使用PHP在我的网站上检测访问者来自哪个国家。

请注意,我并不是要将此用作安全措施或任何重要用途,只是更改一些单词的拼写方式 (美国人似乎认为“enrolment”这个词有两个L……疯狂的美国佬),以及在“选择您的国家”列表中提供默认选项。

因此,使用地理位置数据库有点过头了,而且我真的不想为此安装新的PHP库,那么最简单/最简单的方法是什么,以查找访问者来自哪个国家?


1
解决方案请参见 https://dev59.com/UnVC5IYBdhLWcg3wbghT#22334417 - PiTheNumber
12个回答

33

自 PHP 5.3.0 版本开始,提供了一种将$_SERVER['HTTP_ACCEPT_LANGUAGE']变量解析为语言区域的函数。

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

文档:https://www.php.net/manual/en/locale.acceptfromhttp.php


如果您只需要语言的前两个字符,那么这个方法可以正常工作。但是,如果您需要完整的区域设置,则存在不一致性。例如,对于波兰语,Edge和Firefox目前都只提供了两个字符“pl”。但是,对于越南语,Edge提供“vi”,而Firefox则提供“vi_VN”。 - zsalya

21

并不保证,但大多数浏览器会提交一个Accept-Language HTTP头,如果它们来自美国,则指定en-us。一些较旧的浏览器仅指定为en。而且,并非所有的机器都设置正确以指示其首选语言环境。但这是一个好的第一猜测。

基于英国的用户通常将其系统或用户语言环境设置为英国英语,在默认浏览器配置中应将结果作为en-gb的Accept Language头。其他国家也有en语言环境,例如en-za(南非),而且在理论上主要是像en-jp这样的组合也是可能的。

基于地理位置IP的猜测更不太可能正确推断出首选语言/本地化环境。Google认为基于IP地址地理位置进行内容协商是有意义的,但当我在日本或韩国时,这真的很恼人...


5
客户偏爱的语言不代表其所在地区。 - Gumbo
2
取决于您所说的“locale”的含义。假设您不是指“位置”,而是在软件国际化方面使用它:Accept-Language参数现在通常会在每个首选语言中指定完整的区域设置,因为语言字段的后半部分最常见的用法是指定国家(而不是语言变体)。 语言加上国家的组合与日期、时间、数字和货币约定的特定于区域设置的约定相对应。 没有国家信息,显然不足以完成这项工作。 - JasonTrue
10
当网站根据地区而不是浏览器配置显示语言时,我非常讨厌。除非你住在另一个国家,否则你无法想象这有多令人沮丧。如果我进入一个网站并且无法在5秒钟内找到更改语言选项,我就会离开。 - Sandy
我在日本的时候,我甚至向微软坚持要求使用hotmail.ca,但是他们给我分配了hotmail.co.jp。 - awiebe

13

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

请参考Zend_Locale获取示例,或者您甚至可能希望使用该库。


7

您可以进行IP比较,而无需整个库来完成。

解决方案#1

使用API,这样您就不需要任何东西。这是一个Web API,让您知道国家:

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

解决方案 #2

你有没有考虑使用浏览器代理语言?你可能能够从中知道英语的类型。

解决方案 #3

这个网站叫做BlockCountry,可以让你按国家列出IP列表。当然,你不想屏蔽,但是你可以使用IP列表并进行比较(获取所有美国IP等),这可能不是很准确...


2
你有关于http://api.hostip.info/的更多信息吗?它是由谁运营的?在性能和数据质量方面可靠吗? - Simon_Weaver
1
看起来不是很时新。我刚试了三个来自我国家的IP地址,都无法定位到国家! - Primoz Rome
hostip.info看起来一点也不可靠。我发现http://ipinfo.io/有更好的信息,但如果你需要查找大量的IP地址,你就必须付费。 - Mikko Rantalainen

2

根据您所述的目的,与IP基础地理定位相比,Accept-Language头更适合。事实上,这正是Accept-Language的预期目的。


1
客户的首选语言并不代表他的区域设置。 - Gumbo
1
真的,但是OP想要使用locale的原因是“只是更改一些单词的拼写(美国人似乎认为单词“enrolment”有两个L....疯狂的家伙)”-他想要使用locale作为首选语言的代理。 - Dave Sherohman
1
请参考我上面的评论...我认为最好使用客户偏爱的语言,而不是他所在地区的语言。 - Sandy

2

解析 $_SERVER["HTTP_ACCEPT_LANGUAGE"] 以获取国家和浏览器语言环境。


2

我使用HTTP_ACCEPT_LANGUAGE

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

1
为了识别您的访客国家,我使用了 GeoIP 扩展,非常简单易用。

0

GeoIP扩展是一个不错的选择。


0

或者你可以按照以下步骤操作:

http://www.maxmind.com/app/geoip_country下载'geoip.dat'和geoip.inc文件

在geoip.inc文件头部,你会找到如何使用它的说明(例如初始化等)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接