使用PHP自动检测基于浏览器和URL组合的语言文件

时间:2009-11-12 19:08:22

标签: php browser locale

我的网站上有很多来自世界各地的人。整个过程都是UTF-8,所以人们可以自由地提交内容并用他们希望的任何语言 - 从希腊语到英语。

现在,用户无法控制的唯一内容是内置网站语言,用于导航和注册说明等内容。这些字符串在语言文件中,但可以轻松翻译。

所以现在我需要知道如何构建一个系统,尝试自动检测用户的首选语言,同时仍然允许更改。

执行此操作的最简单方法is to check Accept-Language标题users browser sends。大多数浏览器将以用户想要的语言安装 - 即使这样,他们也可以在设置中更改语言。

The problem is网吧用户可能想要更改这些设置但是无法用户或用户可能无法通过网络来了解他们。想象一个愚蠢的美国游客在另一个国家的某台计算机上(我可以嘲笑他们因为我是一个人。)

所以这些人需要更好的方式来改变他们无法覆盖浏览器的语言包装。要回答这个问题,我认为我可以实施基于网址的系统,例如site.com/en_us/...site.com/fr_ca/...

好的,这就是我想象它的运作方式。

  • 新的UserA出现了。
  • 我的网站未找到区域设置Cookie
  • 查看并解析accept-language header
  • 检查现有的lang目录(以确保我支持fr_ca!)
  • 将cookie设置为fr_ca
  • 将用户重定向到site.com/fr_ca

  • UserA现在加载site.com/fr_ca

  • 我的网站找到了区域设置Cookie
  • 区域设置Cookie与网址区域设置匹配
  • 用户必须要使用此区域设置
  • 继续加载页面

  • UserB从UserA获取指向site.com/fr_ca

  • 的链接
  • UserB加载页面,我的网站找不到区域设置cookie

这就是我在下一步做什么而迷失的地方

  • 我的网站发现UserB浏览器显示en_us,因此会重定向它们 或
  • 我的网站使用fr_ca创建一个区域设置Cookie,用户必须访问en_US才能更改。

这是否是处理语言检测的一种非常可靠的方法,所以我知道是否要注册或注册?

4 个答案:

答案 0 :(得分:2)

我会选择“我的网站发现UserB浏览器说en_us所以它重定向它们”,因为这是新访问者的预期行为 - 如果您没有任何语言切换器。

另一方面,如果你提供一个明显可见的语言切换器块 - 那么我会使用“我的网站用FR创建一个区域设置cookie,用户将不得不访问EN改变“,因为”错误的语言“可以很容易地切换。

总的来说,我建议实施可见语言切换 - 如果其他一切都失败并且您的法国访问者看到希腊语的网站,这是最可靠的后备。

然后可以将这些角色分配给每个级别的语言协商:

  1. (最低优先级)Cookie报告访问者的偏好
  2. 当没有cookie时,accept-language告诉使用哪种语言
  3. 如果没有接受语言(或您不支持),请使用默认语言
  4. (最高优先级)当URL中有语言说明符时 - 使用它,无论cookie / accept-language的值是什么

答案 1 :(得分:1)

这就是我这样做的方式......

在用户可以切换语言的网站上始终有一个位置。语言按钮应加载当前所在的页面,并将cookie设置为该语言。

测试要加载的语言...

// cookie exists, they know what language they want
if cookie exists load that language

// cookie doesn't exist - its expired or this is their first visit
elseif accept-language is set, load that language; set cookie

// no accept-language present
else load some default language; set cookie

说法国的英语发言人来到你的网站。

  • 没有cookie,但是接受语言是法语。

  • 加载了法语,设置了cookie。

  • 用户看到语言切换器并选择英语。英语加载和cookie为他在网站上的剩余时间设置。

如果浏览器不接受cookie,则在查询字符串中传递lang = [lang],并在检查cookie后检查它。

答案 2 :(得分:1)

我会尽可能地使语言指标透明化。这意味着我会像你建议的那样将它放在URL中,而不是放在cookie中。如果需要,用户可以在URL中轻松更改它。

现在,如果缺少语言指示符,您可以对 Accept-Language 或其他条件进行语言协商,并将用户重定向到所请求资源的特定语言表示。

此外,您可以对每个请求进行语言协商,并将URL中请求的语言与已协商的语言进行比较。如果它们不同,您可以提供一条消息,表明首选语言的表示也可用。

答案 3 :(得分:0)

请记住,阿拉伯语言从右到左书写时几乎没有问题,因此您必须在大多数标签中定义写入方向。另外我会将语言参数设置为严格,而不是使用 en_US en__GB 使用en参数,因为它们之间没有太大区别。