是否有一种简单的方法可以解析用户的HTTP_ACCEPT_LANGUAGE并在PHP中设置语言环境?
我知道Zend框架有一个方法可以做到这一点,但我宁愿不安装整个框架只是为了使用那一点功能。
PEAR I18Nv2软件包处于测试阶段并且近三年没有更改,所以如果可能的话我宁愿不使用它。
如果它可以判断服务器是否在Windows上运行,那也很好,因为Windows的语言环境字符串与世界其他地方不同......(德语是“deu”或“german”而不是“得”。)
答案 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结合起来。
答案 3 :(得分:1)
有http_negotiate_language
,但这取决于http-extension。或者,请参阅手册页上的注释,以获取用户态实现。