Index: tests/Zend/Form/ElementTest.php =================================================================== --- tests/Zend/Form/ElementTest.php (revision 21664) +++ tests/Zend/Form/ElementTest.php (working copy) @@ -2049,6 +2049,91 @@ $this->assertEquals(1, count($messages)); $this->assertEquals('foo', array_shift($messages)); } + + /** + * @group ZF-9275 + */ + public function testElementDoesntOverrideDefaultValidatorTranslatorWithDefaultRegistryTranslator() + { + $registryTranslations = array('alphaInvalid' => 'Registry message'); + $registryTranslate = new Zend_Translate('array', $registryTranslations); + Zend_Registry::set('Zend_Translate', $registryTranslate); + + $validatorTranslations = array('alphaInvalid' => 'Validator message'); + $validatorTranslate = new Zend_Translate('array', $validatorTranslations); + Zend_Validate_Abstract::setDefaultTranslator($validatorTranslate); + + $elementTranslations = array('alphaInvalid' => 'Element message'); + $elementTranslate = new Zend_Translate('array', $elementTranslations); + + // the default validate translator should beat the registry one + $this->element->addValidator('Alpha'); + $this->assertFalse($this->element->isValid(123)); + $messages = $this->element->getMessages(); + $this->assertEquals('Validator message', $messages['alphaInvalid']); + } + + /** + * @group ZF-9275 + */ + public function testDefaultTranslatorDoesntOverrideElementTranslatorOnValdiation() + { + $registryTranslations = array('alphaInvalid' => 'Registry message'); + $registryTranslate = new Zend_Translate('array', $registryTranslations); + Zend_Registry::set('Zend_Translate', $registryTranslate); + + $validatorTranslations = array('alphaInvalid' => 'Validator message'); + $validatorTranslate = new Zend_Translate('array', $validatorTranslations); + Zend_Validate_Abstract::setDefaultTranslator($validatorTranslate); + + $elementTranslations = array('alphaInvalid' => 'Element message'); + $elementTranslate = new Zend_Translate('array', $elementTranslations); + + $this->element->addValidator('Alpha'); + $this->element->setTranslator($elementTranslate); + $this->assertFalse($this->element->isValid(123)); + $messages = $this->element->getMessages(); + $this->assertEquals('Element message', $messages['alphaInvalid']); + } + + /** + * @group ZF-9275 + */ + public function testValidatorsDefaultTranslatorDoesntOverrideFormsDefaultTranslator() + { + $formTranslations = array('alphaInvalid' => 'Form message'); + $formTranslate = new Zend_Translate('array', $formTranslations); + Zend_Form::setDefaultTranslator($formTranslate); + + $validatorTranslations = array('alphaInvalid' => 'Validator message'); + $validatorTranslate = new Zend_Translate('array', $validatorTranslations); + Zend_Validate_Abstract::setDefaultTranslator($validatorTranslate); + + // the default validate translator should beat the registry one + $this->element->addValidator('Alpha'); + $this->assertFalse($this->element->isValid(123)); + $messages = $this->element->getMessages(); + $this->assertEquals('Form message', $messages['alphaInvalid']); + } + + /** + * @group ZF-9275 + */ + public function testElementsTranslatorDoesntOverrideValidatorsDirectlyAttachedTranslator() + { + $elementTranslations = array('alphaInvalid' => 'Element message'); + $elementTranslate = new Zend_Translate('array', $elementTranslations); + + $validatorTranslations = array('alphaInvalid' => 'Direct validator message'); + $validatorTranslate = new Zend_Translate('array', $validatorTranslations); + + $validator = new Zend_Validate_Alpha(); + $validator->setTranslator($validatorTranslate); + $this->element->addValidator($validator); + $this->assertFalse($this->element->isValid(123)); + $messages = $this->element->getMessages(); + $this->assertEquals('Direct validator message', $messages['alphaInvalid']); + } } class Zend_Form_ElementTest_Decorator extends Zend_Form_Decorator_Abstract Index: library/Zend/Form.php =================================================================== --- library/Zend/Form.php (revision 21665) +++ library/Zend/Form.php (working copy) @@ -2776,6 +2776,16 @@ } /** + * Is there a default translation object set? + * + * @return boolean + */ + public static function hasDefaultTranslator() + { + return (bool)self::$_translatorDefault; + } + + /** * Indicate whether or not translation should be disabled * * @param bool $flag Index: library/Zend/Form/Element.php =================================================================== --- library/Zend/Form/Element.php (revision 21664) +++ library/Zend/Form/Element.php (working copy) @@ -1332,6 +1332,21 @@ array_unshift($validators, $notEmpty); $this->setValidators($validators); } + + // Find the correct translator. Zend_Validate_Abstract::getDefaultTranslator() + // will get either the static translator attached to Zend_Validate_Abstract + // or the 'Zend_Translate' from Zend_Registry. + if (Zend_Validate_Abstract::hasDefaultTranslator() && + !Zend_Form::hasDefaultTranslator()) + { + $translator = Zend_Validate_Abstract::getDefaultTranslator(); + if ($this->hasTranslator()) { + // only pick up this element's translator if it was attached directly. + $translator = $this->getTranslator(); + } + } else { + $translator = $this->getTranslator(); + } $this->_messages = array(); $this->_errors = array(); @@ -1339,7 +1354,13 @@ $isArray = $this->isArray(); foreach ($this->getValidators() as $key => $validator) { if (method_exists($validator, 'setTranslator')) { - $validator->setTranslator($this->getTranslator()); + if (method_exists($validator, 'hasTranslator')) { + if (!$validator->hasTranslator()) { + $validator->setTranslator($translator); + } + } else { + $validator->setTranslator($translator); + } } if (method_exists($validator, 'setDisableTranslator')) { Index: library/Zend/Validate/Abstract.php =================================================================== --- library/Zend/Validate/Abstract.php (revision 21664) +++ library/Zend/Validate/Abstract.php (working copy) @@ -353,6 +353,16 @@ } /** + * Does this validator have its own specific translator? + * + * @return bool + */ + public function hasTranslator() + { + return (bool)$this->_translator; + } + + /** * Set default translation object for all validate objects * * @param Zend_Translate|Zend_Translate_Adapter|null $translator @@ -393,6 +403,16 @@ } /** + * Is there a default translation object set? + * + * @return boolean + */ + public static function hasDefaultTranslator() + { + return (bool)self::$_defaultTranslator; + } + + /** * Indicate whether or not translation should be disabled * * @param bool $flag