我一直在使用Zend_Locale和Zend_Translate,特別是使用htmlentities時遇到了一些問題。但是還有其他一些古怪的東西。Zend Framework語言環境和Zend_Locale,Zend_Translate和Zend_Form形式的翻譯問題
首先,從Zend_Locale文檔中它指出:
Zend框架允許應用範圍的地方的使用情況。您只需使用 'Zend_Locale'將Zend_Locale的實例設置爲註冊表即可。那麼這種情況下將所有的語言環境意識到 類Zend框架
內使用這似乎並不在Zend_Translate工作,我假設了Zend_Framework不是「語言環境意識」類的,怪異的,這是不但沒有什麼大問題,我只需要明確地設置它。下面是我的自舉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_Framework陣列適配器。我的數組在translation.php中定義。
與Zend_Locale類似,Zend_Form(http://framework.zend.com/manual/en/zend.form.i18n.html)文檔中提到了將翻譯添加到Zend_Form的最簡單方法是設置一個Zend_Translate在註冊表中使用'Zend_Translate'鍵的對象 - 很簡單,將其設置,並且在數組中有匹配翻譯的任何表單標籤,錯誤消息等都將被自動轉換。問題是我的法語翻譯有很多問題。我可能是錯的,但我相信Zend_Form的setLabel方法可以轉義文本,所以我的實體被轉換了兩次。我嘗試從翻譯中刪除所有實體,但這完全失敗,並給我一個空白輸出。
有沒有人有任何想法?翻譯的好處似乎是一種主要的必然性嗎?
目前我不會自動這樣做,但我已經添加了一箇中間的功能到我的形式做了以下(其中$本 - > _翻譯是一個Zend_Translate對象):
private function getTranslation($str) {
return html_entity_decode($this->_translate->_($str), ENT_COMPAT, 'UTF-8');
}
但是,這是這很不理想,因爲我必須首先在每一個setLabel和errorMessage中包裝,這種類型忽略了Zend的語言環境和翻譯類的重點。