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

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

17.02.2010 Презентация проекта LINKGATOR.NET 6 коммент.

02.02.2010 Первая в России конференция по Zend Framework 8 коммент.

30.12.2009 Новый Год 2010 9 коммент.

Все

Категории

PHP 2 стат.

Zend Framework 23 стат.

Javascript 3 стат.

Другое 11 стат.

Книги 1 стат.

Украина 1 стат.

Все

RSS

Статьи

Комментарии

Портфолио

Облако тегов

программирование  Программы  портфолио  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  релизы 

Все

Реклама



Статистика



Rambler's Top100

Главная > Статьи > Zend Framework > Zend Framework. Локализация проектов. Часть третья
24.06.09 Zend Framework. Локализация проектов. Часть третья

POEDITВот добрались мы и до третьей части моего повествования о локализации веб-проектов с помощью Zend Framework и GNU gettext.

 

Напомню, в предыдущей части я рассказал Вам о программной реализации мультиязычности в PHP, теперь самое время рассмотреть инструментарий для создания файлов переводов и эффективное управление ими на основе Вашего исходного кода…

 

 

 

Инструменты



Для работы нам необходима всего лишь одна маленькая и шустрая программка – Poedit для Windows. Лично я пользуюсь версией 1.4.2.

 

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

 

Все, программа готова к использованию.

 

 

Создание и настройка каталогов



Для создания каталогов (так называется набор строк для перевода) Вы можете воспользоваться менеджером каталогов, но лично я всегда выбирал Файл -> Создать каталог…

 

Создание каталога в poEdit

После выбора пункта меню вы должны увидеть окно настройки будущего каталога. Думаю, что с заполнением вкладки «информация о проекте» трудностей возникнуть не должно. Есть только одно примечание: не путайте «кодировку исходного кода» и «кодировку» - это принципиально разные понятия. Кодировка исходного кода, это кодировка программного кода Вашего веб-проекта, а «кодировка» - кодировка файла с переводом.

 

Информация о каталоге

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

 

Настройка путей

Для ясности вопроса приведу Вам пример уже заполненного варианта:

 

Настройка путей

Т.е. в примере сканируются папки:

  • Z:\home\fooup-cms\fooup.cms\core\lib\
  • Z:\home\fooup-cms\fooup.cms\core\locale\
  • Z:\home\fooup-cms\fooup.cms\core\mvc\

Вкладка «ключевые слова» нам не нужна, так как рассмотренных настроек вполне хватит. После того как Вы нажмете кнопку «ОК» Вам будет предложено сохранить *.po файл, с которого потом соберется *.mo файл. Назовите сохраняемый файл в зависимости от выбранной стратегии сканирования переводов в Zend Framework. В моем случае файл должен называться в формате {locale}.mo, где {locale} – необходимое 2-х буквенное сокращение языка (ISO 639).

 

Итак, каталог успешно создан. Перейдем к следующему шагу.

 

 

Сканирование исходного кода



Для начала сканирования исходного кода на предмет строк нуждающихся в переводе нажмите кнопку «Обновить» Сканирование исходного кода. После чего Вы должны увидеть индикатор процесса проверки. После завершения операции Вы увидите сводку об обновлении, в которой будет указано количество добавленных и удаленных строк.

Алгоритм работы программы следующий:

  1. Проверяются файлы с исходным кодом в папках указанных Вами
  2. В них находятся вызовы функций вида _(‘Строка’)
  3. Все найденные строки добавляются в каталог. Потом Вы их переводите

 

 

Проблемы?



Я так и знал, что у Вас возникли проблемы Подмигивает. Дайте догадаюсь, появились вопросы о шаблонах вида Улыбается? По-умолчанию, шаблоны вида (файлы *.phtml) опускаются. От этого есть лекарство:

  1. Файл -> Установки…
  2. В появившемся окне выбираем вкладку «Парсеры»
  3. Выбираем PHP, нажимаем «Править»
  4. Появится окно «Настройка парсера»
  5. В поле «Список расширений» вписываем: *.php;*.phtml

Если сейчас Вы попытаетесь просканировать исходники, то получите целую кучу ругани от программы. Дело в том, что программа определяет парсер по расширению, а так как расширение phtml не относится ни к одному языку программирования из поддерживаемых, то возникает ошибка разбора файла. Вывод – нужно заставить парсер обрабатывать шаблоны вида как файлы php. По поводу этой темы перелопатил целую кучу поисковой выдачи поисковиков, но все было безуспешно. Решение нашел, почитав официальную документацию по GNU gettext.

 

Нужно немного модифицировать настройки по-умолчанию поля «Команда парсера» - впишите «xgettext --language=PHP --force-po -o %o %C %K %F». Вот как все перечисленные настройки должны выглядеть в итоге:

 

Настройка персера

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

 

Небольшая заметка: для быстрого перемещения между строками используйте клавиши CTRL + стрелочки

 

 

Итог



В данной статье мы рассмотрели процесс создания каталогов переводов в программе poEdit, решили ряд вопросов и проблем, что поможет Вам сократить время на решении этих нюансов. В следующей части я подведу итоги проделанной работы и отвечу на Ваши вопросы. Zend Translate + Gettext + Poedit = удобно, быстро, эфективно. Удачи!

Теги:  zend framework, zend_translate, gettext

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

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

09.12.09 11:55:40

Вопрос, как быть, если изначально использовался array как хранилище перевода и в шаблонах разросшегося проекта нет ни одной строки для сканирования? Есть ли какие-либо способы создать проект для poedit'а без сканирования на основе массива? 

  illusive

09.12.09 12:31:47

Как Вы использовали указанный массив? Использовали ли Вы при этом Zend Framework и его адаптеры?

  Marat

09.12.09 12:50:31

Я исполльзую стандартную схему ZF, аналогичную той, что используется в вашей статье. Единственное данные локализации не в mo-файлах а в array
  illusive

09.12.09 13:42:57

Тогда в чем проблема? Почему у Вас нету строк для сканирования, если Вы пользовались Zend Translate?

 

Если у Вас реализовано все по стандартной схеме ZF, то Вам надо почитать комментарии к второй части. Думаю по ним Вы найдете решение проблемы.

А так, боюсь, что придется переводить все заново...

  nrnwest

22.12.09 23:26:31

Спасибо за решения с файлами .phtml

 

  Михаил

25.01.10 10:57:12

Очень полезная инфа, спасибо :)

Но возник вопрос. Как разруливается многомодульность (хранение строк разных модулей в разных .mo) понятно. Но как сделать так, чтобы строки, общие для всех модулей хранились в одном общем файле? Ведь если создавать по кадному mo на модуль, то PoEdit при сканировании исходников не распознает, где там общие строки, а где уникальные для модуля :/

  illusive

25.01.10 11:06:14

Я тоже столкнулся с этим вопросом, но честно говоря процент совпадений строк в модулях и ядре очень маленький, поэтому я перевожу все для каждого модуля отдельно. Строки просто перезаписываются в трансляторе. Иногда, это бывает очень даже выгодно, когда одна и та же фраза на языке оригинала должна переводится на язык локализации, только в разных контекстах... 

  Михаил

25.01.10 11:44:30

Процент действительно как правило маленький, но когда возникает задача "исправить это везде" было бы круто, чтобы менялось в одном месте :). Вероятно, можно будет вывод общих областей вынести отдельно, чтобы и сканировалось оно PoEdit'ом отдельно... Я с Zend не так давно начал работать, потому не уверен :)

Но вот еще, к примеру, момент... В качестве ключей используется русский вариант строк. Это удобно, когда надо отдать на перевод файл кому-то удаленно. Но, с другой стороны, если вдруг поменяется формулировка на русском ("ключевом языке") PoEdit сразу отметит старый вариант как удаляемый, а новый, соответственно, будет без перевода... Такое может происходить часто в первое время после открытия проекта, когда формулировки устаканиваются :). Не сталкивались ли с подобным?

Порыскал, но не нашел альтернативных (может быть, более мощных) средств работы с .po...

  Михаил

25.01.10 11:49:30

Хм. Хотя может быть я сам отвечу на свой вопрос. Если старую фразу до правок не удалять, а на добавление новой согласиться, то в .po будут две похожие фразы, и перевод из старой в новую можно будет руками... Все равно неудобно =)

  illusive

25.01.10 11:54:02

У меня в проекте ключи - англоязычные строки. Если Вы делаете поправки в оригинале, то вы же не полностью переписываете весь текст, а просто его поправляете. В большинстве таких случаев PoEdit не удалит строку, а пометит как неточную.

Более мощных инструментов для работы с gettext тоже не нашел Хмурый 

  Юрий

26.01.10 16:11:19

А какую кодировку надо выбирать исходно файла в POedit, если ключи заданы на русском языке? Программа не хочет переводить русские ключи типа: $this->translate->_('Добро пожаловать')

Переводит только если поменять слова в translate->_(' ') на translate->_('Welcome'), тогда все работает находит этот ключ ('Welcome'). Может кто сталкивался с кодировкой исходного файла?

  illusive

26.01.10 17:52:10

Нужно выставлять ту кодировку, которая у Вас в проекте.

  Юрий

26.01.10 17:57:11

Все разобрался спасибо за ссылку на официальную документацию Если у кого будет проблема поставьте кодировку исходного файла CP1251

  Михаил

11.02.10 12:27:11

Кстати, хинт :). Для кого-то может и не новый.

В PoEdit можно указать папки для сканирования, но нельзя отдельные файлы. В результате можно отсканировать все вьюшки, а отдельно контроллер, если он в папке с другими - нет.

Я для себя в проекте создал отдельную папку, типа "for_poedit", внутри раздел, к примеру, "register", а внутрь кинул _символические ссылки_ на папку с вьюшками /application/views/scripts/register/ и на контроллер /application/controllers/RegisterController.php

Ну и в PoEdit, конечно, для сканирования назначил только папку /for_poedit/register/

  illusive

11.02.10 12:52:32

Спасибо, полезная подсказка Улыбается

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

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