Index: library/Zend/Form/Element/Multi.php =================================================================== --- library/Zend/Form/Element/Multi.php (revision 9236) +++ library/Zend/Form/Element/Multi.php (working copy) @@ -213,15 +213,27 @@ */ protected function _translateOption($option, $value) { - if (!isset($this->_translated[$option]) - && (null !== ($translator = $this->getTranslator())) - && $translator->isTranslated($value)) - { - $this->options[$option] = $translator->translate($value); - $this->_translated[$option] = true; - return true; - } + if (isset($this->_translated[$option]) || (null === ($translator = $this->getTranslator()))) { + return false; + } + + if (is_array($value)) { + $value = $this->_arrayMapRecursive(array($translator, 'translate'), $value); + } else { + $value = $translator->translate($value); + } - return false; + $this->options[$option] = $value; + $this->_translated[$option] = true; + return true; + } + + protected function _arrayMapRecursive($function, $data) { + foreach ( $data as $i => $item ) { + $data[$i] = is_array($item) + ? $this->_arrayMapRecursive($function, $item) + : call_user_func($function, $item) ; + } + return $data; } } Index: tests/Zend/Form/Element/MultiselectTest.php =================================================================== --- tests/Zend/Form/Element/MultiselectTest.php (revision 9236) +++ tests/Zend/Form/Element/MultiselectTest.php (working copy) @@ -253,6 +253,33 @@ $test = $this->element->getMultiOption('testing'); $this->assertEquals($options['testing'], $test); } + + public function testOptionsAreTranslatedWhenInASelectWithOptgroups() + { + $translations = array( + 'ThisShouldNotShow' => 'Foo Value', + 'ThisShouldNeverShow' => 'Bar Value' + ); + require_once 'Zend/Translate.php'; + $translate = new Zend_Translate('array', $translations, 'en'); + $translate->setLocale('en'); + + $options = array( + 'group' => array ( + 'foovalue' => 'ThisShouldNotShow', + 'barvalue' => 'ThisShouldNeverShow' + ) + ); + + $this->element->setTranslator($translate) + ->addMultiOptions($options); + + $html = $this->element->render($this->getView()); + foreach ($options['group'] as $value => $label) { + $this->assertNotContains($label, $html, $html); + $this->assertRegexp('/]*>' . $translations[$label] . '/s', $html, $html); + } + } public function testMultiselectIsArrayByDefault() {