| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- import json
- import os
- import sys
- from pathlib import Path
- LOCALES_DIR = Path("src/locales")
- MASTER_FILE = LOCALES_DIR / "translations.json"
- LANGUAGES = ["en", "me", "ru", "ua"]
- def get_nested_keys(data, prefix=""):
- keys = {}
- for k, v in data.items():
- new_prefix = f"{prefix}.{k}" if prefix else k
- if isinstance(v, dict):
- # Check if this is a leaf node with language keys
- if any(lang in v for lang in LANGUAGES):
- keys[new_prefix] = v
- else:
- keys.update(get_nested_keys(v, new_prefix))
- else:
- keys[new_prefix] = v
- return keys
- def set_nested_key(data, key_path, value):
- parts = key_path.split('.')
- for part in parts[:-1]:
- data = data.setdefault(part, {})
- data[parts[-1]] = value
- def merge():
- """Merge individual JSON files into translations.json"""
- master_data = {}
- all_keys = set()
- locale_data = {}
- for lang in LANGUAGES:
- path = LOCALES_DIR / f"{lang}.json"
- if path.exists():
- with open(path, "r", encoding="utf-8") as f:
- data = json.load(f)
- flat = {}
- def flatten(d, prefix=""):
- for k, v in d.items():
- new_prefix = f"{prefix}.{k}" if prefix else k
- if isinstance(v, dict):
- flatten(v, new_prefix)
- else:
- flat[new_prefix] = v
- flatten(data)
- locale_data[lang] = flat
- all_keys.update(flat.keys())
- for key in sorted(all_keys):
- translations = {}
- for lang in LANGUAGES:
- translations[lang] = locale_data.get(lang, {}).get(key, "")
-
- set_nested_key(master_data, key, translations)
- with open(MASTER_FILE, "w", encoding="utf-8") as f:
- json.dump(master_data, f, ensure_ascii=False, indent=2)
-
- print(f"Merged all locales into {MASTER_FILE}")
- def split():
- """Split translations.json into individual JSON files"""
- if not MASTER_FILE.exists():
- print(f"Error: {MASTER_FILE} not found")
- return
- with open(MASTER_FILE, "r", encoding="utf-8") as f:
- master_data = json.load(f)
- for lang in LANGUAGES:
- lang_data = {}
-
- def unflatten(d, target, current_lang):
- for k, v in d.items():
- if isinstance(v, dict):
- # Check if this is a leaf (contains language keys)
- if any(l in v for l in LANGUAGES):
- target[k] = v.get(current_lang, "")
- else:
- target[k] = {}
- unflatten(v, target[k], current_lang)
- else:
- # Should not ideally happen with the current structure
- target[k] = v
- unflatten(master_data, lang_data, lang)
-
- output_path = LOCALES_DIR / f"{lang}.json"
- with open(output_path, "w", encoding="utf-8") as f:
- json.dump(lang_data, f, ensure_ascii=False, indent=2)
- print(f"Generated {output_path}")
- if __name__ == "__main__":
- if len(sys.argv) < 2:
- print("Usage: python manage_locales.py [merge|split]")
- sys.exit(1)
-
- cmd = sys.argv[1].lower()
- if cmd == "merge":
- merge()
- elif cmd == "split":
- split()
- else:
- print(f"Unknown command: {cmd}")
|