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

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

06.07.2010 Memcache и Zend: у Вас "падает" Memcache? 4 коммент.

06.07.2010 Collabtive - web-based project management software 2 коммент.

03.06.2010 Ускоряем ZF-проекты: автолоад и сборка в один файл 2 коммент.

Все

Категории

PHP 2 стат.

Zend Framework 25 стат.

Javascript 3 стат.

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

Книги 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. Локализация проектов. Часть вторая
23.06.09 Zend Framework. Локализация проектов. Часть вторая

Zend_Translate + Gettext = multilanguageВторая часть статьи о локализации веб-проектов с помощью gettext и Zend Framework. В первой части статьи мы определились с выбором адаптера.

 

Наш выбор пал на Gettext – быстрое и грамотное решение с набором инструментария для облегчения реализации. Итак, вторая часть будет описывать Zend_Translate и работу с ним, чтобы уяснить себе четко нюансы программирования в PHP.

 

Следующая часть расскажет нам, как подготовить файлы переводов, покажет основные приемы и самое главное решит одну очень важную проблему, но об этом потом. Сейчас нас интересует программинг. Что-же, приступим!

 

 

Бутстрап файл


 

В бутстрапе мы должны инициализировать Zend_Translate, передав ему нужные параметры: адаптер, папку с переводами, текущую локаль и некоторые специфические настройки. Самое главное определится с структурой каталогов. У меня, например, в новой версии моей CMS, ядро системы, плагины и модули имеют папку «locale», где и хранятся переводы. Zend_Translate находит переводы по имени файла, например, «ru.mo».

 

Есть разные типы автоматического нахождения файлов Zend'ом:

  1. В каждой папке, например, «en», «ru», есть отдельный набор файлов переводов. Т.е. по названию папки (Zend_Translate::LOCALE_DIRECTORY);
  2. По названию файла (Zend_Translate::LOCALE_FILENAME):
  • По всему имени файла, например, «ru.mo», где «ru» - локаль (мой выбор)
  • По расширению файла, например, «core.ru»
  • По структуре имени файла и приоритетах разделителей, например, «core_ru.mo», «core.ru.mo», «core-ru.mo». Если в имени файла встречаются несколько разделителе одновременно, то приоритет следующий: «.», «_», «-».

Для себя я выбрал вариант «по всему имени файла», чтобы не путаться. Структуру каталогов поменять, если что успеете. Поэтому потренируйтесь с вариантом, который выбрал я.

 

Итак, код инициализации Zend_Translate:

Как видите, все как всегда очень просто Подмигивает. В данном коде мы создали объект Zend_Translate, передав сразу же специфические опции. Эти опции можно передавать еще и функцией setOptions объекта, например, давайте заставим Zend Framework записывать все непереведенные строки в лог-файл:

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

  1. Создали объект Zend_Translate, как показывал я
  2. Создали объект Zend_Log
  3. Передали логгер, шаблон записываемого сообщения и включили механизм логгинга

Еще не забудьте про кеширование, это очень актуально:

Все, с настройкой вроде бы разобрались. Переходим к использованию.

 

 

Использование


 

В моих разработках каждая отдельная часть системы (ядро, модуль, плагин) имеет свою папку с переводами, поэтому встает вопрос, как заставить Zend_Translate искать не в одной папке, а во всех ну или хотя бы как добавить файлы для загрузки переводов. Для этого существует функция addTranslation объекта Zend_Translate:

Для перевода строк с помощью Gettext, я рекомендую Вам не использовать ключи, а полноценные строки. Для чего это нужно:

  1. Gettext не разрешает дубляж переведенных строк, поэтому при использовании ключей Вам придется подумать, как избежать дубляжа, быть уверенным, что такой ключ нигде еще не используется
  2. Если в исходном коде Вы решили поменять переводимую строку, то Вы сразу же увидите, что в файлах переводов есть неточные переводы (в третьей части об этом будет идти речь), а при использовании ключей – предыдущий вариант точно будет удален, а измененный ключ будет отмечен как непереведенный
  3. Если перевода какой-то строки не окажется в файлах, то человек увидит нормальное сообщение (только не на нужном языке), а при использовании ключей – абсолютно неинформативный текст

Теперь покажу Вам пример перевода строки:

 

 

Нюансы с Zend_View


 

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

Вот как я решил этот вопрос:

 

 

Итог


 

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

Теги:  zend framework, zend_translate, gettext

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

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

24.06.09 19:41:26

Спасибо большое. Ждем продолжения. О переводе в Зенде много находил статтей, но только у вас все подробно и понятно.

  Добропожелатель

03.09.09 11:27:51

Вместо прямого назначения транслятора

Zend_Validate_Abstract::setDefaultTranslator($translator);

Можно просто поместить в Zend_Registry объект Zend_Translate

Zend_Registry::set('Zend_Translate', Zend_Translate);

И валидаторы сами будут доставать его и использовать.

  illusive

10.09.09 09:42:39

Хм... Не знал подобного решения, спасибо, возьму на вооружение. Какие еще компоненты будут брать Zend_Translate с Zend_Registry, не подскажите?

  Добропожелатель

14.09.09 14:04:43

Ну например можно спокойно использовать таким образом Translate помощник Zend_View в скриптах вида.

  illusive

14.09.09 15:23:31

Да я это знаю, но poEdit при таких раскладах не будет находить строки в скриптах вида, что очень плохо. Ему обязательно нужен такой формат:

  Kuzma

18.11.09 14:23:14

Добрый день!

Спасибо за обширный материал!

Столкнулся с одним затруднением:

<?php echo $this->translator->_('Test);?>

Вызывается только из layout.phtml.

В скриптах вида пишет:

Call to a member function _() on a non-object...

В бутстрапе имею след. код:

protected function _initViewHelpers()
    {

$view = new Zend_View();
        $view->translator = $translator;

...

}

Подскажите пожалуйста, что нужно подправить.

спасибо!

  illusive

18.11.09 14:28:54

Вы создаете новый объект Zend_View... А Вы попробуйте "взять" Zend_View из Zend_Layout:

  Kuzma

18.11.09 14:39:57

Спасибо за скорый ответ!

Возможно у меня перегружен метод инициализации ViewHelper, т.к. не помогло :(

Если здесь более менее правильно, значит проблема в другом месте :/

        $view = new Zend_View();
        $view->setEncoding('UTF-8');
        $view->doctype('XHTML1_STRICT');
        $view->headTitle('GM');

$view->addHelperPath("Tinymce/View/Helper","Tinymce_View_Helper");

        $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
        $viewRenderer->setView($view);  Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
        Zend_Layout::startMvc(
            array(
                'layout' => 'layout',
                'layoutPath' => '/application/views/layouts',
                'pluginClass' => 'ZFBlog_Layout_Controller_Plugin_Layout'
            )
        );
        $view = Zend_Layout::getMvcInstance()->getView();
        $view->translator = $translator;       
        $this->bootstrap('layout');
        $layout=$this->getResource('layout');

  illusive

18.11.09 23:45:11

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

  Kuzma

18.11.09 23:47:57

Ясно!

Но всёравно спасибо!

  illusive

19.11.09 00:08:19

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

 

Не смог сдержаться, чтобы все-таки не попробовать подсказать Смеётся

  Kuzma

19.11.09 14:29:11

Спешу поделиться решениемЗапечатано которое подсказали добрые люди:

Внёс $translator в реестр. Помощник вызываю<?php echo $this->translate('Create');?>.

А для того, чтобы PoEdit понимал такую констркуцию, в закладке "ключевые слова" пишем translateСмеётся

Всё замечательно работает.

  illusive

19.11.09 14:43:26

Спасибо! Отлично. Видите, мои решения тоже бывают не совершенны Улыбается

Это в очередной раз подтверждает, что вместе мы сила и можем дойти до офигенно стройного решения

  rid1

07.02.10 18:17:37

имхо, лучше написать вью хелпер _
и шаблоне писать echo $this->_("текст")

  naider

09.07.10 21:55:15

имхо, лучше написать вью хелпер _
и шаблоне писать echo $this->_("текст")

С хелпером у меня возникли траблы, но если переопределить View (в моем случае это и так было сделано), то можно добавить метод:

тогда в шаблонах можно писать $this->_("текст")

  illusive

12.07.10 22:34:08

Спасибо за интересный ход)))

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

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