我通过扩展Zend_Validate_Abstract
来验证有关Zend_Captcha
的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'
,我会收到一条空消息。如果它不存在,我会在验证器类中定义英语消息。
如何实现自定义验证器的消息也使用相同的机制进行翻译?
答案 0 :(得分: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
);
}
}
答案 1 :(得分: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 :(得分:0)
我的问题是包含翻译数组的文件的编码。德语变音符号编码不正确。我现在正在使用UTF-8,一切正常。
感谢您的所有努力。