Я начал использовать gettext для перевода текста и сообщений, которые я отправляю пользователю. Я использую poedit в качестве редактора, но я борюсь с динамическими сообщениями.
Например, у меня есть такие вещи, как логин, где у меня есть переменная, которая сообщает тип ошибки.
$this->translate('page-error-' . $error);
Когда я автоматически обновляюсь из poedit, это читается как «page-error-». У меня есть файл, в котором я помещаю фиктивные вызовы в метод перевода со всеми возможными ключами, чтобы добавить их в мой poedit при автоматическом обновлении.
Мне это не особенно нравится. Как вы, ребята, это делаете.
Спасибо за ваши идеи
Нет – это невозможно, потому что редактор (и инструменты 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');
ОБНОВИТЬ!
Я продолжал изучать эту проблему. И я в настоящее время отказался от импорта из источника. Вот как я продолжаю, пока не найду лучшее решение
Включить ведение журнала нетранслируемых (динамических) идентификаторов
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). Теперь у меня есть два файла:
я настроил свой перевод в 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/