Php Zend框架语言环境和Zend_语言环境、Zend_翻译和Zend_形式形式中的翻译问题

Php Zend框架语言环境和Zend_语言环境、Zend_翻译和Zend_形式形式中的翻译问题,php,zend-framework,zend-form,zend-translate,zend-locale,Php,Zend Framework,Zend Form,Zend Translate,Zend Locale,我在Zend_语言环境和Zend_翻译方面遇到了一些问题,特别是在htmlentities方面。但还有一些其他的奇怪之处 首先,在Zend_语言环境文档中,它指出: Zend Framework允许使用应用程序范围的语言环境。你 只需使用键将Zend_Locale的实例设置到注册表 “Zend_语言环境”。然后此实例将在所有区域设置感知中使用 Zend框架的类 这似乎不适用于Zend_Translate,我假设Zend_Translate不是一个“区域设置感知”类,奇怪的是它不是,但没什么大问题

我在Zend_语言环境和Zend_翻译方面遇到了一些问题,特别是在htmlentities方面。但还有一些其他的奇怪之处

首先,在Zend_语言环境文档中,它指出:

Zend Framework允许使用应用程序范围的语言环境。你 只需使用键将Zend_Locale的实例设置到注册表 “Zend_语言环境”。然后此实例将在所有区域设置感知中使用 Zend框架的类

这似乎不适用于Zend_Translate,我假设Zend_Translate不是一个“区域设置感知”类,奇怪的是它不是,但没什么大问题,我只是需要显式地设置它。下面是我的引导中的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_表单文档中的Zend_语言环境(http://framework.zend.com/manual/en/zend.form.i18n.html)它说,向Zend_表单添加翻译的最简单方法是在注册表中设置一个Zend_Translate对象,键为“Zend_Translate”-简单,设置此项以及任何表单标签、错误消息,数组中具有匹配转换的等将自动转换。问题是,我的法语翻译有很多不连贯之处。我可能错了,但我相信Zend_Form的setLabel方法会转义文本,所以我的实体会被转换两次。我尝试从翻译中删除所有实体,但这完全失败,并给我一个空白输出

有人有什么想法吗?翻译的htmlentities似乎是一个主要的必需品,对吗

目前,我没有自动执行此操作,但我已在表单中添加了一个中间函数,该函数执行以下操作(其中$this->\u translate是Zend\u translate对象):


但这远远不够理想,因为我必须首先将每个setLabel和errorMessage打包在一起,这有点缺少Zend的locale和translation类的要点。

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

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

希望这有助于

private function getTranslation($str) {
    return html_entity_decode($this->_translate->_($str), ENT_COMPAT, 'UTF-8');
}