<?php
return [
    'app.title' => 'Mi Aplicación',
    'app.welcome' => 'Bienvenido',
    'app.copyright' => '© {year} {app}',
    'app.description' => 'Aplicación web con gestión de usuarios',
    'nav.home' => 'Inicio',
    'nav.about' => 'Acerca de',
    'nav.doc' => 'Documentación',
    'doc.title' => 'Documentación',
    'doc.cat_general_admin' => 'Administración general',
    'doc.cat_module_admin' => 'Administración de módulos',
    'doc.cat_general_user' => 'Guía de uso general',
    'doc.cat_module_user' => 'Guías de uso de módulos',
    'doc.empty' => 'No hay documentación disponible para su perfil.',
    'doc.back' => 'Volver a la documentación',
    'nav.login' => 'Iniciar sesión',
    'nav.logout' => 'Cerrar sesión',
    'nav.profile' => 'Mi perfil',
    'nav.admin' => 'Administración',
    'nav.settings' => 'Configuración',
    'nav.users' => 'Usuarios',
    'auth.username' => 'Nombre de usuario',
    'auth.password' => 'Contraseña',
    'auth.password_new' => 'Nueva contraseña',
    'auth.password_conf' => 'Confirmar contraseña',
    'auth.password_keep' => 'Dejar vacío para conservar la contraseña actual',
    'auth.login' => 'Entrar',
    'auth.logout' => 'Salir',
    'auth.remember' => 'Recordarme',
    'auth.login_title' => 'Iniciar sesión',
    'auth.login_error' => 'Nombre de usuario o contraseña incorrectos.',
    'auth.too_many_attempts' => 'Demasiados intentos de inicio de sesión. Inténtelo de nuevo en unos minutos.',
    'auth.login_inactive' => 'Esta cuenta está desactivada.',
    'auth.logout_success' => 'Ha cerrado sesión correctamente.',
    'auth.no_access' => 'Acceso denegado. Permisos insuficientes.',
    'auth.method' => 'Método de autenticación',
    'auth.method_local' => 'Cuenta local',
    'auth.method_oauth' => 'OAuth / SSO',
    'auth.method_ldap' => 'LDAP / Active Directory',
    'auth.or_use' => 'O inicie sesión con:',
    'user.list' => 'Lista de usuarios',
    'user.create' => 'Crear usuario',
    'user.edit' => 'Editar',
    'user.delete' => 'Eliminar',
    'user.confirm_delete' => '¿Está seguro de que desea eliminar al usuario «{username}»?',
    'user.profile' => 'Rol',
    'user.roles' => 'Roles',
    'user.roles_hint' => 'Seleccione uno o más roles. app_admin (sistema) concede todos los derechos en todos los módulos.',
    'user.roles_system' => 'Sistema',
    'user.role_self_locked' => 'bloqueado: no puede quitar su propio rol de administrador',
    'user.language' => 'Idioma',
    'user.theme' => 'Tema',
    'user.postgresql_prefs' => 'Preferencias PostgreSQL',
    'user.postgresql_landing' => 'Página de inicio tras elegir una base',
    'user.postgresql_landing_hint' => 'Página a la que llega tras elegir una base PostgreSQL. También se puede definir con un clic desde el botón flotante de los informes.',
    'user.oracle_prefs' => 'Preferencias Oracle',
    'user.oracle_landing' => 'Página de inicio tras elegir una base',
    'user.oracle_landing_hint' => 'Página a la que llega después de seleccionar una base Oracle.',
    'user.oracle_report_format' => 'Formato de informes Oracle',
    'user.oracle_format_html' => 'HTML estático',
    'user.oracle_format_active' => 'Dinámico (cuando disponible)',
    'user.oracle_format_hint' => 'Afecta a ASH y SQL Monitor. AWR no tiene formato dinámico.',
    'user.active' => 'Activo',
    'user.inactive' => 'Inactivo',
    'user.created_at' => 'Creado',
    'user.last_login' => 'Último acceso',
    'user.email' => 'Correo electrónico',
    'user.password' => 'Contraseña',
    'user.save' => 'Guardar',
    'user.cancel' => 'Cancelar',
    'user.never' => 'Nunca',
    'user.actions' => 'Acciones',
    'role.app_admin' => 'Administrador de la aplicación',
    'role.oracle_admin' => 'Administrador Oracle',
    'role.oracle_user' => 'Usuario Oracle',
    'role.cmdb_admin' => 'Administrador CMDB',
    'role.cmdb_user' => 'Usuario CMDB',
    'role.cnp_admin' => 'Administrador CNP',
    'role.cnp_user' => 'Usuario CNP',
    'theme.label' => 'Tema',
    'theme.os' => 'Tema del sistema',
    'theme.light' => 'Claro',
    'theme.dark' => 'Oscuro',
    'theme.colorblind' => 'Alto contraste / Daltonismo',
    'theme.custom' => 'Personalizado',
    'lang.label' => 'Idioma',
    'lang.fr' => 'Français',
    'lang.en' => 'English',
    'lang.pl' => 'Polski',
    'lang.it' => 'Italiano',
    'lang.es' => 'Español',
    'lang.ro' => 'Română',
    'lang.de' => 'Deutsch',
    'settings.title' => 'Configuración de la aplicación',
    'settings.app_name' => 'Nombre de la aplicación',
    'settings.app_logo' => 'Logo',
    'settings.app_logo_hint' => 'PNG, JPG, SVG, WebP — máx. 2 MB',
    'settings.app_favicon' => 'Favicon',
    'settings.app_favicon_hint' => 'PNG, ICO, SVG — máx. 512 KB. Recomendado: 32×32 px',
    'settings.app_logo_del' => 'Eliminar logo',
    'settings.app_favicon_del' => 'Eliminar favicon',
    'settings.appearance' => 'Apariencia',
    'settings.default_theme' => 'Tema predeterminado',
    'settings.default_lang' => 'Idioma predeterminado',
    'settings.auth_methods' => 'Métodos de autenticación',
    'settings.smtp_title' => 'Correo (SMTP)',
    'settings.smtp_hint' => 'Configuración del servidor SMTP para el envío de correos (notificaciones, alertas).',
    'settings.smtp_host' => 'Servidor SMTP',
    'settings.smtp_port' => 'Puerto',
    'settings.smtp_encryption' => 'Cifrado',
    'settings.smtp_enc_none' => 'Ninguno',
    'settings.smtp_auth_enabled' => 'Autenticación SMTP',
    'settings.smtp_auth_hint' => 'Desmarcar si el servidor es un relé interno que no requiere credenciales.',
    'settings.smtp_username' => 'Usuario',
    'settings.smtp_password' => 'Contraseña',
    'settings.smtp_from_address' => 'Dirección del remitente',
    'settings.smtp_from_name' => 'Nombre del remitente',
    'settings.smtp_test' => 'Probar conexión',
    'settings.smtp_test_send' => 'Enviar prueba',
    'settings.smtp_test_ok' => 'Conexión SMTP exitosa.',
    'settings.smtp_test_sent' => 'Correo de prueba enviado. Verifique su bandeja de entrada.',
    'settings.smtp_test_rcpt_placeholder' => 'destinatario@ejemplo.com',
    'settings.smtp_test_rcpt_required' => 'Ingrese una dirección de correo destinatario para la prueba.',
    'settings.smtp_test_subject' => 'Configuración SMTP validada',
    'settings.smtp_test_body' => 'Si recibe este correo, la configuración SMTP de la aplicación es correcta.',
    'settings.smtp_host_required' => 'El servidor SMTP no está configurado.',
    'report_sub.title' => 'Suscripciones a informes',
    'report_sub.schedules_title' => 'Planificación de informes',
    'report_sub.matrix_title' => 'Suscripciones de usuarios',
    'report_sub.save' => 'Guardar',
    'report_sub.saved' => 'Suscripciones guardadas.',
    'report_sub.col_user' => 'Usuario',
    'report_sub.col_email' => 'Correo electrónico',
    'report_sub.no_users' => 'Ningún usuario activo con dirección de correo electrónico.',
    'report_sub.frequency_daily' => 'Diario',
    'report_sub.frequency_weekly' => 'Semanal',
    'report_sub.frequency_monthly' => 'Mensual',
    'report_sub.day_of_month' => 'Día del mes',
    'report_sub.logical_day' => 'Día lógico',
    'report_sub.dow_1' => 'Lunes',
    'report_sub.dow_2' => 'Martes',
    'report_sub.dow_3' => 'Miércoles',
    'report_sub.dow_4' => 'Jueves',
    'report_sub.dow_5' => 'Viernes',
    'report_sub.dow_6' => 'Sábado',
    'report_sub.dow_7' => 'Domingo',
    'report_sub.logical_first_monday' => 'Primer lunes',
    'report_sub.logical_first_tuesday' => 'Primer martes',
    'report_sub.logical_first_wednesday' => 'Primer miércoles',
    'report_sub.logical_first_thursday' => 'Primer jueves',
    'report_sub.logical_first_friday' => 'Primer viernes',
    'report_sub.logical_last_monday' => 'Último lunes',
    'report_sub.logical_last_friday' => 'Último viernes',
    'report_sub.logical_last_day' => 'Último día',
    'report_sub.report_cnp_ad_anomalies' => 'Anomalías AD (CNP)',
    'report_sub.report_cmdb_db_inventory' => 'Inventario de BD (CMDB)',
    'report_sub.report_cnp_cmdb_sync' => 'Sinc. CMDB/Oracle (CNP)',
    'report_sub.subject_cnp_ad_anomalies' => 'Informe: Anomalías AD',
    'report_sub.subject_cmdb_db_inventory' => 'Informe: Inventario de bases de datos',
    'report_sub.subject_cnp_cmdb_sync' => 'Informe: Sincronización CMDB / Oracle',
    'report_sub.view_online' => 'Ver en línea',
    'report_sub.total_databases' => 'Total de bases de datos',
    'report_sub.log_title' => 'Últimos envíos',
    'report_sub.log_date' => 'Fecha',
    'report_sub.log_report' => 'Informe',
    'report_sub.log_recipients' => 'Destinatarios',
    'report_sub.log_status' => 'Estado',
    'report_sub.no_active_module' => 'Ningún informe que ofrecer: todos dependen de módulos actualmente desactivados. Active el módulo correspondiente para recuperar su planificación y sus suscriptores — se conservan.',
    'settings.oauth_config' => 'Configuración OAuth',
    'settings.ldap_config' => 'Configuración LDAP',
    'settings.save' => 'Guardar configuración',
    'settings.debug_mode' => 'Modo depuración',
    'settings.trace_mode' => 'Modo traza',
    'settings.session_section' => 'Sesión',
    'settings.session_lifetime' => 'Duración de la sesión',
    'settings.session_lifetime_unit' => 'segundos',
    'settings.session_lifetime_hint' => 'Entre 300 (5 min) y 86.400 (24 h). Por defecto: 3.600 (1 h).',
    'settings.enabled' => 'Activado',
    'settings.disabled' => 'Desactivado',
    'settings.client_id' => 'Client ID',
    'settings.client_secret' => 'Client Secret',
    'settings.redirect_uri' => 'URI de redirección',
    'settings.auth_url' => 'URL de autorización',
    'settings.token_url' => 'URL del token',
    'settings.ldap_host' => 'Host LDAP',
    'settings.ldap_port' => 'Puerto LDAP',
    'settings.ldap_base_dn' => 'Base DN',
    'settings.ldap_bind_dn' => 'Bind DN',
    'settings.ldap_bind_pass' => 'Contraseña de conexión',
    'settings.ldap_user_dn_pattern' => 'Patrón DN de usuario',
    'settings.ldap_user_dn_pattern_hint' => 'Marcadores: {user}, {base_dn}, {domain}. P. ej. OpenLDAP: uid={user},{base_dn} — AD UPN: {user}@{domain}',
    'settings.ldap_tls_insecure' => 'Omitir verificación del certificado TLS (LDAPS)',
    'settings.ldap_tls_insecure_hint' => 'Usar solo para diagnóstico; en producción, instalar la CA en el almacén de confianza del servidor web.',
    'settings.ldap_test_section' => 'Prueba de configuración',
    'settings.ldap_test_btn' => 'Probar configuración',
    'settings.ldap_test_user' => 'Usuario de prueba',
    'settings.ldap_test_user_hint' => 'Opcional — para probar un bind de usuario real',
    'settings.ldap_test_pass' => 'Contraseña de prueba',
    'settings.ldap_test_running' => 'Ejecutando prueba…',
    'settings.ldap_test_ok' => 'Configuración LDAP válida',
    'settings.ldap_test_ko' => 'Prueba LDAP fallida',
    'settings.ldap_test_step_ext_ko' => 'Extensión PHP ldap ausente — active extension=ldap en php.ini',
    'settings.ldap_test_step_ext_ok' => 'Extensión PHP ldap cargada',
    'settings.ldap_test_step_host_ko' => 'Host LDAP no especificado',
    'settings.ldap_test_step_connect_ko' => 'ldap_connect() falló — parámetros inválidos',
    'settings.ldap_test_step_connect_ok' => 'Conexión inicializada (LDAPv3, timeout 5 s)',
    'settings.ldap_test_step_svc_ok' => 'Bind de servicio exitoso',
    'settings.ldap_test_step_svc_ko' => 'Bind de servicio fallido',
    'settings.ldap_test_step_anon_ok' => 'Bind anónimo exitoso',
    'settings.ldap_test_step_anon_warn' => 'Bind anónimo rechazado (normal en Active Directory)',
    'settings.ldap_test_step_user_ok' => 'Bind de usuario exitoso',
    'settings.ldap_test_step_user_ko' => 'Bind de usuario fallido',
    'settings.ldap_test_step_user_no_base' => 'Base DN faltante — no se puede construir el DN del usuario',
    'admin.title' => 'Administración',
    'admin.dashboard' => 'Panel de control',
    'admin.total_users' => 'Total de usuarios',
    'admin.active_users' => 'Usuarios activos',
    'admin.welcome' => 'Bienvenido al panel de administración.',
    'msg.save' => 'Guardar',
    'msg.cancel' => 'Cancelar',
    'msg.saved' => 'Cambios guardados correctamente.',
    'msg.error' => 'Ha ocurrido un error.',
    'msg.warning' => 'Advertencia',
    'msg.deleted' => 'Eliminado correctamente.',
    'msg.access_denied' => 'Acceso denegado.',
    'msg.not_found' => 'Página no encontrada.',
    'msg.server_error' => 'Error interno del servidor.',
    'msg.required_fields' => 'Por favor, complete todos los campos obligatorios.',
    'msg.passwords_mismatch' => 'Las contraseñas no coinciden.',
    'msg.password_changed' => 'Contraseña cambiada correctamente.',
    'msg.user_created' => 'Usuario creado correctamente.',
    'msg.user_updated' => 'Usuario actualizado correctamente.',
    'msg.user_deleted' => 'Usuario eliminado.',
    'msg.username_taken' => 'Este nombre de usuario ya está en uso.',
    'msg.ldap_user_not_found' => 'Este identificador no existe en el directorio LDAP.',
    'module.title' => 'Módulos',
    'module.list' => 'Lista de módulos',
    'module.manage' => 'Gestionar módulos',
    'module.name' => 'Módulo',
    'module.status' => 'Estado',
    'module.active' => 'Activo',
    'module.inactive' => 'Inactivo',
    'module.active_count' => 'módulo(s) activo(s)',
    'module.enable' => 'Activar',
    'module.enable_required' => 'Activar {module} y sus dependencias',
    'module.enable_required_confirm' => '¿Activar el módulo «{module}» y todos los módulos de los que depende?',
    'module.enable_required_summary' => '{n} módulo(s) activado(s): {list}.',
    'module.enable_required_none' => 'El módulo y sus dependencias ya están activos.',
    'module.enable_required_failed' => '{n} módulo(s) no pudieron activarse:',
    'module.disable' => 'Desactivar',
    'module.open' => 'Abrir',
    'module.roles' => 'Roles',
    'module.depends_on' => 'Depende de',
    'module.none_registered' => 'No hay módulos registrados.',
    'module.confirm_disable' => '¿Desactivar el módulo «{label}»?',
    'module.warn_users_linked' => '{n} usuario(s) activo(s) tienen el rol «{role}». Perderán acceso al módulo.',
    'module.deps_missing' => 'No se puede activar «{module}»: módulo(s) requerido(s) no activo(s) — {deps}',
    'module.deps_dependents' => 'No se puede desactivar «{module}»: aún usado por {dependents}',
    'module.enable_failed' => 'La activación del módulo falló',
    'module.provision_summary' => '{created} usuario(s) creado(s), {roles} rol(es) asignado(s).',
    'module.add_title' => 'Añadir o actualizar un módulo',
    'module.add_hint' => 'Suba un archivo ZIP que contenga un único directorio de módulo (con su module.php en la raíz del directorio). Si el módulo aún no existe, se añade desactivado; si ya existe, se actualiza en su sitio: se conservan sus roles y sus asignaciones a usuarios, su configuración y sus datos. La versión anterior se respalda antes del reemplazo.',
    'module.zip_label' => 'Archivo ZIP del módulo',
    'module.add_apply' => 'Aplicar',
    'module.remove' => 'Eliminar',
    'module.confirm_delete' => '¿Eliminar el módulo «{label}» y todos sus datos (roles, configuración)?',
    'module.cannot_delete_active' => 'No se puede eliminar un módulo activo. Desactívelo primero.',
    'module.upload_error' => 'Error al subir el archivo.',
    'module.upload_invalid_zip' => 'El archivo no es un ZIP válido.',
    'module.upload_bad_structure' => 'El ZIP debe contener un único directorio de módulo en su raíz.',
    'module.upload_no_descriptor' => 'El ZIP no contiene module.php en la raíz del directorio del módulo.',
    'module.upload_exists' => 'Ya existe un módulo «{name}».',
    'module.upload_extract_failed' => 'Falló la extracción del módulo.',
    'module.upload_success' => 'Módulo «{name}» añadido (desactivado). Actívelo para usarlo.',
    'module.update_success' => 'Módulo «{name}» actualizado (v{from} → v{to}). Se conservaron sus roles, su configuración y sus datos. Copia de seguridad de la versión anterior: {backup}',
    'module.update_failed' => 'La actualización del módulo «{name}» falló: no se pudo apartar el directorio existente. No se modificó nada.',
    'module.update_backup_failed' => 'Falló la copia de seguridad de la versión instalada. La actualización se canceló, no se modificó nada.',
    'module.update_rollback' => 'La actualización del módulo «{name}» falló; se restauró la versión anterior.',
    'module.update_rollback_failed' => 'La actualización del módulo «{name}» falló Y no se pudo restaurar la versión anterior. La aplicación permanece en mantenimiento: restaure la copia {backup} (súbala aquí) y luego desactive el mantenimiento.',
    'module.update_name_mismatch' => 'Archivo incoherente: el directorio es «{name}» pero el descriptor declara «{decl}». No se modificó nada.',
    'module.update_on_enable_warn' => 'Módulo «{name}» actualizado, pero su inicialización informó un error: {error}',
    'module.delete_success' => 'Módulo eliminado.',
    'module.delete_failed' => 'No se pudo eliminar completamente el directorio del módulo «{name}».',
    'module.dev_php_env' => 'Entorno PHP',
    'module.dev_ini' => 'Configuración php.ini',
    'module.dev_session' => 'Sesión actual',
    'module.dev_extensions' => 'Extensiones cargadas',
    'module.dev_logs' => 'Registros recientes',
    'module.dev_no_logs' => 'No se encontraron entradas de registro.',
    'module.dev_db_file' => 'Base de datos',
    'home.title' => 'Inicio',
    'home.logged_in' => 'Ha iniciado sesión como <strong>{username}</strong> ({role}).',
    'home.visitor' => 'Está navegando como visitante. <a href="/login.php">Inicie sesión</a> para acceder a más funciones.',
    'admin.maintenance' => 'Mantenimiento',

    // ── Lotes / Programación ──────────────────────────────────────────────
    'batch.title' => 'Lotes / Programación',
    'batch.card_desc' => 'Programación de tareas (crontab / programador de Windows), estado y registros.',
    'batch.manage' => 'Gestionar lotes',
    'batch.schedule_title' => 'Programación propuesta',
    'batch.schedule_intro' => 'Tareas programadas de la aplicación y su frecuencia.',
    'batch.col_job' => 'Tarea',
    'batch.col_schedule' => 'Programación (cron)',
    'batch.col_command' => 'Comando',
    'batch.col_state' => 'Estado',
    'batch.state_active' => 'Activa',
    'batch.state_inactive' => 'Inactiva',
    'batch.job_logrotate' => 'Rotación de registros',
    'batch.job_backup' => 'Copia de seguridad',
    'batch.job_collect_ash' => 'Recogida ASH',
    'batch.job_collect_cmdb' => 'Recogida CMDB',
    'batch.job_collect_rman' => 'Recogida RMAN',
    'batch.job_collect_users' => 'Inventario de usuarios Oracle',
    'batch.job_schedule_reports' => 'Envío de informes programados',
    'batch.job_remediate' => 'Remediación de usuarios Oracle',
    'batch.job_provision' => 'Aprovisionamiento de usuarios Oracle',
    'batch.install' => 'Activar (instalar crontab)',
    'batch.uninstall' => 'Desactivar (quitar de crontab)',
    'batch.confirm_install' => '¿Instalar las tareas en la crontab del usuario apache?',
    'batch.confirm_uninstall' => '¿Quitar las tareas de la aplicación de la crontab?',
    'batch.apache_note' => 'Opera sobre la crontab del usuario del servidor web (apache).',
    'batch.crontab_title' => 'Crontab actual',
    'batch.crontab_empty' => 'No hay crontab para el usuario actual.',
    'batch.windows_title' => 'Windows (Programador de tareas)',
    'batch.windows_intro' => 'Comandos schtasks a ejecutar en un símbolo del sistema de Administrador (host Windows).',
    'batch.logs_title' => 'Últimas ejecuciones',
    'batch.logs_rman' => 'Recogida RMAN',
    'batch.logs_ash' => 'Recogida ASH',
    'batch.logs_backups' => 'Copias de seguridad',
    'batch.logs_applog' => 'Registro de la aplicación',
    'batch.logs_none' => 'Sin datos.',
    'batch.col_when' => 'El',
    'batch.col_result' => 'Resultado',
    'batch.col_source' => 'Fuente',
    'batch.col_day' => 'Día',
    'batch.col_rows' => 'Filas',
    'batch.failed' => 'Error',
    'batch.shell_unavailable' => 'Ejecución de shell no disponible (crontab no gestionable desde la web).',
    'batch.already_installed' => 'Todas las tareas ya están presentes en la crontab.',
    'batch.install_ok' => '{n} tarea(s) añadida(s) a la crontab.',
    'batch.uninstall_ok' => 'Tareas de la aplicación eliminadas de la crontab.',
    'batch.crontab_error' => 'No se pudo actualizar la crontab.',
    'backup.title' => 'Copia de seguridad y restauración',
    'backup.overview' => 'Metadatos de la aplicación',
    'backup.overview_hint' => 'Contenido del directorio seguro: base de datos, clave de cifrado, wallets de Oracle Cloud.',
    'backup.files_count' => 'Archivos',
    'backup.total_size' => 'Tamaño total',
    'backup.create_title' => 'Crear una copia de seguridad',
    'backup.create_hint' => 'Crea un archivo ZIP de todo el directorio seguro (excluyendo copias de seguridad anteriores). La copia de seguridad puede almacenarse en el servidor o descargarse.',
    'backup.save_local' => 'Guardar en el servidor',
    'backup.download' => 'Descargar',
    'backup.created_ok' => 'Copia de seguridad «%s» creada (%d archivos).',
    'backup.restore_title' => 'Restaurar una copia de seguridad',
    'backup.restore_hint' => 'Suba un archivo ZIP creado en esta página para restaurar los metadatos. Se creará automáticamente una copia de seguridad del estado actual antes de la restauración.',
    'backup.restore_label' => 'Archivo ZIP de copia de seguridad',
    'backup.restore_apply' => 'Restaurar',
    'backup.restore_confirm' => '¿Está seguro de que desea restaurar esta copia de seguridad? El estado actual se respaldará previamente.',
    'backup.restore_this' => 'Restaurar esta copia de seguridad',
    'backup.restored_ok' => '%d archivo(s) restaurado(s). Copia de seguridad previa a la restauración: %s',
    'backup.local_list' => 'Copias de seguridad locales',
    'backup.no_backups' => 'No hay copias de seguridad locales.',
    'backup.col_name' => 'Archivo',
    'backup.col_size' => 'Tamaño',
    'backup.col_date' => 'Fecha',
    'backup.delete_confirm' => '¿Eliminar la copia de seguridad «%s»?',
    'backup.deleted_ok' => 'Copia de seguridad «%s» eliminada.',
    'backup.invalid_file' => 'Nombre de archivo no válido.',
    'backup.securite_missing' => 'El directorio seguro no existe.',
    'backup.create_error' => 'No se pudo crear el archivo ZIP.',
    'update.title' => 'Actualización de la aplicación',
    'update.current_version' => 'Versión actual',
    'update.upload_title' => 'Subir una actualización',
    'update.upload_hint' => 'Seleccione un archivo ZIP que contenga los archivos de actualización. La base de datos y la clave de cifrado no se sobrescribirán.',
    'update.zip_label' => 'Archivo ZIP de actualización',
    'update.apply' => 'Aplicar actualización',
    'update.confirm' => '¿Está seguro de que desea aplicar esta actualización? Se creará una copia de seguridad automáticamente.',
    'update.upload_error' => 'Error al subir el archivo.',
    'update.invalid_zip' => 'El archivo no es un archivo ZIP válido.',
    'update.zip_ext_missing' => 'La extensión PHP ZipArchive no está disponible en este servidor.',
    'update.empty_archive' => 'El archivo no contiene archivos para extraer (todos los archivos están protegidos o el archivo está vacío).',
    'update.success' => '%d archivo(s) actualizado(s) correctamente.',
    'update.backup_created' => 'Copia de seguridad creada: %s',
    'update.deleted' => '%d elemento(s) de la versión anterior eliminado(s).',
    'update.full_backup_created' => 'Copia de seguridad completa: %s',
    'update.backup_failed' => 'Error en la copia de seguridad previa — actualización cancelada, ningún archivo eliminado.',
    'update.maintenance_failed' => 'Extracción incompleta: la aplicación permanece en modo mantenimiento. Restaure la copia %s (Copia de seguridad/Restauración) o reinicie la actualización.',
    'update.maintenance_active' => 'La aplicación está actualmente en modo mantenimiento (visible solo para los administradores).',
    'update.clear_maintenance' => 'Salir del modo mantenimiento',
    'update.maintenance_cleared' => 'Modo mantenimiento desactivado.',
    'update.danger_hint' => 'La actualización pone la aplicación en mantenimiento, hace una copia y luego ELIMINA la versión anterior (excepto securite/ y log/), y extrae la nueva.',
    'update.pruned' => '%d copia(s) de seguridad antigua(s) eliminada(s).',
    'update.restore_success' => 'Versión restaurada desde %s:',
    'update.backup_deleted' => 'Copia de seguridad eliminada: %s',
    'update.backup_not_found' => 'Copia de seguridad no encontrada o nombre no válido.',
    'update.delete_failed' => 'Error al eliminar la copia de seguridad.',
    'update.backups_title' => 'Versiones anteriores (copias de seguridad)',
    'update.backups_hint' => 'Las últimas 3 versiones se conservan automáticamente. Puede restaurar o eliminar una versión.',
    'update.backups_empty' => 'No hay copias de seguridad disponibles.',
    'update.backup_latest' => 'última',
    'update.restore' => 'Restaurar',
    'update.restore_confirm' => 'Restaurar esta versión reemplazará la actual (clean replace). ¿Continuar?',
    'update.delete_backup' => 'Eliminar',
    'update.delete_backup_confirm' => '¿Eliminar definitivamente esta copia de seguridad?',
    'update.protected_dirs' => 'Datos y registros siempre preservados',
    'update.git_kept' => 'Metadatos git preservados (módulo Developer presente)',
    'update.git_removed' => 'Metadatos git eliminados (instancia empaquetada)',
    'update.partial_errors' => '%d archivo(s) no se pudieron extraer:',
    'update.skipped_files' => '%d archivo(s) protegido(s) omitido(s):',
    'update.protected_title' => 'Archivos protegidos',
    'update.protected_hint' => 'Los siguientes archivos nunca se sobrescribirán durante una actualización, incluso si están presentes en el archivo:',
    'update.protected_db' => 'Base de datos de la aplicación',
    'update.protected_key' => 'Clave maestra de cifrado',
    'update.protected_wallets' => 'Oracle Cloud Wallets',
    'maintenance.title' => 'Mantenimiento en curso',
    'maintenance.message' => 'La aplicación no está disponible temporalmente por mantenimiento. Vuelva a intentarlo en unos instantes.',
    'about.title' => 'Acerca de',
    'about.version' => 'Version',
    'about.libraries' => 'Bibliotecas de terceros',
    'about.lib_name' => 'Biblioteca',
    'about.lib_version' => 'Version',
    'about.lib_license' => 'Licencia',
    'about.license_title' => 'Licencia',
    'about.license_rights' => 'Todos los derechos reservados.',
    'about.license_grant' => 'Este software se proporciona bajo una licencia propietaria, no exclusiva e intransferible. El autor concede al adquirente el derecho a usar el software en su forma original, sin transferencia de propiedad.',
    'about.license_conditions' => 'Sujeto a las siguientes condiciones:',
    'about.license_cond_attribution' => '<strong>Atribución</strong> — El origen del software y el nombre del autor deben conservarse en el código fuente y la documentación técnica. La interfaz mostrada a los usuarios finales sí puede personalizarse (véase «Marca blanca»).',
    'about.license_cond_no_derivs' => '<strong>Sin obras derivadas</strong> — El código del software no puede modificarse, transformarse ni usarse como base de obras derivadas sin la autorización escrita previa del autor, salvo la personalización de la identidad visual (título, logotipo, favicon, tema) prevista por la aplicación.',
    'about.license_cond_commercial' => '<strong>Sin cesión — marca blanca permitida</strong> — El software no puede cederse, revenderse ni sublicenciarse como producto. No obstante, el adquirente puede explotarlo y ofrecerlo a sus propios clientes en marca blanca, bajo su propia identidad visual, sin transferencia de la propiedad de la licencia.',
    'about.license_disclaimer' => 'EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO, PERO SIN LIMITARSE A, LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN FIN PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO EL AUTOR SERÁ RESPONSABLE DE RECLAMACIÓN, DAÑO U OTRA RESPONSABILIDAD ALGUNA.',
    'about.license_compat' => 'Licencia propietaria e intransferible: el software puede explotarse en marca blanca pero no puede cederse ni revenderse.',
    'backup.include_key' => 'Incluir la clave de cifrado (master.key) — recuperación completa',
    'backup.include_key_warn' => '⚠ Sin la clave, la copia no puede descifrar los secretos: respalde master.key por separado. Con la clave, proteja el archivo (contiene TODOS los secretos).',
];
