2011-03-19 53 views
3

我創建了一個自定義的驗證通過擴展Zend_Validate_Abstract驗證關於Zend_Captcha一個CAPTCHA輸入:如何在Zend Framework中翻譯自定義驗證器的消息?

class My_Validate_Captcha extends Zend_Validate_Abstract { 
    const CAPTCHA = 'captcha'; 

    protected $_messageTemplates = array(
    self::CAPTCHA => "'%value%' isn't the right solution" 
); 

    protected $_id; 

    public function __construct($captchaId) { 
    $this->setId($captchaId); 
    } 

    public function setId($id) { 
    $this->_id = $id; 
    return $this; 
    } 

    public function getId() { 
    return $this->_id; 
    } 

    public function isValid($value) { 
    $this->_setValue($value); 

    $captcha = new Zend_Captcha_Image(); 
    if(!$captcha->isValid(array('input' => $value, 'id' => $this->getId()))) { 
     $this->_error(self::CAPTCHA); 
     return false; 
    } 

    return true; 
    } 
} 

它正常工作與Zend_Filter_Input。如您所見,我爲輸入值無效的情況定義了一條錯誤消息。

現在我試着將這個消息翻譯成德語,就像我翻譯來自Zend_Validate_*類的其他消息一樣。我通過Zend_Translate提供了一個陣列適配器。

return array(
    // Zend_Validate_Alnum 
    'notAlnum'  => "'%value%' darf nur Buchstaben und Zahlen enthalten", 
    'stringEmpty' => "'%value%' Dieser Wert darf nicht leer sein", 
    // ... 
    // My_Validate_Captcha 
    'captcha'  => "'%value%' ist nicht die richtige Lösung" 
) 

我的問題是,這裏定義的從Zend_Validate_*消息被翻譯,而是從My_Validate_Captcha消息未翻譯。如果'captcha'存在於翻譯數組中,我會收到一條空的消息。如果它不存在,我會收到驗證器類中定義的英文消息。

我怎樣才能實現自定義驗證器的消息也使用相同的機制翻譯?

+0

的 '陣列適配器' 你指的是 - 這是傳遞給'Zend_Form'對象? – 2011-03-25 20:14:23

回答

0

我的問題是包含翻譯數組的文件的編碼。德語變音編碼不正確。我現在使用UTF-8並且一切正常。

感謝您的所有努力。

0

林不知道,我深知你的問題,但我有此代碼

class Gestionale_Validator_UniqueCustomMsg extends Zend_Validate_Abstract 
{ 

    const PIVA_NON_UNICA = 'partita iva già assegnata'; 

    protected $_messageTemplates = array(
     self::PIVA_NON_UNICA => 'piva occupata'//verra tradotta in modo automatico 
      ); 

然後在我的翻譯,我有

piva occupata="Questa partita iva è già assengata a \"%value%\"" 

然後我剛纔添加的錯誤這樣

$this->_error(self::PIVA_NON_UNICA, $data['ragsoc']); 

它的工作, 也在我的引導我有

... 
Zend_Form :: setDefaultTranslator ($translate); 
... 
2

添加這個是因爲Google搜索,但我使用了不同的翻譯適配器(Poedit)。處理自定義驗證器翻譯的另一種方法是在構造函數中設置響應消息。通過這種方式,Zend_Translate的翻譯功能可以被Poedit調用和捕獲。

class Form_Validator_Promocode extends Zend_Validate_Db_Abstract 
{ 
    const ERROR_CODE_EXPIRED = 'codeExpired'; 
    const ERROR_CODE_INVALID = 'codeInvalid'; 

    protected $_messageTemplates = array(
     self::ERROR_CODE_EXPIRED => "", 
     self::ERROR_CODE_INVALID => "", 
    ); 

    public function __construct($options) 
    { 
     parent::__construct($options); 

     $tr = Zend_Registry::get('Zend_Translate'); 

     $this->setMessage(
       $tr->translate("This code has expired"), 
       Form_Validator_Promocode::ERROR_CODE_EXPIRED 
     ); 
     $this->setMessage(
       $tr->translate("No code matching '%value%' was found"), 
       Form_Validator_Promocode::ERROR_CODE_INVALID 
     ); 
    } 

}