Zend_Form Перевод заполнителя

У меня есть приложение Zend с Zend_Form, которое должно использовать атрибут HTML5 placeholder вместо меток, как сделано здесь.

class Application_Form_Usereditprofile extends Zend_Form
{
     public function init()
     {
         [...]
         $this->addElement('text', 'FirstName', array(
            'filters'    => [...],
            'validators' => [...],
            'placeholder'=> 'user_editprofile_firstname', // string I want to translate
         ));
         [...]
     }
}

Я инициализировал Zend_Translate, поэтому он должен переводить мои формы по умолчанию. Это отлично работает с этикетками. Однако заполнитель используется как есть, без перевода.

Как я могу перевести строки заполнителей?


person danijar    schedule 03.12.2011    source источник


Ответы (3)


Вы можете получить доступ к помощнику по переводу следующим образом

'placeholder'=> $this->getView()->translate('user_editprofile_firstname),

Кстати. Атрибут plceholder не заменяет label.

Из спецификации:

Атрибут placeholder не должен использоваться как альтернатива метке.

person Jona    schedule 03.12.2011
comment
Спасибо, что работает! И заполнитель вместо метки мне подходит. Я не поддерживаю устаревшие браузеры. - Я долго ждал этого атрибута, а теперь мне нельзя использовать ??? - person danijar; 03.12.2011
comment
Имейте в виду, что это переведет атрибут «заполнитель» как есть, будущие вызовы setTranslator и / или изменения переводчика не повлияют на результат. Это можно рассматривать как нарушение абстракции от корня Zend \ Form. - person Denis 'Alpheus' Cahuk; 08.03.2012

Вот мое окончательное решение. Он переводит все заполнители. Спасибо Йоне за ответ.

foreach($this->getElements() as $key => $element)
{
    $placeholder = $element->getAttrib('placeholder');
    if(isset($placeholder))
    {
        $this->$key->setAttrib('placeholder',$this->getView()->translate($placeholder));
    }
}

Вот и все!

person danijar    schedule 04.12.2011

На самом деле мне нравится автоматизировать процессы, поэтому я просто создал новый класс My_Form, расширяющий Zend_Form, и заменил метод рендеринга для обработки вещей:

public function render(Zend_View_Interface $view = null)
{
        /**
         * Getting elements.
         */
        $elements = $this->getElements();

        foreach ($elements as $eachElement) {

            /**
             * Auto placeholder translation
             */
            if($eachElement->getAttrib('placeholder') !== NULL && $eachElement->getTranslator() !== NULL ) {
                $placeholderText = $eachElement->getAttrib('placeholder');
                $textTrans =  $eachElement->getTranslator()->translate( $placeholderText);
                $eachElement->setAttrib('placeholder', $textTrans);
            }

        }

    /**
     * Rendering.
     */

    return parent::render($view);
}
person Ivan    schedule 14.01.2015