Zend Framework 有一个很棒的组件,叫做 Zend_Locale。在正确解析语言和语言环境方面存在各种细节,部分原因是它已被入侵到HTTP Accept-Language 标头中。
在 Zend Framework语言环境文档中,它说:
注意:请注意,不仅存在大多数人认为的具有 2 个字符的语言环境。还有一些语言和地区不仅缩写为 2 个字符。因此,您不应该自己剥离区域和语言,而是在您想从区域设置字符串中剥离语言或区域时使用 Zend_Locale。否则,当您自己执行此操作时,您的代码中可能会出现意外行为。
完美的。除了我一直在测试各种语言翻译。假设您使用 Firefox 浏览,更改您的设置并添加一些 language_region 配置文件...更改默认顺序。您会看到 Zend 只拉取默认值。文档甚至这样说:
如果用户在他的浏览器中提供了多个语言环境,Zend_Locale 将使用第一个找到的语言环境。如果用户没有提供语言环境或从命令行调用脚本,将自动使用并返回自动语言环境“环境”。
这是不幸的。如果您定义了 5 种语言,您希望浏览用户在浏览器中定义的所有语言环境并使用匹配的语言...
所以我的问题是,你会采取什么方法来解析完整列表并提取任何匹配项?
更新 有一个 Zend_Locale::getBrowser() 方法返回完整列表。伟大的!不知道为什么 Zend_Translate 似乎只拉第一个。我会在检查它是如何工作的之后回来......可能需要构建你有翻译的语言数组,并将其与 getBrowser() 的结果进行比较并提取第一个匹配项。
UPDATE2 我确实实现了一个解决方案,但它仍然有点 hacky,因为 Zend_Translate 和 Zend_Locale 不是小的小类。显然,国际化是一个很大的话题。有相当多的研究。
但从本质上讲,它归结为检查每种语言是否与浏览器首选项列表匹配。