如何在PHP中自动设置用户的语言环境?

时间:2008-11-28 23:27:48

标签: php internationalization locale

是否有一种简单的方法可以解析用户的HTTP_ACCEPT_LANGUAGE并在PHP中设置语言环境?

我知道Zend框架有一个方法可以做到这一点,但我宁愿不安装整个框架只是为了使用那一点功能。

PEAR I18Nv2软件包处于测试阶段并且近三年没有更改,所以如果可能的话我宁愿不使用它。

如果它可以判断服务器是否在Windows上运行,那也很好,因为Windows的语言环境字符串与世界其他地方不同......(德语是“deu”或“german”而不是“得”。)

4 个答案:

答案 0 :(得分:5)

它并不像它应该那么容易(以我的拙见)。首先,您必须从$_SERVER['HTTP_ACCEPT_LANGUAGE']中提取区域设置,并按其q值对其进行排序。之后你必须为每个给定的语言环境检索适当的系统语言环境,这在* nix机器上应该没有问题(你可能只需要处理正确的字符集)但是在Windows上你必须将语言环境翻译成Windows语言环境,例如de_DE将为German_Germany(例如,如果您在应用中使用UTF-8,则还需要处理字符集问题)。我认为你必须为这个问题构建一个查找表 - 并且有很多语言环境; - )

不是你在另一个之后尝试一个区域设置(按降序q值排序),直到找到使用setlocale()的匹配项(如果给定的区域设置不能,则该函数将返回false组)。

但接下来会有最后的障碍来应对:

  

维护区域设置信息   每个进程,而不是每个线程。如果你   在多线程上运行PHP   服务器api就像IIS或Apache一样   Windows可能会突然遇到   更改语言环境设置时   尽管脚本正在运行脚本   本身从未调用过setlocale()   本身。这是因为其他原因   脚本在不同的线程中运行   同时进行相同的过程   使用更改流程范围的区域设置   的setlocale()。

(见:http://de2.php.net/manual/en/function.setlocale.php

这意味着您可以在执行脚本期间遇到突然的区域设置更改,因为具有不同区域设置的其他用户只会点击您的网页。

因此,提到的Zend_Locale不依赖于PHP函数setlocale()(它仅用于检索系统区域设置信息),而是使用基于{{3}提供的数据的系统}。这使得组件独立于所有这些setlocale()问题,但这也引入了一些其他缺陷,例如缺乏对区域设置感知字符串操作的支持(例如,排序)。

答案 1 :(得分:2)

很好的解决方案是on its way

如果没有它,你需要解析那个标题。它是以逗号分隔的以分号分隔的区域设置和属性的列表。

它看起来像这样:

en_US, en;q=0.8, fr_CA;q=0.2, *;q=0.1

然后尝试每个区域设置,直到setlocale()接受它。做好准备,没有一个可以匹配。

不要基于它太重要或允许用户覆盖它,因为某些用户可能配置错误的浏览器。


对于Windows区域设置,您可能需要将ISO 639-1名称转换为ISO 639-2 / 3吗?

答案 2 :(得分:2)

  

我知道Zend框架有一个方法   这样做,但我宁愿不安装   整个框架只是为了使用它   一点功能。

关于Zend的好消息是,你不需要全部安装它。它是一个丢失耦合的框架,您可以在不使用任何其他组件的情况下使用Zend_Locale。也许你想把它与Zend_Translate结合起来。

Check it out

答案 3 :(得分:1)

http_negotiate_language,但这取决于http-extension。或者,请参阅手册页上的注释,以获取用户态实现。