diff --git a/maintenance/clean_locales.py b/maintenance/clean_locales.py new file mode 100644 index 00000000..d2f1873b --- /dev/null +++ b/maintenance/clean_locales.py @@ -0,0 +1,80 @@ +import os +import glob +import json +from collections import OrderedDict + + +ROOT_FOLDER = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) +LOCALES_FOLDER = os.path.join(ROOT_FOLDER, "app", "src", "i18n", "locales") +LOCALE_FILES = { + path.split("/")[-1].replace(".json", ""): path + for path in glob.glob(LOCALES_FOLDER + "/*.json") +} +ALL_LOCALES = set(LOCALE_FILES.keys()) + + +def get_locale_json(locale): + with open(LOCALE_FILES[locale], "r") as fp: + return json.load(fp, object_pairs_hook=OrderedDict) + + +def save_locale_json(locale, data, sort=False): + with open(LOCALE_FILES[locale], "w", encoding="utf-8") as fp: + json.dump(data, fp, ensure_ascii=False, sort_keys=sort, indent=4) + fp.write("\n") + + +def get_flatten_keys(d, parent_key=""): + items = set() + + for k, v in d.items(): + key = f"{parent_key}.{k}" if parent_key else k + items.add(key) + + if isinstance(v, dict): + items |= get_flatten_keys(v, key) + + return items + + +def filter_data(data, stale_keys): + filtered = OrderedDict() + + for k, v in data.items(): + if k not in stale_keys: + value = v + + if isinstance(v, OrderedDict): + nested_stale_keys = [ + key.replace(f"{k}.", "") + for key in stale_keys + if key.startswith(f"{k}.") + ] + if nested_stale_keys: + value = filter_data(v, nested_stale_keys) + + filtered[k] = value + + return filtered + + +def remove_stale_translations(ref="en", locales=None): + locales = set(locales) if locales else ALL_LOCALES + locales.discard(ref) + + ref_data = get_locale_json(ref) + ref_keys = get_flatten_keys(ref_data) + + for locale in locales: + data = get_locale_json(locale) + keys = get_flatten_keys(data) + stale_keys = sorted(keys - ref_keys) + filtered_data = filter_data(data, stale_keys) + save_locale_json(locale, filtered_data) + + # Resave ref file to sort and indent + save_locale_json(ref, ref_data, sort=True) + + +if __name__ == "__main__": + remove_stale_translations()