"""VoxCast UI strings: Spanish. Key/placeholder parity with en.py enforced."""

STRINGS: dict[str, str] = {
    # ── Panel (main.qml) ────────────────────────────────────────────────
    "panel_ready": "Listo",
    "panel_transcribing": "Transcribiendo...",
    "panel_correcting": "Corrigiendo...",
    "panel_enhancing": "Mejorando (IA)…",
    "panel_converting": "Convirtiendo...",
    "panel_error": "Error",
    "panel_drop_file": "Suelta un archivo → Markdown",
    "panel_acc_ai_mode": "Modo IA",
    "panel_acc_settings": "Ajustes",
    "panel_acc_undock": "Desacoplar",
    "panel_acc_hide": "Ocultar",

    # ── Settings window ─────────────────────────────────────────────────
    "settings_title": "Ajustes",
    "sec_interface": "INTERFAZ",
    "row_ui_language": "Idioma",
    "sec_audio": "AUDIO",
    "row_microphone": "Micrófono",
    "opt_system_default": "Predeterminado del sistema",
    "row_voice_test": "Prueba de voz",
    "btn_test": "Probar",
    "btn_stop": "Detener",
    "btn_play": "Reproducir",
    "sec_recognition": "RECONOCIMIENTO",
    "row_model": "Modelo",
    "model_swift": "Swift",
    "model_precise": "Precise",
    "model_ultra": "Ultra",
    "hint_model_swift": "Rápido y ligero, la opción adecuada para portátiles y PC sin tarjeta gráfica.",
    "hint_model_precise": "Precisión equilibrada, una opción sólida para el día a día, funciona bien en la mayoría de PC.",
    "hint_model_ultra": "Máxima precisión, ideal con tarjeta gráfica (4 GB); sin ella es notablemente más lento.",
    "compat_gpu_ok": "Funcionará en tu tarjeta gráfica ({vram} GB).",
    "compat_gpu_low": "Tu tarjeta gráfica ({vram} GB) tiene poca memoria para este modelo, funcionará en el procesador (más lento).",
    "compat_cpu": "No se detectó una tarjeta gráfica compatible, este modelo funcionará en el procesador.",
    "compat_cpu_forced": "Funcionará en el procesador (definido en los ajustes).",
    "row_language": "Idioma",
    "row_lang_auto": "Detectar idioma automáticamente",
    "hint_lang_auto": "Detecta el idioma en cada dictado. Un idioma fijo es más rápido y preciso.",
    "row_live_mode": "Transcripción en vivo",
    "hint_live_mode": "El texto aparece en el cursor mientras hablas, en lugar de al terminar. En este modo no hay mejora con IA; el texto se escribe en el cursor.",
    "hint_output_live": "La transcripción en vivo está activada: el texto se escribe en el cursor mientras hablas, así que estas opciones de salida no se aplican.",
    "hint_live_cpu": "Funciona mejor con tarjeta gráfica; en el procesador puede ir por detrás de tu voz.",
    "live_cpu_warning": "El modo en vivo funciona en el procesador y puede retrasarse; se recomienda una tarjeta gráfica.",
    "sec_output": "SALIDA",
    "row_text_output": "Salida de texto",
    "opt_clipboard": "Portapapeles",
    "opt_type_at_cursor": "Escribir en el cursor",
    "opt_both": "Ambos",
    "row_insert_method": "Método de inserción",
    "opt_paste": "Pegar (Ctrl+V)",
    "opt_typing": "Escritura",
    "hint_typing": "Simula la entrada de teclado. Funciona en terminales.",
    "sec_controls": "CONTROLES",
    "row_hotkey": "Atajo de teclado",
    "row_mode": "Modo",
    "opt_hold": "Mantener",
    "opt_toggle": "Alternar",
    "sec_performance": "RENDIMIENTO",
    "row_compute": "Cómputo",
    "opt_auto": "Automático",
    "opt_gpu": "GPU (CUDA)",
    "opt_cpu": "CPU",
    "hint_cpu_slow": "El modo CPU es más lento.",
    "sec_system": "SISTEMA",
    "row_autostart": "Inicio automático",
    "row_startup_sound": "Sonido de inicio",
    "row_recording_sound": "Sonido de grabación",
    "row_shutdown_sound": "Sonido de cierre",
    "row_always_on_top": "Siempre visible",
    "row_small_panel": "Panel pequeño",
    "sec_file_conversion": "CONVERSIÓN DE ARCHIVOS",
    "row_save_mode": "Modo de guardado",
    "opt_ask": "Preguntar",
    "opt_beside_file": "Junto al archivo",
    "opt_folder": "Carpeta",
    "row_folder": "Carpeta",
    "btn_browse": "Examinar",
    "row_timestamps": "Marcas de tiempo",
    "row_open_after": "Abrir al terminar",
    "row_context_menu": "Menú contextual",
    "hint_context_menu": "Añade «Convertir a Markdown» al menú contextual del Explorador.",
    "sec_ai": "MEJORA CON IA",
    "row_enable": "Activar",
    "hint_ai": "Pule tus dictados con IA (limpiar, e-mail, respuesta…). Elige el modo activo con clic derecho en el panel o con el botón IA del panel.",
    "row_provider": "Proveedor",
    "row_api_key": "Clave API",
    "ph_api_key": "Pega la clave API",
    "ph_api_key_saved": "•••••••• guardada, escribe para reemplazar",
    "btn_save": "Guardar",
    "hint_key_stored": "Clave guardada de forma segura en el Administrador de credenciales de Windows.",
    "btn_clear": "Borrar",
    "btn_load": "Cargar",
    "btn_loading": "Cargando",
    "row_active_mode": "Modo activo",
    "mode_normal": "Normal (sin IA)",
    # Display names of the built-in AI modes (shown while the user hasn't
    # renamed them; the stored name stays the English default).
    "mode_cleanup": "Limpiar",
    "mode_email": "E-Mail",
    "mode_reply": "Respuesta",
    "mode_todo": "Lista de tareas",
    "mode_notes": "Notas",
    "mode_formal": "Formal",
    "lbl_custom_modes": "Modos personalizados",
    "sec_license": "LICENCIA",
    "row_status": "Estado",
    "lic_activated": "● Activado",
    "lic_not_activated": "○ No activado",
    "btn_activate": "Activar",
    "sec_updates": "ACTUALIZACIONES",
    "row_version": "Versión",
    "btn_check_updates": "Buscar actualizaciones",
    "btn_checking": "Comprobando",
    "btn_downloading_pct": "{pct}%  descargando…",
    "btn_download_install": "Descargar e instalar v{version}",
    "btn_reset": "Restablecer",
    "reset_title": "Restablecer ajustes",
    "reset_question": "¿Restablecer todos los ajustes a los valores predeterminados?",
    "dlg_model_dl_title": "Descarga necesaria",
    "dlg_model_dl_text": "El modelo seleccionado aún no está instalado. VoxCast descargará unos {size} de datos de voz y cambiará después. ¿Iniciar la descarga ahora?",

    # ── Mode editor ─────────────────────────────────────────────────────
    "ph_mode_name": "Nombre del modo",
    "tip_remove_mode": "Eliminar modo",
    "ph_system_prompt": "Prompt de sistema, le dice a la IA cómo transformar la transcripción.",
    "btn_add_mode": "Añadir modo",
    "mode_new": "Nuevo modo",

    # ── Mode menu (panel) ───────────────────────────────────────────────
    "menu_ai_mode": "MODO IA",
    "menu_ai_mode_off": "MODO IA  ·  OFF",
    "menu_ai_settings": "Ajustes…",
    "menu_copy_raw": "Copiar transcripción original",
    "tray_raw_copied": "La transcripción original se copió al portapapeles.",

    # ── Activation overlay ──────────────────────────────────────────────
    "act_title": "Activar VoxCast",
    "act_intro": "Introduce tu clave de licencia para activar este dispositivo. La activación es un paso único en línea, después VoxCast funciona completamente sin conexión.",
    "act_enter_key": "Introduce tu clave de licencia.",
    "act_button": "Activar",
    "act_button_busy": "Activando…",
    "act_update_available": "La versión {version} está disponible.",
    "act_update_now": "Actualizar ahora",
    "act_device": "Dispositivo: ",
    "act_quit": "Salir",

    # ── First-run overlay ───────────────────────────────────────────────
    "fr_title": "Configuración de VoxCast",
    "fr_pick_language": "Elige tu idioma para el reconocimiento de voz.\nAsí evitas la detección automática lenta en cada uso.",
    "fr_continue": "Continuar",
    "fr_preparing": "Preparando modelos...",
    "fr_hint_label": "Consejo:",
    "status_hw_check": "Comprobando hardware...",
    "fr_hw_gpu": "Tarjeta gráfica detectada ({vram} GB): se configurará el modelo {model}.",
    "fr_hw_cpu": "No se detectó una tarjeta gráfica dedicada: se configurará el modelo {model}.",
    "fr_hint_download": "Los modelos se descargan una vez y se quedan en tu dispositivo, sin nube.",
    "fr_hint_hotkey": "Pulsa Ctrl+Shift+Espacio para empezar a dictar, púlsalo otra vez para parar.",
    "fr_hint_ai": "Haz clic derecho en el panel para elegir un modo IA (p. ej. E-Mail, Respuesta).",
    "fr_hint_dragfile": "Arrastra un archivo al panel para convertirlo en Markdown.",
    "fr_hint_audio": "Suelta un archivo de audio (mp3, ogg, m4a…) para transcribirlo.",
    "fr_hint_explorer": "En el Explorador: clic derecho en un archivo → “Convertir a Markdown”.",
    "fr_hint_dock": "Acopla el panel a un borde de la pantalla, se retira hasta que lo necesites.",
    "fr_hint_settings": "Abre Ajustes para cambiar el modelo, el idioma o el atajo cuando quieras.",

    # ── Status messages (Python → panel) ────────────────────────────────
    "status_init_services": "Inicializando servicios...",
    "status_loading_vad": "Cargando detección de actividad de voz...",
    "status_loading_model": "Cargando modelo de reconocimiento de voz...",
    "status_init_models": "Inicializando modelos...",
    "status_loading": "Cargando modelo...",
    "status_switching_model": "Cambiando de modelo...",
    "status_downloading_engine": "Descargando motor de reconocimiento de voz...",
    "status_engine_ready": "Motor de reconocimiento de voz listo",
    "status_downloading_correction": "Descargando modelo de corrección...",
    "status_correction_ready": "Modelo de corrección descargado",

    # ── Meeting recording ────────────────────────────────────────────────
    "menu_meeting_start": "Grabar reunión",
    "menu_meeting_stop": "Detener grabación de la reunión",
    "meeting_consent_title": "Grabar reuniones",
    "meeting_consent_body": "VoxCast graba el audio del sistema y tu micrófono para que puedas transcribir llamadas y reuniones.\n\nAsegúrate de que todos los participantes estén de acuerdo con la grabación, en muchos países (incluida Alemania) grabar una llamada sin consentimiento es un delito.",
    "meeting_consent_accept": "Entendido, empezar a grabar",
    "meeting_consent_cancel": "Cancelar",
    "status_meeting_recording": "Grabando reunión",
    "status_meeting_transcribing": "Transcribiendo reunión… {pct}%",
    "meeting_done_title": "Reunión transcrita",
    "meeting_done_body": "La transcripción se guardó, haz clic aquí para abrirla.",
    "meeting_resume_note": "Se encontró una grabación de reunión sin terminar, se está transcribiendo ahora.",
    "menu_meeting_folder": "Abrir carpeta de reuniones",
    "meeting_source_title": "¿Qué grabar?",
    "meeting_source_system": "Todo el sistema",
    "meeting_source_empty": "Ninguna app está reproduciendo audio ahora mismo",
    "meeting_app_fallback": "La captura de una sola app no pudo iniciarse, se grabará todo el sistema en su lugar.",
    "md_meeting_source": "Fuente",
    "meeting_partial_note": "La grabación terminó antes de tiempo, la grabación parcial se procesó de todos modos.",
    "meeting_system_silent": "No se capturó audio del sistema, revisa tu dispositivo de reproducción. Algunos auriculares reproducen el audio de forma que Windows no puede grabarlo; cambiar el dispositivo de salida predeterminado ayuda.",
    "meeting_summary_failed": "El resumen con IA falló, la transcripción se guardó sin él.",
    "err_meeting_folder": "No se pudo crear la carpeta de reuniones. Revisa la carpeta en Ajustes.",
    "err_meeting_disk": "No hay suficiente espacio libre en disco, la grabación de la reunión se detuvo.",
    "err_meeting_maxlen": "Se alcanzó la duración máxima de reunión (4 h), la grabación se detuvo.",
    "err_meeting_capture": "La grabación de la reunión falló, no se pudo capturar audio.",
    "err_meeting_transcribe": "La transcripción de la reunión falló. El archivo de audio se conservó para que puedas reintentarlo.",
    "md_meeting_title": "Reunión",
    "md_meeting_date": "Fecha",
    "md_meeting_duration": "Duración",
    "md_meeting_summary": "Resumen",
    "md_meeting_transcript": "Transcripción",
    "sec_remote": "Servidor remoto",
    "row_remote_enable": "Usar servidor remoto",
    "hint_remote": "Ejecuta la transcripción en otro ordenador con una GPU o CPU más potente. El dictado, la conversión de archivos y las reuniones se procesan en el servidor.",
    "hint_recognition_remote": "El servidor remoto se encarga del reconocimiento, por lo que el modelo local de abajo está desactivado. Elige el modelo en el servidor.",
    "row_remote_url": "Dirección del servidor",
    "ph_remote_url": "http://192.168.1.10:8590",
    "row_remote_key": "Clave API",
    "ph_remote_key": "Pega la clave API del servidor",
    "btn_remote_test": "Probar conexión",
    "remote_testing": "Probando...",
    "btn_remote_discover": "Buscar servidor",
    "remote_discovering": "Buscando...",
    "remote_discover_none": "No se encontró ningún servidor. Asegúrate de que el servidor esté en marcha, ambos dispositivos estén en la misma red y el cortafuegos del servidor permita VoxCast Server en la red local.",
    "remote_enhance_available": "Mejora con IA disponible",
    "remote_update_available": "Actualización del servidor disponible: {version}",
    "row_tls_mode": "Certificado",
    "tls_verify": "Exigir un certificado válido",
    "tls_pinned": "Confiar en este servidor",
    "tls_insecure": "Permitir cualquier certificado",
    "btn_trust_cert": "Comprobar certificado",
    "tls_trust_title": "¿Confiar en este servidor?",
    "tls_trust_body": "El servidor presentó esta huella de certificado. Confirma que coincide con tu servidor antes de confiar en él.",
    "tls_trust_confirm": "Confiar",
    "tls_trust_failed": "No se pudo leer el certificado del servidor. Comprueba la dirección y que HTTPS esté activado.",
    "tls_insecure_warning": "La conexión no está verificada. Úsala solo en una red de confianza.",
    "row_enhance_source": "Mejora con IA",
    "enhance_own": "Mi propia clave de API",
    "enhance_server": "Usar el servidor",
    "hint_enhance_server": "El servidor mejora con su propia clave de IA, así que no necesitas introducir ninguna aquí.",
    "lbl_server_modes": "Modos de empresa (del servidor)",
    "managed_locked": "Gestionado por tu organización",
    "remote_http_warn": "Esta conexión no está cifrada. Úsala solo en una red local de confianza.",
    "remote_live_hint": "Los subtítulos en directo se ejecutan en este dispositivo; necesitan un modelo instalado localmente.",
    "remote_connected": "Conectado: {model} en {where}",
    "remote_on_gpu": "GPU ({vram} GB)",
    "remote_on_cpu": "CPU",
    "err_remote_unreachable": "No se pudo conectar con el servidor remoto. Comprueba la dirección y tu red.",
    "err_remote_auth": "El servidor remoto rechazó la clave API.",
    "err_remote_busy": "El servidor remoto está ocupado. Inténtalo de nuevo en un momento.",
    "err_remote_failed": "El servidor remoto no pudo procesar este audio.",
    "sec_meeting": "REUNIONES",
    "row_meeting_mic": "Grabar micrófono",
    "hint_meeting_mic": "Captura también tu propia voz, no solo a los demás participantes.",
    "row_meeting_language": "Idioma",
    "lang_meeting_auto": "Detección automática",
    "row_convert_language": "Idioma del audio",
    "lang_convert_auto": "Detección automática",
    "err_convert_engine_loading": "El motor de voz todavía se está cargando. Vuelve a intentar la conversión en un momento.",
    "err_convert_no_speech": "No se reconoció voz en este archivo. No se creó ningún archivo Markdown.",
    "err_convert_engine_error": "El motor de voz notificó un error durante la transcripción.",
    "tray_convert_failed": "No se pudo convertir {name}: {error}",
    "hint_meeting_language": "La detección automática maneja reuniones en cualquier idioma, incluso si cambia a mitad de la llamada. Elige un idioma solo si la detección tiene problemas.",
    "row_meeting_keep": "Conservar archivo de audio",
    "hint_meeting_keep": "Guarda la grabación como archivo .wav junto a la transcripción.",
    "row_meeting_summary": "Resumen con IA",
    "hint_meeting_summary": "Añade un resumen generado con IA al inicio de la transcripción (requiere tener configurada la mejora con IA).",
    "hint_meeting_summary_nokey": "La mejora con IA no está configurada, se omitirán los resúmenes.",
    "row_meeting_folder": "Guardar en",
    "meeting_folder_default": "Documentos\\VoxCast\\Meetings",
    "btn_open": "Abrir",

    # ── Errors / tray (Python) ──────────────────────────────────────────
    "err_audio_lib": "Biblioteca de audio no disponible",
    "err_gpu_oom": "Memoria de la GPU agotada. Reinicia en modo CPU.",
    "err_gpu_fallback": "Tarjeta gráfica no disponible, funcionando en el procesador (más lento).",
    "err_hotkey_init": "Sistema de atajos de teclado no inicializado",
    "err_mic": "Error de micrófono. Revisa tu dispositivo de audio.",
    "err_mic_test_busy": "Ya hay una grabación en curso. Deténla antes de probar el micrófono.",
    "err_model_switch": "El cambio de modelo falló. Inténtalo de nuevo.",
    "err_model_download": "La descarga del modelo de voz falló. Revisa tu conexión a internet.",
    "err_speech_start": "No se pudo iniciar el reconocimiento de voz.",
    "err_transcription": "La transcripción falló. Inténtalo de nuevo.",
    "err_model_missing": "Modelo de voz no encontrado. Selecciona un modelo en Ajustes.",
    "tray_cpu_fallback": "No se encontró una GPU compatible. Funcionando en CPU.\nLa transcripción será más lenta que con aceleración por GPU.",
    "tray_cpu_configured": "Funcionando en CPU según lo configurado en los ajustes.",
    "tray_cpu_detected": "No se detectó una GPU compatible. Funcionando en CPU.\nPara una transcripción más rápida se recomienda una GPU compatible.",
    "tray_file_not_found": "Archivo no encontrado.",
    "tray_no_supported_files": "No hay archivos compatibles para convertir.",
    "tray_still_starting": "VoxCast todavía está iniciándose, inténtalo de nuevo.",
    "tray_no_output_folder": "No hay carpeta de destino, elige dónde guardar.",
    "tray_context_menu_failed": "No se pudo actualizar el menú contextual.",
    "tray_need_api_key": "Introduce y guarda primero una clave API.",
    "tray_models_load_failed": "No se pudieron cargar los modelos.",
    "tray_show_hide": "Mostrar/Ocultar",

    # ── License (Python user messages) ──────────────────────────────────
    "lic_enter_key": "Introduce tu clave de licencia.",
    "lic_saved_failed": "Activado, pero la licencia no se pudo guardar en este PC.",
    "lic_success": "VoxCast activado. ¡Gracias!",
    "lic_check_failed": "La activación falló. Revisa tu clave.",
    "lic_no_server": "No se pudo contactar con el servidor de activación. Revisa tu conexión a internet.",
    "lic_unexpected": "La activación falló de forma inesperada. Inténtalo de nuevo.",

    # ── Updates (Python user messages) ──────────────────────────────────
    "upd_checking": "Buscando actualizaciones…",
    "upd_latest": "Ya tienes la última versión.",
    "upd_available": "La versión {version} está disponible.",
    "upd_dialog_title": "Actualización disponible",
    "upd_whats_new": "Novedades",
    "upd_required": "Obligatoria",
    "upd_no_notes": "Mejoras generales y correcciones.",
    "upd_later": "Más tarde",
    "upd_install_now": "Descargar e instalar",
    "upd_install_note": "La actualización reemplaza tu versión actual automáticamente, no tienes que hacer nada más.",
    "upd_downloading": "Descargando la versión {version}…",
    "upd_failed": "La actualización falló. Inténtalo de nuevo.",
    "upd_starting_installer": "Iniciando el instalador…",
    "upd_installer_failed": "No se pudo iniciar el instalador.",
    "upd_err_filename": "Nombre de archivo del instalador inesperado en el manifiesto de actualización.",
    "upd_err_https": "La descarga de la actualización debe usar HTTPS.",
    "upd_err_response": "El servidor de actualizaciones devolvió una respuesta no válida.",
    "upd_err_no_url": "No se proporcionó una URL de descarga.",
    "upd_err_no_checksum": "Al manifiesto de actualización le falta la suma de verificación. Cancelado.",
    "upd_err_redirect": "El servidor de actualizaciones devolvió una redirección inesperada.",
    "upd_err_integrity": "El archivo descargado no superó la comprobación de integridad. Cancelado.",
    "upd_err_check": "No se pudieron buscar actualizaciones: {error}",
    "upd_err_download": "La descarga falló: {error}",
    "upd_err_save": "No se pudo guardar la actualización: {error}",
    "upd_err_host": "Descarga de actualización rechazada desde el host no confiable '{host}'.",

    # ── LLM (user messages) ─────────────────────────────────────────────
    # ── Late additions (review sweep) ───────────────────────────────────
    "act_first": "Activa VoxCast primero.",
    "llm_enhance_failed": "La mejora con IA falló: {error}",
    "llm_truncated": "La respuesta de la IA quedó cortada, se usó la transcripción original en su lugar.",
    "llm_mode_needs_key": "Modo IA seleccionado, añade una clave API en Ajustes para activar la mejora.",
    "tt_recording": "Grabando...",
    "tray_saved": "Guardado: {name}",
    "tray_converted": "{n} archivos convertidos a Markdown.",
    "hk_press_key": "Pulsa una tecla...",
    "hk_acc_record": "Pulsa las teclas del atajo",
    "no_folder": "Ninguna carpeta seleccionada",
    "llm_load_models_ph": "Cargar modelos →",

    "llm_no_key": "No se proporcionó una clave API.",
    "llm_no_key_configured": "No hay una clave API configurada.",
    "llm_bad_key": "Clave API no válida o no autorizada.",
    "llm_rate_limit": "Límite de peticiones alcanzado. Inténtalo de nuevo en un momento.",
    "llm_provider_down": "El proveedor de IA no está disponible temporalmente.",
    "llm_request_failed": "La petición falló ({code}).",
    "llm_network": "Error de red: {error}",
    "llm_no_model": "No se encontró un modelo de IA utilizable para esta clave API.",
}
