posplit
94 lines
| 3.2 KiB
| text/plain
|
TextLexer
/ i18n / posplit
Gregory Szorc
|
r46434 | #!/usr/bin/env python3 | ||
Wagner Bruna
|
r11389 | # | ||
# posplit - split messages in paragraphs on .po/.pot files | ||||
# | ||||
# license: MIT/X11/Expat | ||||
# | ||||
Matt Harbison
|
r52756 | from __future__ import annotations | ||
Pulkit Goyal
|
r29152 | |||
import polib | ||||
Simon Heimberg
|
r20359 | import re | ||
Wagner Bruna
|
r11389 | import sys | ||
Gregory Szorc
|
r44089 | |||
Wagner Bruna
|
r11389 | def addentry(po, entry, cache): | ||
e = cache.get(entry.msgid) | ||||
if e: | ||||
e.occurrences.extend(entry.occurrences) | ||||
FUJIWARA Katsunori
|
r39305 | |||
# merge comments from entry | ||||
for comment in entry.comment.split('\n'): | ||||
if comment and comment not in e.comment: | ||||
if not e.comment: | ||||
e.comment = comment | ||||
else: | ||||
e.comment += '\n' + comment | ||||
Wagner Bruna
|
r11389 | else: | ||
po.append(entry) | ||||
cache[entry.msgid] = entry | ||||
Gregory Szorc
|
r44089 | |||
Wagner Bruna
|
r11389 | def mkentry(orig, delta, msgid, msgstr): | ||
entry = polib.POEntry() | ||||
entry.merge(orig) | ||||
entry.msgid = msgid or orig.msgid | ||||
entry.msgstr = msgstr or orig.msgstr | ||||
entry.occurrences = [(p, int(l) + delta) for (p, l) in orig.occurrences] | ||||
return entry | ||||
Gregory Szorc
|
r44089 | |||
Wagner Bruna
|
r11389 | if __name__ == "__main__": | ||
po = polib.pofile(sys.argv[1]) | ||||
cache = {} | ||||
entries = po[:] | ||||
po[:] = [] | ||||
Gregory Szorc
|
r44089 | findd = re.compile(r' *\.\. (\w+)::') # for finding directives | ||
Wagner Bruna
|
r11389 | for entry in entries: | ||
msgids = entry.msgid.split(u'\n\n') | ||||
if entry.msgstr: | ||||
msgstrs = entry.msgstr.split(u'\n\n') | ||||
else: | ||||
msgstrs = [u''] * len(msgids) | ||||
if len(msgids) != len(msgstrs): | ||||
# places the whole existing translation as a fuzzy | ||||
# translation for each paragraph, to give the | ||||
# translator a chance to recover part of the old | ||||
# translation - erasing extra paragraphs is | ||||
# probably better than retranslating all from start | ||||
if 'fuzzy' not in entry.flags: | ||||
entry.flags.append('fuzzy') | ||||
msgstrs = [entry.msgstr] * len(msgids) | ||||
delta = 0 | ||||
for msgid, msgstr in zip(msgids, msgstrs): | ||||
Simon Heimberg
|
r20361 | if msgid and msgid != '::': | ||
Wagner Bruna
|
r11389 | newentry = mkentry(entry, delta, msgid, msgstr) | ||
Simon Heimberg
|
r20359 | mdirective = findd.match(msgid) | ||
if mdirective: | ||||
Gregory Szorc
|
r44089 | if not msgid[mdirective.end() :].rstrip(): | ||
Simon Heimberg
|
r20362 | # only directive, nothing to translate here | ||
FUJIWARA Katsunori
|
r28074 | delta += 2 | ||
Simon Heimberg
|
r20362 | continue | ||
Simon Heimberg
|
r20359 | directive = mdirective.group(1) | ||
Simon Heimberg
|
r20363 | if directive in ('container', 'include'): | ||
if msgid.rstrip('\n').count('\n') == 0: | ||||
# only rst syntax, nothing to translate | ||||
FUJIWARA Katsunori
|
r28074 | delta += 2 | ||
Simon Heimberg
|
r20363 | continue | ||
else: | ||||
# lines following directly, unexpected | ||||
Gregory Szorc
|
r44089 | print( | ||
'Warning: text follows line with directive' | ||||
' %s' % directive | ||||
) | ||||
Simon Heimberg
|
r20359 | comment = 'do not translate: .. %s::' % directive | ||
if not newentry.comment: | ||||
newentry.comment = comment | ||||
elif comment not in newentry.comment: | ||||
newentry.comment += '\n' + comment | ||||
Wagner Bruna
|
r11389 | addentry(po, newentry, cache) | ||
delta += 2 + msgid.count('\n') | ||||
po.save() | ||||