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 67 68 69
|
#!/usr/bin/env python3
import os
import re
import sys
ret = 0
def log(prefix, suffix, fallback):
try:
print(prefix, suffix) # Non-utf8 output...
except UnicodeEncodeError:
print(prefix, fallback)
def validate_translation(input, translation):
if not translation:
return True
if re.findall(r'(?:(?<!%)%[^%OCRUHBIH]|\$[^at1234])', translation):
log('Translation includes invalid formatting:', translation, input)
return False
in_vars = re.findall(r'(\$(?:\d|t))', input)
if not all(var in translation for var in in_vars):
log('Translation does not contain all variables:', translation, input)
return False
in_ascii = re.findall(r'\$a(\d{3})', translation)
if any(int(i) > 256 for i in in_ascii):
log('Translation contains invalid ascii value:', translation, input)
return False
# We could try to validate colors but that is pretty flexible
return True
def validate_language(path):
global ret
print('Validating', path)
with open(path, 'r', encoding='utf-8') as f:
in_event = False
event_input = ''
for line in f:
if 'textevents.h' in line:
in_event = True
elif in_event is False:
continue
elif line.startswith('msgid'):
event_input = line[7:-2]
elif line.startswith('msgstr'):
if not validate_translation(event_input, line[8:-2]):
ret = 1
in_event = False
elif line == '\n':
print('Failed to find translation for', event_input)
in_event = False
with open(sys.argv[1], 'r') as linguas:
for lang in linguas:
path = os.path.join(sys.argv[2], lang.strip() + '.po')
validate_language(path)
sys.exit(ret)
|