3

我通过扩展Zend_Validate_Abstract来验证关于以下内容的 CAPTCHA 输入创建了一个自定义验证器Zend_Captcha

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'如果翻译数组中存在,我会收到一条空消息。如果它不存在,我会收到验证器类中定义的英文消息。

如何实现来自自定义验证器的消息也使用相同的机制进行翻译?

4

3 回答 3

2

由于谷歌搜索添加了这个,但我使用了不同的翻译适配器(Poedit)。另一种处理自定义验证器翻译的方法是在构造函数中设置响应消息。这样Zend_TranslatePoedit 就可以调用和捕获的 translate 函数。

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
        );
    }

}

于 2012-09-06T12:51:21.127 回答
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 );
...
于 2011-04-01T08:32:01.977 回答
0

我的问题是包含翻译数组的文件的编码。德国元音变音未正确编码。我现在使用 UTF-8,一切正常。

感谢您的所有努力。

于 2011-04-14T13:28:33.430 回答