1

我在 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 的语言环境和翻译类的要点。

4

1 回答 1

0

我还使用 Zend_Translate 和数组适配器来设置表单的标签。我不需要将任何字符编码为 HTML 实体。据我所知,将它们编码为 UTF-8 就足够了。所以,你提到的包装器不应该是必需的。

我只是将 Zend_Translate 添加到注册表中(使用 'Zend_Translate' 键,否则它将不起作用),将翻译键直接传递给 setLabel() 并且它可以工作。

希望有帮助...

于 2011-08-18T07:41:57.870 回答