有没有一种简单的方法来解析用户的HTTP_ACCEPT_LANGUAGE并在PHP中设置语言环境?
我知道Zend框架有一个方法可以做到这一点,但我宁愿不安装整个框架只是为了使用那一点功能.
PEAR I18Nv2软件包处于测试阶段,近三年没有更改,所以如果可能的话我宁愿不使用它.
如果它可以判断服务器是否在Windows上运行,那也很好,因为Windows的语言环境字符串与世界其他地方不同......(德语是"deu"或"german"而不是"de". )
它并不像它应该那么容易(以我的拙见).首先,您必须从中提取区域设置$_SERVER['HTTP_ACCEPT_LANGUAGE']
并按其q
值对其进行排序.之后你必须为每个给定的语言环境检索适当的系统语言环境,这在*nix机器上应该没问题(你可能只需要处理正确的字符集)但是在Windows上你必须将语言环境翻译成视窗语言环境,比如de_DE
将German_Germany
(再次你还必须应付字符集的问题,如果你在你的应用程序,例如使用UTF-8).我认为你必须为这个问题建立一个查找表 - 并且有很多语言环境;-)
不能在另一个之后尝试一个区域设置(使用降序q
值排序),直到找到匹配项setlocale()
(false
如果无法设置给定的区域设置,函数将返回).
但随后将面临最后一个障碍:
每个进程维护语言环境信息,而不是每个线程.如果您在Windows上的多线程服务器api(如IIS或Apache)上运行PHP,则在脚本运行时可能会遇到区域设置的突然更改,尽管脚本本身从未调用过setlocale()本身.这是因为在同一进程的不同线程中运行的其他脚本同时使用setlocale()更改了进程范围的语言环境.
(见:http://de2.php.net/manual/en/function.setlocale.php)
这意味着您可以在执行脚本期间遇到突然的区域设置更改,因为具有不同区域设置的其他用户只会访问您的网页.
因此,上述内容Zend_Locale
不依赖于PHP函数setlocale()
(它仅用于检索系统区域设置信息),而是使用基于Unicode CLDR项目提供的数据的系统.这使组件独立于所有这些setlocale()
问题,但这也引入了一些其他缺陷,例如缺乏对区域设置感知字符串操作的支持(例如排序).