mirror of
https://github.com/YunoHost/yunohost-admin.git
synced 2024-09-03 20:06:15 +02:00
[i18n] add locales cleaning py script
This commit is contained in:
parent
2d9aafa231
commit
fc4dd74f99
1 changed files with 80 additions and 0 deletions
80
maintenance/clean_locales.py
Normal file
80
maintenance/clean_locales.py
Normal file
|
@ -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()
|
Loading…
Add table
Reference in a new issue