我在 Zend_Locale 和 Zend_Translate 方面遇到了一些问题,特别是在 htmlentities 方面。但是还有其他一些奇怪的地方。
首先,在 Zend_Locale 文档中它指出:
Zend Framework 允许使用应用程序范围的语言环境。您只需使用键“Zend_Locale”将 Zend_Locale 实例设置到注册表。然后这个实例将在 Zend Framework 的所有语言环境感知类中使用
这似乎不适用于 Zend_Translate,我假设 Zend_Translate 不是“语言环境感知”类,奇怪的是它不是但没有大问题我只需要显式设置它。下面是我的 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' 键 - 简单,设置它,任何在数组中具有匹配翻译的表单标签、错误消息等都将被自动翻译。问题是我的法语翻译有很多htmlentities。我可能是错的,但我相信 Zend_Form 的 setLabel 方法会转义文本,因此我的实体会被转换两次。我尝试从翻译中删除所有实体,但这完全失败并给了我一个空白输出。
有没有人有任何想法?用于翻译的 htmlentities 似乎是一个主要的必需品,对吧?
目前我没有自动执行此操作,但我在表单中添加了一个中间函数,它执行以下操作(其中 $this->_translate 是 Zend_Translate 对象):
private function getTranslation($str) {
return html_entity_decode($this->_translate->_($str), ENT_COMPAT, 'UTF-8');
}
但这远非理想,因为我必须首先将每个 setLabel 和 errorMessage 包装起来,有点错过 Zend 的语言环境和翻译类的要点。