diff --git a/tools/validate_translations.py b/tools/validate_translations.py new file mode 100755 index 000000000..bb1ed1015 --- /dev/null +++ b/tools/validate_translations.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python + +from glob import glob +import polib +import re + +def validateEntry(original, translation): + if translation == '': + return True + + # Find fmt arguments in source message + src_arguments = re.findall("{.*?}", original) + if len(src_arguments) == 0: + return True + + # Find fmt arguments in translation + translated_arguments = re.findall("{.*?}", translation) + + # If paramteres are untyped with order, sort so that they still appear equal if reordered + # Note: This does no hadle cases where the translator reordered arguments where not expected + # by the source. Or other advanced but valid usages of the fmt syntax + isOrdered = True + for argument in src_arguments: + if re.search("^{\d+}$", argument) == None: + isOrdered = False + break + + if isOrdered: + src_arguments.sort() + translated_arguments.sort() + + if src_arguments == translated_arguments: + return True + + print ("\033[36m" + original + "\033[0m != \033[31m" + translation + "\033[0m") + + return False + + +status = 0 + +files = glob('Translations/*.po') +files.sort() +for path in files: + po = polib.pofile(path) + print ("\033[32mValidating " + po.metadata['Language'] + "\033[0m : " + str(po.percent_translated()) + "% translated") + + for entry in po: + if entry.fuzzy: + continue + + if entry.msgid_plural: + for translation in entry.msgstr_plural.values(): + if not validateEntry(entry.msgid_plural, translation): + status = 255 + continue + + if not validateEntry(entry.msgid, entry.msgstr): + status = 255 + +exit(status)