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

これを追加したのは 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
        );
    }

}

于 2012-09-06T12:51:21.127 に答える
0

私の問題は、翻訳配列を含むファイルのエンコードでした。ドイツ語のウムラウトが正しくエンコードされていませんでした。私は現在UTF-8を使用していますが、すべてうまくいきます。

ご尽力いただきありがとうございます。

于 2011-04-14T13:28:33.430 に答える
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 に答える