我一直遇到Zend_Locale和Zend_Translate的一些问题,特别是htmlentities。但还有其他一些奇怪的事情。
首先,在Zend_Locale文档中声明:
Zend Framework允许使用应用程序范围的语言环境。您 只需使用密钥将Zend_Locale实例设置到注册表即可 '从Zend_Locale'。然后,此实例将在所有区域设置中使用 Zend框架类
这似乎不适用于Zend_Translate,我假设Zend_Translate不是'locale aware'类,奇怪的是它不是,但没有大问题我只需要明确地设置它。下面是我的Bootstrap中的initLocale()函数:
$session = new Zend_Session_Namespace();
// only if locale is explicitly set by user:
if(isset($_GET['locale']) && !empty($_GET['locale'])) {
$session->locale = $_GET['locale'];
}
$locale = isset($session->locale) ? $session->locale : 'auto';
try {
$zendLocale = new Zend_Locale($locale);
} catch (Zend_Locale_Exception $e) {
$zendLocale = new Zend_Locale('en_CA');
}
Zend_Registry::set('Zend_Locale', $zendLocale);
require_once(APPLICATION_PATH . '/languages/translation.php');
$translate = new Zend_Translate(array(
'adapter' => 'array',
'content' => $english,
'locale' => 'en'
));
$translate->addTranslation(array(
'content' => $french,
'locale' => 'fr'
));
$translate->setLocale($zendLocale->toString());
Zend_Registry::set('translate', $translate);
正如你在这里看到的,我正在使用Zend_Translate的数组适配器。我的数组在translation.php中定义。
与Zend_Form(http://framework.zend.com/manual/en/zend.form.i18n.html)文档中的Zend_Locale类似,它说向Zend_Form添加翻译的最简单方法是设置Zend_Translate对象在注册表中使用'Zend_Translate'键 - 简单,设置它,并且在数组中具有匹配转换的任何表单标签,错误消息等将自动翻译。问题是我的法语翻译有很多不足之处。我可能错了,但我相信Zend_Form的setLabel方法会转义文本,所以我的实体会被转换两次。我尝试从翻译中删除所有实体但这完全失败并给我一个空白输出。
有没有人有任何想法?翻译的好处似乎是一个主要的必要性吗?
目前我没有自动执行此操作,但我在表单中添加了一个中间函数,其执行以下操作(其中$ this-> _translate是Zend_Translate对象):
private function getTranslation($str) {
return html_entity_decode($this->_translate->_($str), ENT_COMPAT, 'UTF-8');
}
但这远非理想,因为我必须首先将每个setLabel和errorMessage包装起来,而忽略了Zend的语言环境和翻译类。
答案 0 :(得分:0)
我还使用Zend_Translate和数组适配器来设置表单的标签。我不需要将任何字符编码为HTML实体。据我所知,将它们编码为UTF-8就足够了。所以,你提到的包装器不是必需的。
我只是将Zend_Translate添加到注册表中(使用'Zend_Translate'键,否则它将无效),直接将翻译键传递给setLabel()并且它可以正常工作。
希望有帮助...