Как перевести сообщения пользовательского валидатора в Zend Framework?
Я создал собственный валидатор, расширив 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'
присутствует в массиве перевода. Если его нет, я получаю английское сообщение, определенное в классе валидатора.
Как я могу добиться, чтобы сообщение от пользовательского валидатора также переводилось с использованием того же механизма?
3 ответа
Моя проблема заключалась в кодировке файла, который содержит массив перевода. Немецкие умлауты не были закодированы должным образом. Я сейчас использую UTF-8 и все работает.
Спасибо за все ваши усилия.
Добавление это из-за поиска в 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
);
}
}
Я не уверен, что я хорошо понял ваш вопрос, но у меня есть этот код
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 );
...