Zend Framework有一个名为Zend_Locale的优秀组件。在正确解析语言和语言环境方面有各种各样的细节,部分原因是因为它被黑客入侵HTTP Accept-Language header。
在Zend Framework locale docs中,它说:
注意:请注意不存在 仅限最多2个字符的区域设置 人们认为。还有语言 和不仅是的地区 缩写为2个字符。 因此你不应该剥离 区域和语言本身,但使用 Zend_Locale什么时候想剥离 来自语言环境的语言或区域 串。否则你可以拥有 代码中的意外行为 当你自己这样做时。
完美。除了我一直在测试各种语言翻译。假设您使用Firefox浏览,更改您的设置并添加一些language_region配置文件...更改默认顺序。你会看到Zend只提取默认值。文档甚至这样说:
如果用户提供多个 浏览器中的语言环境Zend_Locale 将使用第一个找到的区域设置。如果 用户不提供区域设置或 正在调用脚本 命令行自动语言环境 '环境'将自动成为 使用和返回。
这很不幸。如果您定义了5种语言,则需要浏览用户在浏览器中定义的所有语言环境,并使用与...相匹配的语言。
所以我的问题是,您采取什么方法来解析完整列表并提取任何匹配项?
更新 有一个Zend_Locale :: getBrowser()方法返回完整列表。大!不知道为什么Zend_Translate似乎只是拉出了第一个。我会在检查它是如何工作之后再回来......可能需要构建你有翻译的lang数组并将其与getBrowser()的结果进行比较并拉出第一个匹配。
UPDATE2 我确实实现了一个解决方案,但它仍然有点hacky,因为Zend_Translate和Zend_Locale不是小的小类。显然,国际化是一个很大的话题。有一点研究。
但实质上,它归结为检查每种语言的匹配与浏览器首选项列表。
答案 0 :(得分:0)
我的方法是http://www.zf-beginners-guide.com/本书
protected function _initLocale()
{
// try to auto-detect locale
// if fail, set locale manually
try {
$locale = new Zend_Locale('browser');
} catch (Zend_Locale_Exception $e) {
$locale = new Zend_Locale('en_GB');
}
// register locale
$registry = Zend_Registry::getInstance();
$registry->set('Zend_Locale', $locale);
}
但是我害怕他提到的语言环境升级:
小心请务必注意这一点 Zend_Locale不会抛出 区域设置标识符的异常 检测到只包含语言 代码而不是区域代码。对于 例如,一些客户端和/或服务器 环境可能只是返回 locale en或fr。这种情况可以 有时会产生问题 Zend_Locale与其他人一起使用 期望a的语言环境感知类 完整的区域设置标识符,例如 Zend_Currency的。没有真实的 解决这个问题,除了 手动设置基于的语言环境 可用事实和“最佳猜测” 估计。 A proposed new feature in Zend_Locale将来会允许 “区域升级”,其中部分 限定的区域设置标识符(for 例如,en)将自动进行 转换为完全限定的语言环境 标识符(例如,en_US)。
例如在firefox中,如果你只选择语言代码[en],上面的代码将接受它作为语言环境,但其他语言环境感知类将抛出异常
经过一些测试后,我发现很高比例的人不会改变浏览器的默认语言 这会让你开心:)