Files
Assetmanager/tools/check_translations.py

32 lines
1.7 KiB
Python
Executable File

#!/usr/bin/env python3
"""Check template/Python translation keys against BASE_TRANSLATIONS."""
from pathlib import Path
import ast, re, sys
root=Path(__file__).resolve().parents[1]
source=(root/'app'/'i18n.py').read_text(encoding='utf-8')
tree=ast.parse(source)
keys=set()
for node in ast.walk(tree):
if isinstance(node, ast.Dict):
for key in node.keys:
if isinstance(key, ast.Constant) and isinstance(key.value,str): keys.add(key.value)
used=set()
patterns=[re.compile(r"\bt\(\s*['\"]([^'\"]+)"),re.compile(r"_translate_request\([^,]+,\s*['\"]([^'\"]+)")]
for path in list((root/'app').rglob('*.py'))+list((root/'app'/'templates').rglob('*.html')):
text=path.read_text(encoding='utf-8',errors='replace')
for pattern in patterns: used.update(pattern.findall(text))
dynamic_prefixes=('field.','jobdefs.interpreter.','jobdefs.platform.','jobdefs.source.','jobs.action.','jobs.event.','jobs.type.','presence.','software.platform.','software.status.','backup.reason_')
missing=sorted(k for k in used if k not in keys and '~' not in k and not k.startswith(dynamic_prefixes))
jobdef_used=sorted(k for k in used if k.startswith('jobdefs.') and not k.endswith('.'))
jobdef_missing=sorted(k for k in jobdef_used if k not in keys and not k.startswith(('jobdefs.interpreter.','jobdefs.platform.','jobdefs.source.')))
if jobdef_missing:
print('Missing jobdefs keys:')
for key in jobdef_missing: print(' -',key)
sys.exit(1)
print(f'Defined translation keys: {len(keys)}')
print(f'Statically referenced keys: {len(used)}')
if missing:
print('Legacy/static keys without BASE_TRANSLATIONS entry (warning):')
for key in missing: print(' -',key)
print('Job definition translation check passed.')