twonly-app/scripts/check_arb.py
2026-04-29 00:22:42 +02:00

121 lines
4.3 KiB
Python

import os
import json
import re
import sys
ARB_DIR = 'lib/src/localization/translations'
LIB_DIR = 'lib'
def get_arb_data(filepath):
try:
with open(filepath, 'r', encoding='utf-8') as f:
return json.load(f)
except Exception as e:
print(f"Error reading {filepath}: {e}")
return {}
def save_arb_data(filepath, data):
with open(filepath, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
f.write('\n')
def get_keys(data):
return {k for k in data.keys() if k and not k.startswith('@')}
def main():
fix_mode = '--fix' in sys.argv
en_file = os.path.join(ARB_DIR, 'en.arb')
if not os.path.exists(en_file):
print(f"Error: {en_file} not found. Please run this script from the project root.")
return
en_data = get_arb_data(en_file)
en_keys = get_keys(en_data)
print(f"Found {len(en_keys)} keys in en.arb")
# 1. Check for unused keys in Dart files
print("\n--- Checking for unused keys in Dart files ---")
all_dart_text = ""
for root, _, files in os.walk(LIB_DIR):
for file in files:
if file.endswith('.dart'):
filepath = os.path.join(root, file)
if "generated" in str(filepath):
continue
try:
with open(filepath, 'r', encoding='utf-8') as f:
all_dart_text += f.read() + "\n"
except Exception as e:
print(f"Could not read {filepath}: {e}")
unused_keys = set()
for key in sorted(en_keys):
# Using word boundary to avoid partial matches
pattern = r'\b' + re.escape(key) + r'\b'
if not re.search(pattern, all_dart_text):
unused_keys.add(key)
if unused_keys:
print(f"Found {len(unused_keys)} keys in en.arb that do not appear to be used in the Dart code:")
for k in sorted(unused_keys):
print(f" - {k}")
if fix_mode:
print("\n--fix is enabled. Deleting unused keys from all .arb files...")
arb_files = [f for f in os.listdir(ARB_DIR) if f.endswith('.arb')]
for arb_file in arb_files:
filepath = os.path.join(ARB_DIR, arb_file)
data = get_arb_data(filepath)
deleted_count = 0
for k in unused_keys:
if k in data:
del data[k]
# Also delete associated metadata if it exists
meta_k = f"@{k}"
if meta_k in data:
del data[meta_k]
deleted_count += 1
if deleted_count > 0:
save_arb_data(filepath, data)
print(f"Deleted {deleted_count} unused keys from {arb_file}")
# Remove deleted keys from our set so the comparison below is accurate
en_keys = en_keys - unused_keys
else:
print("\nRun with --fix to automatically delete these unused keys.")
else:
print("All keys in en.arb seem to be used in the Dart files.")
# 2. Compare other .arb files with en.arb
print("\n--- Comparing other .arb files with en.arb ---")
arb_files = [f for f in os.listdir(ARB_DIR) if f.endswith('.arb')]
for arb_file in arb_files:
if arb_file == 'en.arb':
continue
filepath = os.path.join(ARB_DIR, arb_file)
data = get_arb_data(filepath)
other_keys = get_keys(data)
extra_keys = other_keys - en_keys
missing_keys = en_keys - other_keys
print(f"\n[{arb_file} vs en.arb]")
if extra_keys:
print(f"Keys in {arb_file} but NOT in en.arb ({len(extra_keys)}):")
for k in sorted(extra_keys):
print(f" + {k}")
else:
print(f"No extra keys found in {arb_file} (all keys are in en.arb).")
if missing_keys:
print(f"Keys in en.arb but NOT in {arb_file} ({len(missing_keys)}):")
for k in sorted(missing_keys):
print(f" - {k}")
else:
print(f"No missing keys in {arb_file} (it has all en.arb keys).")
if __name__ == "__main__":
main()