Sea*_*ean 8 php locale internationalization
有没有一种简单的方法来解析用户的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()
问题,但这也引入了一些其他缺陷,例如缺乏对区域设置感知字符串操作的支持(例如排序).
好的解决方案正在路上。
如果没有它,您将需要解析该标头。它是用分号分隔的区域设置和属性的逗号分隔列表。
它可以看起来像这样:
en_US, en;q=0.8, fr_CA;q=0.2, *;q=0.1
Run Code Online (Sandbox Code Playgroud)
然后尝试每个区域设置直到setlocale()
接受它。做好准备,它们可能都不匹配。
不要基于它任何太重要的东西或允许用户覆盖它,因为某些用户可能配置了错误的浏览器。
对于 Windows 区域设置,也许您需要将 ISO 639-1 名称转换为 ISO 639-2/3?
归档时间: |
|
查看次数: |
2659 次 |
最近记录: |