Вторая часть статьи о локализации веб-проектов с помощью gettext и Zend Framework. В первой части статьи мы определились с выбором адаптера.
Наш выбор пал на Gettext – быстрое и грамотное решение с набором инструментария для облегчения реализации. Итак, вторая часть будет описывать Zend_Translate и работу с ним, чтобы уяснить себе четко нюансы программирования в PHP.
Следующая часть расскажет нам, как подготовить файлы переводов, покажет основные приемы и самое главное решит одну очень важную проблему, но об этом потом. Сейчас нас интересует программинг. Что-же, приступим!
Бутстрап файл
В бутстрапе мы должны инициализировать Zend_Translate, передав ему нужные параметры: адаптер, папку с переводами, текущую локаль и некоторые специфические настройки. Самое главное определится с структурой каталогов. У меня, например, в новой версии моей CMS, ядро системы, плагины и модули имеют папку «locale», где и хранятся переводы. Zend_Translate находит переводы по имени файла, например, «ru.mo».
Есть разные типы автоматического нахождения файлов Zend'ом:
- В каждой папке, например, «en», «ru», есть отдельный набор файлов переводов. Т.е. по названию папки (Zend_Translate::LOCALE_DIRECTORY);
- По названию файла (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 записывать все непереведенные строки в лог-файл:
Алгоритм следующий:
- Создали объект Zend_Translate, как показывал я
- Создали объект Zend_Log
- Передали логгер, шаблон записываемого сообщения и включили механизм логгинга
Еще не забудьте про кеширование, это очень актуально:
Все, с настройкой вроде бы разобрались. Переходим к использованию.
Использование
В моих разработках каждая отдельная часть системы (ядро, модуль, плагин) имеет свою папку с переводами, поэтому встает вопрос, как заставить Zend_Translate искать не в одной папке, а во всех ну или хотя бы как добавить файлы для загрузки переводов. Для этого существует функция addTranslation объекта Zend_Translate:
Для перевода строк с помощью Gettext, я рекомендую Вам не использовать ключи, а полноценные строки. Для чего это нужно:
- Gettext не разрешает дубляж переведенных строк, поэтому при использовании ключей Вам придется подумать, как избежать дубляжа, быть уверенным, что такой ключ нигде еще не используется
- Если в исходном коде Вы решили поменять переводимую строку, то Вы сразу же увидите, что в файлах переводов есть неточные переводы (в третьей части об этом будет идти речь), а при использовании ключей – предыдущий вариант точно будет удален, а измененный ключ будет отмечен как непереведенный
- Если перевода какой-то строки не окажется в файлах, то человек увидит нормальное сообщение (только не на нужном языке), а при использовании ключей – абсолютно неинформативный текст
Теперь покажу Вам пример перевода строки:
Нюансы с Zend_View
При использовании переведенных строк в шаблонах Zend_View и инструмента, о котором я расскажу Вам в следующей части, пользоваться встроенным помощником вида translate будет невозможно, потому, что программа не найдет строку, чтобы добавить ее в файл перевода. Все строки, которые будут переводится обязательно должны быть обрамлены таким кодом:
Вот как я решил этот вопрос:
Итог
В данной статье мы с Вами рассмотрели процесс программной реализации локализации переводов. В следующей части я покажу Вам какими инструментами и самое главное как пользоваться для создания каталогов переводов, чтобы достичь максимальной гибкости и удобности в этом процессе.



которое подсказали добрые люди: