poedit обходной путь для динамического gettext

Я начал использовать gettext для перевода текста и сообщений, которые я отправляю пользователю. Я использую poedit в качестве редактора, но я борюсь с динамическими сообщениями.

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

$this->translate('page-error-' . $error); 

Когда я автоматически обновляюсь из poedit, это читается как «page-error-». У меня есть файл, в котором я помещаю фиктивные вызовы в метод перевода со всеми возможными ключами, чтобы добавить их в мой poedit при автоматическом обновлении.

Мне это не особенно нравится. Как вы, ребята, это делаете.

Спасибо за ваши идеи

Solutions Collecting From Web of "poedit обходной путь для динамического gettext"

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

Вы пытаетесь что-то вроде

 $this->translate(sprintf('page-error-%s', $error)); 

Я столкнулся с той же проблемой.

например, у меня есть

в php

 //Gives FORM_HEADER_ADD or FORM_HEADER_EDIT echo $this->translate('FORM_HEADER_' . strtoupper($this->data)); 

Когда я синхронизируюсь с poedit, он заберет «FORM_HEADER_», который не является идентификатором, который я получил (сгенерировал) в коде.

Поэтому мне пришлось исправить проблему, когда я дал полный идентификатор Poedit, и решил, что, выполнив следующее в php

 echo ($this->data === 'add') ? $this->translate('FORM_HEADER_ADD') : $this->translate('FORM_HEADER_EDIT'); 

ОБНОВИТЬ!

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

  1. Создайте приложение и используйте как можно больше статических идентификаторов.
  2. Включить ведение журнала нетранслируемых (динамических) идентификаторов

     protected function _initMyTranslate(){ $date = new Zend_Date(); $fileName = sprintf('/../logs/translation_%1$s.log', $date->toString('dd-MM')); $writer = new Zend_Log_Writer_Stream(APPLICATION_PATH . $fileName); $log = new Zend_Log($writer); // get the translate resource from the ini file and fire it up $resource = $this->getPluginResource('translate'); $translate = $resource->getTranslate(); // add the log to the translate $translate->setOptions( array( 'log' => $log, 'logUntranslated' => true ) ); // return the translate to get it in the registry and so on return $translate; } 
  3. Используйте Poedit для синхронизации с источником и переведите найденные строки.

  4. Во время фазы тестирования / отладки проверьте журнал для нетранслируемых строк.
  5. Добавьте нетранслируемые строки в файл .po.

     msgid "IDENTIFIER" msgstr "TRANSLATION STRING" 
  6. Откройте файл po и сохраните его, чтобы создать mo-файл (НЕ СИНЯТЬ ИСТОЧНИКОМ ИЛИ ВСЕ ПОТЕРЯНО).

ОБНОВЛЕНИЕ 2.

Теперь я использую отдельный файл для моих ручных идентификаторов, используя текстовый редактор (gedit / notepad). Теперь у меня есть два файла:

  1. Авто, созданный poedit, называется <language> .po
  2. вручную отредактированный файл с именем <язык> _manual.po

я настроил свой перевод в application.ini для сканирования всех файлов в каталоге языков

 resources.translate.adapter = gettext resources.translate.content = APPLICATION_PATH "/../library/languages/" resources.translate.locale = auto ;use en to force english or nl for dutch..etc resources.translate.scan = directory resources.translate.options.disableNotices = false 

если вы хотите перевести на другой язык в poedit do file -> новый каталог из POT-файла и начать перевод ваших добавленных вручную строк.

Если у вас есть конечное количество ошибок, вы можете добавить некоторый фиктивный код в условие if (false) , единственная цель которого – заставить PoEdit забрать переводы.

Например:

 if (false) { _('role_visitor'); _('role_hiker_reader'); _('role_hiker'); _('role_translator'); _('role_proofreader'); _('role_moderator'); _('role_moderator_2'); _('role_moderator_3'); _('role_admin'); } 

Затем вы можете перевести с помощью:

 $translated_role = _('role_' . $role); 

Кредиты на: http://eng.marksw.com/2012/12/05/how-to-expose-dynamic-translatable-text-to-translation-tools-like-poedit/