使用Zend_Locale, Zend_Translate和Zend_Form的Zend框架语言环境和翻译问题


Zend Framework locale and translation problems in form with Zend_Locale, Zend_Translate and Zend_Form

我一直有一些问题与Zend_Locale和Zend_Translate,特别是与htmlentities。但还有其他一些奇怪的地方。

首先,在Zend_Locale文档中声明:

Zend框架允许使用应用程序范围内的区域设置。你只需将Zend_Locale的一个实例设置为具有键的注册表"Zend_Locale"。然后,此实例将在所有区域设置感知范围内使用Zend Framework的类

这似乎不与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' -很容易,设置好后,任何表单标签,错误消息等在数组中有匹配的翻译将被自动翻译。问题是,我的法语翻译有很多htmlentity。我可能是错的,但我相信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的locale和translation类的重点。

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

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