2010-07-18 90 views
3

我正在一个网站上有一些小的国际化需求(英文,法文和德文),我想弄清楚用户来自哪里,所以我知道要显示哪些内容。我认为正确的方法是检查“HTTP_ACCEPT_LANGUAGE”标题以找出用户正在请求的#1语言(并且可以安全地认为,德国的所有用户都有浏览器默认要求DE等) 。I18n网站:我如何检测语言?

这是正确的吗?或者我还有其他的做法(希望没有太荒谬的地方,就像试图从知识产权中找出他们的国家一样)......?

thanks-- 埃里克

回答

8

如果您选择当前最流行的选择 - geoIP - 无需进一步考虑,您不会为用户提供很大的帮助。

语言和国家不重叠。你将如何处理来自瑞士IP地址的用户?比利时?加拿大?如果你在每种情况下都选择大多数语言,那么你会惹恼重复访问者,这些访客恰巧是大型语言少数群体的一部分:每次都会以“错误”的语言迎接他们,尽管该网站可用他们的首选语言。对于外国人来说也是如此 - 从经验来看,例如瑞典人因为碰巧前往瑞典而受到欢迎是非常令人不安的。 (甚至大的网站也错了,有一天我从伦敦到达温哥华机场,谷歌把我转到fr_CA)。不要忘记,大量的人是他们国家的多语言或非母语人士的住所。

下面是我遵循guidlines:

  1. 首先检查用户正在告诉你他们有可能的选择。最简单的方法是:
    • 解析的语言/文化信息出HTTP用户代理字符串examples for Firefox)的。这告诉你一些关于他们正在运行的操作系统版本的信息,并且是一个非常好的偏好指示。他们当然可能会欺骗用户代理,但如果他们这样做,他们不太可能会惊讶他们得到错误的预设。
    • Accept-Language HTTP标头(优先级较低,因为您可能会看到比使用英语作为操作系统首选项的实际用户更多的“en”)。
  2. 二,保存用户的偏好。如果他们登录,询问他们并将其保存为选项。如果没有,请设置一个cookie(合理的过期设置)。这样,他们回来时会感到惊喜。
  3. 仅限使用GeoIP作为最后的手段。
+0

辉煌。感谢您提供非常全面的答案。 – Eric 2010-07-20 02:36:45

+1

我应该只提到大多数用户代理将基于操作系统语言进行自我配置,因此几乎不需要验证两个头;另外,Accept-Language比复杂的用户代理字符串更容易解析。 – igorsantos07 2017-11-10 20:00:45

-1

你几乎回答了你自己的问题 - 你可以使用页眉或只是geoip的(它的死简单易用)

下载来自: http://geolite.maxmind.com/download/geoip/api/php/

示例代码:

include("geoipcity.inc"); 
include("geoipregionvars.php"); 
$gi = geoip_open("GeoLiteCity.dat", GEOIP_STANDARD); 
$record = geoip_record_by_addr($gi, $user_ip); 
echo "The users country code is:" . $record->country_code; 
geoip_close($gi); 
+1

只有当没有用户偏好可用时,Geoip才是一种猜测方法。这很重要,因为一些地点有几种可能的合理语言可用。 (如果你不喜欢英语或西班牙语的话,你可以选择英文或西班牙文作为迈阿密地址吗?如果用户不喜欢,用户的偏好就是最好的方式。) – 2010-07-18 21:29:25

+0

如果用户旅行,该怎么办? geoip几乎不是一个好的解决方案。 – igorsantos07 2017-11-10 20:02:06

0

我会检查接受的语言标题和或iginating访问者的IP地址的国家。如果接受语言头文件不是英文(可能是最常用的默认设置),则使用它来设置默认语言。如果接受语言是英语,请使用原始国家设置默认语言。我认为这会让你对访问者的母语产生更多的教育猜测。