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()