ddnet/scripts/reconvert_l10n.py

76 lines
2.3 KiB
Python
Raw Normal View History

import polib
import json
import sys
JSON_KEY_TRANSL="translated strings"
JSON_KEY_AUTHOR="authors"
JSON_KEY_MODIFY="modified by"
JSON_KEY_OR="or"
JSON_KEY_TR="tr"
JSON_KEY_CO="context"
def reconvert(filename, json_filename):
"""Converts a l10n file.po into a file.json, keeping author info from a previous file.json if possible"""
po = polib.pofile(open(filename, encoding='utf-8').read())
translations = []
for entry in po:
if entry.msgstr:
t_entry = {}
t_entry[JSON_KEY_OR] = entry.msgid
t_entry[JSON_KEY_TR] = entry.msgstr
if entry.msgctxt is not None:
t_entry[JSON_KEY_CO] = entry.msgctxt
translations.append(t_entry)
try:
previous_l10n = json.load(open(json_filename, encoding='utf-8'), strict=False)
# remove tabs from data
authors = previous_l10n[JSON_KEY_AUTHOR]
for i, value in enumerate(authors[JSON_KEY_MODIFY]):
authors[JSON_KEY_MODIFY][i] = value.replace("\t", " ")
result = {JSON_KEY_AUTHOR: authors, JSON_KEY_TRANSL: translations}
print(" extracted author info from " + json_filename)
except IOError:
result = {JSON_KEY_AUTHOR: "", JSON_KEY_TRANSL: translations}
print(" failed to open " + json_filename + ", skipping author info")
json.dump(
result,
open(json_filename, 'w', encoding='utf-8'),
ensure_ascii=False,
indent="\t",
separators=(',', ': '),
sort_keys=True,
)
def normalize(filename):
"""Normalizes a l10n file.po for better version controlling"""
po = polib.pofile(open(filename).read())
entries = list(sorted(sorted(po, key=lambda x: x.msgctxt or ""), key=lambda x: x.msgid))
po.clear()
for entry in entries:
po.append(entry)
po.save(filename)
def decrement_indent(filename):
"""decrement indent level of file"""
with open(filename, encoding='utf-8') as f:
sanitized_json=f.read().replace('\n\t', '\n')
with open(filename, 'w', encoding='utf-8') as f:
f.write(sanitized_json)
if __name__ == '__main__':
"""Normalizes then converts a l10n file.po into a file.json, keeping author info from a previous file.json if possible"""
for filename in sys.argv[1:]:
assert(len(filename)>len(".po"))
json_filename = filename[:-3]+".json"
normalize(filename)
print(filename + " -> " + filename + " (normalized)")
reconvert(filename, json_filename)
decrement_indent(json_filename)
print(filename + " -> " + json_filename)