用PHP检查浏览器的语言?

时间:2009-03-06 20:26:46

标签: php browser

如何通过PHP检查用户浏览器的语言?

我需要为美国和英国的人们展示不同的页面。

我尝试了以下代码失败

<?php
if(ereg("us", $_SERVER["HTTP_ACCEPT_LANGUAGE"]))
   include('http://page.com/us.txt');
else
   include('http://page.com/uk.txt');
?>

我为美国和英国的人们运行了一个特定的代码。

4 个答案:

答案 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/