- Replace 5 hardcoded text strings with LUS_LOC() calls: * ResolutionEditor.cpp: 'Click to resolve' -> BUTTON_CLICK_TO_RESOLVE * ResolutionEditor.cpp: ' ' (space) -> TEXT_SPACE * SohMenuNetwork.cpp: ':' (colon) -> TEXT_COLON (2 instances) * UIWidgets.cpp: '+' (plus) -> TEXT_PLUS - Add new translation keys to both en_US.json and es_ES.json: * BUTTON_CLICK_TO_RESOLVE: 'Click to resolve' / 'Haz clic para resolver' * TEXT_SPACE: ' ' / ' ' * TEXT_COLON: ':' / ':' * TEXT_PLUS: '+' / '+' - All hardcoded UI text now uses localization system - Compilation successful with only minor format warnings This completes the immediate task of eliminating hardcoded text strings.
152 lines
5.1 KiB
Python
152 lines
5.1 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Script para sincronizar archivos de traducción JSON
|
|
- Detecta claves faltantes en otros idiomas
|
|
- Genera reportes sobre traducciones pendientes
|
|
- Añade placeholders automáticamente
|
|
"""
|
|
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
from collections import defaultdict
|
|
|
|
PROJECT_ROOT = Path(__file__).parent.parent
|
|
LANGUAGES_DIR = PROJECT_ROOT / "languages"
|
|
|
|
def load_language_file(filename):
|
|
"""Carga un archivo de idioma"""
|
|
filepath = LANGUAGES_DIR / filename
|
|
if not filepath.exists():
|
|
print(f"❌ Archivo no encontrado: {filepath}")
|
|
return None
|
|
with open(filepath, 'r', encoding='utf-8') as f:
|
|
return json.load(f)
|
|
|
|
def save_language_file(filename, data):
|
|
"""Guarda un archivo de idioma"""
|
|
filepath = LANGUAGES_DIR / filename
|
|
with open(filepath, 'w', encoding='utf-8') as f:
|
|
json.dump(data, f, indent=4, ensure_ascii=False)
|
|
|
|
def sync_language_to_reference(ref_lang="en_US.json", target_lang="es_ES.json"):
|
|
"""Sincroniza un idioma con el de referencia"""
|
|
ref_data = load_language_file(ref_lang)
|
|
target_data = load_language_file(target_lang)
|
|
|
|
if ref_data is None or target_data is None:
|
|
return 0, 0
|
|
|
|
ref_keys = set(ref_data.keys())
|
|
target_keys = set(target_data.keys())
|
|
|
|
missing_keys = ref_keys - target_keys
|
|
extra_keys = target_keys - ref_keys
|
|
|
|
print(f"\n{'='*70}")
|
|
print(f"Sincronización: {ref_lang} → {target_lang}")
|
|
print(f"{'='*70}")
|
|
|
|
added = 0
|
|
if missing_keys:
|
|
print(f"\n📝 Claves faltantes en {target_lang}: {len(missing_keys)}")
|
|
for key in sorted(missing_keys):
|
|
target_data[key] = ref_data[key] # Usar valor inglés como placeholder
|
|
added += 1
|
|
print(f" + {key}: \"{ref_data[key][:50]}...\"" if len(ref_data[key]) > 50 else f" + {key}: \"{ref_data[key]}\"")
|
|
|
|
removed = 0
|
|
if extra_keys:
|
|
print(f"\n🗑️ Claves huérfanas en {target_lang}: {len(extra_keys)}")
|
|
print(" (Considere revisar antes de eliminar)")
|
|
for key in sorted(extra_keys):
|
|
print(f" - {key}: \"{target_data[key][:50]}...\"" if len(target_data[key]) > 50 else f" - {key}: \"{target_data[key]}\"")
|
|
|
|
if added > 0:
|
|
save_language_file(target_lang, target_data)
|
|
print(f"\n✓ Guardado: {added} claves añadidas a {target_lang}")
|
|
|
|
return added, len(extra_keys)
|
|
|
|
def generate_translation_report():
|
|
"""Genera un reporte de progreso de traducciones"""
|
|
en_data = load_language_file("en_US.json")
|
|
|
|
if en_data is None:
|
|
return
|
|
|
|
language_files = list(LANGUAGES_DIR.glob("*.json"))
|
|
language_files = [f for f in language_files if f.name != 'shipofharkinian.json']
|
|
|
|
print(f"\n{'='*70}")
|
|
print("📊 REPORTE DE PROGRESO DE TRADUCCIONES")
|
|
print(f"{'='*70}\n")
|
|
|
|
total_keys = len(en_data)
|
|
print(f"Total de claves a traducir: {total_keys}\n")
|
|
|
|
for lang_file in sorted(language_files):
|
|
lang_data = load_language_file(lang_file.name)
|
|
if lang_data is None:
|
|
continue
|
|
|
|
translated = len([k for k in lang_data.keys() if k in en_data.keys()])
|
|
percentage = (translated / total_keys * 100) if total_keys > 0 else 0
|
|
|
|
bar_length = 40
|
|
filled = int(bar_length * percentage / 100)
|
|
bar = '█' * filled + '░' * (bar_length - filled)
|
|
|
|
print(f"{lang_file.name:15} [{bar}] {percentage:5.1f}% ({translated}/{total_keys})")
|
|
|
|
print(f"\n{'='*70}")
|
|
|
|
def group_keys_by_prefix():
|
|
"""Agrupa claves por prefijo para mejor visualización"""
|
|
en_data = load_language_file("en_US.json")
|
|
|
|
if en_data is None:
|
|
return
|
|
|
|
prefixes = defaultdict(list)
|
|
for key in en_data.keys():
|
|
prefix = key.split('_')[0] if '_' in key else 'OTHER'
|
|
prefixes[prefix].append(key)
|
|
|
|
print(f"\n{'='*70}")
|
|
print("🏷️ CLAVES AGRUPADAS POR PREFIJO")
|
|
print(f"{'='*70}\n")
|
|
|
|
for prefix in sorted(prefixes.keys()):
|
|
count = len(prefixes[prefix])
|
|
print(f"{prefix:20} {count:4} claves")
|
|
|
|
print(f"\n{'='*70}")
|
|
|
|
def main():
|
|
import argparse
|
|
|
|
parser = argparse.ArgumentParser(description='Sincronizar archivos de traducción')
|
|
parser.add_argument('--sync', action='store_true', help='Sincronizar idiomas faltantes')
|
|
parser.add_argument('--report', action='store_true', help='Generar reporte de progreso')
|
|
parser.add_argument('--prefixes', action='store_true', help='Mostrar claves agrupadas por prefijo')
|
|
parser.add_argument('--all', action='store_true', help='Ejecutar todas las operaciones')
|
|
|
|
args = parser.parse_args()
|
|
|
|
if not args.sync and not args.report and not args.prefixes and not args.all:
|
|
args.all = True
|
|
|
|
if args.sync or args.all:
|
|
total_added, total_extra = sync_language_to_reference()
|
|
print(f"\n✓ Sincronización completada")
|
|
|
|
if args.report or args.all:
|
|
generate_translation_report()
|
|
|
|
if args.prefixes or args.all:
|
|
group_keys_by_prefix()
|
|
|
|
if __name__ == "__main__":
|
|
main()
|