Статьи
Портфолио
Друзья
Контакты

Последние статьи

15.10.2011 Zend Framework Day 2011, 12 ноября, Киев (0)

27.09.2011 MSSQL, XML и PHP. Как заставить это работать из под *nix? (0)

22.06.2011 Zend Framework, MSSQL и UTF-8 - проблемы с кодировками (5)

Все

Категории

PHP (2)

Zend Framework (32)

Javascript (4)

Другое (13)

Книги (1)

Все

RSS

Статьи

Комментарии

Портфолио

Облако тегов

программирование  open search  портфолио  php  zend framework  Zend_Db  Smarty  Zend_Form  паттерны  javascript  niceforms  jQuery  Zend_Mail  веб  Google  Zend_Rest  Zend_View_Helper  zend casts  Zend_View  Zend_Layout  speedUp  интернет  Загрузчик фотографий  Flash  ВКонтакте  zend  localization  zend_translate  gettext  Я читаю  Книги  sphinx  софт  массовые рассылки  хранение данных 

Все

Статистика



джинсы
Корпоративный блог SEO-Studio - заполнить заявку.
смотреть онлайн Мальчишник 2.
бытовые лазерные уровни на http://www.220-volt.ru/catalog/4-75/0/

Главная > Статьи > Zend Framework > Учим Zend_Form говорить на русском языке!
28.10.08 Учим Zend_Form говорить на русском языке!

РучечкиПредставьте себе ситуацию: Вы участвуете в разработке крупного проекта, исполняя обязанности программиста. Вам надлежит запрограммировать порядка 50-ти форм для пользователей.

 

Вам немного повезло – верстальщик должен Вам помочь их сверстать, но как быть с программной частью, ведь программировать формы – такая рутинная работа. Вот тут Вы и вспомните о Zend_Form.

 

Он значительно упрощает их программинг, позволяя программисту делать лишь свою прямую работу – программировать. В этой статье я не буду рассказывать Вам о том, как использовать Zend_Form, в мануале всё очень красиво расписано.

 

Я расскажу Вам о том, как заставить Zend_Form, выводить сообщения об ошибках на русском языке и предоставлю Вам уже переведённый материал. Поэтому усаживаемся поудобнее, концентрируем своё внимание на статье и поехали ;)

 

 

Проблема


По-умолчанию, Zend_Form выводит сообщения об ошибках на английском языке, нужно «научить» его выводить эти сообщения на русском.

 

 

Решение


Для решения данного вопроса я воспользуюсь стандартными методами работы с мультиязычной поддержкой в Zend Framework – Zend_Translate. Zend_Form имеет очень удобный и довольно простой механизм для работы с Zend_Translate, но об этом в мануале вспоминается как-то вскользь, поэтому я решил в полной мере осветить эту тему у себя на блоге.

 

Итак, для начала, нам нужно перевести все возможные сообщения об ошибках на русский язык. Покопавшись в исходниках Zend_Validate (именно эти классы проверяют форму и передают найденные ошибки), я нашел 64 сообщения об ошибках. Поработав над их переводом, у меня получился ассоциативный массив следующего содержания:

 

 

А что далее? Следующим нашим шагом будет настройка и заполнение информацией экземпляра класса Zend_Translate. Раз уж я сделал перевод в виде массива данных, то нам надо создать экземпляр класса Zend_Translate_Adapter_Array и наполнить его переведённым материалом. После этого, нам надо передать Zend_Translate форме, а дальше за Вас всё сделает Zend.

 

Итак, код, который иллюстрирует выше описанные действия:

 

 

Теперь Вы можете сделать тестовую форму с валидаторами и полюбоваться полученным результатом. А если грамотно продумать Ваше приложение, то Вы можете унаследовать Zend_Form и дописать к Вашим формам дополнительный код, который упростит Вам жизнь, предоставляя удобный интерфейс для реализации необходимого функционала.

 

Таким образом не придется делать одинаковые операции для каждой формы. Это сэкономит Ваши время и силы.

 

 

И в завершение


Переведённый материал Вы можете взять здесь. Если Вы обнаружили ошибку или какую-то неточность в переводе – сообщите мне, пожалуйста, в комментариях к статье.

 

Теги:  zend framework, php, программирование, Zend_Form

Другие категории:

■ PHP ■ Zend Framework ■ Javascript ■ Другое ■ Книги
Комментарии к статье
  IgorN

31.10.08 10:58:22

Нормальнапя статейка для новичков.

  illusive

31.10.08 11:17:58

Нормальнапя статейка для новичков.

Спасибо

  Виктор

20.11.08 14:36:32

Спасибо, помогло в текущем проекте, правда у вас в массиве много ошибок.

Поисправлял некоторые:

  illusive

21.11.08 09:18:48

Спасибо, помогло в текущем проекте

 Очень рад, что мои труды Вам помогли Улыбается

Правда у вас в массиве много ошибок. Поисправлял некоторые

Спасибо. Материал поправил. Просто спешил, нужно было срочно реализовать это для одного проекта...

  Palard

27.11.08 13:59:00

Спасибо, помогло перевести все элементы формы, но file_upload не починяется, даже при добавлении куска в массив:

Есть ли решения. Я пока думаю над этим вопросом и курю исходники.

  illusive

27.11.08 14:16:20

Попробуйте вот так:

Или так:

  illusive

27.11.08 14:23:47

Нет, эти варианты не работают.

Я сейчас занят. Отпишу по сабжу завтра Хмурый

  illusive

27.11.08 20:17:46

В первую очередь я перевел сообщения об ошибках, вот они:

А далее начал эксперементировать и удивительно, но через Zend_Translate сообщения не заменялись! Я перепробовал все, что знал...

 

Единственный способ, который сработал, это передача сообщений через функцию setMessage() либо массивом данных вида пар "ключ"=>"значение" через функцию setMessages() валидатора, т.е. я написал код, подобный этому:

По-моему это баг Zend Framework. Если все валидаторы успешно переводятся, кроме этих, то это выглядит очень странно.... Буду искать дополнительных решений потому, что меня такие переводы неустраивают.

  illusive

27.11.08 22:00:03

Вот. Придумал более красивый способ обойти баг.

Дело в том, что Zend_File_Transfer_Adapter_Http, как я заметил, не поддерживает Zend_Translate, поэтому, валидаторы в него загружаются, но не переводятся. А если валидаторы сначала загрузить, а потом ручками передать им объекты Zend_Translate, то все стает на свои места.

  illusive

28.11.08 12:50:58

В Zend Framework 1.7 можно еще сделать и так:

P.S Отправил баг в Zend Framework баг-трекер...

  woto

29.11.08 14:12:39

Отправил баг в Zend Framework баг-трекер...

Благое дело, а то тоже замучался с переводом элементов связанных с файлами.

  illusive

29.11.08 17:31:41

Благое дело, а то тоже замучался с переводом элементов связанных с файлами.

О реакции программистов на баг сообщу обязательно здесь Подмигивает

  trial

16.12.08 18:56:30

Ребята,  столкнулся с небольшой проблемой: использую валидаторы отдельно от Zend_Form, как в этом случае перевести все сообщения валидаторов разом? Если, допустим использую Zend_Validate_EmailAddress, то я, конечно, могу сделать

но в этом случае переведутся только сообщения валидатора почты, а если мне еще понадобится перевести сообщения для, скажем, Zend_Validate_Date, то мне придется опять устанавливать для него транслятор.

Это гемор, друзья. Нельзя ли как нибудь перевести все сообщения скопом, но не используя Zend_Form ?

  SID

16.12.08 20:33:53

Добавил от себя:

  illusive

17.12.08 09:20:35

@trial:

У меня есть решение:

Теперь все сообщения от валидаторов на русском.

Мы просто создаём наш транслятор (в бутстрапе, например) и указываем Zend_Validate, какой транслятор будем использовать по умолчанию (тоже можно сделать это в бутстрапе).

  illusive

17.12.08 09:26:20

@SID:

Спасибо!

  trial

17.12.08 12:56:59

@illusive:

Спасибо большое!

Zend_Validate_Abstract::setDefaultTranslator($translator); - вот этого то мне и не хватало, не знал что можно манипулировать с Zend_Validate_Abstract.

  illusive

17.12.08 13:06:08

Спасибо большое!

Пожалуйста.

  Nalim

29.04.09 15:00:37

это все конечно здорово,

но я как то не понял в каком месте зодается форма?

в контроллре не получается

Fatal error: Class 'Zend_Validate_Alnum' ....

т.е. не находиться первый же класс, константа из которого приводиться в массиве(

  Eugene Rybalkin

07.05.09 13:00:24

Это-то все интересно, а вот есть ли способ перевести сообщения об ошибках Zend_Filter_Input?

Например Zend_Filter_Input::MISSING_MESSAGE

ну и прочие соотв.

  Ahiles

04.06.09 12:22:25

Помутил значи тут с вашими идеями и получилось примерно следующее:


добавил вот такую директорию "\application\languages" потом в конфиг забил примерно следующее 'languages' => $root . 'application/languages/'


Вот, ну а после в нужной мне форме сделал это:

 

Вот и все товарищи, вдруг кому поможет :)

C Уважением, Ahiles Смеётся

  Скакунов Александр

03.07.09 16:16:20

Нормальная статья и для неновичков.

  illusive

26.09.09 09:57:17

Нормальная статья и для неновичков.

Подмигивает

  Snowcore

07.10.09 12:42:44

Спасибо за материал!

  illusive

07.10.09 14:24:38

Спасибо за материал!

Пожалуйста Улыбается

  Snowcore

08.10.09 18:09:03

А как можно персонализировать сообщения об ошибках для отдельных элементов в частности?

Например, мне нужно 2 разных сообщения для NotEmpty валидатора.

  illusive

08.10.09 18:36:01

  buskaMuza

09.10.09 10:42:08

По моим наблюдениям лучше для индексов использовать уже готовые строки. Т.е. вместо констант классов - использовать сами сообщения, найденные в классах.

Если используются константы, то каждый из упомянутых классов подгружается во время инициализации этого массива. Что есть не очень хорошо и не всегда нужно.

А в остальном за статью большое спасибо -очень помогла.

  illusive

01.11.09 11:04:35

Я с Вами вполне согласен. Позже, после публикации статьи тоже это понял Улыбается

  Марина

11.02.10 12:19:00

Объясните, пожалуйста, как Zend_Translate_Adapter_Array узнает значение констант из подключаемого файла? Например: откуда известно значение Zend_Validate_StringLength::TOO_LONG,
если  Zend/Validate/StringLength.php в общем случае может и не быть заинклюженным ранее.

Если я правильно понимаю, чтобы обработать значения констант из массива, нужно предварительно подключить все файлы Zend_Validate_*, константы из которых переведены. Я в чем-то ошибаюсь?

  illusive

11.02.10 12:52:14

Да, верно. Мой способ вытаскивания переводов, в этом плане кривоват.. Но Вы можете повытаскивать сами строки - тогда все будет норм.

  Марина

11.02.10 15:04:56

Сами строки не получится повытаскивать, они ведь содержат переменные %value%...

  illusive

11.02.10 15:39:39

Вы также и в переводах эти переменные расставляйте, где надо :)

И вообще, значения в эти переменные подставляются потом.. 

  так заглянувший IronMan))

23.02.10 04:42:26

Можно еще легче, ну почти )) сделать

http://www.tig12.net/downloads/apidocs/zf/Validate/Zend_Validate_EmailAddress.class.html#det_constants_INVALID_LOCAL_PART

  так заглянувший IronMan))

23.02.10 04:46:40

У меня допустим ошибки Email, не переводятся, просто в самом Zende и поменять, Zend/Validate/EmailAddress.php, line 52 допустим, но я всеже этим кодом воспользуюсь также. Спасибо.

  так заглянувший IronMan))

23.02.10 05:23:40

 Zend_Validate_EmailAddress::INVALID_FORMAT     => "'%value%' не правильное имя для адреса, вводите адрес вида имя@домен"

Этого точно не хватает))

  illusive

23.02.10 23:32:18

Спасибо за помощь и свой вклад!

  Beck

24.02.10 22:18:34

Отличная сборка и отличные комментарии.

Спасибо и автору и тем, кто оставил свои комментарии

Пожалуйста добавьте в статью

Zend_Validate_EmailAddress::INVALID_FORMAT

Так как, допустим я, уже собирался постить на форуме вопрос, почему не работает перевод проверки емайла.

Спасибо еще раз! Жду от вас полного перевода ошибок. :)

  illusive

24.02.10 23:46:09

Спасибо, поправил Подмигивает

  vredniy

17.06.10 15:07:17

как раз нужно реализовать это в проекте, огромное спасибо

  illusive

20.06.10 22:21:34

Пожалуйста Подмигивает

  Any

08.11.10 13:58:23

Но отображается русский вообще, что делать?

  Any

08.11.10 13:59:28

*Не

  Andrew

18.11.10 13:49:18

Хорошая статья, вопрос а как можна подключить переводы ошыбок формы если адаптер не array а gettext. Спасибо.

  illusive

18.11.10 14:52:25

Я просто вывел их в отдельный файл, вызывая Zend_Translate, но при запуске приложения не подключаю его. Просто poEdit сканируя находит строки и собирает в бинарники.

Вот и все) 

  Dr

10.07.11 14:47:35

Спасибо, не с первого раза получилось, но всеравно большое спасибо

  TheMacros

28.01.12 22:28:24

спасибо, все работает отлично)

Оставить свой комментарий

 
Статьи | Портфолио | Друзья | Контакты
Идея и мозги: Васильев Андрей © 2008-2011 Web-Blog Кисточка и фантазия: Зелинский Богдан