check_translations.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import json
  2. import os
  3. import re
  4. def get_keys(data, prefix=""):
  5. keys = []
  6. if isinstance(data, dict):
  7. for k, v in data.items():
  8. new_key = f"{prefix}.{k}" if prefix else k
  9. # Skip language objects (they have "en", "ru", etc)
  10. if isinstance(v, dict) and any(lang in v for lang in ["en", "ru", "me", "ua"]):
  11. keys.append(new_key)
  12. else:
  13. keys.extend(get_keys(v, new_key))
  14. return keys
  15. def check_unused():
  16. locales_dir = "src/locales"
  17. src_dir = "src"
  18. trans_files = [f for f in os.listdir(locales_dir) if f.startswith("translations") and f.endswith(".json")]
  19. # Collect all source code content
  20. src_content = ""
  21. for root, dirs, files in os.walk(src_dir):
  22. for file in files:
  23. if file.endswith((".vue", ".ts", ".js")):
  24. with open(os.path.join(root, file), "r", encoding="utf-8") as f:
  25. src_content += f.read() + "\n"
  26. report = {}
  27. for trans_file in trans_files:
  28. path = os.path.join(locales_dir, trans_file)
  29. with open(path, "r", encoding="utf-8") as f:
  30. data = json.load(f)
  31. all_keys = get_keys(data)
  32. unused = []
  33. for key in all_keys:
  34. # Check for exact string match in code
  35. # We look for "key", 'key', or `key`
  36. pattern = re.compile(f"['\"`]{re.escape(key)}['\"`]")
  37. if not pattern.search(src_content):
  38. unused.append(key)
  39. report[trans_file] = unused
  40. return report
  41. if __name__ == "__main__":
  42. report = check_unused()
  43. print(json.dumps(report, indent=2, ensure_ascii=False))