使用Zend_Locale,Zend_Translate和Zend_Form形式的Zend Framework语言环境和转换问题

时间:2011-08-11 10:55:40

标签: php zend-framework zend-form zend-translate zend-locale

我一直遇到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的语言环境和翻译类。

1 个答案:

答案 0 :(得分:0)

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

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

希望有帮助...