#!/usr/bin/env python3 """ Script to add i18n tags to all Django templates """ import os import re from pathlib import Path def add_i18n_load(content): """Add {% load i18n %} at the top if not present""" if '{% load i18n %}' in content or '{%load i18n%}' in content: return content # Check if it extends a template if content.strip().startswith('{% extends'): # Add after extends lines = content.split('\n') for i, line in enumerate(lines): if '{% extends' in line: lines.insert(i + 1, '{% load i18n %}') return '\n'.join(lines) # Add at the very top return '{% load i18n %}\n' + content def wrap_text_in_trans(content): """Wrap user-facing text in {% trans %} tags""" # Common patterns to translate patterns = [ # Headings and titles in HTML tags (r']*>([^<{]+)', r'{% trans "\2" %}'), (r'([^<{]+)', r'{% trans "\1" %}'), # Button text (r']*>([^<{]+)', r''), # Labels (r']*>([^<{]+)', r''), # Placeholders (already handled in topbar) # Table headers (r']*>([^<{]+)', r'{% trans "\1" %}'), # Paragraphs with simple text (r']*>([^<{]+)

', r'

{% trans "\1" %}

'), # Span with simple text (r']*>([^<{]+)', r'{% trans "\1" %}'), ] for pattern, replacement in patterns: content = re.sub(pattern, replacement, content) return content def process_template(filepath): """Process a single template file""" print(f"Processing: {filepath}") try: with open(filepath, 'r', encoding='utf-8') as f: content = f.read() original_content = content # Add i18n load tag content = add_i18n_load(content) # Note: We'll do manual translation wrapping for better control # The automatic wrapping can be too aggressive if content != original_content: with open(filepath, 'w', encoding='utf-8') as f: f.write(content) print(f" ✓ Updated: {filepath}") return True else: print(f" - No changes needed: {filepath}") return False except Exception as e: print(f" ✗ Error processing {filepath}: {e}") return False def main(): """Main function to process all templates""" base_dir = Path(__file__).parent templates_dir = base_dir / 'templates' if not templates_dir.exists(): print(f"Templates directory not found: {templates_dir}") return # Find all HTML files html_files = list(templates_dir.rglob('*.html')) print(f"Found {len(html_files)} template files") print("=" * 60) updated_count = 0 for html_file in html_files: if process_template(html_file): updated_count += 1 print("=" * 60) print(f"Completed! Updated {updated_count} out of {len(html_files)} files") if __name__ == '__main__': main()