使用完整的区域设置首选项列表从Zend Framework中提取用户定义的区域设置的最佳方法是什么?

时间:2010-11-05 18:54:46

标签: zend-framework localization internationalization zend-locale

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不是小的小类。显然,国际化是一个很大的话题。有一点研究。

但实质上,它归结为检查每种语言的匹配与浏览器首选项列表。

1 个答案:

答案 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],上面的代码将接受它作为语言环境,但其他语言环境感知类将抛出异常

经过一些测试后,我发现很高比例的人不会改变浏览器的默认语言 这会让你开心:)