1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
#!/usr/bin/python3
# Author: Benjamin Drung <bdrung@ubuntu.com>
"""Check translation .po files for inconsistencies like identical translations."""
import argparse
import collections
import logging
import os
import sys
import polib
LOG_FORMAT = "%(name)s %(levelname)s: %(message)s"
__script_name__ = os.path.basename(sys.argv[0]) if __name__ == "__main__" else __name__
def check_duplicate_translations(po_file: polib.POFile) -> int:
"""Check if different msgids have the identical translation."""
msgstr_to_msgids = collections.defaultdict(set)
for entry in po_file:
if entry.msgstr == "":
continue
msgstr_to_msgids[entry.msgstr].add(entry.msgid)
# Drop single translations
duplicate_translations = {
msgstr: msgids for msgstr, msgids in msgstr_to_msgids.items() if len(msgids) > 1
}
if not duplicate_translations:
return 0
logger = logging.getLogger(__script_name__)
for msgstr, msgids in duplicate_translations.items():
logger.warning(
"Following IDs have the identical '%s' translation '%s': %s",
po_file.metadata["Language"],
msgstr,
", ".join(sorted(msgids)),
)
return 1
def check_translation(po_filename: str) -> int:
"""Check translation .po file for issues."""
po_file = polib.pofile(po_filename)
return check_duplicate_translations(po_file)
def main() -> int:
"""Check translation .po files for inconsistencies like identical translations."""
parser = argparse.ArgumentParser()
parser.add_argument("po_file", nargs="*")
args = parser.parse_args()
logging.basicConfig(format=LOG_FORMAT, level=logging.INFO)
failures = 0
for po_filename in args.po_file:
failures += check_translation(po_filename)
return failures
if __name__ == "__main__":
sys.exit(main())
|