70 lines
1.8 KiB
Plaintext
70 lines
1.8 KiB
Plaintext
|
#!/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)
|