poedit обходной путь для динамического gettext - PullRequest
7 голосов
/ 16 мая 2009

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

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

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 17 мая 2009

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

2 голосов
/ 17 мая 2009

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

$this->translate(sprintf('page-error-%s', $error));
0 голосов
/ 08 декабря 2017

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

0 голосов
/ 13 июня 2012

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

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

в 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. Откройте файл po и сохраните его для создания файла mo (НЕ синхронизировать с источником или все потеряно).

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

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

  1. Автоматически генерируется poedit под названием .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 -> новый каталог из файла POT, и начать переводить добавленные вручную строки.

...