poedit обходной путь для динамического gettext
Я начал использовать gettext для перевода текста и сообщений, которые я отправляю пользователю. Я использую Poedit в качестве редактора, но я борюсь с динамическими сообщениями.
Например, у меня есть такие вещи, как логин, где у меня есть переменная, которая сообщает тип ошибки.
$this->translate('page-error-' . $error);
Когда я автоматически обновляюсь из poedit, это читается как "page-error-". У меня есть файл, в который я помещаю фиктивные вызовы метода translate со всеми возможными ключами, чтобы они добавлялись в мой poedit при автообновлении.
Мне не особенно нравится эта ситуация. Как вы, ребята, делаете это?
Спасибо за ваши идеи
4 ответа
Нет - это невозможно, потому что редактор (и gettext
инструменты) читают ваши источники, а не выполняют вашу программу. Вам придется сохранять фиктивные звонки или добавлять ключи к файлам перевода самостоятельно.
Вы пытаетесь что-то вроде
$this->translate(sprintf('page-error-%s', $error));
Если у вас есть конечное число ошибок, вы можете добавить фиктивный код внутри 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/
Я столкнулся с той же проблемой.
например у меня есть
в 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');
ОБНОВИТЬ!
Я продолжал изучать эту проблему. И я в настоящее время отказался от импорта из источника. Так я продолжаю, пока не найду лучшее решение
- Создайте приложение и используйте как можно больше статических идентификаторов.
Включить запись непереведенных (динамических) идентификаторов
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; }
Используйте Poedit для синхронизации с источником и перевода найденных строк.
- Во время фазы тестирования / отладки проверьте журнал на наличие непереведенных строк.
Добавьте непереведенные строки в файл.po.
msgid "IDENTIFIER" msgstr "TRANSLATION STRING"
Откройте файл po и сохраните его для создания файла mo (НЕ синхронизировать с источником или все потеряно).
ОБНОВЛЕНИЕ 2.
Теперь я использую отдельный файл для моих идентификаторов вручную с помощью текстового редактора (gedit / notepad). Теперь у меня есть два файла:
- Автоматически генерируется poedit под названием
.po - отредактированный вручную файл с именем
_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 -> новый каталог из файла POT, и начните переводить добавленные вручную строки.