You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.5 KiB
62 lines
1.5 KiB
|
4 years ago
|
#!/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)
|