Вопрос

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

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

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

Когда я автоматически обновляюсь из poedit, это читается как «ошибка страницы-».У меня есть файл, в котором я помещаю фиктивные вызовы метода перевода со всеми возможными ключами, чтобы они добавлялись в мой 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');

ОБНОВЛЯТЬ!

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

  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/блокнот).Теперь у меня есть два файла:

  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, сделайте файл -> новый каталог из файла 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/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top