Удаление всех нечетких записей PO-файла

Кто-нибудь знает способ массового удаления всех нечетких переводов из файла PO. Что-то типа:

if #, fuzzy == TRUE Затем УСТАНОВИТЕ msgstr="" И УДАЛИТЕ #, fuzzy


person Martijn Burger    schedule 10.09.2011    source источник
comment
Думаю, вам нужно более подробно остановиться.   -  person Tom Zych    schedule 10.09.2011
comment
Какие детали тебе не хватает, Том?   -  person Martijn Burger    schedule 10.09.2011
comment
Возможно, эта дополнительная информация поможет: gnu.org/s/hello/ руководство/gettext/PO-Files.html   -  person Martijn Burger    schedule 10.09.2011
comment
Казалось, что это может быть слишком расплывчатый вопрос, но я не был уверен, стоит ли отмечать его, поэтому задал. Я не знаю gettext, но кто-то, кто знает, сможет вам помочь. Похоже, ими нужно манипулировать с помощью gettext, поэтому я не хочу писать скрипт Python для этого.   -  person Tom Zych    schedule 10.09.2011
comment
Да, это тоже была моя мысль, написать скрипт для этого, но мне было интересно, есть ли более простое решение.   -  person Martijn Burger    schedule 11.09.2011
comment
почти 5 лет спустя, но не думали ли вы просто отключить нечеткое сопоставление во время генерации PO? Опция --no-fuzzy-matching для msgmerge делает это   -  person dfherr    schedule 12.06.2016
comment
Я думал, что это был не вариант для меня в то время. Но я действительно уже не могу вспомнить, почему. :)   -  person Martijn Burger    schedule 13.06.2016


Ответы (3)


Вы можете удалить нечеткие строки с помощью polib, которая является библиотекой Python для работы с gettext po. файлы:

import os, polib
for dirname, dirnames, filenames in os.walk('/path/to/your/project/'):
    for filename in filenames:
        try: ext = filename.rsplit('.', 1)[1]
        except: ext = ''
        if ext == 'po':
            po = polib.pofile(os.path.join(dirname, filename))
            for entry in po.fuzzy_entries():
                entry.msgstr = ''
                if entry.msgid_plural: entry.msgstr_plural['0'] = ''
                if entry.msgid_plural and '1' in entry.msgstr_plural: entry.msgstr_plural['1'] = ''
                if entry.msgid_plural and '2' in entry.msgstr_plural: entry.msgstr_plural['2'] = ''
                entry.flags.remove('fuzzy')
            po.save()

Этот скрипт удаляет нечеткие строки перевода + нечеткие флаги, но сохраняет непереведенные исходные msgids. Некоторые языки (ru, cz, ...) имеют более двух форм множественного числа, поэтому мы проверяем msgstr_plural['2']. Индекс списка должен быть строкой. Не используйте для этого целые числа.

person Simon Steinberger    schedule 01.03.2012
comment
Полностью переписанный ответ, который должен делать именно то, что вы ищете. Вы, вероятно, уже решили проблему, но, возможно, кто-то еще сталкивается с той же проблемой. - person Simon Steinberger; 21.01.2013

Если gettext установлен, для этого можно использовать команду msgattrib:

msgattrib --clear-fuzzy --empty -o /path/to/output.po /path/to/input.po

Полная документация по msgattrib находится здесь:

https://www.gnu.org/software/gettext/manual/html_node/msgattrib-Invocation.html

person Aaron M    schedule 20.02.2015
comment
--empty кажется новой опцией для этого. Сегодня это должен быть принятый ответ. Спасибо! - person Simon Steinberger; 30.07.2017
comment
Хорошо, это дает мне недопустимую ошибку многобайтовой последовательности, даже если файлы PO имеют кодировку UTF8.... - person Simon Steinberger; 30.07.2017

Если у вас установлен GNU gettext, вы можете использовать эту команду для удаления нечетких сообщений:

msgattrib --no-fuzzy -o путь/к/вашему/выходному/po/файлу путь/к/вашему/входному/po/файлу

person binhnv    schedule 13.09.2011
comment
это удаление нечетких элементов, но вопрос в том, чтобы установить для этого пустую msgstr, я тоже ищу решение для этого, это неправильно. - person Svisstack; 06.01.2013
comment
Как насчет того, чтобы сделать msgattrib --no-fuzzy, а затем msgmerge с шаблоном? Это должно вернуть пустые сообщения из шаблона. - person Mikko Rantalainen; 26.04.2013
comment
Это удаляет нечеткие записи. OP хочет очистить нечеткие переводы и удалить нечеткий флаг, но сохранить записи. - person Sam Kauffman; 06.12.2017