import re import json import glob import pytest # List all locale files (except en.json being the ref) locale_folder = "locales/" locale_files = glob.glob(locale_folder + "*.json") locale_files = [filename.split("/")[-1] for filename in locale_files] locale_files.remove("en.json") reference = json.loads(open(locale_folder + "en.json").read()) def find_inconsistencies(locale_file): this_locale = json.loads(open(locale_folder + locale_file).read()) # We iterate over all keys/string in en.json for key, string in reference.items(): # Ignore check if there's no translation yet for this key if key not in this_locale: continue # Then we check that every "{stuff}" (for python's .format()) # should also be in the translated string, otherwise the .format # will trigger an exception! subkeys_in_ref = {k[0] for k in re.findall(r"{(\w+)(:\w)?}", string)} subkeys_in_this_locale = { k[0] for k in re.findall(r"{(\w+)(:\w)?}", this_locale[key]) } if any(k not in subkeys_in_ref for k in subkeys_in_this_locale): yield """\n ========================== Format inconsistency for string {key} in {locale_file}:" en.json -> {string} {locale_file} -> {translated_string} """.format( key=key, string=string.encode("utf-8"), locale_file=locale_file, translated_string=this_locale[key].encode("utf-8"), ) @pytest.mark.parametrize("locale_file", locale_files) def test_translation_format_consistency(locale_file): inconsistencies = list(find_inconsistencies(locale_file)) if inconsistencies: raise Exception("".join(inconsistencies))