Как перевести сообщения пользовательского валидатора в 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'. Если его нет, я получаю сообщение на английском языке, определенное в классе валидатора.

Как я могу добиться того, чтобы сообщение от настраиваемого валидатора также переводилось с использованием того же механизма?


person user413773    schedule 19.03.2011    source источник
comment
«Адаптер массива», на который вы ссылаетесь - передается ли он объекту Zend_Form?   -  person Jake N    schedule 25.03.2011


Ответы (3)


Это добавлено из-за поиска в Google, но я использовал другой адаптер перевода (Poedit). Другой способ обработки перевода настраиваемого валидатора - установка ответных сообщений в конструкторе. Таким образом Poedit может вызвать и перехватить функцию translate Zend_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
        );
    }

}

person danielkarso    schedule 06.09.2012

Я не уверен, что правильно понял ваш вопрос, но у меня есть этот код

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']);

и это работает, также в моем bootstrap у меня есть

...
Zend_Form :: setDefaultTranslator ( $translate );
...
person max4ever    schedule 01.04.2011

Моя проблема заключалась в кодировке файла, содержащего массив переводов. Немецкие умляуты не кодировались должным образом. Я сейчас использую UTF-8, и все работает.

Спасибо за все твои старания.

person user413773    schedule 14.04.2011