Почему gettext переводит пустую строку в текст заголовка .po?

У меня есть настройка gettext в PHP5. После некоторой борьбы с наборами символов и т.п. мне удалось перевести некоторые основные строки. Теперь я столкнулся с проблемой. При переводе пустой строки я ожидаю вернуть непереведенную (пустую) строку (поправьте меня, если я ошибаюсь ;)).

Однако вместо возврата входной строки я получаю заголовок файла .PO в качестве перевода:

Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2011-09-22 15:03+0200 PO-Revision-Date: 2011-09-22 15:37+0200 Last-Translator: timo Language-Team: English Language: en MIME-Version: 1.0 Content-Type: text/plain; charset=ASCII Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); 

Когда я просматриваю файл .mo с помощью текстового редактора, я вижу, что заголовок, кажется, помещен в случайное место в файле. Я хотел бы показать вам, но я не могу вставить файл. Похоже, есть список моих msgid, затем заголовок, а затем список моих msgstr

Я использовал следующую команду для создания файла .mo:

msgfmt -c -v -o en/LC_MESSAGES/messages.mo messages_en.po

После этой команды я перезапустил свой веб-сервер (lighttpd).

Что я сделал не так и как это исправить?


person Timo    schedule 30.09.2011    source источник


Ответы (2)


После поиска по разным запросам я наткнулся на этот сайт: http://framework.zend.com/issues/browse/ZF-2914

Здесь я обнаружил, что перевод пустой строки в метаинформацию на самом деле находится в спецификации gettext:

Это также имеет еще одно преимущество, так как пустая строка в PO-файле GNU gettext обычно транслируется в некоторую системную информацию, прикрепленную к этому конкретному MO-файлу, и пустая строка обязательно становится первой как в исходной, так и в переведенной таблицах, делая системную информацию очень легко найти.

person Timo    schedule 05.10.2011

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

function _tl($msg)
{
    $ret = "";
    if($msg != "")
    {
        $ret = _($msg);
    }    

    return $ret;

}

Затем в poedit, в настройках вашего каталога, на вкладке ключевых слов установите использование новой функции _tl. Это способ, которым poedit распознает его в вашем коде.

person Fernando    schedule 06.07.2016