2009-05-16 2 views
6

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

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

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

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

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

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

+0

Я не мог понять проблему. можете ли вы описать это более ясно? – farzad

ответ

5

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

+0

Как я могу добавить ключи вручную? Я не смог найти способ. Также удаляются ли эти удаленные ключи при синхронизации с источниками? –

+0

Добавить страницу-error-% s – Blaise

2

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

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

как я делаю динамические ключи не проблема, проблема в том, как вы добавляете их в poedit. –

0

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

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

В 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'); 

UPDATE!

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

  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. Открыть файл Ро и сохранить его, чтобы создать файл МО (НЕ SYNC С ИСТОЧНИКОМ ИЛИ ВСЕ утрачена).

UPDATE 2.

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

  1. Авто порождено PoEdit называют < языка > .po
  2. вручную Editted файл под названием < языка > _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 и начать перевод ваших добавленных вручную строк.

0

Если у вас есть конечное число ошибок, вы можете добавить некоторый фиктивный код в состояние 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/

Смежные вопросы