manage_locales.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import json
  2. import os
  3. import sys
  4. from pathlib import Path
  5. LOCALES_DIR = Path("src/locales")
  6. MASTER_FILE = LOCALES_DIR / "translations.json"
  7. LANGUAGES = ["en", "me", "ru"]
  8. def get_nested_keys(data, prefix=""):
  9. keys = {}
  10. for k, v in data.items():
  11. new_prefix = f"{prefix}.{k}" if prefix else k
  12. if isinstance(v, dict):
  13. # Check if this is a leaf node with language keys
  14. if any(lang in v for lang in LANGUAGES):
  15. keys[new_prefix] = v
  16. else:
  17. keys.update(get_nested_keys(v, new_prefix))
  18. else:
  19. keys[new_prefix] = v
  20. return keys
  21. def set_nested_key(data, key_path, value):
  22. parts = key_path.split('.')
  23. for part in parts[:-1]:
  24. data = data.setdefault(part, {})
  25. data[parts[-1]] = value
  26. def merge():
  27. """Merge individual JSON files into translations.json"""
  28. master_data = {}
  29. all_keys = set()
  30. locale_data = {}
  31. for lang in LANGUAGES:
  32. path = LOCALES_DIR / f"{lang}.json"
  33. if path.exists():
  34. with open(path, "r", encoding="utf-8") as f:
  35. data = json.load(f)
  36. flat = {}
  37. def flatten(d, prefix=""):
  38. for k, v in d.items():
  39. new_prefix = f"{prefix}.{k}" if prefix else k
  40. if isinstance(v, dict):
  41. flatten(v, new_prefix)
  42. else:
  43. flat[new_prefix] = v
  44. flatten(data)
  45. locale_data[lang] = flat
  46. all_keys.update(flat.keys())
  47. for key in sorted(all_keys):
  48. translations = {}
  49. for lang in LANGUAGES:
  50. translations[lang] = locale_data.get(lang, {}).get(key, "")
  51. set_nested_key(master_data, key, translations)
  52. with open(MASTER_FILE, "w", encoding="utf-8") as f:
  53. json.dump(master_data, f, ensure_ascii=False, indent=2)
  54. print(f"Merged all locales into {MASTER_FILE}")
  55. def split():
  56. """Split translations.json into individual JSON files"""
  57. if not MASTER_FILE.exists():
  58. print(f"Error: {MASTER_FILE} not found")
  59. return
  60. with open(MASTER_FILE, "r", encoding="utf-8") as f:
  61. master_data = json.load(f)
  62. for lang in LANGUAGES:
  63. lang_data = {}
  64. def unflatten(d, target, current_lang):
  65. for k, v in d.items():
  66. if isinstance(v, dict):
  67. # Check if this is a leaf (contains language keys)
  68. if any(l in v for l in LANGUAGES):
  69. target[k] = v.get(current_lang, "")
  70. else:
  71. target[k] = {}
  72. unflatten(v, target[k], current_lang)
  73. else:
  74. # Should not ideally happen with the current structure
  75. target[k] = v
  76. unflatten(master_data, lang_data, lang)
  77. output_path = LOCALES_DIR / f"{lang}.json"
  78. with open(output_path, "w", encoding="utf-8") as f:
  79. json.dump(lang_data, f, ensure_ascii=False, indent=2)
  80. print(f"Generated {output_path}")
  81. if __name__ == "__main__":
  82. if len(sys.argv) < 2:
  83. print("Usage: python manage_locales.py [merge|split]")
  84. sys.exit(1)
  85. cmd = sys.argv[1].lower()
  86. if cmd == "merge":
  87. merge()
  88. elif cmd == "split":
  89. split()
  90. else:
  91. print(f"Unknown command: {cmd}")