如何通过PHP检查用户浏览器的语言?
我需要为美国和英国的人们展示不同的页面。
我尝试了以下代码失败
<?php
if(ereg("us", $_SERVER["HTTP_ACCEPT_LANGUAGE"]))
include('http://page.com/us.txt');
else
include('http://page.com/uk.txt');
?>
我为美国和英国的人们运行了一个特定的代码。
答案 0 :(得分:8)
可能只是一个区分大小写的问题; eregi('en-us')或preg_match('/ en-us / i')本应该把它拿起来。
然而,只是在标题中寻找'en-us'可能有时会出错,特别是当列出美国和英国语言时。 “Accept-Language”实际上是一个非常复杂的标题,你真的需要一个适当的解析器。
如果你有PECL,那么你已经完成了整个工作:http://www.php.net/manual/en/function.http-negotiate-language.php
我不知道为什么其他答案是针对User-Agent标头的;这完全是假的。用户代理不被要求在任何特定的地方保留语言价值,对于某些浏览器(例如Opera,以及一些我从未听说过的称为“Internet Explorer”的小型浏览器),它根本不会。 包含语言的地方,这将是安装浏览器版本的语言,而不是用户首选的语言,这是你应该看到的。 (此设置将默认为构建语言,但可由用户从首选项UI进行自定义。)
答案 1 :(得分:3)
试试这个:
<?
if(preg_match('/en-us/i', $_SERVER['HTTP_USER_AGENT']))
include('http://page.com/us.txt');
else
include('http://page.com/uk.txt');
?>
答案 2 :(得分:2)
可能更可靠的方法是在$_SERVER['HTTP_USER_AGENT']
字符串上执行正则表达式。
<?php
if(preg_match('/en-US/', $_SERVER['HTTP_USER_AGENT']))
include('http://page.com/us.txt');
else
include('http://page.com/uk.txt');
?>
您无法保证获得有效且有用的用户代理字符串,因此请确保else语句包含合理的替代字符。
答案 3 :(得分:1)
这是一种基于zend的解决方案。当您添加其他语言时,它也会起作用。
<?php
include_once "Zend/Locale.php";
$zend_locale = new Zend_Locale(Zend_Locale::BROWSER);
// returns en for English, de for German etc.
echo $browser_language = $zend_locale->getLanguage();
echo "<br />\n";
// returns en_US for American English, en_GB for British English etc.
echo $browser_locale = $zend_locale->toString();
echo "<br />\n";
解决方案见:
http://www.mpopp.net/2010/07/how-to-detect-the-users-preferred-language-smarter-than-google/