在PHP中检测用户语言 - 稳定的解决方案

7
我目前正在开发一个自动用户语言检测功能,以提供用户所需的语言内容。当然,如果用户需要,也可以手动更改语言设置,但是如果用户第一次访问页面,我想在页面中提供其语言的内容。
因此,我上网查找并发现 $_SERVER ['HTTP_ACCEPT_LANGUAGE']-变量可以得到以下结果:
de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
那么,过滤这个结果并得到类似于“EN”/“DE”/“IT”的清晰结果最好的方法是什么?
$rL = $_SERVER["HTTP_ACCEPT_LANGUAGE"]; //  de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
$langCode = strtoupper($rl[0].$rl[1]);

这个Server-Var的第二个问题是只有在浏览器提供一些信息时才会给出结果。设置默认页面语言是唯一的处理可能吗?
我感兴趣的第二种可能性是通过IP获取语言。因此,如果我获得语言,我可能知道用户的语言。但是在瑞士、比利时等多语言国家怎么办?对于像.com/.net/.org这样的顶级域名呢?
那么,您会采用哪种方法来检测用户的语言呢?
谢谢您的帮助。
2个回答

5
坚持使用Accept-Language头部。所有浏览器都会传递这个头部,而且它更有可能是用户想要的语言,而不是粗略猜测地理位置。PECL有http_negotiate_language,可以解析头部并正确选择语言,尽管实际上,即使是在字符串中寻找en/de/it这样有些虚假的方法,也比IP嗅探更好用。
引用:

像.com/.net/.org等TLD有什么问题。

域名通常不涉及IP嗅探,因为它有自己的IP范围后端数据库,这些IP范围“可能”与某个国家相关联。反向解析国家猜测几乎没有用处,因为很少有IP反向解析到ccTLD。

当我尝试使用http_negotiate_language的示例时,我得到了一个致命错误:Call to undefined function http_negotiate_language()。我做错了什么? - wildhaber
安装pecl_http扩展。http://uk.php.net/manual/en/http.install.php 或者在negotiate_language页面的评论中有一个本地PHP版本,看起来应该是可以的。 - bobince

1
作为最佳实践,我会选择来自Zend Framework的非常成熟的Zend_Locale组件。
它拥有您需要的所有内容,可以对应用程序进行国际化和本地化,从检测用户的本地设置到广泛的国际化货币、数字、日期格式化和翻译管理解决方案。

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