import { getFuLocaleMessage } from '@/lang/fu';

const message = {
    commons: {
        true: 'Verdadero',
        false: 'Falso',
        colon: ': ',
        example: 'p.ej., ',
        fit2cloud: 'FIT2CLOUD',
        lingxia: 'LXware',
        button: {
            run: 'Ejecutar',
            prev: 'Anterior',
            next: 'Siguiente',
            create: 'Crear',
            add: 'Agregar',
            select: 'Seleccionar',
            save: 'Guardar',
            set: 'Configuración',
            sync: 'Sincronizar',
            delete: 'Eliminar',
            edit: 'Editar',
            enable: 'Habilitar',
            disable: 'Deshabilitar',
            confirm: 'Confirmar',
            cancel: 'Cancelar',
            reset: 'Restablecer',
            setDefault: 'Restaurar valores predeterminados',
            restart: 'Reiniciar',
            conn: 'Conectar',
            clean: 'Limpiar',
            cleanAll: 'Limpiar todo',
            selectAll: 'Seleccionar todo',
            login: 'Iniciar sesión',
            close: 'Cerrar',
            stop: 'Detener',
            start: 'Iniciar',
            view: 'Ver',
            watch: 'Seguir',
            handle: 'Ejecutar',
            clone: 'Clonar',
            expand: 'Expandir',
            collapse: 'Colapsar',
            log: 'Registros',
            back: 'Atrás',
            backup: 'Respaldar',
            recover: 'Restaurar',
            retry: 'Reintentar',
            upload: 'Subir',
            download: 'Descargar',
            init: 'Inicializar',
            verify: 'Verificar',
            saveAndEnable: 'Guardar y habilitar',
            import: 'Importar',
            importAll: 'Importar todo',
            export: 'Exportar',
            power: 'Enviar',
            search: 'Buscar',
            refresh: 'Actualizar',
            get: 'Obtener',
            upgrade: 'Actualizar',
            update: 'Actualizar',
            ignore: 'Ignorar actualización',
            copy: 'Copiar',
            random: 'Generar',
            install: 'Instalar',
            uninstall: 'Desinstalar',
            fullscreen: 'Pantalla completa',
            quitFullscreen: 'Salir de pantalla completa',
            showAll: 'Mostrar todo',
            hideSome: 'Ocultar algunos',
            agree: 'Aceptar',
            notAgree: 'No aceptar',
            preview: 'Vista previa',
            open: 'Abrir',
            notSave: 'No guardar',
            createNewFolder: 'Crear nueva carpeta',
            createNewFile: 'Crear nuevo archivo',
            helpDoc: 'Documentación',
            bind: 'Vincular',
            unbind: 'Desvincular',
            cover: 'Sobrescribir',
            skip: 'Omitir',
            fix: 'Arreglar',
            down: 'Detener',
            up: 'Iniciar',
            sure: 'Confirmar',
            show: 'Mostrar',
            hide: 'Ocultar',
            migrate: 'Migrar',
            disConn: 'Desconectar',
            visit: 'Abrir',
            tip: 'Aviso',
            reconnect: 'Reconectar',
        },
        operate: {
            start: 'Iniciar',
            stop: 'Detener',
            restart: 'Reiniciar',
            reload: 'Recargar',
            rebuild: 'Reconstruir',
            sync: 'Sincronizar',
            up: 'Subir',
            down: 'Bajar',
            delete: 'Eliminar',
        },
        search: {
            timeStart: 'Hora de inicio',
            timeEnd: 'Hora de fin',
            timeRange: 'Hasta',
            dateStart: 'Fecha de inicio',
            dateEnd: 'Fecha de fin',
            date: 'Fecha',
        },
        table: {
            all: 'Todo',
            total: 'Total {0}',
            name: 'Nombre',
            type: 'Tipo',
            card: 'Tarjeta',
            table: 'Tabla',
            status: 'Estado',
            statusSuccess: 'Éxito',
            statusFailed: 'Fallido',
            statusWaiting: 'Esperando...',
            records: 'Registros',
            group: 'Grupo',
            default: 'Predeterminado',
            createdAt: 'Fecha de creación',
            publishedAt: 'Fecha de publicación',
            date: 'Fecha',
            updatedAt: 'Fecha de actualización',
            operate: 'Operaciones',
            message: 'Mensaje',
            description: 'Descripción',
            interval: 'Intervalo',
            user: 'Propietario',
            title: 'Título',
            port: 'Puerto',
            forward: 'Reenviar',
            protocol: 'Protocolo',
            tableSetting: 'Configuración de tabla',
            refreshRate: 'Frecuencia de actualización',
            noRefresh: 'Sin actualización',
            selectColumn: 'Seleccionar columna',
            local: 'local',
            serialNumber: 'Número de serie',
            manageGroup: 'Gestionar grupos',
            backToList: 'Volver a la lista',
            keepEdit: 'Continuar Editando',
            pin: 'Fijar arriba',
            unpin: 'Desfijar',
            creator: 'Creador',
            updater: 'Actualizador',
        },
        loadingText: {
            Upgrading: 'Actualizando el sistema, por favor espere...',
            Restarting: 'Reiniciando el sistema, por favor espere...',
            Recovering: 'Recuperando desde instantánea, por favor espere...',
            Rollbacking: 'Revirtiendo desde instantánea, por favor espere...',
        },
        msg: {
            noneData: 'No hay datos disponibles',
            delete: 'Esta operación de eliminación no se puede deshacer. ¿Desea continuar?',
            clean: 'Esta operación de limpieza no se puede deshacer. ¿Desea continuar?',
            closeDrawerHelper: 'Es posible que el sistema no guarde los cambios que realizó. ¿Desea continuar?',
            deleteSuccess: 'Eliminación completada correctamente',
            loginSuccess: 'Inicio de sesión completado correctamente',
            operationSuccess: 'Operación completada correctamente',
            operationFailed: 'Operación fallida',
            copySuccess: 'Copiado completado correctamente',
            notSupportOperation: 'Esta operación no es compatible',
            requestTimeout: 'La solicitud caducó, inténtalo más tarde',
            infoTitle: 'Aviso',
            notRecords: 'No hay registros de ejecución para esta tarea',
            sureLogOut: '¿Está seguro de que desea cerrar sesión?',
            createSuccess: 'Creación completada correctamente',
            updateSuccess: 'Actualización completada correctamente',
            uploadSuccess: 'Carga completada correctamente',
            operateConfirm: 'Para confirmar, escribe: ',
            inputOrSelect: 'Selecciona o ingresa',
            selectOne: 'Selecciona un(a) {0}',
            copyFailed: 'Error al copiar',
            operatorHelper: 'Ejecuta "{1}" en "{0}". Esto no se puede deshacer. ¿Continuar?',
            notFound: 'Lo sentimos, la página que solicitó no existe.',
            unSupportType: 'El tipo de archivo actual no es compatible.',
            unSupportSize: 'El archivo subido supera los {0}M, ¡por favor verifique!',
            fileExist: 'El archivo ya existe en la carpeta actual. No se permite subirlo de nuevo.',
            fileNameErr:
                'Solo puede subir archivos cuyo nombre contenga de 1 a 256 caracteres, incluyendo inglés, chino, dígitos o los caracteres .-_',
            confirmNoNull: 'Asegúrese de que el valor {0} no esté vacío.',
            errPort: 'Información de puerto incorrecta, ¡por favor verifique!',
            remove: 'Eliminar',
            backupHelper: 'La operación actual respaldará {0}. ¿Proceder?',
            recoverHelper: 'Restaurar desde {0}. Esto es irreversible. ¿Continuar?',
            refreshSuccess: 'Actualizado correctamente',
            rootInfoErr: 'Ya se encuentra en el directorio raíz',
            resetSuccess: 'Restablecimiento completado correctamente',
            creatingInfo: 'Creando, no es necesario realizar esta operación',
            installSuccess: 'Instalado correctamente',
            uninstallSuccess: 'Desinstalado correctamente',
            offlineTips: 'La edición sin conexión no admite esta acción',
            errImportFormat: 'Los datos de importación o el formato son incorrectos, verifica y vuelve a intentarlo',
            importHelper: 'Si hay conflictos, los datos importados sobrescribirán los existentes.',
            errImport: 'El contenido del archivo es anormal:',
            backupSuccess: 'Copia completada',
            restoreSuccess: 'Restauración completada',
        },
        login: {
            username: 'Usuario',
            password: 'Contraseña',
            passkey: 'Inicio de sesión con Passkey',
            otherLoginMethods: 'Otros métodos de inicio de sesión',
            welcome: 'Bienvenido de nuevo. Inicia sesión con tu usuario y contraseña.',
            errorAuthInfo: 'Usuario o contraseña incorrectos, inténtalo nuevamente.',
            errorMfaInfo: 'Información de autenticación inválida, inténtalo nuevamente.',
            captchaHelper: 'Captcha',
            errorCaptcha: 'Código captcha inválido',
            codeInput: 'Por favor, ingrese el código de verificación de 6 dígitos del validador MFA',
            mfaTitle: 'Autenticación MFA',
            mfaCode: 'Código de verificación MFA',
            title: 'Panel de gestión de servidores Linux',
            licenseHelper: '<Acuerdo de Licencia Comunitaria>',
            errorAgree: 'Haga clic para aceptar la Licencia de Software Comunitaria',
            logout: 'Cerrar sesión',
            agreeTitle: 'Acuerdo',
            agreeContent:
                'Para proteger mejor sus derechos e intereses legítimos, por favor lea y acepte el siguiente acuerdo &laquo; <a href = "https://www.fit2cloud.com/legal/licenses.html" target = "_blank" > Acuerdo de Licencia Comunitaria </a> &raquo;',
            passkeyFailed: 'El inicio de sesión con Passkey falló, inténtalo de nuevo',
            passkeyNotSupported: 'El navegador o entorno actual no admite Passkey',
            passkeyToPassword: '¿Tienes problemas para usar una passkey? Usa la contraseña en su lugar',
        },
        rule: {
            username: 'Introduzca un nombre de usuario',
            password: 'Introduzca una contraseña',
            rePassword: 'La confirmación de la contraseña no coincide con la contraseña.',
            requiredInput: 'Este campo es obligatorio.',
            requiredSelect: 'Seleccione un elemento de la lista',
            illegalChar: 'Actualmente no se admite la inyección de caracteres & ; $ \' ` ( ) " > < ｜',
            illegalInput: 'Este campo no debe contener caracteres no permitidos.',
            duplicate: 'Este valor debe ser único.',
            commonName:
                'Este campo debe comenzar con un carácter no especial y debe estar compuesto por letras, caracteres chinos, números, ".", "-", y "_" con una longitud de 1 a 128.',
            userName:
                'Este campo debe estar compuesto por letras, caracteres chinos, números y "_" con una longitud de 3 a 30.',
            simpleName:
                'Este campo no debe comenzar con el carácter "_" y debe estar compuesto por letras, números y "_" con una longitud de 3 a 30.',
            simplePassword:
                'Este campo no debe comenzar con el carácter "_" y debe estar compuesto por letras, números y "_" con una longitud de 1 a 30.',
            dbName: 'Este campo no debe comenzar con el carácter "_" y debe estar compuesto por letras, números y "_" con una longitud de 1 a 64.',
            imageName:
                'Este campo debe estar compuesto por letras, números, ":", "@", "/", ".", "-", y "_" con una longitud de 1 a 256.',
            volumeName:
                'Este campo debe estar compuesto por letras, números, ".", "-", y "_" con una longitud de 2 a 30.',
            supervisorName:
                'Este campo debe comenzar con un carácter no especial y debe estar compuesto por letras, números, "-", y "_" con una longitud de 1 a 128.',
            composeName:
                'Debe comenzar con un carácter no especial, permite minúsculas, números, - y _, longitud de 1 a 256',
            complexityPassword:
                'Admite combinaciones de contraseña de 8 a 30 caracteres que contengan al menos dos de estos tipos: letras, números y caracteres especiales.',
            commonPassword: 'La longitud de este campo debe ser mayor a 6.',
            linuxName:
                'La longitud de este campo debe estar entre 1 y 128. El campo no debe contener los siguientes caracteres especiales: "{0}".',
            email: 'Este campo debe ser una dirección de correo electrónico válida.',
            number: 'Este campo debe ser un número.',
            integer: 'Este campo debe ser un número entero positivo.',
            ip: 'Este campo debe ser una dirección IP válida.',
            host: 'Este campo debe ser una dirección IP válida o un nombre de dominio.',
            hostHelper: 'Admite introducir dirección IP o nombre de dominio',
            port: 'Este campo debe ser un número de puerto válido.',
            selectHelper: 'Por favor seleccione el archivo {0} correcto',
            domain: 'Este campo debe tener el formato: ejemplo.com o ejemplo.com:8080.',
            databaseName: 'Este campo debe estar compuesto por letras, números y "_" con una longitud de 1 a 30.',
            ipErr: 'Este campo debe ser una dirección IP válida.',
            numberRange: 'Este campo debe ser un número entre {0} y {1}.',
            paramName:
                'Este campo debe estar compuesto por letras, números, ".", "-", y "_" con una longitud de 2 a 30.',
            paramComplexity:
                'Este campo no debe comenzar ni terminar con caracteres especiales y debe estar compuesto por letras, números y los caracteres "{0}", con una longitud de 6 a 128.',
            paramUrlAndPort: 'Este campo debe tener el formato "http(s)://(nombre de dominio/ip):(puerto)".',
            nginxDoc: 'Este campo debe estar compuesto por letras, números y ".".',
            appName:
                'Este campo no debe comenzar ni terminar con "-" o "_" y debe estar compuesto por letras, números, "-", y "_" con una longitud de 2 a 30.',
            containerName: 'Permite letras, números, -, _ y .; no puede comenzar con - _ o .; longitud: 2-128',
            mirror: 'La dirección de aceleración del mirror debe comenzar con http(s)://, soporta letras (mayúsculas y minúsculas), números, . / y -, y no debe contener líneas en blanco.',
            disableFunction: 'Solo admite letras, guiones bajos y comas',
            leechExts: 'Solo admite letras, números y comas',
            paramSimple: 'Admite letras minúsculas y números, longitud de 1 a 128',
            filePermission: 'Error en el permiso del archivo',
            formatErr: 'Error de formato, por favor verifique e intente nuevamente',
            phpExtension: 'Solo admite _, letras minúsculas en inglés y números',
            paramHttp: 'Debe comenzar con http:// o https://',
            phone: 'El formato del número de teléfono es incorrecto',
            authBasicPassword: 'Admite letras, números y caracteres especiales comunes, longitud de 1 a 72',
            length128Err: 'La longitud no puede exceder los 128 caracteres',
            maxLength: 'La longitud no puede exceder los {0} caracteres',
            vmName: 'Admite letras inglesas, números, ".", "-" y "_"; longitud de 1 a 64; debe comenzar con una letra o un número.',
            vmNetwork:
                'Admite letras inglesas, números, ".", ":", "-" y "_"; longitud de 1 a 64; debe comenzar con una letra o un número.',
            alias: 'Soporta A->Z, números, - and _, largo 1-128 carácteres, no puede empezar ni terminar con -_.',
        },
        res: {
            paramError: 'La solicitud falló, por favor intente de nuevo más tarde.',
            forbidden: 'El usuario actual no tiene permisos',
            serverError: 'Excepción del servicio',
            notFound: 'El recurso no existe',
            commonError: 'La solicitud falló',
        },
        service: {
            serviceNotStarted: 'El servicio {0} no está iniciado.',
        },
        status: {
            running: 'En ejecución',
            done: 'Completado',
            scanFailed: 'Incompleto',
            success: 'Completado con éxito',
            waiting: 'En espera',
            waitForUpgrade: 'Esperar Actualización',
            failed: 'Fallido',
            stopped: 'Detenido',
            error: 'Error',
            created: 'Creado',
            restarting: 'Reiniciando',
            uploading: 'Cargando',
            unhealthy: 'No saludable',
            removing: 'Eliminando',
            paused: 'Pausado',
            exited: 'Finalizado',
            partial: 'Parcial',
            dead: 'Muerto',
            installing: 'Instalando',
            enabled: 'Habilitado',
            disabled: 'Deshabilitado',
            normal: 'Normal',
            building: 'Construyendo',
            upgrading: 'Actualizando',
            pending: 'Pendiente de editarse',
            rebuilding: 'Reconstruyendo',
            deny: 'Denegado',
            accept: 'Aceptado',
            used: 'En uso',
            unused: 'Sin usar',
            starting: 'Iniciando',
            recreating: 'Recreando',
            creating: 'Creando',
            init: 'Esperando aplicación',
            ready: 'normal',
            applying: 'Aplicando',
            uninstalling: 'Desinstalando',
            lost: 'Contacto perdido',
            bound: 'Vinculado',
            unbind: 'Desvinculado',
            exceptional: 'Excepcional',
            free: 'Libre',
            enable: 'Habilitado',
            disable: 'Deshabilitado',
            deleted: 'Eliminado',
            notfound: 'No encontrado',
            inactive: 'Inactivo',
            degraded: 'Degradado',
            inaccessible: 'Inaccesible',
            unknown: 'Desconocido',
            downloading: 'Descargando',
            packing: 'Empaquetando',
            sending: 'Enviando',
            healthy: 'Normal',
            executing: 'Ejecutando',
            installerr: 'Instalación fallida',
            applyerror: 'Aplicación fallida',
            systemrestart: 'Interrumpido',
            starterr: 'Error al iniciar',
            uperr: 'Error al iniciar',
            new: 'Nuevo',
            conflict: 'Conflicto',
            duplicate: 'Duplicado',
            unexecuted: 'No Ejecutado',
            canceled: 'Cancelado',
        },
        units: {
            second: ' segundo | segundo | segundos',
            minute: 'minuto | minuto | minutos',
            hour: 'hora | hora | horas',
            day: 'día | día | días',
            week: 'semana | semana | semanas',
            month: 'mes | mes | meses',
            year: 'año | año | años',
            time: 'rqm',
            core: 'núcleo | núcleo | núcleos',
            millisecond: 'milisegundo | milisegundos',
            secondUnit: 's',
            minuteUnit: 'min',
            hourUnit: 'h',
            dayUnit: 'd',
            semicolon: ';',
        },
        log: {
            noLog: 'No hay registros disponibles',
        },
    },
    menu: {
        home: 'Panel',
        apps: 'Tienda de aplicaciones',
        website: 'Sitio | Sitios',
        project: 'Proyecto | Proyectos',
        config: 'Configuración | Configuraciones',
        ssh: 'Configuración SSH',
        firewall: 'Cortafuegos',
        ssl: 'Certificado | Certificados',
        database: 'Base de datos | Bases de datos',
        aiTools: 'IA',
        mcp: 'MCP',
        container: 'Contenedor | Contenedores',
        cronjob: 'Tarea programada | Tareas programadas',
        system: 'Sistema',
        security: 'Seguridad',
        files: 'Explorador de archivos',
        monitor: 'Monitoreo',
        terminal: 'Terminal | Terminales',
        settings: 'Configuración',
        toolbox: 'Caja de herramientas',
        logs: 'Registro | Registros',
        runtime: 'Ejecución | Entornos de ejecución',
        processManage: 'Proceso | Procesos',
        process: 'Proceso | Procesos',
        network: 'Red | Redes',
        supervisor: 'Supervisor',
        tamper: 'Antimanipulación',
        app: 'Aplicación',
        msgCenter: 'Tareas',
        disk: 'Disco',
        template: 'Plantilla',
        filter: 'Filtro',
    },
    home: {
        recommend: 'Recomendado',
        dir: 'Directorio',
        quickDir: 'Acceso rápido',
        minQuickJump: 'Agrega al menos una entrada de acceso rápido',
        maxQuickJump: 'Puedes agregar hasta cuatro entradas de acceso rápido',
        database: 'Database - All',
        restart_1panel: 'Reiniciar panel',
        restart_system: 'Reiniciar servidor',
        operationSuccess: 'Completado con éxito. Reiniciando ahora, actualiza el navegador luego.',
        entranceHelper:
            'La entrada segura no está habilitada. Actívala en "Configuraciones -> Seguridad" para mejorar la seguridad.',
        appInstalled: 'Aplicaciones',
        systemInfo: 'Información del sistema',
        hostname: 'Nombre del host',
        platformVersion: 'Sistema operativo',
        kernelVersion: 'Kernel',
        kernelArch: 'Arquitectura',
        network: 'Red',
        io: 'Disco I/O',
        ip: 'IP local',
        proxy: 'Proxy del sistema',
        baseInfo: 'Información básica',
        totalSend: 'Total enviado',
        totalRecv: 'Total recibido',
        rwPerSecond: 'Operaciones de E/S',
        ioDelay: 'Latencia de E/S',
        uptime: 'Tiempo en funcionamiento',
        runningTime: 'Desde',
        mem: 'Memoria del Sistema',
        swapMem: 'Partición swap',
        runSmoothly: 'Carga baja',
        runNormal: 'Carga moderada',
        runSlowly: 'Carga alta',
        runJam: 'Carga pesada',
        core: 'Núcleo físico',
        logicCore: 'Núcleo lógico',
        corePercent: 'Uso del Núcleo',
        cpuFrequency: 'Frecuencia CPU',
        cpuDetailedPercent: 'Distribución del Tiempo de CPU',
        cpuUser: 'Usuario',
        cpuSystem: 'Sistema',
        cpuIdle: 'Inactivo',
        cpuIrq: 'IRQ',
        cpuSoftirq: 'Soft IRQ',
        cpuSteal: 'Robado',
        cpuTop: 'Top 5 de Procesos por Uso de CPU',
        memTop: 'Top 5 de Procesos por Uso de Memoria',
        loadAverage: 'Promedio de carga en el último minuto | Promedio de carga en los últimos {0} minutos',
        load: 'Carga',
        mount: 'Punto de montaje',
        fileSystem: 'Sistema de archivos',
        total: 'Total',
        used: 'En uso',
        cache: 'Cache',
        free: 'Libre',
        shard: 'Fragmentado',
        available: 'Disponible',
        percent: 'Utilización',
        goInstall: 'Ir a instalar',
        networkCard: 'Tarjeta de red',
        disk: 'Disco',
        memo: 'Memo',
        memoPlaceholder: 'Haz clic en el botón de editar para habilitar la edición.',
        carouselSetting: 'Configuración del carrusel',
        tooltipSensitiveInfo: 'Mostrar/Ocultar información sensible',
        alias: 'Alias',
    },
    tabs: {
        more: 'Más',
        hide: 'Ocultar',
        closeLeft: 'Cerrar izquierda',
        closeRight: 'Cerrar derecha',
        closeCurrent: 'Cerrar actual',
        closeOther: 'Cerrar otras',
        closeAll: 'Cerrar todo',
    },
    header: {
        logout: 'Cerrar sesión',
    },
    database: {
        manage: 'Administrar base de datos',
        deleteBackupHelper: 'Eliminar copias de seguridad de la base de datos simultáneamente',
        delete: 'La operación de eliminación no se puede revertir, por favor introduzca "',
        deleteHelper: '" para eliminar esta base de datos',
        deleteUserHelper: '" para eliminar este usuario',
        userBoundDatabases: 'tiene acceso a las siguientes bases de datos:',
        noMysql: 'Servicio de base de datos (MySQL o MariaDB)',
        noPostgresql: 'Servicio de base de datos PostgreSQL',
        goUpgrade: 'Ir a actualizar',
        goInstall: 'Ir a instalar',
        isDelete: 'Eliminada',
        permission: 'Cambiar permisos',
        format: 'Juego de Caracteres',
        collation: 'Intercalación',
        collationHelper: 'Si está vacío, use la intercalación predeterminada del juego de caracteres {0}',
        permissionForIP: 'IP',
        permissionAll: 'Todos (%)',
        localhostHelper:
            'Configurar los permisos de la base de datos como "localhost" para el despliegue en contenedores impedirá el acceso externo al contenedor. ¡Por favor elija cuidadosamente!',
        databaseConnInfo: 'Conexión',
        rootPassword: 'Contraseña root',
        serviceName: 'Nombre del servicio',
        serviceNameHelper: 'Acceso entre contenedores en la misma red.',
        backupList: 'Respaldo',
        loadBackup: 'Importar',
        localUpload: 'Subida local',
        hostSelect: 'Server Selection',
        selectHelper: 'Estas seguro de importar el archivo de backup {0}?',
        remoteAccess: 'Acceso remoto',
        remoteHelper: 'Múltiples IP separadas por comas, ejemplo: 172.16.10.111,172.16.10.112',
        remoteConnHelper:
            'Conectarse remotamente como usuario root en MySQL puede presentar riesgos de seguridad. Por lo tanto, realice esta operación con precaución.',
        changePassword: 'Cambiar contraseña',
        changeConnHelper: 'Esta operación modificará la base de datos actual {0}. ¿Desea continuar?',
        changePasswordHelper:
            'La base de datos ha sido asociada a una aplicación. Cambiar la contraseña también cambiará la contraseña de la base de datos en la aplicación. El cambio se aplica después de reiniciar la aplicación.',
        recoverTimeoutHelper: '-1 significa sin límite de tiempo de espera',
        confChange: 'Configuración',
        confNotFound:
            'No se pudo encontrar el archivo de configuración. Por favor actualice la aplicación a la última versión en la tienda y vuelva a intentarlo.',
        portHelper:
            'Este puerto es el puerto expuesto del contenedor. Debe guardar la modificación por separado y reiniciar el contenedor.',
        loadFromRemote: 'Sincronizar desde el servidor',
        userBind: 'Vincular usuario',
        noUserBind: 'Sin vinculación',
        userAuthorization: 'Autorización de usuario',
        noUserAuthorization: 'No autorizar',
        authorizedDatabaseCount: '{0} base(s) de datos autorizada(s)',
        authorizationManagement: 'Gestión de autorizaciones',
        authorizedUsers: 'Usuarios autorizados',
        authorizedUserCount: '{0} usuario(s)',
        addUserAuthorization: 'Añadir autorización de usuario',
        revokeAuthorization: 'Revocar autorización',
        revokeAuthorizationHelper: '¿Revocar el acceso del usuario {0} a la base de datos {1}?',
        supplementPassword: 'Añadir contraseña',
        supplementPasswordHelper: 'Solo guarda la contraseña existente en 1Panel; no cambia la contraseña en MySQL.',
        pgBindHelper:
            'Esta operación se utiliza para crear un nuevo usuario y vincularlo a la base de datos destino. Actualmente no se admite seleccionar usuarios ya existentes en la base de datos.',
        pgSuperUser: 'Superusuario',
        loadFromRemoteHelper:
            'Esto sincronizará las bases de datos, los usuarios y las autorizaciones del servidor con 1Panel. ¿Desea continuar?',
        passwordHelper: 'No se puede obtener, haga clic para modificar',
        remote: 'Remoto',
        remoteDB: 'Servidor remoto | Servidores remotos',
        createRemoteDB: 'Vincular @.lower:database.remoteDB',
        unBindRemoteDB: 'Desvincular @.lower:database.remoteDB',
        unBindForce: 'Forzar desvinculación',
        unBindForceHelper:
            'Ignorar todos los errores durante la desvinculación para asegurar que la operación final sea exitosa',
        unBindRemoteHelper:
            'Desvincular la base de datos remota solo eliminará la relación de vinculación y no eliminará directamente la base de datos remota',
        editRemoteDB: 'Editar servidor remoto',
        localDB: 'Base de datos local',
        address: 'Dirección de la base de datos',
        version: 'Versión de la base de datos',
        userHelper: 'El usuario root o un usuario con privilegios de root puede acceder a la base de datos remota.',
        mongodbPermissionDbOwner: 'Propietario de la base de datos',
        mongodbPermissionRead: 'Leer datos',
        mongodbPermissionReadWrite: 'Leer y escribir datos',
        mongodbPermissionUserAdmin: 'Administrador de usuarios',
        pgUserHelper: 'Usuario de base de datos con privilegios de superusuario.',
        ssl: 'Usar SSL',
        clientKey: 'Clave privada del cliente',
        clientCert: 'Certificado del cliente',
        caCert: 'Certificado CA',
        hasCA: 'Posee certificado CA',
        skipVerify: 'Omitir la verificación de validez del certificado',
        initialDB: 'Base de Datos Inicial',
        formatHelper:
            'El conjunto de caracteres actual de la base de datos es {0}, la inconsistencia de conjuntos puede causar errores al recuperar',
        dropHelper: 'Puede arrastrar y soltar el archivo aquí o',
        clickHelper: 'hacer clic para subir',
        supportUpType:
            'Solo se admiten los formatos de archivo sql, sql.gz, tar.gz y .zip. El archivo comprimido importado debe contener solo un archivo .sql o incluir test.sql.',
        currentStatus: 'Estado actual',
        baseParam: 'Parámetro básico',
        performanceParam: 'Parámetro de rendimiento',
        runTime: 'Tiempo de inicio',
        connections: 'Total de conexiones',
        bytesSent: 'Bytes enviados',
        bytesReceived: 'Bytes recibidos',
        queryPerSecond: 'Consultas por segundo',
        txPerSecond: 'Tx por segundo',
        connInfo: 'Conexiones activas/pico',
        connInfoHelper: 'Si el valor es demasiado grande, aumente "max_connections".',
        threadCacheHit: 'Cache de hilos exitoso',
        threadCacheHitHelper: 'Si es muy bajo, aumente "thread_cache_size".',
        indexHit: 'Índice exitoso',
        indexHitHelper: 'Si es muy bajo, aumente "key_buffer_size".',
        innodbIndexHit: 'Tasa de aciertos del índice Innodb',
        innodbIndexHitHelper: 'Si es muy bajo, aumente "innodb_buffer_pool_size".',
        cacheHit: 'Aciertos en caché de consulta',
        cacheHitHelper: 'Si es muy bajo, aumente "query_cache_size".',
        tmpTableToDB: 'Tabla temporal en disco',
        tmpTableToDBHelper: 'Si es muy alto, intente aumentar "tmp_table_size".',
        openTables: 'Tablas abiertas',
        openTablesHelper: 'El valor de configuración de "table_open_cache" debe ser mayor o igual a este valor.',
        selectFullJoin: 'Seleccionar join completo',
        selectFullJoinHelper: 'Si el valor no es 0, verifique si el índice de la tabla es correcto.',
        selectRangeCheck: 'Uniones sin índice',
        selectRangeCheckHelper: 'Si el valor no es 0, verifique si el índice de la tabla es correcto.',
        sortMergePasses: 'Cantidad de merges ordenados',
        sortMergePassesHelper: 'Si es muy alto, aumente "sort_buffer_size".',
        tableLocksWaited: 'Bloqueos de tabla',
        tableLocksWaitedHelper: 'Si el valor es muy alto, considere mejorar el rendimiento de su base de datos.',
        performanceTuning: 'Ajuste de rendimiento',
        optimizationScheme: 'Esquema de optimización',
        keyBufferSizeHelper: 'Tamaño del buffer para índices',
        queryCacheSizeHelper: 'Caché de consulta. Si la función está deshabilitada, establezca este parámetro en 0.',
        tmpTableSizeHelper: 'Tamaño del caché de tabla temporal',
        innodbBufferPoolSizeHelper: 'Tamaño del buffer Innodb',
        innodbLogBufferSizeHelper: 'Tamaño del buffer de logs de Innodb',
        sortBufferSizeHelper: '* conexiones, tamaño del buffer de ordenamiento por hilo',
        readBufferSizeHelper: '* conexiones, tamaño del buffer de lectura',
        readRndBufferSizeHelper: '* conexiones, tamaño del buffer de lectura aleatoria',
        joinBufferSizeHelper: '* conexiones, tamaño del caché de asociación de tablas',
        threadStackelper: '* conexiones, tamaño de pila por hilo',
        binlogCacheSizeHelper: '* conexiones, caché del log binario (múltiplos de 4096)',
        threadCacheSizeHelper: 'Tamaño del pool de hilos',
        tableOpenCacheHelper: 'Caché de tablas',
        maxConnectionsHelper: 'Máximo de conexiones',
        restart: 'Reiniciar',
        slowLog: 'Registros lentos',
        noData: 'Aún no hay registros lentos.',
        isOn: 'Activado',
        longQueryTime: 'umbral(es)',
        thresholdRangeHelper: 'Por favor, introduzca el umbral correcto (1 - 600).',
        timeout: 'Tiempo de espera',
        timeoutHelper: 'Tiempo de espera de conexión inactiva. 0 indica que la conexión está siempre activa.',
        maxclients: 'Máximo de clientes',
        requirepassHelper:
            'Déjelo en blanco si no se ha establecido ninguna contraseña. Los cambios deben guardarse por separado y el contenedor debe reiniciarse.',
        databases: 'Cantidad de bases de datos',
        maxmemory: 'Uso máximo de memoria',
        maxmemoryHelper: '0 indica sin restricción.',
        tcpPort: 'Puerto de escucha actual.',
        uptimeInDays: 'Días en operación.',
        connectedClients: 'Cantidad de clientes conectados.',
        usedMemory: 'Uso de memoria actual de Redis.',
        usedMemoryRss: 'Tamaño de memoria solicitado al sistema operativo.',
        usedMemoryPeak: 'Pico de uso de memoria de Redis.',
        memFragmentationRatio: 'Ratio de fragmentación de memoria.',
        totalConnectionsReceived: 'Total de clientes conectados desde el inicio.',
        totalCommandsProcessed: 'Total de comandos ejecutados desde el inicio.',
        instantaneousOpsPerSec: 'Comandos ejecutados por el servidor por segundo.',
        keyspaceHits: 'Cantidad de veces que se encontró la clave de la base de datos.',
        keyspaceMisses: 'Cantidad de intentos fallidos para encontrar la clave.',
        hit: 'Proporción de aciertos de clave de la base de datos.',
        latestForkUsec: 'Microsegundos consumidos en la última operación fork().',
        redisCliHelper: 'No se detectó el servicio "redis-cli". Primero habilite el servicio.',
        redisQuickCmd: 'Comandos rápidos de Redis',
        recoverHelper: 'Esto sobrescribirá los datos con [{0}]. ¿Desea continuar?',
        mongodbRecoverDropAllCollections: 'Vaciar la base de datos actual antes de restaurar',
        mongodbRecoverDropAllCollectionsHelper:
            'De forma predeterminada, solo se sobrescriben las colecciones existentes y se conservan las colecciones nuevas. Al activarlo, se vacía la base de datos actual y luego se restaura desde la copia de seguridad.',
        submitIt: 'Sobrescribir los datos',
        baseConf: 'Básico',
        allConf: 'Todos',
        restartNow: 'Reiniciar ahora',
        restartNowHelper1:
            'Necesita reiniciar el sistema después de que los cambios de configuración tengan efecto. Si necesita persistir los datos, guarde antes de reiniciar.',
        restartNowHelper: 'Esto solo surtirá efecto después de reiniciar el sistema.',
        persistence: 'Persistencia',
        rdbHelper1: 'segundo(s), insertar',
        rdbHelper2: 'piezas de datos',
        rdbHelper3: 'Cumplir cualquiera de las condiciones activará la persistencia RDB.',
        rdbInfo: 'Asegúrese de que el valor de la regla esté entre 1 y 100000',
        containerConn: 'Conexión del contenedor',
        copyConnURL: 'Copiar URL de conexión',
        connAddress: 'Dirección',
        containerConnHelper:
            'Esta dirección de conexión es usada por aplicaciones en entorno de ejecución PHP o instalaciones en contenedores.',
        remoteConn: 'Conexión externa',
        remoteConnHelper2:
            'Esta dirección de conexión puede ser usada por aplicaciones fuera del contenedor o externas.',
        remoteConnHelper3:
            'La dirección de acceso predeterminada es la IP del host. Para modificarla, diríjase a la configuración de "Dirección de acceso predeterminada" en la página de ajustes del panel.',
        localIP: 'IP local',
    },
    aiTools: {
        agents: {
            agent: 'Agente',
            account: 'Cuenta de modelo',
            batchOperation: 'Operación por lotes',
            operationType: 'Tipo de operación',
            batchAction: '{0} por lotes',
            installSkillAction: 'Distribuir Skill',
            batchAgentTask: '{0} agentes por lotes',
            dispatchAgentTask: 'Enviar tareas para {0} agentes',
            dispatchTask: 'Enviar tareas de {0}',
            taskSubmitted: 'Tarea de {0} enviada',
            allNodes: 'Todos los nodos',
            targetVersion: 'Versión de destino',
            skillSource: 'Origen de Skill',
            skillKeyword: 'Palabra clave de Skill',
            clawHubSkillPlaceholder: 'Busque y seleccione una Skill primero',
            noAccountHint: 'Selecciona una cuenta de modelo existente o agrega una nueva.',
            accountCount: '{0} cuentas de modelo',
            syncAgents: 'Sincronizar agentes vinculados',
            syncAgentsHelper: 'Actualiza openclaw.json para los agentes que usan esta cuenta de modelo',
            appVersion: 'Versión de la app',
            webuiPort: 'Puerto WebUI',
            tokenOrAuth: 'Token/Autenticación',
            allowedOrigins: 'Direcciones de acceso',
            allowedOriginsRequired: 'Introduce al menos una dirección de acceso',
            allowedOriginsInvalid: 'Usa el formato http(s)://host-o-ip[:puerto]',
            provider: 'Proveedor de modelos',
            accountModelsHelper:
                'Configure los modelos que esta cuenta expone a OpenClaw para el cambio y la configuración',
            accountModelsRequired: 'Configure al menos un modelo',
            verifyModel: 'Modelo de verificación',
            verifyModelHelper:
                'Seleccione un modelo al que esta cuenta tenga acceso. Se usará para enviar una solicitud mínima al guardar y verificar la conexión.',
            verifyModelRequired: 'Seleccione un modelo de verificación',
            discoverModels: 'Obtener modelos',
            automaticModelDiscovery: 'Obtención automática',
            manualModelConfiguration: 'Configuración manual',
            discoverModelsHelper:
                'Obtenga los modelos mediante la API /v1/models del proveedor y añádalos todos al conjunto de modelos',
            discoverModelsFailedFallback: 'No se pudieron obtener los modelos. Configure un modelo manualmente.',
            discoverModelsFailedUseDefaults:
                'No se pudieron obtener los modelos. Se usarán los modelos predeterminados.',
            accountModelsDuplicate: 'Existen modelos duplicados en el catálogo',
            modelPool: 'Pool de modelos',
            fallbackModels: 'Modelos de respaldo',
            addFallbackModel: 'Agregar modelo de respaldo',
            fallbackModelsEmpty: 'No hay modelos de respaldo configurados',
            modelInputTypes: 'Tipos de entrada',
            reasoning: 'Modelo de razonamiento',
            verified: 'Verificado',
            verifySkipped: 'Sin verificación',
            skillsTab: 'Habilidades',
            pluginsTab: 'Complementos',
            pluginsInstalled: 'Instalados',
            pluginsMarket: 'Mercado de complementos',
            pluginsMarketHint: 'Introduce una palabra clave para buscar complementos',
            pluginSearchPlaceholder: 'Buscar complementos...',
            pluginOrigin: 'Origen',
            pluginOriginAll: 'Todos los orígenes',
            pluginOriginBundled: 'Integrado',
            pluginOriginExternal: 'Externo',
            pluginStatusAll: 'Todos los estados',
            pluginEnabled: 'Activado',
            pluginDisabled: 'Desactivado',
            pluginCategory: 'Categoría',
            pluginVerification: 'Verificación',
            pluginOfficial: 'Oficial',
            pluginCommunity: 'Comunidad',
            pluginDownloads: 'Descargas',
            pluginEnable: 'Activar',
            pluginDisable: 'Desactivar',
            pluginListEmpty: 'No hay complementos',
            pluginSearchEmpty: 'No se encontraron complementos coincidentes',
            pluginInstallConfirm: '¿Instalar el complemento {0}?',
            pluginDisableConfirm: '¿Desactivar el complemento {0}?',
            pluginUninstallConfirm: '¿Desinstalar el complemento {0}?',
            securityTab: 'Seguridad',
            otherTab: 'Otros',
            timeZone: 'Zona horaria',
            browserEnabled: 'Navegador habilitado',
            npmRegistry: 'Registro NPM',
            npmRegistryHelper:
                'Se usa para instalar plugins de OpenClaw. Puede elegir un registro predefinido o introducir uno personalizado.',
            npmRegistryInvalid: 'Introduzca una URL válida del registro NPM que empiece por http:// o https://',
            pluginInstallNPMRegistryHelper:
                'Vaya a Configuración -> Otros para configurar el registro NPM y acelerar la instalación de plugins',
            skillsSearchPlaceholder: 'Buscar habilidades...',
            skillsEmpty: 'Sin habilidades',
            skillsMarket: 'Mercado de habilidades',
            skillsMarketHint: 'Seleccione una fuente y busque habilidades',
            skillsMarketEmpty: 'No se encontraron habilidades relacionadas',
            skillsMarketSourceClawhubGlobal: 'ClawHub (Global)',
            skillsMarketSourceClawhubChina: 'ClawHub (China)',
            skillsMarketSourceSkillhub: 'SkillHub (Tencent)',
            skillsMarketSourceLocalHub: 'Tienda local de Skills',
            skillsScore: 'Puntuación',
            skillsMarketSourceOfficial: 'Oficial',
            versionUnsupportedTitle: 'Esta función no es compatible con la versión actual',
            versionUnsupportedHelper: 'Actualice OpenClaw a la versión {0} o posterior.',
            skillsGroupBuiltIn: 'Integradas',
            skillsGroupExternal: 'Externas',
            skillsGroupWorkspace: 'Espacio de trabajo',
            switchModelSuccess: 'Modelo cambiado correctamente',
            channelsTab: 'Canales',
            agentRoleTab: 'Agentes',
            agentRoleUnsupported: 'La gestión de roles actualmente solo es compatible con OpenClaw.',
            workspace: 'Directorio del espacio de trabajo',
            agentDir: 'Directorio del agente',
            roleMarkdownDescriptions: {
                'AGENTS.md': [
                    'Instrucciones operativas para el agente y cómo debe usar la memoria.',
                    'Buen lugar para reglas, prioridades y detalles sobre cómo debe comportarse.',
                ],
                'SOUL.md': ['Personalidad, tono y límites.'],
                'USER.md': ['Quién es el usuario y cómo dirigirse a él.'],
                'IDENTITY.md': ['El nombre, estilo y emoji del agente.'],
                'TOOLS.md': ['Notas sobre las herramientas locales y las convenciones.'],
                'HEARTBEAT.md': [
                    'Lista de comprobación opcional para ejecuciones heartbeat.',
                    'Manténgala corta para evitar gastar tokens.',
                ],
                'BOOT.md': [
                    'Lista de inicio opcional que se ejecuta al reiniciar el gateway cuando los hooks internos están habilitados.',
                    'Manténgala corta; use la herramienta de mensajes para envíos externos.',
                ],
                'BOOTSTRAP.md': [
                    'Ritual único de la primera ejecución.',
                    'Solo se crea para un espacio de trabajo completamente nuevo.',
                ],
            },
            duplicateBinding: 'La combinacion de canal e ID de cuenta debe ser unica',
            accountIdOptional: 'ID de cuenta (opcional)',
            saveAllMd: 'Guardar todo',
            roleMarkdownRestartHelper:
                'Guardar todos los archivos markdown actuales requiere reiniciar el contenedor para surtir efecto. Elija si reiniciar ahora o más tarde.',
            configFileRestartHelper:
                'Guardar el archivo de configuración requiere reiniciar inmediatamente el contenedor para surtir efecto.',
            overviewSnapshot: 'Resumen',
            primaryModel: 'Modelo principal',
            defaultModel: 'Modelo predeterminado',
            channelCount: 'Canales configurados',
            skillCount: 'Habilidades',
            jobCount: 'Tareas programadas',
            sessionCount: 'Sesiones',
            hermesChatAction: 'Conversación',
            hermesChatTitle: 'Conversación de Hermes',
            hermesChatDialogTitle: 'Conversación de Hermes - {0}',
            hermesChatNewChat: 'Nueva conversación',
            hermesChatNoSessions: 'No hay sesiones',
            hermesChatMessageCount: '{0} mensajes',
            hermesChatEmptyHint: 'Seleccione una sesión a la izquierda o haga clic en Nueva conversación',
            hermesChatTitlePlaceholder: 'Introduzca el título de la sesión',
            hermesChatRenameSuccess: 'El título de la sesión se ha actualizado',
            hermesChatDeleteConfirm: '¿Eliminar la sesión {0}?',
            hermesChatDeleteSuccess: 'Sesión eliminada',
            weixin: 'Weixin',
            wecom: 'WeCom',
            dingtalk: 'DingTalk',
            feishu: 'Feishu',
            pluginNotInstalled: 'El plugin no está instalado. Instálalo primero.',
            dmPolicy: 'Política de MD',
            threadSession: 'Sesión por hilo',
            replyMode: 'Modo de respuesta',
            requireMention: 'Requerir mención',
            requireMentionTrue: "Requiere {'@'}",
            requireMentionFalse: "No requiere {'@'}",
            requireMentionOpen: 'Según la configuración del grupo',
            groupPolicy: 'Política de grupo',
            policyAllowlist: 'Lista permitida',
            policyOpen: 'Abierto',
            policyDisabled: 'Deshabilitado',
            bots: 'Bots',
            addBot: 'Agregar bot',
            accountId: 'ID de cuenta',
            accountIdPlaceholder:
                'Un ID único para distinguir bots y usarlo después en la configuración y el enrutamiento.',
            setDefaultBot: 'Establecer como predeterminado',
            botDuplicateField: '{field} ya existe',
            botRequired: 'Agregue al menos un bot',
            botId: 'ID del bot',
            allowFrom: 'Lista permitida de MD',
            allowFromPlaceholder: 'Un ID de remitente por línea',
            allowlistPolicyHelper: '{0}. Solo se usa cuando {1} es Lista permitida.',
            systemPrompt: 'Prompt del sistema',
            groupAllowFrom: 'Lista permitida de grupos',
            groupAllowFromPlaceholder: 'Un ID de grupo por línea',
            separateSessionByConversation: 'Sesión separada por conversación',
            groupSessionScope: 'Ámbito de sesión de grupo',
            groupSessionScopeGroup: 'Compartido por grupo',
            groupSessionScopeGroupSender: 'Por remitente',
            sharedMemoryAcrossConversations: 'Compartir memoria entre conversaciones',
            asyncMode: 'Modo asíncrono',
            ackText: 'Texto de confirmación',
            ackTextDefault: 'Tarea recibida, procesando...',
            streaming: 'Streaming',
            streamingOff: 'Desactivado',
            streamingPartial: 'Parcial',
            streamingBlock: 'Bloqueante',
            streamingProgress: 'Progreso',
            allowFromRequired: 'Introduzca al menos una entrada en la lista permitida',
            pairingCode: 'Código de emparejamiento',
            pairingCodePlaceholder: 'Introduzca el código de emparejamiento',
            approvePairing: 'Aprobar emparejamiento',
            saveSuccess: 'Guardado correctamente',
            successAndRestart: '{0}. El contenedor se está reiniciando automáticamente.',
            pairingApproveSuccess: 'Emparejamiento aprobado correctamente',
            scanConnect: 'Escanear para conectar',
            scanConnectHelper:
                'Haga clic para iniciar la tarea de inicio de sesión por QR. El código QR aparecerá en el registro de tareas y el contenedor se reiniciará automáticamente después de completar el escaneo.',
            channelAutoRestartHelper:
                'Al guardar, el contenedor se reiniciará automáticamente para que la configuración surta efecto.',
            dashboardAuthAutoRebuildHelper:
                'Al guardar el usuario o la contraseña, el contenedor se reconstruirá automáticamente para que los cambios surtan efecto.',
            dashboardAuthImmediateHelper:
                'Al guardar, las credenciales de QwenPaw se actualizan de inmediato sin reiniciar el contenedor.',
            channelDeleteConfirm: '¿Eliminar la configuración del canal {0}?',
            apiTypeBaseURLHelper: 'Este tipo envía solicitudes a {0}. Base URL recomendada: {1}',
            customImageURLHelper:
                'Introduce la URL completa del endpoint de generación de imágenes para cuentas Custom. La ruta no se añade automáticamente. Ejemplo: {0}',
            apiTypeBaseURLMismatch:
                'La Base URL actual parece una ruta {0}, pero está seleccionado {1}. URL recomendada: {2}',
            validateAvailability: 'Validar disponibilidad de la cuenta',
            validateAvailabilityHelper: 'Envía un mensaje mínimo antes de guardar para validar la API',
            validateImageAvailabilityHelper: 'Genera una imagen mínima antes de guardar y puede generar costes',
        },
        model: {
            model: 'Modelo',
            localModel: 'Modelos locales',
            create_helper: 'Descargar "{0}"',
            ollama_doc: 'Puede visitar el sitio oficial de Ollama para buscar y encontrar más modelos.',
            container_conn_helper: 'Utilice esta dirección para el acceso o conexión entre contenedores',
            ollama_sync:
                'Al sincronizar modelos de Ollama, se detectaron los siguientes modelos que no existen. ¿Desea eliminarlos?',
            from_remote: 'Este modelo no fue descargado vía 1Panel, no hay registros de descarga relacionados.',
            no_logs: 'Los registros de descarga de este modelo han sido eliminados y no se pueden consultar.',
            vllmVersionHelper: 'Para servidores FusionXpark GB 10, seleccione la versión -cu130.',
            vllmCommandPortHelper:
                'El comando de inicio debe usar el puerto {0}; de lo contrario, no se podrá acceder al servicio.',
            syncModelAccount: 'Sincronizar con cuenta de modelo',
            modelAccountAddressHelper:
                'La dirección del contenedor es para contenedores de agentes; 127.0.0.1, IP del sistema o dirección personalizada es para AI Gateway o servicios externos.',
            containerAddress: 'Dirección del contenedor',
            customAddress: 'Dirección personalizada',
            downloader: 'Descargador',
            modelDir: 'Directorio del modelo',
            manualDownload: 'Descarga manual',
            modelSource: 'Fuente del modelo',
            repoID: 'ID del repositorio',
            endpointLabel: 'Endpoint de {0}',
            acceleratedEndpointLabel: 'Endpoint de aceleración de {0}',
            tokenOptionalLabel: 'Token de {0} (opcional)',
            searchSource: 'Buscar en {0}',
            hfEndpointHelper:
                'Configure un endpoint de aceleración cuando el acceso a HuggingFace sea inestable. La búsqueda, los detalles y las descargas lo utilizarán.',
            sortTrending: 'Tendencias',
            sortLikes: 'Más valorados',
            sortDownloads: 'Más descargados',
            sortUpdated: 'Actualizados recientemente',
            sortCreated: 'Más recientes',
            downloadsCount: 'Descargas',
            likes: 'Me gusta',
            taskQueue: 'Cola de descargas',
            progress: 'Progreso',
            localDownloaded: 'Descargados',
            modelInfo: 'Detalles del modelo',
            downloading: 'Descargando',
            canceled: 'Cancelado',
            downloadQueued: 'Agregado a la cola de descargas',
            cancelTaskConfirm: '¿Cancelar esta tarea de descarga?',
            deleteLocalModelConfirm: '¿Eliminar el modelo local {0}?',
        },
        proxy: {
            proxy: 'Mejoras de gateway de IA',
            proxyHelper1: 'Vincule un dominio y habilite HTTPS para mejorar la seguridad de la transmisión',
            proxyHelper2: 'Limite el acceso por IP para evitar exposición pública',
            proxyHelper3: 'Habilitar transmisión en tiempo real',
            proxyHelper4: 'Una vez creado, puede verlo y gestionarlo en la lista de sitios web',
            proxyHelper5:
                'Después de habilitarlo, puede deshabilitar el acceso externo al puerto en Tienda de Aplicaciones - Instaladas - Ollama - Parámetros para mejorar la seguridad.',
            proxyHelper6:
                'Para deshabilitar la configuración del proxy, puede eliminarla desde la lista de sitios web.',
            whiteListHelper: 'Restringir el acceso solo a las IP incluidas en la lista blanca',
        },
        aiProxy: {
            title: 'Gateway de IA',
            apiReference: 'Referencia de API',
            notInstalled: 'No instalado',
            usage: 'Uso',
            accountPool: 'Grupo de cuentas',
            importModelAccount: 'Importar cuenta de modelo',
            editModelAccount: 'Editar cuenta de modelo',
            selectModelAccount: 'Seleccionar una cuenta de modelo existente',
            upstreamApiAddress: 'Dirección de API ascendente',
            priority: 'Prioridad',
            healthStatus: 'Estado de salud',
            failureCount: 'Fallos',
            lastError: 'Último error',
            modelMap: 'Mapeo de modelos',
            qpsLimit: 'Límite de QPS',
            tokenLimit: 'Límite de tokens',
            tokenUsed: 'Tokens usados',
            tokenRemaining: 'Tokens restantes',
            resetToken: 'Restablecer tokens',
            resetTokenConfirm: '¿Restablecer el uso de tokens de {0}?',
            unlimited: 'Ilimitado',
            unlimitedWithAuto: 'Ilimitado, incluye auto',
            lastUsedAt: 'Último uso',
            validityPeriod: 'Periodo de validez',
            keepCurrentValidity: 'Mantener la validez actual',
            neverExpires: 'Nunca caduca',
            validForDays: 'Válido durante {0} días',
            customDays: 'Días personalizados',
            enterValidityDays: 'Introduzca el periodo de validez en días',
            currentExpiresAt: 'Caducidad actual: {0}',
            currentNeverExpires: 'Actualmente no caduca',
            expiresAt: 'Fecha de caducidad',
            expired: 'Caducado',
            reactivate: 'Reactivar',
            settingTitle: 'Configuración del gateway de IA',
            basicSetting: 'Configuración básica',
            performanceSetting: 'Configuración de rendimiento',
            logSetting: 'Configuración de registros',
            lbPolicy: 'Estrategia de balanceo',
            protocolConversion: 'Conversión de protocolo',
            protocolConversionDesc:
                'Permite la conversión directa compatible entre Chat Completions, Responses y Anthropic Messages. Los protocolos nativos siempre tienen prioridad.',
            protocolConversionRisk:
                'La conversión de protocolos no es sin pérdidas. Los campos específicos, las llamadas a herramientas, el razonamiento o el contenido multimodal pueden degradarse o perderse. Úsela después de evaluar los riesgos.',
            visionEnhancement: 'Mejora visual',
            visionEnhancementRisk:
                'La mejora visual puede enviar imágenes a un proveedor de modelos visuales independiente.',
            visionModelGroup: 'Grupo de modelos visuales',
            visionModelGroupDesc:
                'Seleccione en este grupo de generación de texto un modelo que comprenda imágenes. Todas las imágenes de una solicitud usan el mismo modelo.',
            visionTargetModelGroup: 'Grupo de modelos de destino',
            visionTargetModelGroupDesc:
                'Activa la mejora solo para modelos de este grupo sin cambiar el modelo final de la solicitud.',
            visionEnhancementDesc:
                'Las imágenes se convierten en evidencia de texto y pueden perder detalles, aumentando la latencia y el coste. El gateway no detecta compatibilidad visual nativa. Guardar reinicia el gateway; úselo después de evaluar los riesgos.',
            visionPreprocess: 'Preprocesamiento visual',
            cacheHit: 'Acierto de caché',
            apiType: 'Tipo de API',
            lbPolicyRoundRobin: 'Round Robin',
            lbPolicyRoundRobinDesc:
                'Selecciona las cuentas de modelo disponibles en orden. Úselo cuando los backends tengan capacidad similar.',
            lbPolicyWeightedRoundRobin: 'Round Robin ponderado',
            lbPolicyWeightedRoundRobinDesc:
                'Distribuye solicitudes según el peso de la cuenta de modelo. Un peso mayor recibe más tráfico; úselo cuando la capacidad de los backends sea diferente.',
            lbPolicyFailover: 'Conmutación por error',
            lbPolicyFailoverDesc:
                'Usa primero la cuenta de modelo con mayor prioridad y cambia a la siguiente disponible tras un fallo o periodo de enfriamiento.',
            maxConcurrency: 'Concurrencia máxima',
            queueSize: 'Tamaño de cola',
            queueTimeoutSeconds: 'Tiempo de espera en cola (s)',
            requestTimeoutSeconds: 'Timeout de solicitud no streaming (s)',
            streamIdleTimeoutSeconds: 'Timeout de inactividad streaming (s)',
            maxBodyMb: 'Tamaño máximo del cuerpo (MB)',
            runtimeRefreshSeconds: 'Intervalo de actualización runtime (s)',
            logRetentionDays: 'Retención de logs del gateway de IA (días)',
            clearLogs: 'Limpiar logs',
            clearLogsConfirm:
                'Se limpiarán las estadísticas de uso, auditorías de cumplimiento, decisiones de enrutamiento, logs del cuerpo de solicitud y logs del servicio del gateway de IA. ¿Continuar?',
            usageRetentionDays: 'Retención de estadísticas de uso (días)',
            contentAuditRetentionDays: 'Retención de auditoría de cumplimiento de contenido (días)',
            logCleanupIntervalHours: 'Intervalo de limpieza de logs (horas)',
            requestBodyLog: 'Log del cuerpo de solicitud',
            requestBodyLogDesc:
                'Escribe cuerpos de solicitud y respuesta de AI Gateway en Elasticsearch para búsqueda, auditoría y diagnóstico.',
            requestBodyLogIndexPrefix: 'Prefijo del índice',
            requestBodyLogRetentionDays: 'Retención del log del cuerpo de solicitud (días)',
            requestBodyLogMaxBodyKb: 'Tamaño máximo del cuerpo de solicitud (KB)',
            requestBody: 'Cuerpo de solicitud',
            requestBodySize: 'Tamaño del cuerpo de solicitud',
            requestBodyTruncated: 'Truncado',
            responseBody: 'Cuerpo de respuesta',
            responseBodySize: 'Tamaño del cuerpo de respuesta',
            responseBodyTruncated: 'Cuerpo de respuesta truncado',
            readableContent: 'Contenido legible',
            rawResponse: 'Respuesta original',
            replyContent: 'Contenido de respuesta',
            reasoningContent: 'Contenido de razonamiento',
            statusTitle: 'Estado del gateway de IA',
            serviceEnabled: 'Inicio automático del servicio',
            proxyEnabled: 'Gateway habilitado',
            statusMessage: 'Mensaje de estado',
            esLogDropped: 'Logs ES descartados',
            esLogLastSuccessAt: 'Última escritura ES',
            esLogCircuitOpen: 'Circuito abierto',
            esLogCircuitUntil: 'Circuito ES hasta',
            serviceOperateConfirm: '¿Confirmar {0} el servicio de gateway de IA?',
            deleteTargetConfirm: '¿Eliminar {0} {1}?',
            deleteBackendTitle: 'Eliminar cuenta de modelo',
            userFallback: 'Usuario eliminado (ID: {0})',
            requestModel: 'Modelo solicitado',
            upstreamModel: 'Modelo upstream',
            upstreamDuration: 'Tiempo upstream',
            requestModelPlaceholder: 'p. ej. qwen2.5-coder',
            upstreamModelPlaceholder: 'p. ej. Qwen/Qwen2.5-Coder-32B-Instruct',
            addMapping: 'Agregar mapeo',
            overview: 'Resumen',
            distribution: 'Distribución',
            usageTrend: 'Tendencia de uso',
            distributionBy: 'Distribución por {0}',
            unmatched: 'Sin coincidencia',
            modelAccount: 'Cuenta de modelo',
            serviceProvider: 'Proveedor',
            tokenUsage: 'Uso de tokens',
            percent: 'Porcentaje',
            ranking: 'Ranking',
            rank: 'Rango',
            promptToken: 'Tokens de entrada',
            completionToken: 'Tokens de salida',
            totalToken: 'Tokens totales',
            cachedToken: 'Tokens en caché',
            cacheHitRate: 'Tasa de acierto de caché',
            activeUsers: 'Usuarios activos',
            activeModels: 'Modelos activos',
            failedRequests: 'Solicitudes fallidas',
            averageTokenPerRequest: 'Tokens promedio/solicitud',
            callLogs: 'Registros de llamadas',
            usageKeywordPlaceholder: 'Buscar Request ID / modelo / modelo upstream / mensaje de error',
            attemptChain: 'Cadena de intentos',
            attemptIndex: 'Orden de llamada',
            clientProtocol: 'API del cliente',
            upstreamProtocol: 'API upstream',
            conversionPath: 'Ruta de conversión',
            noAttemptDetails: 'No hay registros de la cadena de intentos',
            input: 'Entrada',
            output: 'Salida',
            total: 'Total',
            healthHealthy: 'Saludable',
            healthCooldown: 'En enfriamiento',
            healthUnhealthy: 'Anómalo',
            healthDeleted: 'Eliminado',
            healthUnknown: 'Desconocido',
            validationModelMapEmpty: 'Los nombres del mapeo de modelos no pueden estar vacíos',
            validationModelMapDuplicate: 'El modelo solicitado {0} está duplicado',
            modelGroup: 'Grupo de modelos',
            modelCapability: 'Capacidad del modelo',
            textGeneration: 'Generación de texto',
            imageGeneration: 'Generación de imágenes',
            textModels: 'Modelos de texto',
            textToImageModels: 'Modelos de texto a imagen',
            unauthorized: 'Sin autorización',
            imageCount: 'Cantidad de imágenes',
            availableModels: 'Modelos disponibles',
            modelGroupModels: 'Modelos solicitados',
            modelGroupModelsPlaceholder: 'Seleccione o ingrese nombres de modelos solicitados',
            modelGroupModelsHelper:
                'Ingrese los nombres de modelo que usan los clientes al llamar al gateway de IA; el enrutamiento inteligente prueba los modelos en orden y no balancea carga entre modelos.',
            modelGroupGuide:
                'Los grupos de modelos contienen los nombres de modelo expuestos por el gateway de IA. Configure los modelos upstream en el mapeo de modelos del pool de cuentas. auto es un nombre de modelo virtual y no debe añadirse al grupo.',
            modelGroupModelCount: '{0} modelos',
            contentCompliance: 'Cumplimiento de contenido',
            contentAction: 'Acción',
            actionBlock: 'Bloquear',
            actionAuditOnly: 'Solo auditar',
            actionDropHistory: 'Eliminar historial',
            severity: 'Gravedad',
            severityHigh: 'Alta',
            severityMedium: 'Media',
            severityLow: 'Baja',
            sensitiveWord: 'Palabra sensible',
            sensitiveGroup: 'Grupo de palabras sensibles',
            sensitiveWordCount: 'Palabras',
            normalizedWord: 'Palabra normalizada',
            matchedWords: 'Palabras coincidentes',
            matchedGroups: 'Grupos coincidentes',
            importResult: 'Importadas {0}, duplicadas {1}, no válidas {2}',
            auditLogs: 'Registros de auditoría',
            smartRoute: 'Enrutamiento inteligente',
            smartRouteGuideTitle: 'Use model=auto en el cliente para entrar al enrutamiento inteligente',
            smartRouteGuideReady:
                'model=auto elige entre el grupo simple o complejo según la complejidad de la solicitud. Cualquier otro modelo se reenvía normalmente.',
            smartRouteGuideNotReady:
                'Primero active el enrutamiento inteligente y configure los grupos simple/complejo. Luego use model=auto en el cliente.',
            copyAutoModel: 'Copiar auto',
            goSmartRouteSetting: 'Ir a configuración',
            smartRoutePolicy: 'Política de enrutamiento',
            routeConfig: 'Configuración de enrutamiento',
            embeddingConfig: 'Configuración de embedding',
            embeddingConfigDesc:
                'Se usa para enrutamiento inteligente y coincidencia semántica de muestras de cumplimiento de contenido. Recomendado: llama.cpp + Qwen3-Embedding-0.6B. Configúralo antes de reconstruir vectores.',
            decisionConfig: 'Parámetros de decisión',
            simpleModelGroup: 'Grupo de modelos simples',
            complexModelGroup: 'Grupo de modelos complejos',
            embeddingEndpoint: 'Endpoint',
            embeddingModel: 'Modelo',
            embeddingApiKey: 'API Key',
            routeThreshold: 'Umbral de enrutamiento',
            routeThresholdHelper:
                'Para Enrutamiento Inteligente: usa muestras solo cuando la similitud de la solicitud alcance este valor.',
            auditThreshold: 'Umbral de auditoría',
            auditThresholdHelper:
                'Para Cumplimiento de Contenido: considera coincidencia solo cuando la similitud alcance este valor.',
            topK: 'TopK',
            topKHelper: 'Número de muestras más similares para comparar cada vez.',
            members: 'Miembros',
            samples: 'Muestras',
            routeSamplesGuide:
                'Las muestras son ejemplos de solicitudes simples/complejas para coincidencia por similitud Embedding. Use solicitudes reales y luego cree o reconstruya vectores.',
            rebuildVectors: 'Reconstruir vectores',
            rebuildVectorsConfirm:
                'Reconstruir vectores volverá a solicitar al servicio Embedding que procese las muestras de enrutamiento inteligente y cumplimiento de contenido. ¿Continuar?',
            createVectorOnImport: 'Crear vectores después de importar',
            createVectorOnImportHelper:
                'Activado por defecto. Si Embedding está configurado, una tarea en segundo plano crea vectores; de lo contrario solo crea muestras.',
            route: 'Ruta',
            audit: 'Auditoría',
            auditSamples: 'Muestras de auditoría',
            sampleText: 'Texto',
            sampleLabel: 'Etiqueta',
            vectorModel: 'Modelo vectorial',
            vectorDim: 'Dimensión',
            threshold: 'Umbral',
            preview: 'Vista previa',
            previewGuide:
                'La vista previa prueba si una solicitud es simple o compleja sin llamar al modelo upstream. La fuente es coincidencia de muestras o reglas.',
            previewPlaceholder: 'Introduce el texto de la solicitud',
            confidence: 'Confianza',
            bestSampleSimilarity: 'Mayor similitud de muestra',
            source: 'Fuente',
            sourceHeuristic: 'Reglas',
            sourceEmbedding: 'Coincidencia de muestras',
            sourceContext: 'Herencia de contexto',
            latency: 'Latencia',
            decisionLogs: 'Registros de decisión',
            requestID: 'ID de solicitud',
            simple: 'Simple',
            complex: 'Complejo',
            sampleLabelSafe: 'Seguro',
            sampleLabelReview: 'Revisar',
            sampleLabelBlock: 'Bloquear',
            latencyMs: 'Latencia(ms)',
            smartRouteSettingGuide:
                'Después de activarlo, solo las solicitudes con model=auto usan enrutamiento inteligente. El grupo simple es para tareas de bajo costo; el complejo para análisis de código, arquitectura y diagnóstico.',
            sampleLabelPlaceholder: 'simple / complejo / alto',
            sampleImportPlaceholder: 'Una muestra por línea',
            apiKeyCount: 'Cantidad',
        },
        skillsHub: {
            title: 'Skills Hub',
            upload: 'Subir Skill',
            importSkill: 'Importar Skill',
            repositoryAddress: 'Dirección del repositorio',
            repositoryGithubOnly: 'Solo se admiten direcciones de repositorios de GitHub',
            repositoryRef: 'Rama o Tag',
            repositoryRefPlaceholder: 'Predeterminado main; si falla, se intentará master',
            repositoryDownloadPreview: 'URL de descarga de destino:',
            packageURL: 'URL del paquete',
            packageURLPlaceholder: 'Introduzca la dirección del paquete .zip',
            importSuccess: 'Skill importado correctamente y en estado pendiente de revisión.',
            source: 'Fuente',
            applicableAgent: 'Agente aplicable',
            overview: 'Resumen',
            versionHistory: 'Historial de versiones',
            publishedAt: 'Fecha de publicación',
            versionMarker: 'Marcador',
            currentVersion: 'Actual',
            latestVersion: 'Última versión',
            latestPublished: 'Última publicada',
            riskLevel: 'Nivel de riesgo',
            riskReferenceHint:
                'El nivel de riesgo se genera automáticamente según el contenido del paquete Skill y es solo una referencia.\nBajo: sin riesgos evidentes\nMedio: scripts, dependencias, URL externas o variables de entorno\nAlto: ejecución remota, información sensible o comandos peligrosos',
            riskCheckResult: 'Resultado de seguridad',
            noRiskFound: 'No se encontraron riesgos evidentes.',
            riskFilePath: 'Ruta del archivo',
            riskKeyword: 'Palabra clave o regla coincidente',
            riskDescription: 'Descripción del riesgo',
            publishHighRiskConfirm:
                'Este Skill tiene elementos de alto riesgo y puede contener ejecución de scripts, descargas externas o acceso a información sensible. ¿Publicarlo de todos modos?',
            approve: 'Aprobar',
            reject: 'Rechazar',
            publish: 'Publicar',
            disable: 'Retirar',
            customTarget: 'Agente personalizado',
            addCustomTarget: 'Agregar agente',
            installToTarget: 'Instalar en agente personalizado',
            hostSkillDir: 'Directorio de Skills',
            hostSkillDirHelper: 'Introduzca la ruta del directorio de Skills del nodo.',
            installMethod: 'Método de instalación',
            copy: 'Copiar',
            extract: 'Extraer',
            postInstallCommand: 'Comando posterior a la instalación',
            localSource: 'Carga local',
            uploadDragTitle: 'Arrastre el paquete Skill aquí o haga clic para subirlo',
            uploadFormatLabel: 'Formatos:',
            uploadFormatValue: '.zip, .7z, .tar, .tar.gz',
            uploadSizeLabel: 'Tamaño:',
            uploadSizeValue: 'No más de 5 MB por archivo',
            uploadRequirementLabel: 'Requisito:',
            uploadRequirementPrefix: 'El paquete Skill debe contener',
            onlySupportedArchive: 'Solo se pueden subir paquetes Skill .zip, .7z, .tar y .tar.gz',
            uploadSizeExceeded: 'Un paquete Skill no puede superar los 5 MB',
            uploadSuccess: 'Skill subido correctamente y en estado pendiente de revisión.',
            versionAutoFillPlaceholder:
                'Se detecta automáticamente desde el nombre del archivo cuando sea posible. Confirme o introdúzcalo manualmente',
            metadataOverwriteConfirm:
                'La versión del paquete Skill es diferente del valor introducido. ¿Usar el valor actual?',
            metadataOverwriteConfirmWithVersions:
                'La versión del paquete Skill es diferente del valor introducido. Versión del paquete: {packageVersion}; versión introducida: {inputVersion}. ¿Usar el valor actual?',
            offlineNotice: 'El entorno actual está sin conexión. Solo se pueden instalar Skills desde la tienda local.',
            publishConfirm: '¿Publicar este Skill? Después se podrá instalar desde la tienda local de Skills.',
            disableConfirm: '¿Retirar este Skill? Los Skills ya instalados en agentes no se verán afectados.',
            deleteConfirm:
                '¿Eliminar este Skill? Esta acción no se puede deshacer. Los Skills ya instalados en agentes no se verán afectados.',
            rejectConfirm: '¿Rechazar la revisión de este Skill? Pasará al estado rechazado.',
            downloadPublishedOnly: 'Solo se pueden descargar paquetes Skill publicados.',
            deleteTargetConfirm:
                '¿Eliminar este agente personalizado? Los usuarios ya no podrán seleccionar este destino de instalación.',
            noInstallTarget: 'No hay agentes personalizados disponibles. Configure primero un destino de instalación.',
            postInstallConfirm:
                'Este destino tiene un comando posterior a la instalación. Confirme que el comando es confiable antes de ejecutarlo.',
            status: {
                pending: 'Pendiente',
                approved: 'Aprobado',
                published: 'Publicado',
                disabled: 'Retirado',
                rejected: 'Rechazado',
                deleted: 'Eliminado',
            },
            agent: {
                common: 'Común',
            },
            risk: {
                low: 'Bajo',
                medium: 'Medio',
                high: 'Alto',
            },
            riskType: {
                script_file: 'Archivo de script',
                dependency_manifest: 'Declaración de dependencias',
                external_url: 'URL externa',
                environment_variable: 'Variable de entorno',
                dockerfile: 'Dockerfile',
                command_execution: 'Ejecución de comandos',
                remote_script_execution: 'Ejecución de script remoto',
                eval_execution: 'Ejecución dinámica',
                base64_execution: 'Ejecución tras decodificar Base64',
                privileged_command: 'Comando privilegiado',
                dangerous_delete: 'Eliminación peligrosa',
                world_writable_permission: 'Permiso de alto riesgo',
                credential: 'Credencial sospechosa',
                sensitive_path: 'Ruta sensible',
                suspicious_download_execute: 'Descarga y ejecución sospechosa',
                binary_content: 'Contenido binario',
                scan_truncated: 'Escaneo truncado',
            },
            riskDescriptionText: {
                script_file: 'Contiene archivos de script que pueden ejecutar comandos locales.',
                dependency_manifest:
                    'Contiene declaraciones de dependencias que pueden descargar dependencias externas.',
                external_url: 'Contiene URL externas. Verifique que las direcciones de salida sean confiables.',
                environment_variable: 'Declara variables de entorno. Verifique su uso y valores predeterminados.',
                dockerfile: 'Contiene un Dockerfile que puede definir compilación de imagen o lógica de ejecución.',
                command_execution:
                    'Contiene llamadas relacionadas con ejecución de comandos. Verifique que sean confiables.',
                remote_script_execution: 'Contiene lógica que descarga y ejecuta directamente un script remoto.',
                eval_execution: 'Contiene ejecución dinámica mediante eval.',
                base64_execution: 'Contiene lógica que ejecuta contenido después de decodificar Base64.',
                privileged_command: 'Contiene comandos sudo de elevación de privilegios.',
                dangerous_delete: 'Contiene comandos de eliminación peligrosos.',
                world_writable_permission: 'Contiene cambios de permisos chmod 777.',
                credential: 'Contiene posibles API Key, Token, Secret o Password.',
                sensitive_path: 'Contiene acceso a directorios o archivos sensibles.',
                suspicious_download_execute: 'Contiene lógica sospechosa de descarga externa o descarga y ejecución.',
                binary_content: 'El archivo contiene bytes NUL y puede ocultar contenido ejecutable o binario.',
                scan_truncated:
                    'El archivo supera el límite de escaneo. El contenido no escaneado requiere revisión manual.',
            },
        },
        benchmark: {
            title: 'Benchmark',
            launchCommand: 'Comando de inicio',
            retest: 'Volver a probar',
            statusRunning: 'En ejecución',
            statusWaiting: 'En espera',
            base: 'Información básica',
            backend: 'Backend',
            baseUrl: 'URL base',
            endpoint: 'Endpoint',
            tokenizer: 'Tokenizador',
            tokenizerPlaceholder:
                'Seleccione o introduzca un directorio local de tokenizador, p. ej. /opt/1panel/tokenizers/DeepSeek-V3',
            runConfig: 'Configuración de ejecución',
            rawResult: 'Resultado bruto',
            resultMetrics: 'Métricas de resultado',
            contextTokens: 'Longitud de contexto',
            contextTokensHelper: 'Suma del límite de tokens de entrada y salida de este benchmark.',
            outputThroughput: 'Rendimiento de salida',
            outputThroughputHelper: 'Tokens de salida generados por segundo. Un valor mayor indica más velocidad.',
            totalThroughput: 'Rendimiento total',
            totalThroughputHelper:
                'Tokens de entrada y salida procesados por segundo. Se usa para medir la capacidad general.',
            firstTokenLatency: 'Latencia del primer token',
            firstTokenLatencyHelper:
                'Tiempo desde el envío de la solicitud hasta recibir el primer token. Un valor menor indica respuesta más rápida.',
            tokenValueHelper: 'Introduzca un entero positivo o valor con k, p. ej. 512, 1k, 32k',
            numPrompts: 'Prompts',
            concurrency: 'Concurrencia',
            mean: 'Media',
            median: 'Mediana',
            requestRate: 'Tasa de solicitudes',
            requestRateUnlimited: 'Ilimitado (máximo rendimiento)',
            requestRateCustom: 'QPS personalizado',
            requestRateCustomPlaceholder: 'Solicitudes por segundo, p. ej. 2.5',
            successfulRequests: 'Solicitudes correctas',
            requestThroughput: 'Rendimiento de solicitudes',
            timeout: 'Tiempo de espera (segundos)',
            image: 'Imagen vLLM',
            ignoreEos: 'Ignorar EOS',
            extraHeaders: 'Encabezados adicionales',
        },
        gpu: {
            gpu: 'Monitoreo de GPU',
            gpuHelper: 'El sistema no detectó comandos NVIDIA-SMI o XPU-SMI. ¡Compruebe e inténtelo de nuevo!',
            process: 'Información del Proceso',
            type: 'Tipo',
            typeG: 'Gráficos',
            typeC: 'Cómputo',
            typeCG: 'Cómputo+Gráficos',
            processName: 'Nombre del Proceso',
            shr: 'Memoria Compartida',
            temperatureHelper: 'La alta temperatura de la GPU puede causar una reducción de la frecuencia de la GPU',
            gpuUtil: 'Utilización de GPU',
            temperature: 'Temperatura',
            performanceState: 'Estado de Rendimiento',
            powerUsage: 'Consumo de Energía',
            memoryUsage: 'Utilización de Memoria',
            fanSpeed: 'Velocidad del Ventilador',
            power: 'Energía',
            powerCurrent: 'Energía Actual',
            powerLimit: 'Límite de Energía',
            memory: 'Memoria',
            memoryUsed: 'Memoria Utilizada',
            memoryTotal: 'Memoria Total',
            percent: 'Utilización',
            base: 'Información Básica',
            driverVersion: 'Versión del Controlador',
            cudaVersion: 'Versión de CUDA',
            processMemoryUsage: 'Uso de Memoria',
            performanceStateHelper: 'Desde P0 (rendimiento máximo) hasta P12 (rendimiento mínimo)',
            busID: 'Dirección del Bus',
            persistenceMode: 'Modo de Persistencia',
            enabled: 'Habilitado',
            disabled: 'Deshabilitado',
            persistenceModeHelper:
                'El modo de persistencia responde a las tareas más rápidamente, pero el consumo de energía en espera aumentará en consecuencia',
            displayActive: 'Inicialización de GPU',
            displayActiveT: 'Sí',
            displayActiveF: 'No',
            ecc: 'Tecnología de Corrección de Errores',
            computeMode: 'Modo de Computación',
            default: 'Predeterminado',
            exclusiveProcess: 'Proceso Exclusivo',
            exclusiveThread: 'Hilo Exclusivo',
            prohibited: 'Prohibido',
            defaultHelper: 'Predeterminado: Los procesos pueden ejecutarse concurrentemente',
            exclusiveProcessHelper:
                'Proceso Exclusivo: Solo un contexto CUDA puede usar la GPU, pero puede ser compartido por múltiples hilos',
            exclusiveThreadHelper: 'Hilo Exclusivo: Solo un hilo en un contexto CUDA puede usar la GPU',
            prohibitedHelper: 'Prohibido: No se permite la ejecución concurrente de procesos',
            migModeHelper:
                'Se utiliza para crear instancias MIG, implementando aislamiento físico de GPU en la capa de usuario.',
            migModeNA: 'No Compatible',
            current: 'Monitoreo en Tiempo Real',
            history: 'Registros Históricos',
            notSupport: 'La versión actual o el controlador no admiten mostrar este parámetro.',
            processCount: 'Procesos',
        },
        mcp: {
            server: 'Servidor MCP',
            baseUrl: 'Ruta de acceso externa',
            baseUrlHelper: 'Por ejemplo: http://192.168.1.2:8000',
            ssePath: 'Ruta SSE',
            ssePathHelper: 'Por ejemplo: /sse, asegúrese de que no se repita con otros servidores',
            environment: 'Variables de entorno',
            envKey: 'Nombre de la variable',
            envValue: 'Valor de la variable',
            externalUrl: 'Dirección de conexión externa',
            operatorHelper: 'Se realizará la operación {1} en {0}, ¿desea continuar?',
            domain: 'Dirección de acceso predeterminada',
            domainHelper: 'Por ejemplo: 192.168.1.1 o ejemplo.com',
            bindDomain: 'Vincular sitio web',
            commandPlaceHolder: 'Actualmente solo se admiten comandos de inicio npx y binarios',
            importMcpJson: 'Importar configuración del servidor MCP',
            importMcpJsonError: 'La estructura de mcpServers es incorrecta',
            bindDomainHelper:
                'Al vincular el sitio web, se modificará la dirección de acceso de todos los servidores MCP instalados y se cerrará el acceso externo a los puertos',
            outputTransport: 'Tipo de salida',
            streamableHttpPath: 'Ruta de transmisión',
            streamableHttpPathHelper:
                'Por ejemplo: /mcp, tenga en cuenta que no debe superponerse con otros servidores',
            npxHelper: 'Adecuado para mcp iniciado con npx o binario',
            uvxHelper: 'Adecuado para mcp iniciado con uvx',
            protocolVersion: 'Versión del protocolo',
            protocolVersionHelper:
                'Solo se utiliza con Streamable HTTP sin estado para inicializar automáticamente el servidor MCP stdio descendente',
            gatewayArgsHelper:
                'Los argumentos se añaden al comando supergateway. No se pueden cambiar los argumentos de transporte, puerto, ruta y protocolo gestionados por 1Panel',
            testConnection: 'Probar conexión',
            connectionSuccess: 'Conexión correcta',
            connectionFailed: 'Error de conexión',
        },
        tensorRT: {
            llm: 'TensorRT LLM',
            modelDir: 'Directorio del Modelo',
            commandHelper:
                'Si se necesita acceso externo, establezca el puerto en el comando para que sea el mismo que el puerto de la aplicación',
            imageAlert:
                'Debido al gran tamaño de la imagen, se recomienda descargar manualmente la imagen al servidor antes de la instalación',
            modelSpeedup: 'Habilitar aceleración de modelo',
            modelType: 'Tipo de modelo',
        },
    },
    container: {
        createByCommand: 'Crear por comando',
        importContainerBackupTip: 'Importar archivo de copia de seguridad de contenedor, solo se admite .tar.gz',
        importComposeBackupTip: 'Importar archivo de copia de seguridad de compose, solo se admite .tar.gz',
        stopContainerBeforeBackup: 'Detener contenedor antes de la copia de seguridad',
        stopComposeBeforeBackup: 'Detener compose antes de la copia de seguridad',
        stopBeforeBackupHelper:
            'Al habilitarlo, se detendrá el contenedor o servicio compose antes del respaldo y se restaurará automáticamente al finalizar para garantizar la consistencia de datos.',
        commandInput: 'Introducir comando',
        commandRule: 'Por favor introduzca el comando correcto para crear el contenedor con docker run.',
        commandHelper: 'Este comando se ejecutará en el servidor para crear el contenedor. ¿Desea continuar?',
        updateHelper1:
            'Se detectó que este contenedor proviene de la tienda de aplicaciones. Tenga en cuenta lo siguiente:',
        updateHelper2:
            '1. Las modificaciones actuales no se sincronizarán con las aplicaciones instaladas en la tienda.',
        updateHelper3:
            '2. Si modifica la aplicación en la página de instalados, el contenido editado actualmente quedará inválido.',
        updateHelper4:
            'Editar el contenedor requiere reconstruirlo y se perderán los datos no persistentes. ¿Desea continuar?',
        containerList: 'Lista de contenedores',
        operatorHelper: 'Se realizará {0} en el siguiente contenedor, ¿desea continuar?',
        operatorAppHelper:
            'La operación "{0}" se realizará en los siguientes contenedores y puede afectar los servicios en ejecución. ¿Desea continuar?',
        containerDeleteHelper:
            "Se detectó que el contenedor proviene de la Tienda de Aplicaciones. Eliminar el contenedor no lo eliminará completamente de 1Panel. Para eliminarlo por completo, vaya a la Tienda de Aplicaciones -> menús 'Instalado' o 'Entorno de Ejecución'. ¿Continuar?",
        start: 'Iniciar',
        stop: 'Detener',
        restart: 'Reiniciar',
        kill: 'Finalizar',
        pause: 'Pausar',
        unpause: 'Reanudar',
        rename: 'Renombrar',
        remove: 'Eliminar',
        removeAll: 'Eliminar todos',
        containerPrune: 'Limpiar',
        containerPruneHelper1: 'Esto eliminará todos los contenedores que estén detenidos.',
        containerPruneHelper2:
            'Si los contenedores son de la tienda de aplicaciones, vaya a "Tienda de Aplicaciones -> Instaladas" y haga clic en "Reconstruir" para reinstalarlos después de la limpieza.',
        containerPruneHelper3: 'Esta operación no se puede deshacer. ¿Desea continuar?',
        imagePrune: 'Limpiar',
        imagePruneSome: 'Limpiar sin etiqueta',
        imagePruneSomeEmpty: 'No hay imágenes con la etiqueta "none" para limpiar.',
        imagePruneSomeHelper:
            'Limpia las imágenes con la etiqueta "none" que no estén siendo usadas por ningún contenedor.',
        imagePruneAll: 'Limpiar no usadas',
        imagePruneAllEmpty: 'No hay imágenes sin uso para limpiar.',
        imagePruneAllHelper: 'Limpia las imágenes que no estén siendo usadas por ningún contenedor.',
        networkPrune: 'Limpiar',
        networkPruneHelper: 'Esto eliminará todas las redes no utilizadas. ¿Desea continuar?',
        volumePrune: 'Limpiar',
        volumePruneHelper: 'Esto eliminará todos los volúmenes locales no utilizados. ¿Desea continuar?',
        cleanSuccess: 'La operación se completó correctamente, cantidad limpiada: {0}!',
        cleanSuccessWithSpace:
            'La operación se completó correctamente. El número de discos limpiados esta vez es {0}. El espacio liberado es {1}!',
        unExposedPort: 'La dirección de mapeo del puerto actual es 127.0.0.1, lo que impide el acceso externo.',
        upTime: 'Tiempo activo',
        fetch: 'Obtener',
        lines: 'Líneas',
        linesHelper: 'Por favor introduzca el número correcto de líneas de logs a recuperar.',
        downloadLinesHelper: 'Seleccione o introduzca el número de líneas de log para descargar.',
        lastDay: 'Último día',
        last4Hour: 'Últimas 4 horas',
        lastHour: 'Última hora',
        last10Min: 'Últimos 10 minutos',
        cleanLogscope: 'Tipo de limpieza',
        cleanLog: 'Limpiar logs',
        downLogHelper1: 'Esto descargará todos los logs del contenedor {0}. ¿Desea continuar?',
        downLogHelper2: 'Esto descargará los últimos {1} logs del contenedor {0}. ¿Desea continuar?',
        cleanLogHelper: 'Esto requerirá reiniciar el contenedor y no se puede deshacer. ¿Desea continuar?',
        newName: 'Nuevo nombre',
        workingDir: 'Directorio de trabajo',
        composeFileMissing: 'No se detecto el archivo de Compose',
        source: 'Uso de recursos',
        cpuUsage: 'Uso de CPU',
        cpuTotal: 'CPU total',
        core: 'Núcleo',
        memUsage: 'Uso de memoria',
        memTotal: 'Límite de memoria',
        memCache: 'Caché de memoria',
        loadSize: 'Obtener Tamaño del Contenedor',
        ip: 'Dirección IP',
        cpuShare: 'Proporción de CPU',
        cpuShareHelper:
            'El motor de contenedores usa un valor base de 1024 para la proporción de CPU. Puede aumentarlo para darle al contenedor más tiempo de CPU.',
        inputIpv4: 'Ejemplo: 192.168.1.1',
        inputIpv6: 'Ejemplo: 2001:0db8:85a3:0000:0000:8a2e:0370:7334',
        diskUsage: 'Uso del Disco',
        localVolume: 'Volumen de Almacenamiento Local',
        buildCache: 'Caché de Construcción',
        usage: 'Usado: {0}, Liberable: {1}',
        clean: 'Liberar',
        imageClean:
            'Limpiar imágenes eliminará todas las imágenes no utilizadas. Esta operación no se puede deshacer. ¿Continuar?',
        containerClean:
            'Limpiar contenedores eliminará todos los contenedores detenidos (incluidas las aplicaciones detenidas de la Tienda de Aplicaciones). Esta operación no se puede deshacer. ¿Continuar?',
        sizeRw: 'Tamaño de Capa de Contenedor',
        sizeRwHelper: 'Tamaño de la capa escribible exclusiva del contenedor',
        sizeRootFs: 'Tamaño Virtual',
        sizeRootFsHelper:
            'Tamaño total de todas las capas de imagen de las que depende el contenedor + capa del contenedor',
        containerFromAppHelper:
            'Se detectó que este contenedor proviene de la tienda de aplicaciones. Las operaciones sobre la app pueden invalidar los cambios actuales.',
        containerFromAppHelper1:
            'Haga clic en el botón [Parámetros] en la lista de aplicaciones instaladas para acceder a la página de edición y modificar el nombre del contenedor.',
        command: 'Comando',
        console: 'Interacción con el contenedor',
        tty: 'Asignar un pseudo-TTY (-t)',
        openStdin: 'Mantener STDIN abierto (-i)',
        custom: 'Personalizado',
        emptyUser: 'Si está vacío, iniciará sesión como predeterminado',
        privileged: 'Privilegiado',
        privilegedHelper:
            'Permite que el contenedor realice ciertas operaciones privilegiadas en el host, lo que puede aumentar los riesgos. ¡Úselo con precaución!',
        upgradeHelper: 'Nombre de repositorio/imagen: versión de la imagen',
        upgradeWarning2:
            'La operación de actualización requiere reconstruir el contenedor, cualquier dato no persistente se perderá. ¿Desea continuar?',
        oldImage: 'Imagen actual',
        sameImageContainer: 'Contenedores de la misma imagen',
        sameImageHelper:
            'Los contenedores que usan la misma imagen pueden actualizarse en lote después de seleccionarlos',
        targetImage: 'Imagen objetivo',
        imageLoadErr: 'No se detectó un nombre de imagen para el contenedor',
        imageUpdateTagEmpty: 'No se detectaron etiquetas de imagen actualizables',
        appHelper:
            'El contenedor proviene de la tienda de aplicaciones, y al actualizar podría hacer que el servicio no esté disponible.',
        resource: 'Recurso',
        input: 'Introducir manualmente',
        forcePull: 'Siempre descargar imagen',
        forcePullHelper:
            'Esto ignorará las imágenes existentes en el servidor y descargará la más reciente desde el repositorio.',
        imageUpdateHelper:
            'Comprobar la misma etiqueta en el registro y, si hay cambios, descargar y actualizar la imagen local.',
        server: 'Servidor',
        serverExample: '80, 80-88, ip:80 o ip:80-88',
        containerExample: '80 o 80-88',
        exposePort: 'Exponer puerto',
        exposeAll: 'Exponer todos',
        cmdHelper: 'Ejemplo: nginx -g "daemon off;"',
        entrypointHelper: 'Ejemplo: docker-entrypoint.sh',
        autoRemove: 'Eliminar automáticamente',
        cpuQuota: 'Cantidad de núcleos de CPU',
        memoryLimit: 'Memoria',
        limitHelper: 'Si se establece en 0, no hay limitación. El valor máximo es {0}',
        macAddr: 'Dirección MAC',
        mount: 'Montaje',
        volumeOption: 'Volumen',
        hostOption: 'Host',
        serverPath: 'Ruta en el servidor',
        containerDir: 'Ruta en el contenedor',
        volumeHelper: 'Asegúrese de que el contenido del volumen de almacenamiento sea correcto',
        networkEmptyHelper: 'Por favor confirme que la selección de red del contenedor es correcta',
        modeRW: 'RW',
        modeR: 'R',
        sharedLabel: 'Modo de Propagación',
        private: 'Privado',
        privateHelper: 'Los cambios de montaje en el contenedor y el host no se afectan mutuamente',
        rprivate: 'Privado Recursivo',
        rprivateHelper: 'Todos los montajes en el contenedor están completamente aislados del host',
        shared: 'Compartido',
        sharedHelper: 'Los cambios de montaje en el host y el contenedor son visibles entre sí',
        rshared: 'Compartido Recursivo',
        rsharedHelper: 'Todos los cambios de montaje en el host y el contenedor son visibles entre sí',
        slave: 'Esclavo',
        slaveHelper:
            'El contenedor puede ver los cambios de montaje del host, pero sus propios cambios no afectan al host',
        rslave: 'Esclavo Recursivo',
        rslaveHelper: 'Todos los montajes en el contenedor pueden ver los cambios del host, pero no afectan al host',
        mode: 'Modo',
        env: 'Entornos',
        restartPolicy: 'Política de reinicio',
        always: 'siempre',
        unlessStopped: 'a menos que se detenga',
        onFailure: 'al fallar (cinco veces por defecto)',
        no: 'nunca',
        refreshTime: 'Intervalo de actualización',
        cache: 'Caché',
        image: 'Imagen | Imágenes',
        imagePull: 'Descargar',
        imagePullHelper:
            'Admite seleccionar múltiples imágenes para descargar, presione Enter después de ingresar cada imagen para continuar',
        imagePush: 'Subir',
        imagePushHelper:
            'Se detectó que esta imagen tiene varias etiquetas. Confirme que el nombre de imagen utilizado para enviarla es: {0}',
        imageDelete: 'Eliminar imagen',
        repoName: 'Repositorio de contenedores',
        imageName: 'Nombre de la imagen',
        pull: 'Descargar',
        path: 'Ruta',
        importImage: 'Importar',
        buildArgs: 'Argumentos de Construcción',
        imageBuild: 'Construir',
        pathSelect: 'Ruta',
        label: 'Etiqueta',
        imageTag: 'Etiqueta de imagen',
        imageTagHelper:
            'Admite configurar múltiples etiquetas de imagen, presione Enter después de ingresar cada etiqueta para continuar',
        push: 'Subir',
        fileName: 'Nombre de archivo',
        export: 'Exportar',
        exportImage: 'Exportar imagen',
        size: 'Tamaño',
        tag: 'Etiquetas',
        tagHelper: 'Una por línea. Por ejemplo,\nkey1=value1\nkey2=value2',
        imageNameHelper: 'Nombre de imagen y etiqueta, por ejemplo: nginx:latest',
        cleanBuildCache: 'Limpiar caché de compilación',
        delBuildCacheHelper:
            'Esto eliminará todos los artefactos almacenados en caché generados durante las compilaciones y no se puede deshacer. ¿Desea continuar?',
        urlWarning: 'El prefijo de la URL no debe incluir http:// o https://. Por favor modifique.',
        network: 'Red | Redes',
        networkHelper:
            'Esto puede causar que algunas aplicaciones o entornos no funcionen correctamente. ¿Desea continuar?',
        networkName: 'Nombre',
        driver: 'Driver',
        option: 'Opción',
        attachable: 'Adjuntable',
        parentNetworkCard: 'Tarjeta de Red Principal',
        subnet: 'Subred',
        scope: 'Rango de IP',
        gateway: 'Puerta de enlace',
        auxAddress: 'Excluir IP',
        volume: 'Volumen | Volúmenes',
        volumeDir: 'Directorio de volumen',
        nfsEnable: 'Habilitar almacenamiento NFS',
        nfsAddress: 'Dirección',
        mountpoint: 'Punto de montaje',
        mountpointNFSHelper: 'ej: /nfs, /nfs-share',
        options: 'Opciones',
        repo: 'Repositorio | Repositorios',
        httpRepoHelper: 'Operar un repositorio tipo HTTP requiere reiniciar el servicio Docker.',
        httpRepo:
            'Elegir el protocolo HTTP requiere reiniciar el servicio Docker para agregarlo a los registros inseguros.',
        delInsecure: 'Eliminar registro inseguro',
        delInsecureHelper:
            'Esto reiniciará el servicio Docker para quitarlo de los registros inseguros. ¿Desea continuar?',
        downloadUrl: 'Servidor',
        imageRepo: 'Repositorio de imágenes',
        repoHelper: '¿Incluye un repositorio/organización/proyecto mirror?',
        auth: 'Requiere autenticación',
        mirrorHelper:
            'Si hay varios mirrors, deben estar en líneas separadas. Ejemplo:\nhttp://xxxxxx.m.daocloud.io\nhttps://xxxxxx.mirror.aliyuncs.com',
        registrieHelper:
            'Si existen varios repositorios privados, deben estar en líneas separadas. Ejemplo:\n172.16.10.111:8081\n172.16.10.112:8081',
        compose: 'Compose | Composes',
        composeFile: 'Archivo de Orquestación',
        fromChangeHelper: 'Cambiar la fuente limpiará el contenido actualmente editado. ¿Desea continuar?',
        composePathHelper:
            'Ruta de guardado del archivo Compose: {0}; si se especifica un nombre de proyecto en Docker Compose, tendrá prioridad; de lo contrario, se usará {1}.',
        composeNamePriorityHelper:
            'Prioridad del nombre del proyecto: nombre especificado en la configuración de Docker Compose > directorio padre del archivo > nombre indicado aquí.',
        composeHelper:
            'La composición creada mediante el editor o plantilla de 1Panel se guardará en el directorio {0}/docker/compose.',
        deleteFile: 'Eliminar archivo',
        deleteComposeHelper:
            'Elimina todos los archivos relacionados con la composición de contenedores, incluidos los archivos de configuración y los persistentes. ¡Proceda con precaución!',
        deleteCompose: '" Eliminar esta composición.',
        composeDirectory: 'Directorio de compose',
        template: 'Plantilla',
        composeTemplate: 'Plantilla de compose | Plantillas de compose',
        content: 'Contenido',
        contentEmpty: 'El contenido de Compose no puede estar vacío, por favor introduzca algo y vuelva a intentarlo.',
        containerNumber: 'Número de contenedores',
        containerStatus: 'Estado del contenedor',
        exited: 'Finalizado',
        running: 'En ejecución ({0}/{1})',
        composeDetailHelper:
            'La composición fue creada externamente a 1Panel. Las operaciones de inicio y detención no son compatibles.',
        composeOperatorHelper: 'La operación {1} se realizará en {0}. ¿Desea continuar?',
        composeDownHelper:
            'Esto detendrá y eliminará todos los contenedores y redes bajo la composición {0}. ¿Desea continuar?',
        composeEnvHelper2:
            'Esta orquestación fue creada por la Tienda de Aplicaciones 1Panel. Modifique las variables de entorno en las aplicaciones instaladas.',
        composeContentPlaceholder: 'Escriba o pegue el contenido de su archivo docker-compose aquí',
        setting: 'Configuración | Configuraciones',
        goSetting: 'Ir a configuración',
        restartHelper: 'Los cambios de configuración requieren reiniciar el servicio Docker para surtir efecto',
        operatorStatusHelper: 'Esto "{0}" el servicio Docker. ¿Desea continuar?',
        dockerStatus: 'Servicio Docker',
        daemonJsonPathHelper:
            'Asegúrese de que la ruta de configuración sea la misma que la especificada en docker.service.',
        mirrors: 'Mirrors del registro',
        mirrorsHelper:
            'Utilice primero las URL de los mirrors del registro para las operaciones con imágenes. Déjelo vacío para desactivar los mirrors del registro.',
        mirrorsHelper2: 'Para más detalles, consulte la documentación oficial.',
        registries: 'Registros inseguros',
        ipv6Helper:
            'Al habilitar IPv6, necesita agregar una red de contenedores IPv6. Consulte la documentación oficial para pasos específicos de configuración.',
        ipv6CidrHelper: 'Rango de pool de direcciones IPv6 para contenedores',
        ipv6TablesHelper: 'Configuración automática de reglas iptables para Docker IPv6.',
        experimentalHelper:
            'Para habilitar ip6tables, debe activar esta configuración; de lo contrario, se ignorará ip6tables.',
        cutLog: 'Opción de logs',
        cutLogHelper1: 'La configuración actual solo afectará a los contenedores nuevos.',
        cutLogHelper2: 'Los contenedores existentes deben ser recreados para que la configuración surta efecto.',
        cutLogHelper3:
            'Tenga en cuenta que recrear los contenedores puede provocar la pérdida de datos. Si contienen información importante, realice una copia de seguridad antes de reconstruir.',
        maxSize: 'Tamaño máximo',
        maxFile: 'Archivo máximo',
        liveHelper:
            'Por defecto, cuando el demonio Docker termina, detiene los contenedores en ejecución. Puede configurar el demonio para que los contenedores sigan en ejecución si el demonio no está disponible. Esta función se llama "live restore" y ayuda a reducir el tiempo fuera de servicio por caídas, mantenimientos o actualizaciones.',
        liveWithSwarmHelper: 'La configuración live-restore es incompatible con el modo swarm.',
        iptablesDisable: 'Desactivar iptables',
        iptablesHelper1: 'Configuración automática de reglas iptables para Docker.',
        iptablesHelper2: 'Deshabilitar iptables impedirá que los contenedores se comuniquen con redes externas.',
        daemonJsonPath: 'Ruta de configuración',
        serviceUnavailable: 'El servicio Docker no está iniciado actualmente.',
        startIn: ' para iniciar',
        sockPath: 'Socket Unix',
        sockPathHelper: 'Canal de comunicación entre el demonio Docker y el cliente.',
        sockPathHelper1: 'Ruta predeterminada: /var/run/docker-x.sock',
        sockPathMsg:
            'Guardar la configuración del Socket puede dejar el servicio Docker fuera de servicio. ¿Desea continuar?',
        sockPathErr: 'Por favor seleccione o introduzca la ruta correcta del archivo Docker sock',
        related: 'Relacionado',
        includeAppstore: 'Mostrar contenedores de la tienda',
        excludeAppstore: 'Ocultar contenedores de la tienda',
        cleanDockerDiskZone: 'Limpiar el espacio en disco usado por Docker',
        cleanImagesHelper: '( Limpia todas las imágenes que no están siendo usadas por ningún contenedor )',
        cleanContainersHelper: '( Limpia todos los contenedores detenidos )',
        cleanVolumesHelper: '( Limpia todos los volúmenes locales no utilizados )',
        makeImage: 'Crear imagen',
        newImageName: 'Nuevo nombre de imagen',
        commitMessage: 'Mensaje de commit',
        author: 'Autor',
        ifPause: '¿Pausar el contenedor durante la creación?',
        ifMakeImageWithContainer: '¿Crear nueva imagen a partir de este contenedor?',
        finishTime: 'Hora de la última detención',
        exportHelper: 'Exporta las imágenes seleccionadas en un solo archivo tar.',
    },
    cronjob: {
        importHelper:
            'Las tareas programadas duplicadas se omitirán automáticamente durante la importación. Las tareas se establecerán en estado [Deshabilitado] por defecto, y en estado [Pendiente de edición] cuando la asociación de datos sea anormal.',
        changeStatus: 'Cambiar estado',
        disableMsg: 'Esto detendrá la ejecución automática de la tarea programada. ¿Desea continuar?',
        enableMsg: 'Esto permitirá la ejecución automática de la tarea programada. ¿Desea continuar?',
        taskType: 'Tipo',
        nextTime: 'Próximas 5 ejecuciones',
        record: 'Registros',
        viewRecords: 'Ver registros',
        shell: 'Shell',
        stop: 'Detención Manual',
        stopHelper: 'Esta operación forzará la detención de la ejecución de la tarea actual. ¿Continuar?',
        log: 'Registros de respaldo',
        logHelper: 'Registro del sistema de copias de seguridad',
        logHelper2: '2. Registro de inicio de sesión SSH del servidor',
        logHelper3: '3. Todos los registros del sitio web',
        containerCheckBox: 'En contenedor (no necesita introducir el comando del contenedor)',
        containerName: 'Nombre del contenedor',
        ntp: 'Sincronización horaria',
        ntp_helper: 'Puede configurar el servidor NTP en la página de Configuración Rápida de la Caja de Herramientas.',
        app: 'Respaldo de aplicación',
        website: 'Respaldo de sitio web',
        rulesHelper:
            'Si hay varias reglas de exclusión de compresión, deben estar en líneas separadas. Ejemplo:\n*.log\n*.sql',
        lastRecordTime: 'Hora de la última ejecución',
        all: 'Todos',
        failedRecord: 'Registros fallidos',
        successRecord: 'Registros completados correctamente',
        database: 'Respaldo de base de datos',
        backupArgs: 'Argumentos de Copia de Seguridad',
        backupArgsHelper:
            'Los argumentos de copia de seguridad no listados pueden ser ingresados y seleccionados manualmente. Por ejemplo: Ingrese --no-data y seleccione la primera opción de la lista desplegable.',
        singleTransaction:
            'Copia de seguridad de tablas InnoDB utilizando una única transacción, adecuada para copias de seguridad de datos de gran volumen',
        quick: 'Lee datos fila por fila en lugar de cargar la tabla completa en memoria, adecuado para copias de seguridad de datos de gran volumen y máquinas con poca memoria',
        skipLockTables:
            'Copia de seguridad sin bloquear todas las tablas, adecuada para bases de datos altamente concurrentes',
        setGtidPurgedOff:
            'No exportar información GTID, adecuado para restaurar bases de datos en entornos de Group Replication',
        missBackupAccount: 'No se pudo encontrar la cuenta de respaldo',
        syncDate: 'Hora de sincronización',
        clean: 'Limpiar caché',
        curl: 'Acceder a URL',
        taskName: 'Nombre',
        cronSpec: 'Ciclo de ejecución',
        cronSpecDoc:
            'Los ciclos de ejecución personalizados solo admiten el formato [minuto hora día mes semana], por ejemplo, 0 0 * * *. Para más detalles, consulte la documentación oficial.',
        cronSpecHelper: 'Introduzca el periodo de ejecución correcto',
        cleanHelper:
            'Esta operación registra todos los registros de ejecución de tareas, archivos de respaldo y archivos de registro. ¿Desea continuar?',
        backupContent: 'Contenido de respaldo',
        directory: 'Directorio de respaldo',
        sourceDir: 'Directorio de respaldo',
        snapshot: 'Instantánea del sistema',
        allOptionHelper:
            'El plan actual es respaldar todos los [{0}]. La descarga directa no está soportada por ahora. Puede consultar la lista de respaldos en el menú [{0}].',
        exclusionRules: 'Reglas de exclusión',
        exclusionRulesHelper:
            'Seleccione o ingrese reglas de exclusión, presione Enter después de cada conjunto para continuar. Las reglas de exclusión se aplicarán a todas las operaciones de compresión en esta copia de seguridad',
        default_download_path: 'Enlace de descarga predeterminado',
        saveLocal: 'Retener respaldos locales (igual al número de copias en la nube)',
        url: 'Dirección URL',
        urlHelper: 'Por favor ingrese una dirección URL válida',
        targetHelper: 'Las cuentas de respaldo se gestionan en los ajustes del panel.',
        withImageHelper:
            'Respalda imágenes de la tienda de aplicaciones, pero esto aumentará el tamaño del archivo de la instantánea.',
        ignoreApp: 'Excluir aplicaciones',
        withImage: 'Copia de Seguridad de la Imagen de la Aplicación',
        retainCopies: 'Retener registros',
        retryTimes: 'Intentos de reintento',
        timeout: 'Tiempo de espera',
        ignoreErr: 'Ignorar errores',
        ignoreErrHelper: 'Ignora los errores durante el respaldo para asegurar que todas las tareas se completen',
        retryTimesHelper: '0 significa que no habrá reintentos tras un fallo',
        retainCopiesHelper: 'Número de copias a retener para registros y logs de ejecución',
        retainCopiesHelper1: 'Número de copias a retener para los archivos de respaldo',
        retainCopiesUnit: ' copias (Ver)',
        cronSpecRule:
            'El formato del periodo de ejecución en la línea {0} es incorrecto. ¡Por favor verifique e intente nuevamente!',
        cronSpecRule2: 'El formato del periodo de ejecución es incorrecto, por favor verifique e intente nuevamente.',
        perMonthHelper: 'Ejecutar el día {0} de cada mes a las {1}:{2}',
        perWeekHelper: 'Ejecutar cada semana el {0} a las {1}:{2}',
        perDayHelper: 'Ejecutar todos los días a las {0}:{1}',
        perHourHelper: 'Ejecutar cada hora en el minuto {0}',
        perNDayHelper: 'Ejecutar cada {0} días a las {1}:{2}',
        perNHourHelper: 'Ejecutar cada {0} horas en el minuto {1}',
        perNMinuteHelper: 'Ejecutar cada {0} minutos',
        perNSecondHelper: 'Ejecutar cada {0} segundos',
        perMonth: 'Cada mes',
        perWeek: 'Cada semana',
        perHour: 'Cada hora',
        perNDay: 'Cada N días',
        perDay: 'Cada día',
        perNHour: 'Cada N horas',
        perNMinute: 'Cada N minutos',
        perNSecond: 'Cada N segundos',
        day: 'día(s)',
        monday: 'Lunes',
        tuesday: 'Martes',
        wednesday: 'Miércoles',
        thursday: 'Jueves',
        friday: 'Viernes',
        saturday: 'Sábado',
        sunday: 'Domingo',
        shellContent: 'Script',
        executor: 'Ejecutor',
        errRecord: 'Registro incorrecto',
        errHandle: 'Fallo en la ejecución de la tarea programada',
        noRecord: 'Al activar la tarea programada, verá aquí los registros.',
        cleanData: 'Limpiar datos',
        cleanRemoteData: 'Eliminar datos remotos',
        cleanDataHelper: 'Elimina el archivo de respaldo generado por esta tarea.',
        noLogs: 'Aún no hay salida de tareas...',
        errPath: '¡Error en la ruta de respaldo [{0}], no se puede descargar!',
        cutWebsiteLog: 'Rotación de logs del sitio',
        cutWebsiteLogHelper: 'Los archivos de log rotados se respaldarán en el directorio de respaldos de 1Panel.',
        syncIpGroup: 'Sincronizar grupos de IP de WAF',
        syncIpGroupHelper: 'Sincroniza grupos de IP remotos usados en las listas negras/blancas de WAF',
        requestExpirationTime: 'Tiempo de expiración de solicitud de subida (Horas)',
        unitHours: 'Unidad: Horas',
        alertTitle: 'Tarea programada - {0} 「{1}」 Alerta de fallo',
        library: {
            script: 'Script',
            syncNow: 'Sincronizar Ahora',
            turnOnSync: 'Activar Sincronización Automática',
            turnOnSyncHelper:
                'Activar la sincronización automática realizará sincronizaciones automáticas durante las primeras horas de la madrugada diariamente',
            turnOffSync: 'Desactivar Sincronización Automática',
            turnOffSyncHelper:
                'Desactivar la sincronización automática puede causar retrasos en la sincronización de scripts, ¿confirmar?',
            isInteractive: 'Interactivo',
            interactive: 'Script interactivo',
            interactiveHelper:
                'Requiere introducir datos durante la ejecución y no puede ser usada en tareas programadas.',
            remoteLibrary: 'Biblioteca de Scripts Remota',
            library: 'Librería de scripts',
            create: 'Agregar script',
            edit: 'Editar script',
            groupHelper:
                'Establezca diferentes grupos según las características de los scripts, esto facilita el filtrado.',
            handleHelper: 'Ejecutar el script {1} en {0}, ¿desea continuar?',
            noSuchApp: 'No se detectó el servicio {0}. ¡Por favor instálelo desde la librería de scripts!',
            syncHelper:
                'Se va a sincronizar la librería de scripts del sistema. Solo afecta a los scripts del sistema. ¿Desea continuar?',
        },
        logHelper1: '1. Registro del sistema de 1Panel',
        cleanLog: 'Limpieza automática de logs',
        cleanLogscope: 'Retención de logs',
    },
    monitor: {
        globalFilter: 'Filtro Global',
        enableMonitor: 'Estado de Monitoreo',
        storeDays: 'Días de Retención',
        defaultNetwork: 'Tarjeta de Red Predeterminada',
        defaultNetworkHelper:
            'Opción de tarjeta de red predeterminada mostrada en las interfaces de monitoreo y resumen',
        defaultIO: 'Disco Predeterminado',
        defaultIOHelper: 'Opción de disco predeterminada mostrada en las interfaces de monitoreo y resumen',
        cleanMonitor: 'Limpiar Registros de Monitoreo',
        cleanHelper: 'Esta operación borrará todos los registros de monitoreo, incluidos los de GPU. ¿Continuar?',
        avgLoad: 'Carga promedio',
        loadDetail: 'Detalle de carga',
        resourceUsage: 'Utilización',
        networkCard: 'Interfaz de red',
        read: 'Lectura',
        write: 'Escritura',
        readWriteCount: 'Operaciones de E/S',
        readWriteTime: 'Latencia de E/S',
        today: 'Hoy',
        yesterday: 'Ayer',
        lastNDay: 'Últimos {0} días',
        lastNMonth: 'Últimos {0} meses',
        lastHalfYear: 'Último semestre',
        memory: 'Memoria',
        percent: 'Porcentaje',
        cache: 'Caché',
        disk: 'Disco',
        network: 'Red',
        up: 'Subida',
        down: 'Bajada',
        interval: 'Intervalo de Recolección',
        intervalHelper: 'Ingrese un intervalo de recolección de monitoreo apropiado (10 segundos - 12 horas)',
        runtimeDiagnostics: 'Diagnóstico en tiempo de ejecución',
        runtimeRSS: 'Memoria del proceso (RSS)',
        runtimeHeapAlloc: 'Memoria del heap',
        runtimeHeapObjects: 'Objetos del heap',
        runtimeGoroutines: 'Goroutines',
        goroutineSnapshot: 'Instantánea de Goroutines',
        goroutineSummary: '{0} goroutines agrupadas en {1} pilas de llamadas',
        goroutineTruncated: 'La instantánea es demasiado grande. Solo se muestran algunas pilas de llamadas.',
        captureSnapshot: 'Actualizar instantánea',
        count: 'Cantidad',
        topFunction: 'Función superior',
        manualCapture: 'Captura manual',
        startCapture: 'Iniciar captura',
        capturing: 'Capturando',
        captureSuccess: 'Archivo de diagnóstico generado; descarga iniciada',
        profileCPU: 'CPU',
        profileHeap: 'Heap',
        profileGoroutine: 'Goroutine',
        profileMutex: 'Mutex',
        profileBlock: 'Bloqueo',
        runtimeRSSDesc:
            'Memoria física ocupada por el proceso, incluido el heap de Go, las pilas de hilos y la memoria nativa.',
        runtimeHeapAllocDesc:
            'Memoria asignada en el heap de Go que aún no se ha liberado. Un crecimiento continuo puede indicar objetos retenidos.',
        runtimeHeapObjectsDesc:
            'Número de objetos vivos en el heap de Go. Un crecimiento continuo puede indicar objetos retenidos.',
        runtimeGoroutineDesc:
            'Tareas concurrentes ligeras actuales. Un crecimiento continuo puede indicar una fuga de goroutines.',
        profileCPUDesc:
            'Muestrea las pilas de CPU durante el tiempo seleccionado para localizar las funciones que consumen CPU.',
        profileHeapDesc:
            'Registra los objetos del heap aún en uso y sus pilas de asignación para investigar el crecimiento de memoria.',
        profileGoroutineDesc: 'Guarda el estado y la pila de cada goroutine y agrupa las rutas de llamada idénticas.',
        profileMutexDesc:
            'Mide el tiempo de espera causado por la contención de mutex para localizar bloqueos disputados.',
        profileBlockDesc: 'Mide los bloqueos en canales, select y primitivas de sincronización.',
    },
    terminal: {
        local: 'Local',
        defaultConn: 'Conexión predeterminada',
        defaultConnHelper:
            'Esta operación conectará automáticamente al terminal del nodo después de abrir el terminal para 【{0}】. ¿Continuar?',
        withReset: 'Restablecer Información de Conexión',
        localConnJump:
            'La información de conexión predeterminada se mantiene en [Terminal - Configuración]. Si la conexión falla, ¡edite allí!',
        nodeAdminLocalOnly: 'Los administradores de nodo solo pueden usar terminal local.',
        localHelper: 'El nombre `local` se utiliza solo para identificación interna del sistema',
        connLocalErr:
            'No se puede autenticar automáticamente, por favor introduzca la información de inicio de sesión del servidor local.',
        testConn: 'Probar conexión',
        saveAndConn: 'Guardar y conectar',
        connTestOk: 'La información de conexión es válida',
        connTestFailed: 'Conexión no disponible, por favor revise la información de conexión.',
        host: 'Host | Hosts',
        createConn: 'Nueva conexión',
        noHost: 'Sin host',
        groupChange: 'Cambiar grupo',
        expand: 'Expandir todo',
        fold: 'Contraer todo',
        batchInput: 'Procesamiento por lotes',
        quickCommand: 'Comando rápido | Comandos rápidos',
        noSuchCommand:
            'No se encontraron datos de comandos rápidos en el archivo CSV importado, ¡compruebe e inténtelo de nuevo!',
        quickCommandHelper: 'Puede usar comandos rápidos en la parte inferior de "Terminales -> Terminales".',
        groupDeleteHelper:
            'Después de eliminar el grupo, todas las conexiones pasarán al grupo predeterminado. ¿Desea continuar?',
        quickCommandBatchHelper:
            'Un comando rápido por línea, usando el formato Nombre---Comando, por ejemplo: Ver disco---df -h',
        command: 'Comando',
        quickCmd: 'Comando rápido',
        addHost: 'Agregar',
        localhost: 'Localhost',
        ip: 'Dirección',
        authMode: 'Autenticación',
        passwordMode: 'Contraseña',
        rememberPassword: 'Recordar autenticación',
        keyMode: 'Clave privada',
        key: 'Clave privada',
        keyPassword: 'Contraseña de la clave privada',
        emptyTerminal: 'No hay ninguna terminal conectada actualmente.',
        lineHeight: 'Altura de línea',
        letterSpacing: 'Espaciado de letras',
        fontSize: 'Tamaño de fuente',
        fontFamily: 'Conjunto de fuentes',
        fontFamilySupportHelper:
            'Seleccione o introduzca fuentes. El efecto depende de si el sistema del navegador tiene instalada la fuente; si no, se usará una de respaldo. Si queda vacío, se usará la fuente predeterminada.',
        backgroundColor: 'Color de fondo',
        foregroundColor: 'Color de primer plano',
        cursorBlink: 'Parpadeo del cursor',
        cursorStyle: 'Estilo de cursor',
        cursorUnderline: 'Subrayado',
        cursorBlock: 'Bloque',
        cursorBar: 'Barra',
        scrollback: 'Scrollback',
        scrollSensitivity: 'Sensibilidad de scroll',
        aiAssistant: 'Asistente de IA',
        aiAccountHelper:
            'Use la cuenta de modelo seleccionada para generar y rellenar comandos. Para modelos locales como Ollama y vLLM, use una cuenta de modelo personalizada.',
        aiPrefix: 'Prefijo de activación',
        aiPrefixHelper:
            'Introduzca "prefijo + espacio" y pulse Enter para activar la generación de comandos por IA; por ejemplo: {0} ayúdame a consultar la información del disco.',
        aiRiskCommands: 'Intercepción de comandos de riesgo',
        aiRiskCommandsHelper:
            'Configure los comandos de riesgo que se deben interceptar, uno por línea. Si coinciden, se bloqueará la generación y se devolverán como comentarios.',
        aiSummary:
            'Cuando una línea comienza con el prefijo {0} y pulsa Enter, se activa la generación de comandos por IA.',
        aiPrefixAsciiVisible:
            'Solo se admiten caracteres ASCII visibles. No se permiten espacios, caracteres CJK ni símbolos de ancho completo.',
        saveHelper: '¿Está seguro de que desea guardar la configuración actual de la terminal?',
    },
    toolbox: {
        common: {
            toolboxHelper: 'Para dudas de instalación y uso, consulte',
        },
        swap: {
            swap: 'Partición Swap',
            swapHelper1: 'El tamaño de swap debe ser de 1 a 2 veces la memoria física, ajustable según necesidades.',
            swapHelper2:
                'Antes de crear un archivo swap, asegúrese de que el disco tenga espacio suficiente, ya que el archivo ocupará ese espacio.',
            swapHelper3:
                'El swap ayuda a aliviar la presión de memoria, pero es solo un suplemento. Un uso excesivo puede afectar el rendimiento. Se recomienda aumentar memoria o optimizar el uso.',
            swapHelper4: 'Se recomienda monitorear regularmente el uso de swap para asegurar el funcionamiento normal.',
            swapDeleteHelper:
                'Esta operación eliminará la partición Swap {0}. Por seguridad, el archivo no se borrará automáticamente. Si requiere borrarlo, hágalo manualmente.',
            saveHelper: '¡Por favor guarde primero la configuración!',
            saveSwap: 'Guardar la configuración ajustará la partición Swap {0} a {1}. ¿Desea continuar?',
            swapMin: 'El tamaño mínimo es de 40 KB. ¡Por favor modifique y vuelva a intentar!',
            swapMax: 'El tamaño máximo es {0}. ¡Por favor modifique y vuelva a intentar!',
            swapOff: 'El tamaño mínimo es de 40 KB. Si lo pone en 0, desactivará la partición Swap.',
        },
        device: {
            dnsHelper: 'Servidor DNS',
            dnsAlert: '¡Atención! Modificar el archivo /etc/resolv.conf lo restaurará tras reiniciar el sistema.',
            dnsHelper1: 'Si hay varios DNS, deben ir en líneas nuevas. Ejemplo:\n114.114.114.114\n8.8.8.8',
            hostsHelper: 'Resolución de host',
            hosts: 'Dominio',
            hostAlert: 'Registros comentados ocultos, haga clic en Configuración completa para verlos o modificarlos.',
            toolbox: 'Configuraciones rápidas',
            hostname: 'Nombre del host',
            passwd: 'Contraseña del sistema',
            passwdHelper: 'Los caracteres no pueden incluir $ y &',
            timeZone: 'Zona horaria del sistema',
            localTime: 'Hora del servidor',
            timeZoneChangeHelper: 'Cambiar la zona horaria requiere reiniciar el servicio. ¿Continuar?',
            timeZoneHelper:
                'Si no tiene instalado "timedatectl", no podrá cambiar la zona horaria porque el sistema lo usa.',
            timeZoneCN: 'Beijing',
            timeZoneAM: 'Los Ángeles',
            timeZoneNY: 'Nueva York',
            ntpALi: 'Alibaba',
            ntpGoogle: 'Google',
            syncSite: 'Servidor NTP',
            hostnameHelper: 'El cambio de nombre depende de "hostnamectl". Si no está instalado, podría fallar.',
            userHelper: 'El nombre de usuario depende de "whoami". Si no está instalado, podría fallar.',
            passwordHelper: 'El cambio de contraseña depende de "chpasswd". Si no está instalado, podría fallar.',
            hostHelper: 'Hay un valor vacío en el contenido. Por favor, revise y modifique.',
            dnsCheck: 'Probar disponibilidad',
            dnsOK: '¡La configuración DNS es válida!',
            dnsTestFailed: 'La configuración DNS no es válida.',
            syncSiteHelper: '¿Sincronizar la hora del sistema con {0}?',
        },
        fail2ban: {
            sshPort: 'Puerto SSH',
            sshPortHelper: 'Fail2ban escucha el puerto SSH del host',
            unActive: 'El servicio Fail2ban no está habilitado actualmente.',
            operation: 'Va a realizar la operación "{0}" en Fail2ban. ¿Desea continuar?',
            fail2banChange: 'Modificación de configuración de Fail2ban',
            ignoreHelper: 'La lista de IPs permitidas será ignorada para el bloqueo. ¿Desea continuar?',
            bannedHelper: 'La lista de IPs bloqueadas será bloqueada por el servidor. ¿Desea continuar?',
            maxRetry: 'Intentos máximos',
            banTime: 'Tiempo de bloqueo',
            banTimeHelper: 'El tiempo por defecto es 10 minutos, -1 es bloqueo permanente',
            banTimeRule: 'Por favor, introduzca un tiempo válido o -1',
            banAllTime: 'Bloqueo permanente',
            findTime: 'Periodo de detección',
            banAction: 'Acción de bloqueo',
            banActionOption: 'Bloquear las IP especificadas usando {0}',
            allPorts: ' (Todos los puertos)',
            ignoreIP: 'Lista blanca de IP',
            bannedIP: 'Lista negra de IP',
            logPath: 'Ruta del log',
            logPathHelper: 'Por defecto /var/log/secure o /var/log/auth.log',
        },
        ftp: {
            ftp: 'Cuenta FTP | Cuentas FTP',
            notStart: 'El servicio FTP no está iniciado, ¡inícielo primero!',
            initHelper:
                'La identidad de usuario FTP no está inicializada. Haz clic en Inicializar en la barra de estado superior.',
            operation: 'Se realizará la operación "{0}" en el servicio FTP. ¿Desea continuar?',
            noPasswdMsg: 'No se pudo obtener la contraseña actual de la cuenta FTP, ¡asigne una y vuelva a intentar!',
            enableHelper: 'Habilitar la cuenta FTP restaurará los permisos de acceso. ¿Desea continuar?',
            disableHelper: 'Deshabilitar la cuenta FTP revocará los permisos de acceso. ¿Desea continuar?',
            syncHelper: 'Sincronizar datos de cuentas FTP entre servidor y base de datos. ¿Desea continuar?',
            dirSystem:
                'Este directorio es reservado por el sistema. Modificarlo podría causar errores. ¡Modifíquelo con cuidado!',
            dirHelper: 'Habilitar FTP requiere cambios en los permisos de directorio - elija cuidadosamente',
            dirMsg: 'Habilitar FTP modificará los permisos de todo el directorio {0}. ¿Desea continuar?',
        },
        clam: {
            clam: 'Escaneo de virus',
            cron: 'Escaneo programado',
            cronHelper: 'La edición comercial admite escaneos programados',
            specErr: 'Formato de horario incorrecto, ¡verifique e intente nuevamente!',
            disableMsg:
                'Detener la ejecución programada impedirá que esta tarea se ejecute automáticamente. ¿Desea continuar?',
            enableMsg:
                'Habilitar la ejecución programada permitirá que esta tarea se ejecute automáticamente. ¿Desea continuar?',
            showFresh: 'Mostrar servicio de actualización de firmas',
            hideFresh: 'Ocultar servicio de actualización de firmas',
            clamHelper:
                'La configuración recomendada para ClamAV es: al menos 3 GiB de RAM, CPU de un núcleo a 2.0 GHz o más, y al menos 5 GiB de disco disponible.',
            notStart: 'El servicio ClamAV no está iniciado, ¡inícielo primero!',
            removeRecord: 'Eliminar archivos de informe',
            noRecords: 'Haga clic en "Ejecutar" para iniciar el escaneo y aquí verá los registros.',
            removeInfected: 'Eliminar archivos infectados',
            removeInfectedHelper:
                'Elimina los archivos infectados detectados durante la tarea para asegurar el servidor.',
            clamCreate: 'Crear regla de escaneo',
            infectedStrategy: 'Estrategia para infectados',
            removeHelper: 'Eliminar archivos infectados, ¡elija cuidadosamente!',
            move: 'Mover',
            moveHelper: 'Mover archivos infectados a un directorio específico',
            copyHelper: 'Copiar archivos infectados a un directorio específico',
            none: 'No hacer nada',
            noneHelper: 'No realizar acciones sobre los archivos infectados',
            scanDir: 'Directorio a escanear',
            infectedDir: 'Directorio de infectados',
            scanDate: 'Fecha de escaneo',
            scanResult: 'Cola de logs de escaneo',
            tail: 'Líneas',
            infectedFiles: 'Archivos infectados',
            log: 'Detalles',
            clamConf: 'Clam AV daemon',
            clamLog: '@:toolbox.clam.clamConf logs',
            freshClam: 'FreshClam',
            freshClamLog: '@:toolbox.clam.freshClam logs',
            alertHelper: 'La edición comercial admite escaneos programados y alertas por SMS',
            alertTitle: 'La tarea de escaneo de virus 「{0}」 detectó archivos infectados',
        },
    },
    logs: {
        core: 'Servicio del panel',
        agent: 'Monitoreo de nodo',
        panelLog: 'Logs del panel',
        operation: 'Logs de operación',
        login: 'Logs de acceso',
        loginIP: 'IP de acceso',
        loginAddress: 'Dirección de acceso',
        loginAgent: 'Agente de acceso',
        loginStatus: 'Estado',
        system: 'Logs del sistema',
        hostSystem: 'Logs del host',
        previousPage: 'Página anterior',
        nextPage: 'Página siguiente',
        filter: 'Filtrar mensajes',
        service: 'Servicio',
        priority: 'Prioridad',
        priorityEmergency: 'Emergencia',
        priorityAlert: 'Alerta',
        priorityCritical: 'Crítico',
        priorityError: 'Error',
        priorityWarning: 'Advertencia',
        priorityNotice: 'Aviso',
        priorityInfo: 'Información',
        priorityDebug: 'Depuración',
        message: 'Mensaje',
        deleteLogs: 'Limpiar logs',
        resource: 'Recurso',
        detail: {
            dashboard: 'Resumen general',
            ai: 'IA',
            skills_hub: 'Skills Hub',
            ai_proxy: 'Proxy de IA',
            ai_benchmark: 'Benchmark',
            groups: 'Grupo',
            hosts: 'Host',
            apps: 'Aplicación',
            openresty: 'OpenResty',
            websites: 'Sitio web',
            monitor: 'Monitoreo de sitios web',
            containers: 'Contenedor',
            files: 'Archivo',
            runtimes: 'Runtime',
            process: 'Proceso',
            toolbox: 'Caja de herramientas',
            backups: 'Respaldo / Restaurar',
            tampers: 'Antimanipulación',
            xsetting: 'Configuración de interfaz',
            logs: 'Log',
            settings: 'Configuración',
            cronjobs: 'Tarea programada',
            databases: 'Base de datos',
            waf: 'WAF',
            licenses: 'Licencia',
            nodes: 'Nodo',
            commands: 'Comandos rápidos',
            opsReport: 'Informe de operaciones',
            ops_report: 'Informe de operaciones',
            users: 'Gestión de usuarios',
            roles: 'Rol',
            auth: 'Autenticación de inicio de sesión',
            auth_sources: 'Configuración de autenticación',
            alert: 'Notificaciones de alerta',
            sync: 'Sincronización de Recursos',
            exchange: 'Sincronización de Recursos',
            xapp: 'App',
            vms: 'Gestión de máquinas virtuales',
        },
        websiteLog: 'Logs de sitio web',
        runLog: 'Logs de ejecución',
        errLog: 'Logs de errores',
        task: 'Log de tareas',
        taskName: 'Nombre de la tarea',
        taskRunning: 'En ejecución',
    },
    file: {
        fileDirNum: '{0} directorios, {1} archivos,',
        currentDir: 'Directorio',
        dir: 'Carpeta',
        fileName: 'Nombre del archivo',
        search: 'Buscar',
        mode: 'Permisos',
        editPermissions: 'Editar permisos',
        owner: 'Propietario',
        file: 'Archivo',
        remoteFile: 'Descargar de remoto',
        share: 'Compartir',
        sync: 'Sincronización de datos',
        size: 'Tamaño',
        updateTime: 'Modificado',
        rename: 'Renombrar',
        role: 'Permisos',
        info: 'Ver atributos',
        linkFile: 'Enlace simbólico',
        shareList: 'Lista de compartidos',
        fileTools: 'Herramientas de archivos',
        aiSearchHitLines: 'Líneas coincidentes',
        aiSearch: 'Búsqueda con IA',
        aiSearchTitle: 'Búsqueda con IA',
        aiSearchHint:
            'Busca el contenido del archivo línea por línea. Usa los botones a la derecha de la fila de búsqueda y las "Condiciones avanzadas" debajo. Cuando la cuenta de IA esté activada y guardada, también se podrá generar un resumen en Markdown.',
        aiSearchAccountTitle: 'Cuenta de IA',
        aiSearchAccountIntro: 'Elige una cuenta de modelo grande para generar resúmenes y guarda los cambios.',
        aiSearchAccountEnable: 'Activar búsqueda de IA en archivos',
        aiSearchSaveAccount: 'Guardar configuración de la cuenta',
        aiSearchSectionQuery: 'Búsqueda',
        aiSearchSectionConditions: 'Condiciones de búsqueda',
        aiSearchResultsSection: 'Resultados del análisis',
        aiSearchContentLabel: 'Contenido de búsqueda',
        aiSearchDirLabel: 'Directorio',
        aiSearchExtLabel: 'Extensión del archivo',
        aiSearchModifiedPreset: 'Hora de modificación',
        aiSearchSizePresetLabel: 'Tamaño del archivo',
        aiSearchTimeAny: 'Cualquier momento',
        aiSearchTime3h: 'Últimas 3 horas',
        aiSearchTime1d: 'Último 1 día',
        aiSearchTime7d: 'Últimos 7 días',
        aiSearchTime30d: 'Últimos 30 días',
        aiSearchTimeCustom: 'Personalizado',
        aiSearchSizeAny: 'Sin límite de tamaño',
        aiSearchSize0_10mb: '0 ~ 10 MB',
        aiSearchSize10_100mb: '10 MB ~ 100 MB',
        aiSearchSize100_1gb: '100 MB ~ 1 GB',
        aiSearchSizeGte1gb: '≥ 1 GB',
        aiSearchSizeCustom: 'Personalizado (bytes)',
        aiSearchPlaceholder: 'Introduce el contenido de la búsqueda',
        aiSearchContainSub: 'Recursivo',
        aiSearchMaxItems: 'Límite de rutas/archivos incluidos en la búsqueda (enumeración de directorio, 1–2000)',
        aiSearchRun: 'Iniciar análisis',
        aiSearchTruncated: 'Hay demasiados elementos del directorio; solo se incluyó parte de la lista.',
        aiSearchPreFiltered: 'Las rutas relativas se filtraron previamente por palabra clave.',
        aiSearchMeta: 'Elementos analizados: {0} | Duración {1} | Tokens {2}',
        aiSearchQueryRequired: 'Introduce una descripción de búsqueda o palabras clave',
        aiSearchContentHits: 'Coincidencias de contenido',
        aiSearchContentScanMeta: 'Análisis de contenido: se leyeron {0} archivos de texto.',
        aiSearchNoLineHits: 'No se encontraron líneas que coincidan en los archivos de texto analizados.',
        aiSearchHitsTruncated: 'Algunos archivos no se analizaron o la lista de coincidencias se truncó por límites.',
        aiSearchHitFiles: 'Archivos con coincidencias',
        aiSearchOpenFile: 'Abrir en el editor',
        aiSearchOpenAtLine: 'Abrir e ir a esta línea',
        aiSearchGrepOnlyHint:
            'La IA de archivos está desactivada: solo se ejecuta la búsqueda determinista de contenido, sin llamar al modelo. Activa y guarda la cuenta de IA arriba para obtener resúmenes. La fila de búsqueda y las opciones de abajo siguen aplicando.',
        aiSearchMatchCase: 'Distinguir mayúsculas y minúsculas',
        aiSearchWholeWord: 'Palabra completa (límites de palabra en inglés \\b)',
        aiSearchUseRegex: 'Expresión regular (sintaxis Go RE2)',
        aiSearchExtensions: 'Extensiones de archivo (separadas por comas, p. ej. go,ts,md)',
        aiSearchMinSize: 'Tamaño mínimo del archivo (bytes, 0 = sin límite)',
        aiSearchMaxSize: 'Tamaño máximo del archivo (bytes, 0 = sin límite)',
        aiSearchSectionAdvanced: 'Condiciones avanzadas',
        aiSearchLimitMaxItems: 'Total de archivos a buscar',
        aiSearchLimitMaxScan: 'Archivos para escanear contenido',
        aiSearchLimitMaxBytes: 'Límite de lectura por archivo',
        aiSearchLimitHitsPerFile: 'Líneas coincidentes por archivo',
        aiSearchLimitTotalHits: 'Total de líneas coincidentes',
        aiSearchLimitUnitEntries: 'elementos',
        aiSearchLimitUnitFiles: 'archivos',
        aiSearchLimitUnitBytes: 'B',
        aiSearchLimitUnitLines: 'líneas',
        aiSearchMaxScanFiles: 'Máximo de archivos para escanear contenido',
        aiSearchMaxFileBytes:
            'Máximo de bytes leídos de cada archivo durante el escaneo de contenido. A diferencia del filtro de tamaño anterior (el tamaño en disco decide si entra en la lista), este limita cuánto se lee realmente para la coincidencia.',
        aiSearchMaxHitsPerFile: 'Máximo de líneas coincidentes por archivo',
        aiSearchMaxTotalHits: 'Límite total de líneas coincidentes',
        aiSearchGrepMetaContent:
            'Escaneo de contenido: {0} elementos totales, {1} archivos de texto leídos (según las condiciones actuales; se aplican límites de tamaño/cantidad). Duración {2}',
        aiSearchAdvancedResetDefaults: 'Restablecer límites predeterminados',
        zip: 'Comprimido',
        group: 'Grupo',
        path: 'Ruta',
        public: 'Otros',
        setRole: 'Asignar permisos',
        link: 'Enlace de archivo',
        rRole: 'Lectura',
        wRole: 'Escritura',
        xRole: 'Ejecutable',
        name: 'Nombre',
        compress: 'Comprimir',
        deCompress: 'Descomprimir',
        compressType: 'Formato de compresión',
        compressDst: 'Ruta de compresión',
        replace: 'Sobrescribir archivos existentes',
        compressSuccess: 'Compresión completada correctamente',
        deCompressSuccess: 'Descompresión completada correctamente',
        deCompressDst: 'Ruta de descompresión',
        linkType: 'Tipo de enlace',
        softLink: 'Enlace simbólico',
        hardLink: 'Enlace físico',
        linkPath: 'Ruta del enlace',
        selectFile: 'Seleccionar archivo',
        downloadUrl: 'URL remota',
        downloadStart: 'Descarga iniciada',
        wgetUrlInvalid: 'Introduzca una URL de descarga http(s) válida',
        moveSuccess: 'Movido correctamente',
        copySuccess: 'Copiado correctamente',
        pasteMsg: 'Por favor haz clic en el botón [Pegar] en la parte superior derecha del directorio de destino',
        move: 'Mover',
        calculate: 'Calcular',
        remark: 'Observación',
        setRemark: 'Establecer observación',
        remarkPrompt: 'Ingrese una observación',
        remarkPlaceholder: 'Observación',
        remarkToggle: 'Notas',
        remarkToggleTip: 'Cargar notas del archivo',
        canNotDeCompress: 'No se puede descomprimir este archivo',
        uploadSuccess: 'Carga completada correctamente',
        downloadProcess: 'Progreso de descarga',
        downloading: 'Descargando...',
        infoDetail: 'Propiedades del archivo',
        root: 'Directorio raíz',
        list: 'Lista de archivos',
        sub: 'Recursivo',
        downloadSuccess: 'Descarga completada correctamente',
        theme: 'Tema',
        language: 'Idioma',
        eol: 'Fin de línea',
        history: 'Historial de versiones',
        historyTitle: 'Historial de versiones',
        historyHint:
            'Registra la versión anterior a cada cambio de archivo, lo que permite revisar el historial de cambios de contenido y revertir versiones de contenido.',
        historySettingTitle: 'Política de versiones',
        historyEnable: 'Habilitar historial de versiones',
        historyMaxPerPath: 'Conservar por archivo',
        historyDiskQuota: 'Cuota global de disco (MB)',
        historyCurrentScope: 'Archivo actual',
        historyAllScope: 'Todos los archivos',
        historyDeleteConfirm: '¿Está seguro de que desea eliminar los registros de historial seleccionados?',
        historyNeedFile: 'Abra un archivo primero',
        historyRestore: 'Restaurar esta versión',
        historyOperationOnlyHint:
            'El elemento seleccionado es una operación de archivo y no admite restauración de versiones.',
        historyCurrentFile: 'Archivo actual',
        historyLatestVersion:
            'El lado izquierdo muestra el contenido de la versión histórica y el lado derecho muestra la última versión ' +
            'del archivo seleccionado',
        historyCompareTarget: 'Destino de comparación',
        historyCompareTargetPath: 'Ruta de comparación',
        historyRestoreConfirm: '¿Restaurar esta versión al archivo actual?',
        historyRestoreDirtyConfirm:
            'El archivo actual tiene cambios sin guardar. Al restaurar se sobrescribirán. ¿Continuar?',
        historyRestoreSuccess: 'Versión restaurada correctamente',
        historyDirtyHint: 'El editor actual tiene cambios sin guardar. Al restaurar una versión se sobrescribirán.',
        historyDiffHintCurrent:
            'El lado izquierdo muestra el contenido de la versión histórica y el lado derecho muestra el contenido ' +
            'del archivo actual',
        historyDiffHintAll:
            'El lado izquierdo muestra el contenido de la versión histórica y el lado derecho muestra la última ' +
            'versión del archivo seleccionado',
        copyDir: 'Copiar',
        shareFile: 'Compartir archivo',
        shareExpire: 'Caduca en',
        shareExpire1h: '1 hora',
        shareExpire6h: '6 horas',
        shareExpire24h: '24 horas',
        shareExpire3d: '3 días',
        shareExpire7d: '7 días',
        sharePassword: 'Contraseña',
        sharePasswordPlaceholder: 'Déjelo vacío para no usar contraseña',
        shareMaxDownloads: 'Descargas máximas',
        shareMaxDownloadsHint: '0 significa sin límite',
        shareGenerate: 'Crear enlace',
        shareRegenerate: 'Volver a compartir',
        shareClose: 'Cerrar',
        shareCancel: 'Cancelar uso compartido',
        shareCancelConfirm: '¿Seguro que quieres cancelar este uso compartido de archivo?',
        shareDetail: 'Detalles',
        shareCopyLink: 'Copiar enlace',
        shareLinkLabel: 'Enlace compartido',
        shareQrCode: 'Código QR',
        shareQrDialogTitle: 'Código QR del enlace compartido',
        shareQrDialogHelper: 'Escanee este código QR con su dispositivo móvil',
        shareSaveImage: 'Guardar imagen',
        shareOpenImage: 'Abrir imagen',
        shareExtractFile: 'Extraer archivo',
        shareDownloadingHint: 'Preparando el archivo; la descarga comenzará en breve.',
        shareInvalid: 'El enlace compartido no es válido o ha caducado',
        shareDownloadFailed: 'La descarga falló; inténtelo de nuevo más tarde',
        sharePasswordRequired: 'Contraseña',
        sharePasswordRequiredInput: 'Introduzca la contraseña del enlace compartido',
        sharePasswordLengthHint: 'La contraseña debe tener entre 4 y 256 caracteres',
        shareDownloadPasswordTip:
            'Este enlace está protegido con contraseña. Introduzca la contraseña antes de descargar.',
        shareRiskAlert:
            'Los enlaces compartidos pueden conllevar riesgos de seguridad. Compártalos solo con personas de confianza y evite exponer información sensible.',
        sharePasswordSeparate:
            'Se ha establecido una contraseña. Compártala de forma segura. Los destinatarios deben añadir &password=... a la URL o usar un cliente que admita el parámetro de consulta de contraseña.',
        shareExpiresAt: 'Caduca el',
        paste: 'Pegar',
        changeOwner: 'Modificar usuario y grupo',
        containSub: 'Aplicar cambio de permisos recursivamente',
        ownerHelper:
            'El usuario predeterminado del entorno PHP: el grupo es 1000:1000, es normal que haya diferencias entre usuario dentro y fuera del contenedor',
        searchHelper: 'Soporta comodines como *',
        uploadFailed: '[{0}] Fallo en la carga del archivo',
        fileUploadStart: 'Cargando [{0}]...',
        uploadOverallProgress: 'Progreso total',
        uploadCurrentFileProgress: 'Archivo actual',
        currentSelect: 'Selección actual: ',
        unsupportedType: 'Tipo de archivo no soportado',
        deleteHelper: '¿Está seguro de eliminar los siguientes archivos? Por defecto irán a la papelera de reciclaje.',
        fileHelper:
            'Nota:\n1. Los resultados de búsqueda no pueden ordenarse.\n2. Las carpetas no pueden ordenarse por tamaño.',
        forceDeleteHelper: 'Eliminar permanentemente el archivo (sin pasar por la papelera, lo elimina directamente)',
        recycleBin: 'Papelera',
        sourcePath: 'Ruta original',
        deleteTime: 'Hora de eliminación',
        confirmReduce: '¿Desea restaurar los siguientes archivos?',
        reduceSuccess: 'Restauración completada correctamente',
        reduce: 'Restaurar',
        reduceHelper:
            'Si hay un archivo o directorio con el mismo nombre en la ruta original, será sobrescrito. ¿Desea continuar?',
        clearRecycleBin: 'Vaciar',
        clearRecycleBinHelper: '¿Desea vaciar la papelera?',
        favorite: 'Favoritos',
        removeFavorite: '¿Eliminar de favoritos?',
        addFavorite: 'Agregar/Quitar de favoritos',
        addFavoriteAction: 'Agregar a favoritos',
        removeFavoriteAction: 'Quitar de favoritos',
        clearList: 'Limpiar lista',
        deleteRecycleHelper: '¿Está seguro de eliminar permanentemente los siguientes archivos?',
        typeErrOrEmpty: 'El archivo [{0}] es de tipo incorrecto o carpeta vacía',
        dropHelper: 'Arrastre aquí los archivos que desea cargar',
        fileRecycleBin: 'Habilitar papelera de reciclaje',
        fileRecycleBinMsg: '{0} papelera',
        wordWrap: 'Ajuste de línea',
        deleteHelper2: '¿Está seguro de eliminar el archivo seleccionado? No se puede deshacer.',
        ignoreCertificate: 'Permitir conexiones inseguras',
        ignoreCertificateHelper:
            'Permitir conexiones inseguras puede provocar fugas o alteraciones de datos. Úselo solo si confía en la fuente.',
        useProxy: 'Descargar mediante proxy',
        useProxyHelper: 'Usar el servidor proxy configurado en el panel para acceder a la URL remota',
        uploadOverLimit: '¡El número de archivos supera los 1000! Por favor, comprima y cargue',
        clashDidNotSupport: 'Los nombres de archivo no pueden contener .1panel_clash',
        clashDeleteAlert: 'No se puede eliminar la carpeta "Papelera"',
        clashOpenAlert: 'Haga clic en "Papelera" para abrir la carpeta de papelera',
        right: 'Adelante',
        back: 'Atrás',
        top: 'Volver arriba',
        up: 'Subir',
        openWithVscode: 'Abrir con VS Code',
        vscodeHelper:
            'Confirme el modo de autenticación, el host, el puerto y el usuario. La autenticación con clave requiere configurar SSH en el equipo donde se ejecuta VS Code antes de usarla.',
        vscodeCopyConfig: 'Copiar script de configuración',
        vscodeKeyHelper:
            'El nombre de descarga de la clave privada se deriva de la ruta configurada. Guarde el archivo en esa ruta; el script de configuración lo verificará y aplicará permisos.',
        vscodeKeyPath: 'Ruta de la clave privada SSH',
        vscodeKeyPathPlaceholder: 'Por ejemplo: ~/.ssh/id_ed25519',
        vscodeSelectKey: 'Clave privada SSH',
        vscodeScriptPreview: 'Script de configuración SSH',
        vscodePasswordHelper:
            'La autenticación por contraseña no escribe en la configuración SSH local. Introduzca la contraseña en VS Code al conectarse al host remoto.',
        vscodePasswordHint:
            'La autenticación por contraseña conecta con el host, puerto y usuario configurados. No requiere script de configuración ni archivo de clave privada.',
        vscodeScriptPreviewHint:
            'Ejecute el script de configuración en el equipo donde se ejecuta VS Code para registrar el alias SSH de conexión remota. Vuelva a ejecutarlo si cambia el host, puerto, usuario, clave privada o ruta de la clave.',
        vscodePasswordModeTitle: 'Autenticación por contraseña',
        vscodePasswordModeHint:
            'La autenticación por contraseña conecta con el host, puerto y usuario configurados. No requiere script de configuración ni archivo de clave privada.',
        vscodePasswordStep1: 'Confirme el host, el puerto y el usuario.',
        vscodePasswordStep2: 'Abra VS Code e introduzca la contraseña cuando se le solicite.',
        vscodePasswordStep3: 'No es necesario descargar la clave privada.',
        saveContentAndClose: 'El archivo se ha modificado, ¿desea guardar y cerrar?',
        saveAndOpenNewFile: 'El archivo se ha modificado, ¿desea guardar y abrir el nuevo archivo?',
        noEdit: 'El archivo no ha sido modificado, ¡no es necesario hacer esto!',
        noNameFolder: 'Carpeta sin nombre',
        noNameFile: 'Archivo sin nombre',
        minimap: 'Mapa de código',
        fileCanNotRead: 'No se puede leer el archivo',
        previewTruncated: 'El archivo es demasiado grande, solo se muestra la última parte',
        previewEmpty: 'El archivo está vacío o no es un archivo de texto',
        previewLargeFile: 'Vista previa',
        panelInstallDir: 'El directorio de instalación de 1Panel no puede eliminarse',
        wgetTask: 'Tarea de descarga',
        stopWgetConfirm: '¿Confirmar que desea detener esta tarea de descarga?',
        existFileTitle: 'Archivo con el mismo nombre',
        existFileHelper: 'El archivo cargado contiene un archivo con el mismo nombre, ¿desea sobrescribirlo?',
        existFileSize: 'Tamaño del archivo (nuevo -> viejo)',
        existFileDirHelper: 'El archivo o carpeta seleccionado tiene nombre duplicado. ¡Proceda con precaución!\n',
        coverDirHelper: '¡Las carpetas seleccionadas para reemplazo se copiarán en la ruta de destino!',
        noSuchFile: 'No se encontró el archivo o directorio. Por favor verifique e intente de nuevo.',
        setting: 'Configuración',
        showHide: 'Mostrar archivos ocultos',
        noShowHide: 'No mostrar archivos ocultos',
        cancelUpload: 'Cancelar carga',
        cancelUploadHelper: 'Indica si se cancela la carga; después de la cancelación, la lista de cargas se borrará.',
        keepOneTab: 'Mantener al menos una pestaña',
        notCanTab: 'No se pueden añadir más pestañas',
        convert: 'Convertir Formato',
        converting: 'Convirtiendo',
        fileCanNotConvert: 'Este archivo no admite conversión de formato',
        formatType: 'Tipo de Formato',
        sourceFormat: 'Formato de Origen',
        sourceFile: 'Archivo de Origen',
        saveDir: 'Directorio de Guardado',
        deleteSourceFile: 'Eliminar Archivo de Origen',
        convertHelper: 'Convertir los archivos seleccionados a otro formato',
        convertHelper1: 'Por favor, seleccione los archivos a convertir',
        execConvert: 'Iniciar conversión. Puede ver los registros de conversión en el Centro de Tareas',
        convertLogs: 'Registros de Conversión',
        formatConvert: 'Conversión de Formato',
    },
    ssh: {
        autoStart: 'Inicio automático',
        enable: 'Habilitar inicio automático',
        disable: 'Deshabilitar inicio automático',
        sshAlert:
            'La lista se ordena por fecha de inicio de sesión. Cambiar la zona horaria u otras operaciones pueden afectar las fechas.',
        sshAlert2:
            'Puede usar "Fail2ban" en "Caja de Herramientas" para bloquear IPs que intentan ataques de fuerza bruta y así mejorar la seguridad.',
        sshOperate: 'Se realizará la operación "{0}" en el servicio SSH. ¿Desea continuar?',
        sshChange: 'Configuración SSH',
        sshChangeHelper: 'Esta acción cambió "{0}" a "{1}". ¿Desea continuar?',
        sshFileChangeHelper:
            'Modificar el archivo de configuración puede afectar la disponibilidad del servicio. Ejecute esta acción con precaución. ¿Desea continuar?',
        port: 'Puerto',
        portHelper: 'Especifique el puerto en el que escucha el servicio SSH.',
        listenAddress: 'Dirección de escucha',
        allV4V6: '0.0.0.0:{0}(IPv4) y :::{0}(IPv6)',
        listenHelper: 'Si deja ambos campos en blanco, escuchará en "0.0.0.0:{0}(IPv4)" y ":::{0}(IPv6)".',
        addressHelper: 'Especifique la dirección en la que escucha el servicio SSH.',
        permitRootLogin: 'Permitir inicio de sesión root',
        rootSettingHelper: 'El método predeterminado para root es "Permitir inicio de sesión SSH".',
        rootHelper1: 'Permitir inicio SSH',
        rootHelper2: 'Deshabilitar inicio SSH',
        rootHelper3: 'Solo clave permitida',
        rootHelper4: 'Solo se pueden ejecutar comandos predefinidos. No se permite ninguna otra operación.',
        passwordAuthentication: 'Autenticación por contraseña',
        pwdAuthHelper: 'Si habilitar o no la autenticación por contraseña. Por defecto está activada.',
        pubkeyAuthentication: 'Autenticación por clave',
        privateKey: 'Clave privada',
        publicKey: 'Clave pública',
        password: 'Contraseña',
        createMode: 'Método de creación',
        generate: 'Autogenerar',
        unSyncPass: 'La contraseña de la clave no se puede sincronizar',
        syncHelper:
            'La operación de sincronización limpiará las claves inválidas y sincronizará nuevos pares de claves completos. ¿Desea continuar?',
        input: 'Entrada manual',
        import: 'Subir archivo',
        authKeys: 'Claves de Autorización',
        authKeysHelper: '¿Guardar información actual de clave pública?',
        pubkey: 'Información de clave',
        pubKeyHelper: 'La información de la clave actual solo tiene efecto para el usuario {0}',
        encryptionMode: 'Modo de cifrado',
        passwordHelper: 'Puede contener entre 6 y 10 dígitos y letras en inglés',
        reGenerate: 'Regenerar clave',
        keyAuthHelper: 'Indica si se habilita la autenticación por clave.',
        useDNS: 'useDNS',
        dnsHelper:
            'Controla si la función de resolución DNS está habilitada en el servidor SSH para verificar la identidad de la conexión.',
        confFileOrderHelper:
            'Use el desplegable para cambiar de archivo de configuración y editar/guardar; se aplica por orden de carga y prevalece el valor cargado antes.',
        confFileOrderLabel: '{0} (Orden de carga #{1})',
        analysis: 'Información estadística',
        denyHelper:
            "Se realizará una operación de 'denegar' sobre las siguientes direcciones. Tras la configuración, la IP quedará prohibida de acceder al servidor. ¿Desea continuar?",
        acceptHelper:
            "Se realizará una operación de 'aceptar' sobre las siguientes direcciones. Tras la configuración, la IP recuperará el acceso normal. ¿Desea continuar?",
        noAddrWarning:
            'Actualmente no se han seleccionado direcciones [{0}]. ¡Por favor verifique e inténtelo de nuevo!',
        loginLogs: 'Registros de SSH',
        loginMode: 'Modo',
        authenticating: 'Clave',
        publickey: 'Clave',
        belong: 'Pertenece',
        local: 'Local',
        session: 'Sesión | Sesiones',
        loginTime: 'Hora de inicio de sesión',
        loginIP: 'IP de inicio de sesión',
        stopSSHWarn: 'Indica si se debe desconectar esta conexión SSH',
        remote: 'SSH remoto',
    },
    setting: {
        panel: 'Panel',
        user: 'Usuario del panel',
        userChange: 'Cambiar usuario del panel',
        userChangeHelper: 'Cambiar el usuario del panel cerrará tu sesión. ¿Deseas continuar?',
        passwd: 'Contraseña del panel',
        emailHelper: 'Para recuperación de contraseña',
        watermark: 'Configuración de marca de agua',
        watermarkContent: 'Contenido de la marca de agua',
        contentHelper:
            '{0} representa el nombre del nodo, {1} representa la dirección del nodo. Puede usar variables o ingresar nombres personalizados.',
        watermarkColor: 'Color de la marca de agua',
        watermarkFont: 'Tamaño de fuente de la marca de agua',
        watermarkHeight: 'Altura de la marca de agua',
        watermarkWidth: 'Anchura de la marca de agua',
        watermarkRotate: 'Ángulo de rotación',
        watermarkGap: 'Espaciado',
        watermarkCloseHelper: '¿Seguro que deseas desactivar la configuración de marca de agua del sistema?',
        watermarkOpenHelper: '¿Seguro que deseas guardar la configuración actual de marca de agua del sistema?',
        title: 'Alias del panel',
        panelPort: 'Puerto del panel',
        titleHelper:
            'Admite de 3 a 30 caracteres, incluyendo letras, números, espacios y caracteres especiales comunes',
        portHelper:
            'El rango recomendado de puertos es de 8888 a 65535. Nota: si el servidor tiene un grupo de seguridad, permite el nuevo puerto en el grupo de seguridad previamente',
        portChange: 'Cambio de puerto',
        portChangeHelper: 'Modificará el puerto del servicio y reiniciará el servicio. ¿Deseas continuar?',
        theme: 'Tema',
        menuTabs: 'Pestañas de menú',
        menuAccordion: 'Expansión múltiple de menús',
        menuAccordionHelper:
            'Tras activarlo, varios grupos de menús de la barra lateral pueden permanecer expandidos al mismo tiempo.',
        dark: 'Oscuro',
        darkGold: 'Dorado oscuro',
        light: 'Claro',
        auto: 'Seguir sistema',
        language: 'Idioma',
        runtimeEnv: 'Entorno de ejecución',
        docSource: 'Fuente de documentación',
        withByRegion: 'Seguir región de operación (Predeterminado)',
        withByLang: 'Seguir idioma del sistema',
        region: 'Región de operación',
        cn: 'China continental',
        intl: 'Global',
        regionHelper: 'Al cambiar la región, se ajustarán las siguientes fuentes de recursos:',
        regionHelper1: 'Paquetes de instalación del sistema',
        regionHelper2: 'Tienda de aplicaciones y biblioteca de scripts',
        regionHelper3: 'Manual de usuario y documentación relacionada',
        regionHelper4: 'Esto puede afectar futuras descargas y accesos. Proceda con precaución.',
        regionTip:
            'La región de operación afecta la fuente de actualización del sistema y la dirección de descarga de paquetes de instalación.',
        docSourceTip:
            'La fuente de documentación determina el idioma de los enlaces de documentación y registro de actualizaciones.',
        languageHelper:
            'Por defecto sigue el idioma del navegador. Este parámetro solo tiene efecto en el navegador actual',
        sessionTimeout: 'Tiempo de espera de sesión',
        sessionTimeoutError: 'El tiempo mínimo de espera de sesión es de 300 segundos',
        sessionTimeoutHelper:
            'El panel cerrará la sesión automáticamente si no hay actividad durante más de {0} segundo(s).',
        systemIP: 'Dirección del sistema',
        systemIPHelper:
            'La dirección se utilizará para la redirección de aplicaciones, el acceso a contenedores y otras funciones. Cada nodo puede configurarse con una dirección diferente.',
        proxy: 'Proxy del servidor',
        proxyHelper: 'Tendrá efecto en los siguientes escenarios después de configurar el servidor proxy:',
        proxyHelper1:
            'Descarga de paquetes de instalación y sincronización de la tienda de aplicaciones (solo edición comercial)',
        proxyHelper2: 'Actualización del sistema y comprobación de actualizaciones (solo edición comercial)',
        proxyHelper3: 'Verificación y sincronización de licencias del sistema',
        proxyHelper4:
            'Las solicitudes de red, como la descarga de imágenes de Docker, pasarán por el servidor proxy (solo edición comercial)',
        proxyHelper5: 'Descarga y sincronización unificadas de bibliotecas de scripts del sistema (función comercial)',
        proxyHelper6: 'Solicitud de certificado (función comercial)',
        proxyType: 'Tipo de proxy',
        proxyUrl: 'Dirección del proxy',
        proxyPort: 'Puerto del proxy',
        proxyPasswdKeep: 'Recordar contraseña',
        proxyDocker: 'Proxy de Docker',
        proxyDockerHelper:
            'Sincroniza la configuración del servidor proxy con Docker, admite la extracción de imágenes en servidores offline y otras operaciones',
        syncToNode: 'Sincronizar con nodo',
        syncToNodeHelper: 'Sincroniza la configuración con otros nodos',
        nodes: 'Nodo',
        selectNode: 'Seleccionar nodo',
        selectNodeError: 'Por favor selecciona un nodo',
        apiInterface: 'Habilitar API',
        apiInterfaceClose: 'Una vez cerrado, no se podrá acceder a las interfaces de API. ¿Deseas continuar?',
        apiInterfaceHelper: 'Permite que aplicaciones de terceros accedan a la API.',
        apiInterfaceAlert1:
            'No lo habilites en entornos de producción ya que puede aumentar riesgos de seguridad en el servidor.',
        apiInterfaceAlert2:
            'No uses aplicaciones de terceros para llamar a la API y evitar posibles amenazas de seguridad.',
        apiInterfaceAlert3: 'Documentación de la API',
        apiInterfaceAlert4: 'Guía de uso',
        apiKey: 'Clave de API',
        apiKeyHelper: 'La clave API se utiliza para que aplicaciones de terceros accedan a la API.',
        ipWhiteList: 'Lista blanca de IP',
        ipWhiteListEgs: 'Una por línea. Por ejemplo,\n172.161.10.111\n172.161.10.0/24',
        ipWhiteListHelper:
            'Las IP en la lista blanca pueden acceder a la API, 0.0.0.0/0 (todas IPv4), ::/0 (todas IPv6)',
        apiTrustedProxies: 'Proxies de confianza de la API',
        apiTrustedProxiesEgs: 'Una IP o CIDR del servidor proxy por línea. Por ejemplo,\n172.16.10.111\n172.16.10.0/24',
        apiTrustedProxiesHelper:
            'Al usar un proxy inverso, introduce la IP o la red del servidor proxy para obtener correctamente la IP del cliente. Si no lo usas, deja este campo vacío. No se admiten 0.0.0.0/0 ni ::/0.',
        apiKeyValidityTime: 'Periodo de validez de la clave de interfaz',
        apiKeyValidityTimeEgs: 'Periodo de validez de la clave de interfaz (en minutos)',
        apiKeyValidityTimeHelper:
            'La marca de tiempo de la interfaz es válida si la diferencia con la actual (en minutos) está dentro del rango permitido. Un valor 0 desactiva la verificación.',
        apiKeyReset: 'Restablecer clave de interfaz',
        apiKeyResetHelper:
            'El servicio asociado con la clave quedará inválido. Por favor añade una nueva clave al servicio',
        confDockerProxy: 'Configurar proxy de Docker',
        restartNowHelper: 'Configurar el proxy de Docker requiere reiniciar el servicio de Docker.',
        restartNow: 'Reiniciar ahora',
        restartLater: 'Reiniciar manualmente después',
        systemIPWarning: 'La dirección del servidor no está configurada. Configúrala primero en el panel de control.',
        systemIPWarning1:
            'La dirección del servidor actual está configurada en {0}, ¡y la redirección rápida no es posible!',
        syncTime: 'Hora del servidor',
        timeZone: 'Zona horaria',
        timeZoneChangeHelper: 'Cambiar la zona horaria requiere reiniciar el servicio. ¿Deseas continuar?',
        timeZoneHelper:
            'La modificación de zona horaria depende del servicio system timedatectl. Tomará efecto después de reiniciar el servicio 1Panel.',
        timeZoneCN: 'Pekín',
        timeZoneAM: 'Los Ángeles',
        timeZoneNY: 'Nueva York',
        ntpALi: 'Alibaba',
        ntpGoogle: 'Google',
        syncSite: 'Servidor NTP',
        syncSiteHelper:
            'Esta operación usará {0} como fuente para la sincronización horaria del sistema. ¿Deseas continuar?',
        changePassword: 'Cambiar contraseña',
        oldPassword: 'Contraseña original',
        newPassword: 'Nueva contraseña',
        retryPassword: 'Confirmar contraseña',
        passwordEmptyTip: 'Déjalo vacío para no modificar la contraseña actual',
        noSpace: 'La información ingresada no puede incluir espacios',
        duplicatePassword: 'La nueva contraseña no puede ser igual a la original, por favor vuelve a introducirla',
        diskClean: 'Limpieza de caché',
        developerMode: 'Programa de vista previa',
        developerModeHelper:
            'Podrás experimentar nuevas funciones y correcciones antes de su lanzamiento general y dar retroalimentación anticipada.',
        thirdParty: 'Cuentas de terceros',
        scope: 'Ámbito',
        public: 'Pública',
        publicHelper:
            'Las cuentas de respaldo de tipo público se sincronizarán en cada subnodo, y estos podrán usarlas conjuntamente',
        private: 'Privada',
        privateHelper:
            'Las cuentas de respaldo de tipo privado solo se crean en el nodo actual y son para uso exclusivo de este nodo',
        noTypeForCreate: 'Actualmente no se ha creado ningún tipo de respaldo',
        LOCAL: 'Disco del servidor',
        OSS: 'Ali OSS',
        S3: 'Amazon S3',
        mode: 'Modo',
        MINIO: 'MinIO',
        SFTP: 'SFTP',
        WebDAV: 'WebDAV',
        WebDAVAlist: 'La conexión WebDAV a Alist puede consultarse en la documentación oficial',
        UPYUN: 'UPYUN',
        ALIYUN: 'Aliyun Drive',
        ALIYUNHelper:
            'El límite máximo actual para descargas sin cliente en Aliyun Drive es de 100 MB. Superarlo requiere descargar mediante el cliente.',
        ALIYUNRecover:
            'El límite máximo actual para descargas sin cliente en Aliyun Drive es de 100 MB. Superarlo requiere descargar mediante el cliente al dispositivo local y luego sincronizar la instantánea para la recuperación.',
        GoogleDrive: 'Google Drive',
        analysis: 'Análisis',
        analysisHelper:
            'Pega el contenido completo del token para analizar automáticamente las partes requeridas. Para operaciones específicas, consulta la documentación oficial.',
        serviceName: 'Nombre del servicio',
        operator: 'Operador',
        OneDrive: 'Microsoft OneDrive',
        isCN: 'Versión Century Internet',
        isNotCN: 'Versión internacional',
        client_id: 'ID de cliente',
        client_secret: 'Secreto de cliente',
        redirect_uri: 'URL de redirección',
        onedrive_helper: 'La configuración personalizada puede consultarse en la documentación oficial',
        clickToRefresh: 'Haz clic para refrescar',
        refreshTime: 'Tiempo de actualización del token',
        refreshStatus: 'Estado de actualización del token',
        backupDir: 'Directorio de respaldo',
        codeWarning: 'El formato del código de autorización es incorrecto, ¡por favor confírmalo de nuevo!',
        code: 'Código de autorización',
        codeHelper:
            'Haz clic en el botón "Obtener", luego inicia sesión en {0} y copia el contenido después de "code" en el enlace redirigido. Pégalo en este campo. Para instrucciones específicas, consulta la documentación oficial.',
        googleHelper:
            'Primero crea una aplicación de Google y obtén la información del cliente, completa el formulario y haz clic en obtener. Para operaciones específicas, consulta la documentación oficial.',
        loadCode: 'Obtener',
        COS: 'Tencent COS',
        ap_beijing_1: 'Zona 1 Pekín',
        ap_beijing: 'Pekín',
        ap_nanjing: 'Nankín',
        ap_shanghai: 'Shanghái',
        ap_guangzhou: 'Cantón',
        ap_chengdu: 'Chengdú',
        ap_chongqing: 'Chongqing',
        ap_shenzhen_fsi: 'Shenzhen Financiero',
        ap_shanghai_fsi: 'Shanghái Financiero',
        ap_beijing_fsi: 'Pekín Financiero',
        ap_hongkong: 'Hong Kong, China',
        ap_singapore: 'Singapur',
        ap_mumbai: 'Bombay',
        ap_jakarta: 'Yakarta',
        ap_seoul: 'Seúl',
        ap_bangkok: 'Bangkok',
        ap_tokyo: 'Tokio',
        na_siliconvalley: 'Silicon Valley (EE. UU. Oeste)',
        na_ashburn: 'Ashburn (EE. UU. Este)',
        na_toronto: 'Toronto',
        sa_saopaulo: 'São Paulo',
        eu_frankfurt: 'Fráncfort',
        KODO: 'Qiniu Kodo',
        scType: 'Tipo de almacenamiento',
        typeStandard: 'Estándar',
        typeStandard_IA: 'Estándar_IA',
        typeArchive: 'Archivo',
        typeDeep_Archive: 'Archivo profundo',
        scLighthouse: 'Por defecto, el almacenamiento ligero de objetos solo admite este tipo de almacenamiento',
        scStandard:
            'Almacenamiento estándar, adecuado para escenarios con grandes volúmenes de archivos de acceso frecuente y alta interacción de datos.',
        scStandard_IA:
            'Almacenamiento de acceso infrecuente, adecuado para escenarios con baja frecuencia de acceso (ej., 1-2 veces por mes), con duración mínima de 30 días.',
        scArchive: 'Almacenamiento de archivo, adecuado para escenarios con frecuencia de acceso extremadamente baja.',
        scDeep_Archive:
            'Almacenamiento en frío duradero, adecuado para escenarios con frecuencia de acceso extremadamente baja.',
        archiveHelper:
            'Los archivos de almacenamiento de archivo no pueden descargarse directamente, deben restaurarse primero desde la web del proveedor de la nube correspondiente. ¡Úsalo con precaución!',
        backupAlert:
            'Si un proveedor de nube es compatible con el protocolo S3, puedes usar Amazon S3 directamente para el respaldo. ',
        domain: 'Dominio de aceleración',
        backupAccount: 'Cuenta de respaldo | Cuentas de respaldo',
        loadBucket: 'Obtener bucket',
        accountName: 'Nombre de la cuenta',
        accountKey: 'Clave de la cuenta',
        address: 'Dirección',
        path: 'Ruta',
        safe: 'Seguridad',
        passkey: 'Passkey',
        passkeyManage: 'Administrar',
        passkeyKeyManagement: 'Gestión de claves',
        passkeyHelper: 'Para inicio rápido, se pueden vincular hasta 5 passkeys',
        passkeyRequireSSL: 'Los passkeys requieren un dominio vinculado y acceso por HTTPS',
        passkeyTrustedProxies: 'Proxies confiables',
        passkeyTrustedProxiesHelper:
            'Solo las solicitudes desde estas IP/CIDR confiarán en Forwarded y X-Forwarded-Proto para detectar HTTPS',
        passkeyNotSupported: 'El navegador o entorno actual no admite passkeys',
        passkeyPrereqTitle: 'Se requieren los siguientes requisitos previos para Passkey',
        passkeyPrereqBindDomain: 'Vinculación de dominio de 1Panel configurada',
        passkeyPrereqHttps: 'Acceso seguro mediante HTTPS',
        passkeyPrereqBrowser: 'El entorno admite Passkey (WebAuthn + autenticador de plataforma)',
        passkeyPrereqBrowserDetailWebAuthnUnavailable:
            'Usa un navegador del sistema y confirma que el panel se abre por HTTPS con un dominio vinculado.',
        passkeyPrereqBrowserDetailPlatformCapabilityUnavailable:
            'Este entorno no puede usar autenticación del dispositivo. Prueba un navegador del sistema en una versión más nueva del SO.',
        passkeyPrereqBrowserDetailNoPlatformAuthenticator:
            'Activa bloqueo de pantalla / huella / reconocimiento facial / Windows Hello y vuelve a intentarlo.',
        passkeyPrereqBrowserDetailDetectFailed:
            'La detección falló. Recarga la página y vuelve a intentarlo, o cambia a un navegador del sistema.',
        passkeyPrereqGoSetup: 'Configurar',
        passkeyCount: 'Vinculadas {0}/{1}',
        passkeyName: 'Nombre',
        passkeyNameHelper: 'Introduce un nombre para distinguir dispositivos',
        passkeyAdd: 'Agregar Passkey',
        passkeyCreatedAt: 'Creado',
        passkeyLastUsedAt: 'Último uso',
        passkeyDeleteConfirm: 'Después de eliminar, no podrás iniciar sesión con esta passkey. ¿Continuar?',
        passkeyLimit: 'Se pueden vincular hasta 5 passkeys',
        passkeyFailed:
            'El registro de passkey falló, por favor, asegúrate de que el certificado SSL del panel es confiable',
        bindInfo: 'Información de enlace',
        bindAll: 'Escuchar en todas',
        bindInfoHelper:
            'Cambiar la dirección o el protocolo de escucha del servicio puede causar indisponibilidad. ¿Deseas continuar?',
        ipv6: 'Escuchar IPv6',
        bindAddress: 'Dirección de escucha',
        entrance: 'Entrada',
        showEntrance: 'Mostrar alerta de deshabilitado en la página "Resumen"',
        entranceHelper:
            'Habilitar entrada de seguridad solo permitirá iniciar sesión en el panel mediante la entrada especificada.',
        entranceError: 'Introduce un punto de entrada seguro de 5 a 116 caracteres, solo se admiten números o letras.',
        entranceInputHelper: 'Déjalo en blanco para desactivar la entrada de seguridad.',
        randomGenerate: 'Aleatorio',
        expirationTime: 'Fecha de expiración',
        unSetting: 'No configurado',
        noneSetting:
            'Establece el tiempo de expiración para la contraseña del panel. Tras expirar, deberás restablecer la contraseña',
        expirationHelper:
            'Si el tiempo de expiración de la contraseña es 0 días, la función de expiración estará desactivada',
        days: 'Días de expiración de contraseña',
        expiredHelper: 'La contraseña actual ha expirado. Por favor cámbiala de nuevo.',
        timeoutHelper: 'La contraseña del panel expirará en {0} días. Tras expirar, deberás restablecerla',
        complexity: 'Validación de complejidad',
        complexityHelper:
            'Tras habilitarlo, la contraseña debe tener entre 8 y 30 caracteres y contener al menos dos de estos tipos: letras, números y caracteres especiales.',
        bindDomain: 'Vincular dominio',
        unBindDomain: 'Desvincular dominio',
        panelSSL: 'SSL del panel',
        unBindDomainHelper:
            'La acción de desvincular un dominio puede provocar inseguridad en el sistema. ¿Deseas continuar?',
        bindDomainHelper: 'Tras vincular el dominio, solo ese dominio podrá acceder al servicio de 1Panel.',
        bindDomainHelper1: 'Déjalo en blanco para desactivar la vinculación de dominio.',
        bindDomainWarning:
            'Tras la vinculación del dominio, se cerrará la sesión y solo se podrá acceder al servicio 1Panel mediante el dominio especificado. ¿Deseas continuar?',
        allowIPs: 'IP autorizada',
        unAllowIPs: 'IP no autorizada',
        unAllowIPsWarning:
            'Autorizar una IP vacía permitirá que todas las IP accedan al sistema, lo cual puede provocar inseguridad. ¿Deseas continuar?',
        allowIPsHelper: 'Tras configurar la lista de IP autorizadas, solo las IP en la lista podrán acceder al panel.',
        allowIPsWarning:
            'Tras configurar la lista de IP autorizadas, solo las IP en la lista podrán acceder al panel. ¿Deseas continuar?',
        allowIPsHelper1: 'Déjalo en blanco para desactivar la restricción por IP.',
        allowIPEgs: 'Una por línea. Por ejemplo,\n172.16.10.111\n172.16.10.0/24',
        mfa: 'Autenticación en Dos Pasos',
        mfaClose: 'Desactivar MFA reducirá la seguridad del servicio. ¿Deseas continuar?',
        secret: 'Secreto',
        mfaInterval: 'Intervalo de refresco',
        mfaTitleHelper:
            'El título se usa para distinguir diferentes hosts de 1Panel. Tras modificarlo, vuelve a escanear o añade la clave secreta manualmente.',
        mfaIntervalHelper:
            'Tras modificar el intervalo de refresco, vuelve a escanear o añade la clave secreta manualmente.\nAlgunas apps de autenticación solo admiten un intervalo de 30 segundos (por ejemplo, Google/Microsoft Authenticator).',
        mfaAlert:
            'El token de un solo uso es un número dinámico de 6 dígitos basado en la hora actual. Asegúrate de que la hora del servidor esté sincronizada.',
        mfaHelper: 'Tras habilitarlo, será necesario verificar el token de un solo uso.',
        mfaHelper1: 'Descarga una app de autenticación, por ejemplo,',
        mfaHelper2:
            'Para obtener el token, escanea el siguiente código QR con tu app de autenticación o copia la clave secreta en la aplicación.',
        mfaHelper3: 'Introduce los seis dígitos de la app',
        mfaCode: 'Token de un solo uso',
        sslChangeHelper: 'Modificará la configuración https y reiniciará el servicio. ¿Deseas continuar?',
        sslDisable: 'Deshabilitar',
        sslDisableHelper:
            'Si el servicio https está deshabilitado, deberás reiniciar el panel para que surta efecto. ¿Deseas continuar?',
        noAuthSetting: 'Configuración no autorizada',
        noAuthSettingHelper:
            'Cuando los usuarios no inician sesión desde la entrada de seguridad especificada, o no acceden al panel desde la IP o dominio especificados, esta respuesta puede ocultar características del panel.',
        responseSetting: 'Configuración de respuesta',
        help200: 'Página de ayuda',
        error400: 'Solicitud incorrecta',
        error401: 'No autorizado',
        error403: 'Prohibido',
        error404: 'No encontrado',
        error408: 'Tiempo de espera de la solicitud',
        error416: 'Rango no satisfactorio',
        error444: 'Conexión cerrada',
        error500: 'Error interno del servidor',
        https: 'Configurar HTTPS para el panel mejora la seguridad de acceso',
        strictHelper: 'El tráfico no HTTPS no puede conectarse al panel',
        muxHelper:
            'El panel escuchará en los protocolos HTTP y HTTPS y redirigirá HTTP a HTTPS, pero esto puede reducir la seguridad del panel',
        certType: 'Tipo de certificado',
        selfSigned: 'Autofirmado',
        selfSignedHelper:
            'Los navegadores pueden no confiar en certificados autofirmados y mostrar advertencias de seguridad.',
        select: 'Seleccionar',
        domainOrIP: 'Dominio o IP:',
        timeOut: 'Tiempo de espera',
        rootCrtDownload: 'Descargar certificado raíz',
        primaryKey: 'Clave primaria',
        certificate: 'Certificado',
        backupJump:
            'Archivos de respaldo fuera de la lista actual, intenta descargarlos desde el directorio de archivos e importarlos para el respaldo.',
        snapshot: 'Instantánea | Instantáneas',
        noAppData: 'No hay aplicaciones del sistema disponibles para seleccionar',
        noBackupData: 'No hay datos de respaldo disponibles para seleccionar',
        stepBaseData: 'Datos base',
        stepAppData: 'Aplicación del sistema',
        stepPanelData: 'Datos del sistema',
        stepBackupData: 'Datos de respaldo',
        stepOtherData: 'Otros datos',
        operationLog: 'Conservar registro de operaciones',
        loginLog: 'Conservar registro de accesos',
        systemLog: 'Conservar registro del sistema',
        taskLog: 'Conservar registro de tareas',
        monitorData: 'Conservar datos de monitoreo',
        dockerConf: 'Conservar configuración de Docker',
        selectAllImage: 'Respaldar todas las imágenes de aplicaciones',
        logLabel: 'Registro',
        agentLabel: 'Configuración de nodo',
        appDataLabel: 'Datos de aplicación',
        appImage: 'Imagen de aplicación',
        appBackup: 'Respaldo de aplicación',
        backupLabel: 'Directorio de respaldo',
        confLabel: 'Archivo de configuración',
        dockerLabel: 'Contenedor',
        taskLabel: 'Tarea programada',
        resourceLabel: 'Directorio de recursos de aplicación',
        runtimeLabel: 'Entorno de ejecución',
        appLabel: 'Aplicación',
        databaseLabel: 'Base de datos',
        snapshotLabel: 'Archivo de instantánea',
        websiteLabel: 'Sitio web',
        directoryLabel: 'Directorio',
        appStoreLabel: 'Tienda de aplicaciones',
        shellLabel: 'Script',
        tmpLabel: 'Directorio temporal',
        sslLabel: 'Directorio de certificados',
        reCreate: 'No se pudo crear la instantánea',
        reRollback: 'Error al revertir la instantánea',
        deleteHelper:
            'Todos los archivos de instantánea, incluidos los de la cuenta de respaldo de terceros, serán eliminados. ¿Deseas continuar?',
        status: 'Estado de la instantánea',
        ignoreRule: 'Regla de exclusión',
        editIgnoreRule: '@:commons.button.edit @.lower:setting.ignoreRule',
        ignoreHelper:
            'Esta regla se usará para comprimir y respaldar el directorio de datos de 1Panel al crear la instantánea. Por defecto, se ignoran los archivos de socket.',
        ignoreHelper1: 'Una por línea. Por ejemplo,\n*.log\n/opt/1panel/cache',
        panelInfo: 'Escribir información básica de 1Panel',
        panelBin: 'Respaldar archivos del sistema 1Panel',
        daemonJson: 'Respaldar archivo de configuración de Docker',
        appData: 'Respaldar aplicaciones instaladas de 1Panel',
        panelData: 'Respaldar directorio de datos de 1Panel',
        backupData: 'Respaldar directorio local de respaldo de 1Panel',
        compress: 'Crear archivo de instantánea',
        upload: 'Subir archivo de instantánea',
        recoverDetail: 'Detalle de recuperación',
        importHelper: 'Directorio de instantánea: ',
        lastRecoverAt: 'Última hora de recuperación',
        lastRollbackAt: 'Última hora de reversión',
        reDownload: 'Descargar el archivo de respaldo de nuevo',
        recoverErrArch: '¡La recuperación de instantánea entre arquitecturas de servidor diferentes no es compatible!',
        recoverErrSize:
            'Se detectó espacio insuficiente en disco, por favor verifica o libera espacio e inténtalo de nuevo.',
        recoverHelper:
            'Iniciando recuperación desde la instantánea {0}, confirma la siguiente información antes de continuar:',
        recoverHelper1: 'La recuperación requiere reiniciar Docker y los servicios de 1Panel',
        recoverHelper2:
            'Asegúrate de que haya suficiente espacio en disco en el servidor (Tamaño del archivo de instantánea: {0}, Espacio disponible: {1})',
        recoverHelper3:
            'Asegúrate de que la arquitectura del servidor coincida con la del servidor donde se creó la instantánea (Arquitectura actual: {0})',
        recoverHelper4:
            'Esta operación solo revierte el nodo principal. Si existen nodos secundarios actualizados, reviértelos primero antes de continuar.',
        rollback: 'Reversión',
        rollbackHelper:
            'Revertir esta recuperación reemplazará todos los archivos de esta recuperación y puede requerir reiniciar Docker y los servicios de 1Panel. ¿Deseas continuar?',
        upgradeRecord: 'Registro de actualización',
        upgrading: ' Actualizando, por favor espera...',
        upgradeHelper: 'La actualización requiere reiniciar el servicio 1Panel. ¿Deseas continuar?',
        noUpgrade: 'Actualmente es la última versión',
        versionHelper:
            'Reglas de nombre: [versión mayor].[versión funcional].[versión de corrección de errores], como se muestra en el siguiente ejemplo:',
        rollbackLocalHelper:
            'El nodo principal no admite reversión directa. ¡Ejecuta manualmente el comando [1pctl restore] para revertir!',
        upgradeCheck: 'Buscar actualizaciones',
        upgradeNotes: 'Notas de la versión',
        upgradeNow: 'Actualizar ahora',
        source: 'Fuente de descarga',
        versionNotSame:
            'La versión del nodo no coincide con la del nodo principal. Actualiza en la gestión de nodos antes de reintentar.',
        versionCompare:
            'Se detectó que el nodo {0} ya está en la última versión actualizable. Verifica la versión del nodo principal e inténtalo de nuevo.',
        about: 'Acerca de',
        versionItem: 'Versión Actual',
        backupCopies: 'Copias de Respaldo',
        backupCopiesHelper:
            'Establezca el número de copias de respaldo de actualización para conservar para la reversión de versión. 0 significa conservar todas.',
        backupCopiesRule: 'Conserve al menos 3 registros de respaldo de actualización',
        release: 'Notas de lanzamiento',
        releaseHelper:
            'No se pudieron obtener las notas de lanzamiento para el entorno actual. Puedes consultarlas manualmente en la documentación oficial.',
        project: 'GitHub',
        issue: 'Comentarios',
        doc: 'Documentación oficial',
        star: 'Estrella',
        description: 'Panel de servidor Linux',
        forum: 'Discusiones',
        doc2: 'Documentación',
        currentVersion: 'Versión',
        license: 'Licencia',
        bindNode: 'Vincular nodo',
        menuSetting: 'Configuración de menú',
        menuHide: 'Ocultar menú',
        menuSettingHelper: 'Cuando solo exista 1 submenú, la barra de menú mostrará únicamente ese submenú',
        showAll: 'Mostrar todo',
        hideALL: 'Ocultar todo',
        ifShow: 'Mostrar o no',
        menu: 'Menú',
        confirmMessage: 'La página se actualizará para refrescar la lista de menús avanzados. ¿Deseas continuar?',
        recoverMessage:
            'La página se actualizará y la lista de menús se restaurará a su estado inicial. ¿Desea continuar?',
        compressPassword: 'Contraseña de compresión',
        backupRecoverMessage:
            'Introduce la contraseña de compresión o descompresión (déjalo en blanco para no establecerla)',
        componentSize: 'Tamaño del componente',
        recoverFailed: 'Error al restaurar la instantánea',
    },
    license: {
        community: 'OSS',
        oss: 'Software Open Source',
        ee: 'Edición Enterprise',
        pro: 'Pro',
        trial: 'Prueba',
        add: 'Agregar versión Community',
        licenseBindHelper:
            'Las cuotas de nodo gratuitas solo se pueden utilizar cuando la licencia está vinculada a un nodo',
        licenseAlert:
            'Solo se pueden agregar nodos Community cuando la licencia está correctamente vinculada. Solo los nodos vinculados admiten cambios.',
        licenseUnbindHelper: 'Nodos Community detectados en esta licencia. Desvincule e intente nuevamente.',
        subscription: 'Suscripción',
        perpetual: 'Perpetua',
        product: 'Producto',
        versionConstraint: '{0} Compra de versión',
        forceUnbind: 'Desvinculación forzada',
        forceUnbindHelper: 'La desvinculación forzada ignorará errores y liberará la licencia.',
        updateForce: 'Forzar actualización (ignorar errores para liberar la licencia)',
        trialInfo: 'Versión',
        authorizationId: 'ID de autorización',
        authorizedUser: 'Usuario autorizado',
        lostHelper:
            'La licencia alcanzó el máximo de reintentos. Sincronícela manualmente para activar funciones comerciales.',
        exceptionalHelper:
            'Verificación de licencia anómala. Sincronícela manualmente para activar funciones comerciales. detalle: ',
        quickUpdate: 'Actualización rápida',
        import: 'Importar',
        power: 'Autorizar',
        unbindHelper: 'Se eliminarán todos los ajustes comerciales tras desvincular. ¿Desea continuar?',
        importLicense: 'Importar licencia',
        securityWarningTitle: 'No uses licencias crackeadas ni de origen desconocido.',
        securityWarningContent:
            '1Panel debe ejecutarse con un usuario con permisos de administración del sistema. Las licencias no oficiales o las versiones manipuladas pueden causar pérdida de control del servidor, filtraciones de datos y otros riesgos graves de seguridad. Obtén licencias e instaladores solo desde canales oficiales de FIT2CLOUD.',
        importHelper: 'Haga clic o arrastre el archivo de licencia aquí',
        licenseRequiredTip:
            'La licencia aún no se ha importado. Copie el ID del dispositivo, obtenga la licencia e impórtela antes de iniciar sesión.',
        licenseRequiredShortTip:
            'Primero copie el ID del dispositivo para obtener una licencia. Podrá iniciar sesión después de importarla.',
        licenseRequiredUserTip:
            'La licencia Enterprise Edition no está vinculada. Contacte con un superadministrador para importar la licencia.',
        restoreCommunity: 'Restaurar Community Edition',
        restoreCommunityOnline: 'Restauración en línea',
        restoreCommunityOffline: 'Restauración sin conexión',
        restoreCommunityPackageFound:
            'Se detectó un paquete sin conexión de Community Edition válido. La restauración sin conexión está disponible.',
        restoreCommunityPackageMissing:
            'No se detectó ningún paquete sin conexión de Community Edition válido. La restauración sin conexión no está disponible actualmente.',
        restoreCommunityOnlineHelper:
            'Se descargará automáticamente el paquete Community Edition de la versión actual y se limpiarán los datos exclusivos de Enterprise.',
        restoreCommunityOfflineHelper:
            'Coloque en {path} un paquete oficial cuya versión no sea anterior a la versión Enterprise actual. El cambio se habilitará al detectar un paquete utilizable.',
        restoreCommunityConfirm:
            'Después de cambiar de versión, podrá iniciar sesión en Community Edition con la cuenta actual de superadministrador de Enterprise. Los datos exclusivos de Enterprise se eliminarán durante el cambio. Proceda con precaución.',
        restoreCommunityStarting:
            'Preparando Community Edition. El panel se reiniciará automáticamente cuando termine.',
        levelUpPro: 'Actualizar a la edición comercial',
        licenseSync: 'Sincronizar licencia',
        knowMorePro: 'Ver más',
        closeAlert: 'Puede cerrar la página en la configuración del panel',
        introduce: 'Introducción de funciones',
        deviceID: 'ID del dispositivo',
        corporation: 'Empresa autorizada',
        expired: 'Hora de expiración',
        edition: 'Edición',
        standard: 'Estándar',
        enterprise: 'Enterprise',
        count: 'Cantidad autorizada',
        serialNo: 'Número de serie',
        remark: 'Observación',
        waf: 'Actualizar a la edición comercial permite interceptación, logs, geobloqueo, reglas, páginas personalizadas, etc.',
        tamper: 'Actualizar a la edición comercial protege sitios ante modificaciones no autorizadas.',
        tamperHelper:
            'La operación falló, el archivo/carpeta tiene protección antimanipulación. Revise e intente de nuevo.',
        setting: 'Actualizar a la edición comercial permite personalizar logo, mensaje de bienvenida y más.',
        monitor: 'La edición comercial permite ver estado web en tiempo real, tendencias, logs, etc.',
        alert: 'La edición comercial permite recibir alertas SMS y ver logs, control total de eventos clave.',
        node: 'Actualizar a la edición comercial permite administrar varios servidores Linux con 1Panel.',
        nodeApp:
            'Actualizar a la edición comercial permite actualizar versiones de aplicaciones multinodo sin cambiar de nodo manualmente.',
        nodeDashboard:
            'Actualizar a la edición comercial permite la gestión centralizada de aplicaciones, sitios web, bases de datos y tareas programadas multinodo.',
        fileExchange: 'La edición comercial permite transferir archivos entre varios servidores.',
        app: 'La edición comercial permite ver información de servicio, monitoreo, etc. vía app móvil.',
        cluster:
            'Actualizar a la edición comercial permite gestionar clústeres primario-réplica de MySQL/Postgres/Redis.',
        vllm: 'Actualiza a la edición comercial para gestionar servicios vLLM en 1Panel con despliegue, configuración, operaciones del ciclo de vida y seguimiento de tareas centralizados.',
        'model-downloader':
            'Actualiza a la edición comercial para buscar, descargar y gestionar archivos de modelos locales desde HuggingFace, ModelScope o espejos compatibles, con directorios de modelos y tareas de descarga centralizados.',
        offLine: 'Sin conexión',
    },
    clean: {
        scan: 'Iniciar escaneo',
        scanHelper: 'Limpie fácilmente archivos basura generados por 1Panel',
        clean: 'Limpiar ahora',
        reScan: 'Volver a escanear',
        cleanHelper:
            'Los archivos y directorios seleccionados no se pueden revertir después de la limpieza. ¿Continuar?',
        statusSuggest: '(Limpieza recomendada)',
        statusClean: '(Muy limpio)',
        statusEmpty: 'Muy limpio, ¡no necesita limpieza!',
        statusWarning: '(Precaución)',
        lastCleanTime: 'Última limpieza: {0}',
        lastCleanHelper: 'Archivos/carpetas limpiados: {0}, total limpiado: {1}',
        cleanSuccessful: 'Limpieza completada correctamente',
        currentCleanHelper: 'En esta sesión: {0} archivos/carpetas, Total: {1}',
        suggest: '(Recomendado)',
        totalScan: 'Total a limpiar: ',
        selectScan: 'Total seleccionado: ',
        system: 'Archivos basura del sistema',
        systemHelper: 'Archivos temporales generados durante instantáneas, actualizaciones y otros procesos',
        panelOriginal: 'Archivos de copia de seguridad antes de restaurar instantánea del sistema',
        upgrade: 'Archivos de copia de seguridad de actualización del sistema',
        agentPackages: 'Paquetes de actualización/instalación de nodos secundarios de versiones históricas',
        upgradeHelper: '(Mantenga el último respaldo para restaurar el sistema)',
        snapshot: 'Archivos temporales de instantáneas',
        rollback: 'Archivos de respaldo antes de recuperación',
        backup: 'Copia de Seguridad del Sistema',
        backupHelper: 'Archivos de copia de seguridad no asociados con cuentas de copia de seguridad locales',
        unknownBackup: 'Copia de Seguridad del Sistema',
        tmpBackup: 'Copia de Seguridad Temporal',
        unknownApp: 'Copia de Seguridad de Aplicación no Asociada',
        unknownDatabase: 'Copia de Seguridad de Base de Datos no Asociada',
        unknownWebsite: 'Copia de Seguridad de Sitio Web no Asociada',
        unknownSnapshot: 'Copia de Seguridad de Instantánea no Asociada',
        upload: 'Archivos temporales de carga',
        uploadHelper: 'Archivos temporales subidos en la lista de respaldos',
        download: 'Archivos temporales de descarga',
        downloadHelper: 'Archivos temporales descargados desde respaldos externos',
        directory: 'Directorio',
        systemLog: 'Archivo de registro',
        systemLogHelper: 'Registros del sistema, registros de tareas, archivos de registro del sitio web',
        dockerLog: 'Archivos de registro de operaciones de contenedores',
        taskLog: 'Archivos de registro de ejecución de tareas programadas',
        shell: 'Tareas programadas de script de shell',
        containerShell: 'Tareas programadas de script de shell ejecutadas dentro de contenedores',
        curl: 'Tareas programadas de CURL',
        docker: 'Basura de contenedores',
        dockerHelper: 'Archivos como contenedores, imágenes, volúmenes, caché de construcción, etc.',
        volumes: 'Volúmenes',
        buildCache: 'Caché de build de contenedores',
        appTmpDownload: 'Archivo de descarga temporal de la aplicación',
        unknownWebsiteLog: 'Archivo de respaldo de registro de sitio web no vinculado',
    },
    app: {
        app: 'Aplicación | Aplicaciones',
        installName: 'Nombre',
        installed: 'Instaladas',
        all: 'Todas',
        version: 'Versión',
        detail: 'Detalles',
        params: 'Editar parámetros',
        author: 'Autor',
        source: 'Origen',
        appName: 'Nombre de la aplicación',
        deleteWarn:
            'La eliminación eliminará todos los datos y respaldos. Esta acción no se puede deshacer. ¿Desea continuar?',
        syncSuccess: 'Sincronizado correctamente',
        canUpgrade: 'Actualizaciones',
        backupName: 'Nombre de archivo',
        backupPath: 'Ruta del archivo',
        backupdate: 'Fecha de respaldo',
        versionSelect: 'Seleccione una versión',
        operatorHelper: 'Se realizará la operación {0} en la aplicación seleccionada. ¿Desea continuar?',
        startOperatorHelper: 'La aplicación se iniciará. ¿Desea continuar?',
        stopOperatorHelper: 'La aplicación se detendrá. ¿Desea continuar?',
        restartOperatorHelper: 'La aplicación se reiniciará. ¿Desea continuar?',
        reloadOperatorHelper: 'La aplicación se recargará. ¿Desea continuar?',
        checkInstalledWarn: 'No se detecta "{0}". Vaya a "Tienda de aplicaciones" para instalar.',
        limitHelper: 'La aplicación ya está instalada.',
        deleteHelper: '"{0}" está asociada con los siguientes recursos y no puede eliminarse',
        checkTitle: 'Aviso',
        defaultConfig: 'Configuración predeterminada',
        defaultConfigHelper: 'Se restauró a configuración predeterminada, surte efecto al guardar',
        forceDelete: 'Forzar eliminación',
        forceDeleteHelper: 'Forzar ignorará errores y eliminará la metadata.',
        deleteBackup: 'Eliminar respaldo',
        deleteBackupHelper: 'También eliminar respaldo de la aplicación',
        deleteDB: 'Eliminar base de datos',
        deleteDBHelper: 'También eliminar la base de datos',
        noService: 'Sin {0}',
        toInstall: 'Ir a instalar',
        param: 'Parámetros',
        alreadyRun: 'Instalada',
        syncAppList: 'Sincronizar',
        less1Minute: 'Menos de 1 minuto',
        appOfficeWebsite: 'Sitio web oficial',
        github: 'GitHub',
        document: 'Documentación',
        updatePrompt: 'No hay actualizaciones disponibles',
        installPrompt: 'Aún no hay apps instaladas',
        updateHelper: 'Editar parámetros puede hacer que la app no inicie. Proceda con precaución.',
        updateWarn: 'Actualizar parámetros requiere reconstruir la app. ¿Desea continuar?',
        busPort: 'Puerto',
        syncStart: '¡Sincronizando! Actualice la tienda después',
        advanced: 'Configuración avanzada',
        cpuCore: 'núcleo(s)',
        containerName: 'Nombre del contenedor',
        containerNameHelper: 'El nombre se generará automáticamente si no se establece',
        allowPort: 'Acceso externo',
        allowPortHelper: 'Permitir acceso externo abrirá el puerto en el firewall',
        appInstallWarn:
            'La aplicación no expone el puerto externo por defecto. Use "Configuración avanzada" para habilitarlo.',
        upgradeStart: '¡Iniciando actualización! Refresque la página después',
        toFolder: 'Abrir directorio de instalación',
        editCompose: 'Editar archivo compose',
        editComposeHelper: 'Editar el compose puede hacer que la instalación falle',
        composeNullErr: 'El compose no puede estar vacío',
        takeDown: 'Retirado',
        allReadyInstalled: 'Instaladas',
        installHelper: 'Si tiene problemas con el pull de imagen, configure aceleración.',
        sortMode: 'Ordenar',
        installWarn: 'Si no habilita el acceso externo, la app no será accesible externamente. ¿Desea continuar?',
        showIgnore: 'Ver aplicaciones ignoradas',
        cancelIgnore: 'Cancelar ignoradas',
        ignoreList: 'Aplicaciones ignoradas',
        appHelper: 'Consulte los detalles de la app para instrucciones de instalación.',
        backupApp: 'Respaldar aplicación antes de actualizar',
        backupAppHelper:
            'Si la actualización falla, el respaldo se revertirá. Revise el motivo en los logs del sistema.',
        openrestyDeleteHelper: 'Eliminar OpenResty forzadamente borrará todos los sitios. ¿Desea continuar?',
        downloadLogHelper1: 'Se descargarán todos los logs de la app {0}. ¿Desea continuar?',
        downloadLogHelper2: 'Se descargarán los últimos {1} logs de la app {0}. ¿Desea continuar?',
        syncAllAppHelper: 'Se sincronizarán todas las aplicaciones. ¿Desea continuar?',
        hostModeHelper: 'El modo de red es host. Si necesita abrir el puerto, hágalo manualmente en el firewall.',
        showLocal: 'Mostrar apps locales',
        reload: 'Recargar',
        upgradeWarn: 'Actualizar reemplazará docker-compose.yml. Si hay cambios, puede ver la comparación.',
        openclawHttpsUpgradeNoticeTitle:
            'Nota: Las siguientes instrucciones solo se aplican a quienes actualicen OpenClaw de las versiones 2026.3.13 a 2026.3.22 hacia la versión 2026.3.23 o posterior:',
        openclawHttpsUpgradeNoticeItem1:
            'Después de la actualización, el acceso del agente vuelve a HTTP. Vaya a Configuración -> Ajustes -> Seguridad y compruebe la dirección de acceso.',
        openclawHttpsUpgradeNoticeItem2:
            'Si antes utilizaba un sitio web con proxy inverso, cambie el destino del proxy a http://IP:Port.',
        newVersion: 'Nueva versión',
        oldVersion: 'Versión actual',
        composeDiff: 'Comparación de archivos',
        showDiff: 'Ver comparación',
        useNew: 'Usar versión personalizada',
        useDefault: 'Usar versión predeterminada',
        useCustom: 'Personalizar docker-compose.yml',
        useCustomHelper:
            'Personalizar docker-compose.yml puede causar errores de actualización. Si no es necesario, no marque.',
        diffHelper: 'Izquierda: versión vieja, Derecha: nueva. Edite y guarde la versión personalizada.',
        pullImage: 'Pull de imagen',
        pullImageHelper: 'Ejecutar docker pull antes de iniciar la app',
        deleteImage: 'Eliminar imagen',
        deleteImageHelper: 'Eliminar imagen asociada a la app. Si falla, la tarea continuará.',
        requireMemory: 'Memoria',
        supportedArchitectures: 'Arquitecturas',
        link: 'Enlace',
        showCurrentArch: 'Arquitectura',
        syncLocalApp: 'Sincronizar app local',
        memoryRequiredHelper: 'La app requiere {0} de memoria',
        gpuConfig: 'Habilitar soporte GPU',
        gpuConfigHelper: 'Asegúrese de tener GPU NVIDIA, drivers y NVIDIA Docker Container Toolkit instalados',
        webUI: 'Dirección web',
        webUIPlaceholder: 'Ejemplo: ejemplo.com:8080/login',
        defaultWebDomain: 'Dirección de acceso predeterminada',
        defaultWebDomainHepler: 'Si el puerto es 8080, el acceso será http(s)://dirección:8080',
        webUIConfig:
            'No hay dirección de acceso predeterminada. Configúrela en los parámetros de la app o en la configuración del panel.',
        toLink: 'Abrir',
        customAppHelper: 'Antes de instalar un paquete personalizado, asegúrese de no tener apps instaladas.',
        forceUninstall: 'Desinstalar forzadamente',
        syncCustomApp: 'Sincronizar app personalizada',
        ignoreAll: 'Ignorar todas las versiones siguientes',
        ignoreVersion: 'Ignorar versión especificada',
        specifyIP: 'Vincular IP de host',
        specifyIPHelper: 'Establece la dirección/red del host para el puerto (si no sabe, no rellene)',
        uninstallDeleteBackup: 'Desinstalar - Eliminar respaldo',
        uninstallDeleteImage: 'Desinstalar - Eliminar imagen',
        upgradeBackup: 'Respaldar app antes de actualizar',
        upgradeDeleteImage: 'Actualizar app - Eliminar imagen antigua',
        installAllowPort: 'Abrir el acceso externo al puerto por defecto al instalar apps',
        noAppHelper:
            'No se detectó ninguna aplicación, por favor vaya al centro de tareas para ver el registro de sincronización de la tienda de aplicaciones',
        isEdirWarn: 'Se detectaron cambios en el archivo docker-compose.yml. Revise la comparación.',
    },
    website: {
        primaryDomain: 'Dominio principal',
        otherDomains: 'Otros dominios',
        static: 'Estático',
        deployment: 'Despliegue',
        supportUpType: 'Solo se admite el formato .tar.gz, y el paquete comprimido debe contener el archivo {0}.json',
        proxy: 'Proxy inverso',
        alias: 'Alias',
        ftpUser: 'Cuenta FTP',
        ftpPassword: 'Contraseña FTP',
        ftpHelper:
            'Al crear un sitio web se generará una cuenta FTP correspondiente, cuyo directorio enlazará con el directorio del sitio.',
        remark: 'Observación',
        groupSetting: 'Gestión de grupos',
        createGroup: 'Crear grupo',
        appNew: 'Nueva aplicación',
        appInstalled: 'Aplicación instalada',
        delete: 'Eliminar sitio',
        deleteApp: 'Eliminar aplicación',
        deleteBackup: 'Eliminar copia de seguridad',
        domain: 'Dominio',
        domainHelper: 'Un dominio por línea.\nSoporta comodín "*" y direcciones IP.\nTambién permite añadir puerto.',
        addDomain: 'Añadir dominio',
        domainConfig: 'Dominios',
        defaultDoc: 'Documento predeterminado',
        perserver: 'Concurrencia por servidor',
        perserverHelper: 'Límite de concurrencia máxima para este sitio',
        perip: 'Concurrencia por IP',
        peripHelper: 'Límite de accesos concurrentes desde una misma IP',
        rate: 'Límite de tráfico',
        rateLimit: 'Límite de velocidad por petición',
        rateHelper: 'Limita el flujo de cada petición (unidad: KB)',
        rateLimitHelper: 'Limita la velocidad de transferencia por petición (unidad: KB/s)',
        limitHelper: 'Activar control de flujo',
        other: 'Otros',
        currentSSL: 'Certificado actual',
        dnsAccount: 'Cuenta DNS',
        applySSL: 'Solicitar certificado',
        SSLList: 'Lista de certificados',
        createDnsAccount: 'Cuenta DNS',
        aliyun: 'Aliyun DNS',
        aliEsa: 'Aliyun ESA',
        awsRoute53: 'Amazon Route 53',
        manual: 'Resolución manual',
        key: 'Clave',
        check: 'Ver',
        acmeAccountManage: 'Gestión de cuentas ACME',
        email: 'Correo electrónico',
        acmeAccount: 'Cuenta ACME',
        provider: 'Método de verificación',
        dnsManual: 'Resolución manual',
        expireDate: 'Fecha de expiración',
        brand: 'Organización',
        deploySSL: 'Desplegar certificado',
        deploySSLHelper: '¿Seguro que deseas desplegar este certificado?',
        ssl: 'Certificado | Certificados',
        dnsAccountManage: 'Gestión de proveedores DNS',
        renewSSL: 'Renovar',
        renewHelper: '¿Seguro que deseas renovar el certificado?',
        renewSuccess: 'Certificado renovado',
        enableHTTPS: 'Habilitar',
        aliasHelper: 'El alias es el nombre de directorio del sitio web',
        lastBackupAt: 'Última copia de seguridad',
        null: 'Ninguno',
        nginxConfig: 'Configuración Nginx',
        websiteConfig: 'Configuración del sitio',
        proxySettings: 'Configuración de proxy',
        advancedSettings: 'Configuración avanzada',
        cacheSettings: 'Configuración de caché',
        sniSettings: 'Configuración SNI',
        basic: 'Básico',
        source: 'Configuración',
        security: 'Seguridad',
        nginxPer: 'Optimización de rendimiento',
        neverExpire: 'Nunca expira',
        setDefault: 'Establecer como predeterminado',
        deleteHelper: 'El estado de la aplicación asociada es anómalo, revisa antes de continuar',
        toApp: 'Ir a aplicaciones instaladas',
        cycle: 'Ciclo',
        frequency: 'Frecuencia',
        ccHelper:
            'Si la misma URL recibe más de {1} peticiones en {0} segundos, se activa defensa CC y se bloquea la IP',
        mustSave: 'Los cambios deben guardarse para que surtan efecto',
        fileExt: 'Extensión de archivo',
        fileExtBlock: 'Lista negra de extensiones',
        value: 'Valor',
        enable: 'Habilitar',
        proxyAddress: 'Dirección de proxy',
        proxyHelper: 'Ejemplo: 127.0.0.1:8080',
        forceDelete: 'Forzar eliminación',
        forceDeleteHelper: 'La eliminación forzada ignorará errores y eliminará metadatos igualmente.',
        deleteAppHelper: 'Eliminar también aplicaciones y backups asociados',
        deleteBackupHelper: 'Eliminar también copias de seguridad del sitio',
        deleteDatabaseHelper: 'También eliminar la base de datos asociada al sitio web',
        deleteConfirmHelper:
            'Esta acción es irreversible. Escribe <span style="color:red"> "{0}" </span> para confirmar.',
        staticPath: 'El directorio principal correspondiente es ',
        limit: 'Esquema',
        blog: 'Foro/Blog',
        imageSite: 'Sitio de imágenes',
        downloadSite: 'Sitio de descargas',
        shopSite: 'Tienda',
        doorSite: 'Portal',
        qiteSite: 'Empresa',
        videoSite: 'Video',
        errLog: 'Log de errores',
        stopHelper: 'Al detener el sitio, no será accesible y mostrará una página de parada. ¿Deseas continuar?',
        startHelper: 'Al habilitar el sitio, los usuarios podrán acceder normalmente. ¿Deseas continuar?',
        sitePath: 'Directorio',
        siteAlias: 'Alias del sitio',
        primaryPath: 'Directorio raíz',
        folderTitle: 'El sitio contiene principalmente las siguientes carpetas',
        wafFolder: 'Reglas del firewall',
        indexFolder: 'Directorio raíz del sitio',
        sslFolder: 'Certificados del sitio',
        enableOrNot: 'Habilitar',
        oldSSL: 'Certificado existente',
        manualSSL: 'Importar certificado',
        select: 'Seleccionar',
        selectSSL: 'Seleccionar certificado',
        privateKey: 'Clave privada (KEY)',
        certificate: 'Certificado (formato PEM)',
        HTTPConfig: 'Opciones HTTP',
        HTTPSOnly: 'Bloquear peticiones HTTP',
        HTTPToHTTPS: 'Redirigir a HTTPS',
        HTTPAlso: 'Permitir peticiones HTTP directas',
        sslConfig: 'Opciones SSL',
        disableHTTPS: 'Desactivar HTTPS',
        disableHTTPSHelper: 'Desactivar HTTPS eliminará la configuración del certificado. ¿Quieres continuar?',
        SSLHelper:
            'Nota: No uses certificados SSL en sitios ilegales.\nSi HTTPS no funciona, comprueba que el puerto 443 esté abierto en el firewall.',
        SSLConfig: 'Configuración del certificado',
        SSLProConfig: 'Configuración del protocolo',
        supportProtocol: 'Versión de protocolo',
        encryptionAlgorithm: 'Algoritmo de cifrado',
        notSecurity: '(inseguro)',
        encryptHelper:
            "Let's Encrypt tiene límites de frecuencia para emitir certificados. Consulta la <a target='_blank' href='https://letsencrypt.org/zh-cn/docs/rate-limits/'>documentación oficial</a>.",
        ipValue: 'Valor',
        ext: 'Extensión de archivo',
        wafInputHelper: 'Introduce datos línea por línea',
        data: 'Datos',
        ever: 'Permanente',
        nextYear: 'Un año',
        noLog: 'No se encontraron logs',
        defaultServer: 'Configurar como sitio por defecto',
        noDefaultServer: 'No configurado',
        defaultServerHelper:
            'El sitio por defecto recibirá peticiones de dominios/IP no asociados.\nPreviene resoluciones maliciosas, pero anula la intercepción WAF de dominios no autorizados.',
        restoreHelper: '¿Seguro que deseas restaurar este backup?',
        websiteDeploymentHelper: 'Usa una aplicación instalada o crea una nueva aplicación para desplegar un sitio.',
        websiteStatictHelper: 'Crea un directorio de sitio estático en el host.',
        websiteProxyHelper:
            'Usa un proxy inverso para servicios existentes. Ejemplo: un servicio en el puerto 8080 → "http://127.0.0.1:8080".',
        runtimeProxyHelper: 'Usa un runtime de sitio web para crear un sitio.',
        runtime: 'Runtime',
        deleteRuntimeHelper: 'El runtime debe eliminarse junto con el sitio. Hazlo con precaución.',
        proxyType: 'Tipo de red',
        unix: 'Red Unix',
        tcp: 'Red TCP/IP',
        phpFPM: 'Config FPM',
        phpConfig: 'Config PHP',
        updateConfig: 'Actualizar configuración',
        isOn: 'Activado',
        isOff: 'Desactivado',
        rewrite: 'Reescritura (pseudoestático)',
        rewriteMode: 'Esquema',
        current: 'Actual',
        rewriteHelper: 'Si el pseudoestático causa inaccesibilidad, restaura la configuración predeterminada.',
        runDir: 'Directorio de ejecución',
        runUserHelper:
            'En entornos PHP con contenedor, asigna propietario/grupo 1000 a index y subdirectorios. En PHP local, usa el usuario/grupo de PHP-FPM.',
        userGroup: 'Usuario/Grupo',
        uGroup: 'Grupo',
        proxyPath: 'Ruta de proxy',
        proxyPass: 'URL destino',
        cache: 'Caché',
        cacheTime: 'Duración de caché',
        enableCache: 'Activar caché',
        proxyHost: 'Host de proxy',
        disabled: 'Detenido',
        startProxy: 'Se iniciará el proxy inverso. ¿Deseas continuar?',
        stopProxy: 'Se detendrá el proxy inverso. ¿Deseas continuar?',
        sourceFile: 'Ver origen',
        proxyHelper1: 'Al acceder a este directorio se devolverá el contenido del destino configurado.',
        proxyPassHelper: 'La URL destino debe ser válida y accesible.',
        proxyHostHelper: 'Pasar el dominio en la cabecera Host al servidor proxy.',
        modifier: 'Reglas de coincidencia',
        modifierHelper: 'Ejemplo: "=" coincidencia exacta, "~" regex, "^~" inicio de ruta.',
        replace: 'Reemplazos de texto',
        replaceHelper:
            'Permite sustitución de cadenas en contenido proxy (HTML, CSS, JS, etc.). Soporta regex para casos complejos.',
        addReplace: 'Añadir',
        replaced: 'Cadena de búsqueda (obligatoria)',
        replaceText: 'Reemplazar por',
        replacedErr: 'La cadena de búsqueda no puede estar vacía',
        replacedErr2: 'La cadena de búsqueda no puede repetirse',
        replacedListEmpty: 'Sin reglas de reemplazo',
        proxySslName: 'Nombre SNI de proxy',
        basicAuth: 'Autenticación básica',
        editBasicAuthHelper:
            'La contraseña está cifrada de forma asimétrica y no puede mostrarse. Editar implica restablecerla.',
        antiLeech: 'Anti-hotlink',
        extends: 'Extensiones',
        browserCache: 'Caché de navegador',
        noModify: 'No Modificar',
        serverCache: 'Caché del servidor',
        leechLog: 'Registrar logs anti-hotlink',
        accessDomain: 'Dominios permitidos',
        leechReturn: 'Recurso de respuesta',
        noneRef: 'Permitir Referer vacío',
        disable: 'No habilitado',
        disableLeechHelper: 'Deshabilitar protección anti-hotlink',
        disableLeech: 'Desactivar anti-hotlink',
        ipv6: 'Escuchar IPv6',
        leechReturnError: 'Introduce un código HTTP válido',
        blockedRef: 'Permitir Referer no estándar',
        accessControl: 'Control anti-hotlink',
        leechcacheControl: 'Control de caché',
        logEnableControl: 'Registrar peticiones de estáticos',
        leechSpecialValidHelper:
            'Permitir Referer vacío: peticiones sin Referer no se bloquean. Permitir Referer no estándar: se aceptan Referer que no empiecen con http/https.',
        leechInvalidReturnHelper: 'Código HTTP devuelto tras bloquear hotlinking',
        leechlogControlHelper:
            'Registrar peticiones de estáticos (deshabilitar en producción para evitar exceso de logs).',
        selectAcme: 'Seleccionar cuenta Acme',
        imported: 'Creado manualmente',
        importType: 'Tipo de importación',
        pasteSSL: 'Pegar código',
        localSSL: 'Seleccionar archivo del servidor',
        privateKeyPath: 'Archivo de clave privada',
        certificatePath: 'Archivo de certificado',
        ipWhiteListHelper: 'La lista blanca de IP ignora todas las reglas de bloqueo',
        redirect: 'Redirección',
        sourceDomain: 'Dominio origen',
        targetURL: 'URL destino',
        keepPath: 'Mantener parámetros URI',
        path: 'Ruta',
        redirectType: 'Tipo de redirección',
        redirectWay: 'Modo',
        keep: 'Mantener',
        notKeep: 'No mantener',
        redirectRoot: 'Redirigir a la home',
        redirectHelper: '301 permanente o 302 temporal',
        changePHPVersionWarn: 'Esta acción es irreversible, ¿continuar?',
        changeVersion: 'Cambiar versión',
        retainConfig: 'Conservar php-fpm.conf y php.ini',
        runDirHelper2: 'El directorio secundario debe estar bajo index',
        openrestyHelper:
            'Puertos por defecto de OpenResty → HTTP: {0}, HTTPS: {1}. Esto puede afectar redirecciones y accesos.',
        primaryDomainHelper: 'Ejemplo: ejemplo.com o ejemplo.com:8080',
        acmeAccountType: 'Tipo de cuenta',
        keyType: 'Algoritmo de clave',
        tencentCloud: 'Tencent Cloud',
        containWarn: 'El dominio incluye al principal, corrige la entrada',
        rewriteHelper2:
            'Aplicaciones como WordPress suelen tener configuración pseudoestática predefinida. Cambiarla puede causar errores.',
        websiteBackupWarn: 'Solo se admiten backups locales. Los de otras máquinas pueden fallar en la restauración',
        ipWebsiteWarn: 'Los sitios con IP como dominio deben configurarse como sitio por defecto para funcionar',
        hstsHelper: 'Habilitar HSTS mejora la seguridad',
        includeSubDomains: 'Incluir subdominios',
        hstsIncludeSubDomainsHelper: 'Al habilitarlo, la política HSTS aplicará también a los subdominios.',
        defaultHtml: 'Configurar página por defecto',
        website404: 'Página de error 404',
        domain404: 'Página no encontrada',
        indexHtml: 'Página predeterminada estática',
        stopHtml: 'Página de sitio detenido',
        indexPHP: 'Página predeterminada PHP',
        sslExpireDate: 'Fecha de expiración SSL',
        website404Helper: 'La página 404 solo aplica a sitios PHP o estáticos',
        sni: 'SNI de origen',
        sniHelper:
            'Cuando el backend proxy es HTTPS, puede ser necesario configurar el SNI. Consulta la doc del proveedor CDN.',
        proxySslVerify: 'Verificar certificado SSL del backend',
        proxySslVerifyHelper:
            'Si está activada, el proxy verificará estrictamente el certificado SSL del servidor de origen (desactivada por defecto).',
        huaweicloud: 'Huawei Cloud',
        createDb: 'Crear base de datos',
        enableSSLHelper: 'Si falla, no afectará la creación del sitio',
        batchAdd: 'Añadir múltiples dominios',
        batchInput: 'Entrada por Lotes',
        domainNotFQDN: 'Este dominio puede no ser accesible en la red pública',
        domainInvalid: 'Formato de dominio inválido',
        domainBatchHelper:
            'Un dominio por línea, formato: dominio:puerto@ssl\nEjemplo: example.com:443@ssl o example.com',
        generateDomain: 'Generar',
        global: 'Global',
        subsite: 'Subsitio',
        subsiteHelper: 'Un subsite puede usar un directorio PHP o estático existente como raíz.',
        parentWbeiste: 'Sitio padre',
        deleteSubsite: 'Antes de borrar este sitio elimina los subsitios {0}',
        loadBalance: 'Balanceo de carga',
        server: 'Servidor',
        algorithm: 'Algoritmo',
        ipHash: 'IP Hash',
        ipHashHelper: 'Asigna al mismo servidor las peticiones de un cliente según su IP.',
        leastConn: 'Menos conexiones',
        leastConnHelper: 'Envía peticiones al servidor con menos conexiones activas.',
        leastTime: 'Menor tiempo',
        leastTimeHelper: 'Envía peticiones al servidor con menor tiempo de conexión activa.',
        defaultHelper:
            'Método por defecto: reparte las peticiones equitativamente. Si hay pesos configurados, reparte según ellos.',
        weight: 'Peso',
        maxFails: 'Fallos máximos',
        maxConns: 'Máximo de conexiones',
        strategy: 'Estrategia',
        strategyDown: 'Baja',
        strategyBackup: 'Backup',
        ipHashBackupErr: 'IP hash no admite nodos de respaldo',
        failTimeout: 'Tiempo de espera de fallo',
        failTimeoutHelper:
            'La duración de la ventana de tiempo para las comprobaciones de estado del servidor. Cuando el número acumulado de fallos alcanza el umbral dentro de este período, el servidor se eliminará temporalmente y se reintentará después de la misma duración. Por defecto 10 segundos',
        staticChangePHPHelper: 'Actualmente es un sitio estático, puedes cambiarlo a PHP',
        proxyCache: 'Caché de proxy inverso',
        cacheLimit: 'Límite de espacio de caché',
        shareCache: 'Tamaño de memoria para conteo de caché',
        cacheExpire: 'Expiración de caché',
        shareCacheHelper: '1M de memoria almacena aprox. 8000 objetos',
        cacheLimitHelper: 'Se eliminará caché antigua al superar el límite',
        cacheExpireJHelper: 'Caché eliminada al expirar si no se usa',
        realIP: 'IP real',
        ipFrom: 'Origen de IP',
        ipFromHelper: 'Definiendo orígenes confiables, OpenResty analizará cabeceras HTTP para identificar la IP real.',
        ipFromExample1: 'Si el frontend es Frp: 127.0.0.1',
        ipFromExample2: 'Si el frontend es un CDN: rango IP del CDN',
        ipFromExample3: 'En caso de duda: 0.0.0.0/0 (IPv4) ::/0 (IPv6) [Nota: poco seguro]',
        http3Helper: 'HTTP/3 ofrece mayor velocidad y rendimiento, pero no todos los navegadores lo soportan.',
        cors: 'Intercambio de Recursos de Origen Cruzado (CORS)',
        enableCors: 'Habilitar CORS',
        allowOrigins: 'Dominios permitidos',
        allowMethods: 'Métodos de solicitud permitidos',
        allowHeaders: 'Encabezados de solicitud permitidos',
        allowCredentials: 'Permitir enviar cookies',
        preflight: 'Respuesta rápida a solicitud de preflight',
        preflightHleper:
            'Cuando está habilitado, cuando el navegador envía una solicitud de preflight de origen cruzado (solicitud OPTIONS), el sistema devolverá automáticamente un código de estado 204 y establecerá los encabezados de respuesta de origen cruzado necesarios',
        changeDatabase: 'Cambiar base de datos',
        changeDatabaseHelper1: 'La asociación se usa en backups/restauraciones.',
        changeDatabaseHelper2: 'Cambiar de DB invalida backups previos.',
        saveCustom: 'Guardar como plantilla',
        rainyun: 'Rain Yun',
        volcengine: 'Volcengine',
        runtimePortHelper: 'Este runtime tiene múltiples puertos, selecciona uno.',
        runtimePortWarn: 'Este runtime no tiene puertos, no se puede usar proxy',
        cacheWarn: 'Desactiva la caché en proxy inverso primero',
        loadBalanceHelper: 'Tras crear balanceo, ve a "Proxy inverso" y añade un backend: http://<nombre balanceo>',
        useProxy: 'Usar proxy',
        useProxyHelper: 'Usa la dirección del proxy configurado en el panel',
        westCN: 'West Digital',
        openBaseDir: 'Prevenir ataques cross-site',
        openBaseDirHelper: 'open_basedir restringe rutas accesibles por PHP, protegiendo contra accesos cruzados',
        serverCacheTime: 'Tiempo de caché en servidor',
        serverCacheTimeHelper: 'Durante este tiempo, peticiones idénticas devuelven caché sin ir al backend.',
        browserCacheTime: 'Tiempo de caché en navegador',
        browserCacheTimeHelper:
            'Recursos estáticos se guardan en caché en el navegador reduciendo solicitudes repetidas.',
        donotLinkeDB: 'No vincular base de datos',
        toWebsiteDir: 'Acceder a directorio del sitio',
        execParameters: 'Parámetros de ejecución',
        extCommand: 'Comando adicional',
        mirror: 'Fuente mirror',
        execUser: 'Usuario de ejecución',
        execDir: 'Directorio de ejecución',
        packagist: 'Mirror China completo',
        batchOperate: 'Operación en Lote',
        batchOperateHelper: 'Lote {0} sitios web, ¿continuar operación?',
        stream: 'Proxy TCP/UDP',
        streamPorts: 'Puertos de escucha',
        streamPortsHelper:
            'Configura el número de puerto de escucha externo, los clientes accederán al servicio a través de este puerto, separado por comas, p. ej., 5222,5223',
        streamHelper: 'Reenvío de Puertos y Balanceo de Carga TCP/UDP',
        udp: 'Habilitar UDP',
        syncHtmlHelper: 'Sincronizar con PHP y sitios web estáticos',
        wafValueHelper: 'Valor',
    },
    php: {
        short_open_tag: 'Soporte de etiquetas cortas',
        max_execution_time: 'Tiempo máximo de ejecución del script',
        max_input_time: 'Tiempo máximo de entrada',
        memory_limit: 'Límite de memoria del script',
        post_max_size: 'Tamaño máximo de datos POST',
        file_uploads: 'Permitir subida de archivos',
        upload_max_filesize: 'Tamaño máximo permitido para subir archivos',
        max_file_uploads: 'Cantidad máxima de archivos a subir al mismo tiempo',
        default_socket_timeout: 'Tiempo de espera del socket',
        error_reporting: 'Nivel de errores',
        display_errors: 'Mostrar información detallada de errores',
        cgi_fix_pathinfo: 'Habilitar pathinfo',
        date_timezone: 'Zona horaria',
        disableFunction: 'Deshabilitar función',
        disableFunctionHelper: 'Introduce la función a deshabilitar, como exec. Para varias, separa con comas',
        uploadMaxSize: 'Límite de subida',
        indexHelper:
            'Para garantizar el funcionamiento correcto del sitio PHP, coloca el código en el directorio index y evita renombrar',
        extensions: 'Gestionar extensiones',
        extension: 'Extensión',
        extensionHelper: 'Para varias extensiones, sepáralas con comas',
        toExtensionsList: 'Ver lista de extensiones',
        containerConfig: 'Configuración del contenedor',
        containerConfigHelper:
            'Las variables de entorno y demás se pueden modificar en Configuración - Configuración del Contenedor después de la creación',
        dateTimezoneHelper: 'Ejemplo: TZ=America/Mexico_City (ajusta según necesites)',
        extensionsHelper: 'Para varias extensiones, sepáralas con comas',
    },
    nginx: {
        serverNamesHashBucketSizeHelper: 'Tamaño de la tabla hash para nombres de servidor',
        clientHeaderBufferSizeHelper: 'Tamaño del buffer de cabecera solicitado por el cliente',
        clientMaxBodySizeHelper: 'Tamaño máximo de archivo subido',
        keepaliveTimeoutHelper: 'Tiempo de espera de la conexión',
        gzipMinLengthHelper: 'Tamaño mínimo para comprimir',
        gzipCompLevelHelper: 'Nivel de compresión',
        gzipHelper: 'Habilitar compresión para transmisión',
        connections: 'Conexiones activas',
        accepts: 'Aceptadas',
        handled: 'Gestionadas',
        requests: 'Solicitudes',
        reading: 'Leyendo',
        writing: 'Escribiendo',
        waiting: 'Esperando',
        status: 'Estado actual',
        configResource: 'Configuración',
        saveAndReload: 'Guardar y recargar',
        clearProxyCache: 'Limpiar caché de proxy inverso',
        clearProxyCacheWarn: 'Esta acción eliminará todos los archivos en el directorio de caché. ¿Deseas continuar?',
        create: 'Agregar nuevo módulo',
        update: 'Editar módulo',
        params: 'Parámetros',
        packages: 'Paquetes',
        script: 'Scripts',
        module: 'Módulos',
        build: 'Compilar',
        buildWarn:
            'La compilación local de módulos consume CPU y memoria. Los módulos estáticos también reconstruyen y reinician OpenResty. ¿Continuar?',
        buildPurposeHint:
            'Los módulos dinámicos se aplican mediante carga en caliente tras la compilación (sin reiniciar el contenedor); si incluye módulos estáticos, se reconstruirá la imagen completa y se recreará el contenedor',
        buildMode: 'Modo de compilación',
        buildModeDynamic: 'Dinámico',
        buildModeStatic: 'Estático',
        buildStatus: 'Estado de compilación',
        loadOrder: 'Orden de carga',
        modulesToBuild: 'Módulos dinámicos (carga en caliente tras la compilación, sin reiniciar el contenedor)',
        staticModules: 'Módulos estáticos',
        staticModulesHelper: 'La compilación reconstruirá todos los módulos y reiniciará OpenResty',
        forceBuild: 'Recompilar sin caché',
        buildFailed: 'La última compilación falló',
        pending: 'Pendiente',
        ready: 'Listo',
        failed: 'Fallido',
        dynamicUnsupported: 'La compilación dinámica no es compatible con la versión actual de OpenResty',
        moduleDynamicUnsupported: 'Los parámetros de este módulo no admiten la compilación dinámica',
        mirrorUrl: 'Fuente de software',
        paramsHelper: 'Por ejemplo: --add-module=/tmp/ngx_brotli; el modo dinámico lo convierte automáticamente',
        packagesHelper: 'Por ejemplo: git, curl (separados por coma)',
        scriptHelper:
            'Scripts a ejecutar antes de compilar, usualmente para descargar código fuente de módulos, instalar dependencias, etc.',
        buildHelper:
            'Los módulos dinámicos se cargan desde la configuración tras compilarse; los módulos estáticos siguen reconstruyendo OpenResty.',
        defaultHttps: 'HTTPS Anti-manipulación',
        defaultHttpsHelper1: 'Habilitar esto puede resolver problemas de manipulación de HTTPS.',
        sslRejectHandshake: 'Rechazar handshake SSL predeterminado',
        sslRejectHandshakeHelper:
            'Habilitar esto puede evitar la fuga de certificados, establecer un sitio web predeterminado invalidará esta configuración',
    },
    ssl: {
        create: 'Solicitar',
        provider: 'Tipo',
        manualCreate: 'Creado manualmente',
        acmeAccount: 'Cuenta ACME',
        resolveDomain: 'Resolver dominio',
        err: 'Error',
        value: 'valor del registro',
        dnsResolveHelper: 'Por favor, agrega los siguientes registros en tu proveedor de DNS:',
        detail: 'Ver detalles',
        msg: 'Información',
        ssl: 'Certificado',
        key: 'Clave privada',
        startDate: 'Fecha de inicio',
        organization: 'Organización emisora',
        renewConfirm: 'Esto renovará un nuevo certificado para el dominio {0}. ¿Deseas continuar?',
        autoRenew: 'Renovación automática',
        autoRenewHelper: 'Renueva automáticamente 30 días antes de la expiración',
        renewSuccess: 'Renovación exitosa',
        renewWebsite: 'Este certificado está asociado a los siguientes sitios y se aplicará en ellos simultáneamente',
        createAcme: 'Crear cuenta',
        acmeHelper: 'La cuenta Acme se usa para solicitar certificados gratuitos',
        upload: 'Importar',
        applyType: 'Método de solicitud',
        apply: 'Renovar',
        applyStart: 'Inicia solicitud de certificado',
        getDnsResolve: 'Obteniendo valor DNS, espera...',
        selfSigned: 'Gestionar CA autofirmada',
        ca: 'Autoridad certificadora',
        commonName: 'Nombre común',
        caName: 'Nombre de CA',
        company: 'Nombre de la organización',
        department: 'Unidad organizativa',
        city: 'Ciudad',
        province: 'Estado o provincia',
        country: 'País (código de 2 letras)',
        commonNameHelper: 'Por ejemplo, ',
        selfSign: 'Emitir certificado',
        days: 'Período de validez',
        domainHelper: 'Un dominio por línea, admite * y dirección IP',
        pushDir: 'Guardar certificado en el directorio local',
        dir: 'Directorio',
        pushDirHelper: 'Se generarán los archivos "fullchain.pem" y "privkey.pem" en este directorio.',
        organizationDetail: 'Detalles de la organización',
        fromWebsite: 'Desde el sitio web',
        dnsMauanlHelper: 'En modo manual, haz clic en solicitar tras la creación para obtener el valor DNS',
        httpHelper: 'El modo HTTP requiere OpenResty instalado y no soporta certificados comodín.',
        buypassHelper: 'Buypass no es accesible desde China continental',
        googleHelper: 'Cómo obtener EAB HmacKey y EAB kid',
        googleCloudHelper: 'La API de Google Cloud no es accesible en la mayoría de China',
        skipDNSCheck: 'Omitir comprobación DNS',
        skipDNSCheckHelper: 'Solo marca si tienes problemas de timeout al solicitar el certificado.',
        cfHelper: 'No uses la clave API Global',
        deprecated: 'será obsoleto',
        deprecatedHelper: 'El soporte se ha detenido y puede eliminarse en el futuro. Usa el método Tencent Cloud.',
        dnsPodRemoved: 'eliminado',
        dnsPodRemovedTip:
            'DnsPod ha sido eliminado en lego v5; esta cuenta no puede usarse para emisión o renovación de certificados. Cambia a una cuenta DNS de TencentCloud.',
        dnsPodRemovedSSLTip:
            'La cuenta DnsPod asociada a este certificado ya no es válida en lego v5; la renovación automática fallará. Cambia la cuenta DNS a TencentCloud.',
        disableCNAME: 'Deshabilitar CNAME',
        disableCNAMEHelper: 'Marca si el dominio tiene un CNAME y falla la solicitud.',
        nameserver: 'Servidor DNS',
        nameserverHelper: 'Usa un DNS personalizado para verificar dominios.',
        edit: 'Editar certificado',
        execShell: 'Ejecutar script tras solicitud de certificado.',
        shell: 'Contenido del script',
        shellHelper:
            'Por defecto, el script se ejecuta en el directorio de instalación de 1Panel. Si se guarda el certificado, será en ese directorio. Timeout: 30 minutos.',
        customAcme: 'Servicio ACME personalizado',
        customAcmeURL: 'URL del servicio ACME',
        baiduCloud: 'Baidu Cloud',
        pushNode: 'Sincronizar con otros nodos',
        pushNodeHelper: 'Enviar a los nodos seleccionados después de la aplicación/renovación',
        fromMaster: 'Envío desde el nodo maestro',
        hostedZoneID: 'Hosted Zone ID',
        isIP: 'Certificado IP',
        useEAB: 'Usar autenticación EAB',
    },
    firewall: {
        create: 'Crear regla',
        edit: 'Editar regla',
        ccDeny: 'Protección CC',
        ipWhiteList: 'Lista blanca de IP',
        ipBlockList: 'Lista negra de IP',
        fileExtBlockList: 'Lista negra de extensiones de archivo',
        urlWhiteList: 'Lista blanca de URL',
        urlBlockList: 'Lista negra de URL',
        argsCheck: 'Verificación de parámetros GET',
        postCheck: 'Verificación de parámetros POST',
        cookieBlockList: 'Lista negra de cookies',
        dockerHelper:
            'El firewall actual no puede deshabilitar el mapeo de puertos de contenedores. Las aplicaciones instaladas pueden ir a la página [Instaladas] para editar los parámetros de la aplicación y configurar reglas de liberación de puertos.',
        iptablesHelper:
            'Se detectó que el sistema está usando el firewall {0}. Para cambiar a iptables, ¡desinstálelo manualmente primero!',
        quickJump: 'Acceso rápido',
        used: 'En uso',
        unUsed: 'No usado',
        dockerRestart: 'Las operaciones del firewall requieren reiniciar el servicio de Docker',
        firewallHelper: 'Firewall del sistema {0}',
        firewallNotStart: 'El firewall del sistema no está habilitado actualmente. Actívalo primero.',
        restartFirewallHelper: 'Esta operación reiniciará el firewall actual. ¿Deseas continuar?',
        stopFirewallHelper: 'Esto hará que el servidor pierda protección de seguridad. ¿Deseas continuar?',
        startFirewallHelper:
            'Tras habilitar el firewall, la seguridad del servidor podrá protegerse mejor. ¿Deseas continuar?',
        noPing: 'Deshabilitar ping',
        enableBanPing: 'Bloquear Ping',
        disableBanPing: 'Desbloquear Ping',
        noPingTitle: 'Deshabilitar ping',
        noPingHelper: 'Esto deshabilitará el ping, y el servidor no responderá con eco ICMP. ¿Deseas continuar?',
        onPingHelper: 'Esto habilitará el ping, y los atacantes podrían descubrir tu servidor. ¿Deseas continuar?',
        changeStrategy: 'Cambiar la estrategia de {0}',
        changeStrategyIPHelper1:
            'Cambiar la estrategia de dirección IP a [denegar]. Después de establecerla, se prohibirá el acceso al servidor. ¿Deseas continuar?',
        changeStrategyIPHelper2:
            'Cambiar la estrategia de dirección IP a [permitir]. Después de establecerla, se restaurará el acceso normal. ¿Deseas continuar?',
        changeStrategyPortHelper1:
            'Cambiar la política de puerto a [rechazar]. Después de establecerla, se denegará el acceso externo. ¿Deseas continuar?',
        changeStrategyPortHelper2:
            'Cambiar la política de puerto a [aceptar]. Después de establecerla, se restaurará el acceso normal. ¿Deseas continuar?',
        stop: 'Detener',
        portFormatError: 'Este campo debe ser un puerto válido.',
        portHelper1: 'Puertos múltiples, ej. 8080 y 8081',
        portHelper2: 'Rango de puertos, ej. 8080-8089',
        changeStrategyHelper:
            'Cambiar estrategia de {0} [{1}] a [{2}]. Después de configurarla, {0} tendrá acceso externo como {2}. ¿Deseas continuar?',
        strategy: 'Estrategia',
        accept: 'Aceptar',
        drop: 'Rechazar',
        anyWhere: 'Cualquiera',
        address: 'IPs especificadas',
        addressHelper: 'Admite dirección IP o segmento de red',
        allow: 'Permitir',
        deny: 'Denegar',
        addressFormatError: 'Este campo debe ser una dirección IP válida.',
        addressHelper1: 'Admite dirección IP o rango de IP. Ejemplo: "172.16.10.11" o "172.16.10.0/24".',
        addressHelper2: 'Para múltiples direcciones IP, sepáralas con comas. Ejemplo: "172.16.10.11, 172.16.0.0/24".',
        allIP: 'Todas las IP',
        portRule: 'Regla | Reglas',
        forwardRule: 'Regla de redirección de puertos | Reglas de redirección de puertos',
        ipRule: 'Regla IP | Reglas IP',
        userAgent: 'Filtro User-Agent',
        sourcePort: 'Puerto de origen',
        targetIP: 'IP de destino',
        targetPort: 'Puerto de destino',
        forwardHelper1: 'Si quieres reenviar al puerto local, la IP de destino debe ser "127.0.0.1".',
        forwardHelper2: 'Deja en blanco la IP de destino para reenviar al puerto local.',
        forwardPortHelper: 'Admite rangos de puertos, ej.: 8080-8089',
        forwardInboundInterface: 'Interfaz de Red de Entrada para Reenvío',
        exportHelper: 'A punto de exportar {0} reglas de firewall. ¿Continuar?',
        importSuccess: 'Se importaron correctamente {0} reglas',
        importPartialSuccess: 'Importación completada: {0} correctas, {1} fallidas',
        ipv4Limit: 'La operación actual solo admite direcciones IPv4',
        basicStatus: 'La cadena actual {0} no está vinculada, ¡vincule primero!',
        baseIptables: 'Servicio iptables',
        forwardIptables: 'Servicio de Reenvío de Puertos iptables',
        advanceIptables: 'Servicio de Configuración Avanzada de iptables',
        initMsg: 'A punto de inicializar {0}, ¿continuar?',
        initHelper:
            'Se detectó que {0} no está inicializado. ¡Haga clic en el botón de inicialización en la barra de estado superior para configurar!',
        bindHelper:
            'Vincular: las reglas de firewall solo surtirán efecto cuando el estado esté vinculado. ¿Confirmar?',
        unbindHelper:
            'Desvincular: al desvincular, todas las reglas de firewall agregadas se volverán inválidas. Proceda con precaución. ¿Confirmar?',
        whiteList: 'Lista blanca',
        portWhiteList: 'Lista blanca de puertos',
        portWhiteListAlter:
            'Los puertos de la lista blanca se abrirán automáticamente al inicializar o iniciar el firewall.',
        portWhiteListHelper:
            'Puede especificar el protocolo, por ejemplo 80/tcp o 443/udp. Si se omite, se usa tcp por defecto.',
        defaultStrategy: 'La política predeterminada para la cadena actual {0} es {1}',
        defaultStrategy2:
            'La política predeterminada para la cadena actual {0} es {1}, el estado actual es no vinculado. ¡Las reglas de firewall agregadas surtirán efecto después de la vinculación!',
        filterRule: 'Regla de Filtro',
        filterHelper:
            'Las reglas de filtro le permiten controlar el tráfico de red a nivel INPUT/OUTPUT. Configure con cuidado para evitar bloquear el sistema.',
        chain: 'Cadena',
        targetChain: 'Cadena de Destino',
        sourceIP: 'IP de Origen',
        destIP: 'IP de Destino',
        inboundDirection: 'Dirección de Entrada',
        outboundDirection: 'Dirección de Salida',
        destPort: 'Puerto de Destino',
        action: 'Acción',
        reject: 'Rechazar',
        sourceIPHelper: 'Formato CIDR, ej. 192.168.1.0/24. Dejar vacío para todas las direcciones',
        destIPHelper: 'Formato CIDR, ej. 10.0.0.0/8. Dejar vacío para todas las direcciones',
        portHelper: '0 significa cualquier puerto',
        allPorts: 'Todos los Puertos',
        deleteRuleConfirm: 'Se eliminarán {0} reglas. ¿Continuar?',
        advancedControl: 'Control avanzado',
        advancedControlNotAvailable: 'Actualmente se usa el firewall {0}; las reglas avanzadas solo admiten iptables',
        destination: 'Destino',
    },
    runtime: {
        runtime: 'Runtime',
        default: 'Predeterminado',
        workDir: 'Directorio de trabajo',
        localHelper: 'Para problemas de instalación en entorno local y uso en entorno sin conexión, consulte ',
        versionHelper: 'Versión de PHP, ej. v8.0',
        buildHelper:
            'Si se seleccionan más extensiones, el uso de CPU será mayor durante el proceso de creación de la imagen. Evita seleccionar todas las extensiones.',
        openrestyWarn: 'PHP necesita actualizarse a OpenResty versión 1.21.4.1 o superior para poder usarse',
        toupgrade: 'Actualizar',
        edit: 'Editar runtime',
        extendHelper:
            'Si las extensiones que necesitas no están en la lista, puedes introducir el nombre manualmente. Ejemplo: "sockets", luego selecciona la primera.',
        rebuildHelper: 'Tras editar la extensión, debes reconstruir la aplicación PHP para que surta efecto',
        rebuild: 'Reconstruir aplicación PHP',
        source: 'Origen de extensiones PHP',
        ustc: 'Universidad de Ciencia y Tecnología de China',
        netease: 'Netease',
        aliyun: 'Alibaba Cloud',
        tsinghua: 'Universidad de Tsinghua',
        xtomhk: 'Espejo XTOM (Hong Kong)',
        xtom: 'Espejo XTOM (Global)',
        phpsourceHelper: 'Elige una fuente adecuada según tu entorno de red.',
        appPort: 'Puerto de la aplicación',
        externalPort: 'Puerto externo',
        packageManager: 'Gestor de paquetes',
        codeDir: 'Directorio del código',
        appPortHelper: 'El puerto usado por la aplicación.',
        externalPortHelper: 'El puerto expuesto al exterior.',
        runScript: 'Script de ejecución',
        runScriptHelper:
            'La lista de comandos de inicio se obtiene desde el archivo package.json en el directorio fuente.',
        open: 'Abrir',
        operatorHelper: 'La operación {0} se ejecutará sobre el entorno de ejecución seleccionado. ¿Deseas continuar?',
        taobao: 'Taobao',
        tencent: 'Tencent',
        imageSource: 'Fuente de imagen',
        moduleManager: 'Gestión de módulos',
        module: 'Módulo',
        nodeOperatorHelper:
            '¿Quieres {0} el módulo {1}? La operación puede causar fallos en el entorno de ejecución, confirma antes de continuar',
        customScript: 'Comando de inicio personalizado',
        customScriptHelper:
            'Por favor, ingresa el comando de inicio completo, por ejemplo: npm run start. Para comandos de inicio de PM2, por favor reemplaza con pm2-runtime, de lo contrario fallará al iniciar.',
        portError: 'No repitas el mismo puerto.',
        systemRestartHelper:
            'Descripción de estado: Interrupción - fallo al obtener estado debido a reinicio del sistema',
        javaScriptHelper:
            'Proporciona un comando de inicio completo. Ejemplo: "java -jar halo.jar -Xmx1024M -Xms256M".',
        javaDirHelper: 'El directorio debe contener archivos .jar, se permiten subdirectorios',
        goHelper: 'Proporciona un comando de inicio completo. Ejemplo: "go run main.go" o "./main".',
        goDirHelper: 'El directorio o subdirectorio debe contener archivos Go o binarios.',
        extension: 'Extensión',
        installExtension: '¿Confirmas instalar la extensión {0}?',
        loadedExtension: 'Extensión cargada',
        popularExtension: 'Extensión popular',
        uninstallExtension: '¿Seguro que quieres desinstalar la extensión {0}?',
        phpConfigHelper: 'Modificar la configuración requiere reiniciar el entorno de ejecución, ¿quieres continuar?',
        operateMode: 'Modo de operación',
        dynamic: 'Dinámico',
        static: 'Estático',
        ondemand: 'Bajo demanda',
        dynamicHelper:
            'Ajusta dinámicamente el número de procesos, alta flexibilidad, adecuado para sitios con grandes fluctuaciones de tráfico o poca memoria',
        staticHelper:
            'Número fijo de procesos, adecuado para sitios con alta concurrencia y tráfico estable, alto consumo de recursos',
        ondemandHelper:
            'Los procesos se inician y destruyen bajo demanda, la utilización de recursos es óptima, pero la respuesta inicial puede ser lenta',
        max_children: 'Número máximo de procesos permitidos',
        start_servers: 'Número de procesos creados al inicio',
        min_spare_servers: 'Número mínimo de procesos inactivos',
        max_spare_servers: 'Número máximo de procesos inactivos',
        envKey: 'Nombre',
        envValue: 'Valor',
        environment: 'Variable de entorno',
        pythonHelper:
            'Proporciona un comando de inicio completo. Ejemplo: "pip install -r requirements.txt && python manage.py runserver 0.0.0.0:5000".',
        dotnetHelper: 'Proporciona un comando de inicio completo. Ejemplo: "dotnet MyWebApp.dll".',
        dirHelper: 'Nota: rellena la ruta del directorio dentro del contenedor',
        concurrency: 'Esquema de concurrencia',
        loadStatus: 'Estado de carga',
        extraHosts: 'Mapeo de host',
    },
    process: {
        pid: 'ID de proceso',
        ppid: 'ID de proceso padre',
        numThreads: 'Hilos',
        memory: 'Memoria',
        diskRead: 'Lectura de disco',
        diskWrite: 'Escritura en disco',
        netSent: 'Tráfico de salida',
        netRecv: 'Tráfico de entrada',
        numConnections: 'Conexiones',
        startTime: 'Hora de inicio',
        running: 'En ejecución',
        sleep: 'En espera',
        stop: 'Detenido',
        idle: 'Inactivo',
        zombie: 'Proceso zombi',
        wait: 'Esperando',
        lock: 'Bloqueo',
        blocked: 'Bloqueado',
        cmdLine: 'Comando de inicio',
        basic: 'Básico',
        mem: 'Memoria',
        openFiles: 'Archivos abiertos',
        env: 'Entorno',
        noenv: 'Ninguno',
        net: 'Conexiones de red',
        laddr: 'Dirección/puerto local',
        raddr: 'Dirección/puerto remoto',
        stopProcess: 'Finalizar',
        viewDetails: 'Ver detalles',
        stopProcessWarn: '¿Seguro que deseas finalizar este proceso (PID:{0})?',
        kill: 'Terminar Proceso',
        killNow: 'Terminar Ahora',
        killHelper: 'Terminar el proceso {0} puede hacer que algunos programas funcionen incorrectamente. ¿Continuar?',
        processName: 'Nombre del proceso',
    },
    tool: {
        supervisor: {
            loadStatusErr: 'No se pudo obtener el estado del proceso, verifica el estado del servicio Supervisor.',
            notSupport:
                'Servicio Supervisor no detectado, ve a la página de librería de scripts para instalarlo manualmente',
            list: 'Procesos en segundo plano',
            config: 'Configuración de Supervisor',
            primaryConfig: 'Ubicación del archivo de configuración principal',
            notSupportCtl:
                'No se detectó supervisorctl, ve a la página de librería de scripts para instalarlo manualmente',
            user: 'Usuario',
            command: 'Comando',
            dir: 'Directorio',
            numprocs: 'Número de procesos',
            initWarn:
                'Esto modificará el valor de "files" en la sección "[include]" del archivo de configuración principal. El directorio de otros archivos de configuración será: "{directorio de instalación de 1Panel}/1panel/tools/supervisord/supervisor.d/".',
            operatorHelper: 'La operación {1} se ejecutará en {0}, ¿quieres continuar?',
            uptime: 'Tiempo en ejecución',
            notStartWarn: 'Supervisor no está iniciado. Inícialo primero.',
            serviceName: 'Nombre del servicio',
            initHelper:
                'El servicio Supervisor está detectado pero no inicializado. Haz clic en el botón de inicialización en la barra de estado superior para configurarlo.',
            serviceNameHelper:
                'Nombre del servicio Supervisor gestionado por systemctl, normalmente supervisor o supervisord',
            restartHelper:
                'Esto reiniciará el servicio después de la inicialización, lo que detendrá todos los procesos en segundo plano existentes.',
            RUNNING: 'En ejecución',
            STOPPED: 'Detenido',
            STOPPING: 'Deteniéndose',
            STARTING: 'Iniciándose',
            FATAL: 'Fallo al iniciar',
            BACKOFF: 'Excepción al iniciar',
            ERROR: 'Error',
            statusCode: 'Código de estado',
            manage: 'Gestión',
            autoRestart: 'Reinicio automático',
            EXITED: 'Finalizado',
            autoRestartHelper: 'Indica si el programa se reinicia automáticamente tras un fallo',
            autoStart: 'Inicio automático',
            autoStartHelper: 'Indica si el servicio se inicia automáticamente cuando arranca Supervisor',
        },
    },
    disk: {
        management: 'Gestión de discos',
        partition: 'Partición',
        unmount: 'Desmontar',
        unmountHelper: '¿Quieres desmontar la partición {0}?',
        mount: 'Montar',
        partitionAlert:
            'El particionado de disco requiere formatearlo, y los datos existentes se eliminarán. Guarda o realiza snapshots de tus datos previamente.',
        mountPoint: 'Directorio de montaje',
        systemDisk: 'Disco del sistema',
        unpartitionedDisk: 'Disco sin particionar',
        handlePartition: 'Particionar ahora',
        filesystem: 'Sistema de archivos',
        unmounted: 'No montado',
        cannotOperate: 'No se puede operar',
        systemDiskHelper: 'Aviso: El disco actual es el disco del sistema. No se puede operar sobre él.',
        autoMount: 'Montaje automático',
        model: 'Modelo del dispositivo',
        diskType: 'Tipo de disco',
        serial: 'Núm. de serie',
        noFail: 'El fallo de montaje no afecta al inicio del sistema',
    },
    xpack: {
        ldap: {
            source: 'Origen',
            directoryMissing: 'No existe en LDAP',
            localCredentialsManaged:
                'El nombre de usuario y la contraseña se administran mediante LDAP y no pueden modificarse localmente.',
            sources: {
                local: 'Local',
                ldap: 'LDAP',
            },
            importUsers: 'Importar usuarios de AD/LDAP',
            searchUsersPlaceholder: 'Buscar nombre de usuario',
            readFromLDAP: 'Leer de LDAP',
            selectedUsers: '{0} seleccionados',
            queriedAt: 'Leído el',
            cachedResult: 'Resultado almacenado en caché',
            roleForNewUsers: 'Rol para nuevos usuarios',
            selectRole: 'Seleccione un rol',
            roleOnlyForNewUsers: 'Solo se requiere un rol cuando la importación crea usuarios.',
            roleRequiredForNewUsers: 'Seleccione un rol para los nuevos usuarios de LDAP.',
            changedFields: 'Campos modificados',
            importSelected: 'Importar seleccionado',
            importAll: 'Importar todo',
            importPreview: 'Vista previa de importación de AD/LDAP',
            importCompleted: 'Importación de AD/LDAP completada',
            incompletePreview: 'La lectura del directorio LDAP estuvo incompleta. Lea de LDAP nuevamente.',
            missingUsersWarning:
                'Los usuarios que falten en LDAP serán deshabilitados mediante sincronización estricta.',
            missingUsersWarningDetail: '{0} usuarios LDAP locales ya no podrán iniciar sesión.',
            action: 'Acción',
            reason: 'Razón',
            noImportChanges: 'Sin cambios de importación',
            confirmImport: 'Confirmar importación',
            created: 'Crear',
            updated: 'Actualizar',
            reactivated: 'Reactivar',
            unchanged: 'Sin cambios',
            conflicts: 'Conflictos',
            missing: 'Ausentes',
            missingUsersConfirm:
                '{0} usuarios ausentes en LDAP serán deshabilitados y se cerrarán sus sesiones. ¿Continuar?',
            strictSyncConfirm: 'Confirmar sincronización estricta',
            status: {
                importable: 'Nuevo usuario',
                update_available: 'Actualización disponible',
                up_to_date: 'Actualizado',
                conflict: 'Conflicto',
            },
            fields: {
                name: 'Nombre de usuario',
                externalDN: 'Directorio DN',
                externalID: 'Identificación externa',
                authSourceStatus: 'Estado de autenticación',
            },
            actions: {
                created: 'Crear',
                updated: 'Actualizar',
                reactivated: 'Reactivar',
                unchanged: 'Sin cambios',
                skipped: 'Saltado',
                conflicts: 'Conflicto',
                conflict: 'Conflicto',
                missing: 'Desactivar',
                errors: 'Error',
                error: 'Error',
            },
        },
        expiresEnterpriseAlert:
            'Aviso: Tu licencia de Enterprise Edition expirará en {0} días y todas las funciones de Enterprise Edition dejarán de estar disponibles. Renueva pronto para asegurar el uso continuo.',
        expiresProAlert:
            'Aviso: Tu licencia de Pro Edition expirará en {0} días y todas las funciones de Pro Edition dejarán de estar disponibles. Renueva pronto para asegurar el uso continuo.',
        menu: 'Pro',
        upage: 'Constructor Web con IA',
        proAlert: 'Actualiza a la edición comercial para usar esta función',
        opsReport: {
            name: 'Informe de operaciones',
            overview: 'Resumen',
            system: 'Ejecución del host',
            login: 'Inicio de sesión y seguridad',
            website: 'Protección de sitios web',
            resource: 'Recursos de ejecución',
            cronjob: 'Tareas programadas',
            alert: 'Notificaciones de alerta',
            history: 'Historial de exportación',
            setting: 'Configuración',
            page: {
                enterprise: 'Edición Empresarial',
                reportNode: 'Nodo de informe',
                selectReportNode: 'Seleccionar nodo de informe',
                currentNode: 'Actual',
                scoreMeta: '{0} puntos deducidos · {1} riesgos',
                hostAddress: 'Dirección del host',
                panelVersion: 'Versión del panel',
                cpuCores: 'Núcleos físicos',
                coreUnit: '{0} núcleos',
                memoryTotal: 'Memoria total',
                reportDate: 'Fecha del informe',
                serverSecurityOverview: 'Resumen de operaciones de seguridad del servidor',
                securityScore: 'Puntuación de seguridad',
                overviewSummary:
                    'Nivel de seguridad actual: {0}. {1} puntos deducidos, {2} elementos de riesgo detectados, {3} objetos verificados.',
                riskDistribution: 'Distribución de riesgos',
                totalDeducted: 'Total deducido',
                noRiskDeducted: 'Sin deducciones',
                scoreTrend: 'Tendencia de puntuación',
                scoreLevelSafe: 'Seguro',
                scoreLevelAttention: 'Requiere atención',
                scoreLevelMediumRisk: 'Riesgo medio',
                scoreLevelHighRisk: 'Riesgo alto',
                scoreCategoryHost: 'Recursos del host',
                scoreCategoryLogin: 'Seguridad de acceso',
                scoreCategoryWebsite: 'Sitios web y certificados',
                scoreCategoryCronjob: 'Tareas programadas',
                scoreCategoryResource: 'Recursos de ejecución',
                scoreDiskHigh: 'Uso del disco {0}: {1}%',
                scoreDiskMedium: 'Uso del disco {0}: {1}%',
                scoreResourceHigh: 'Uso actual de {0}: {1}%',
                scoreResourceMedium: 'Uso actual de {0}: {1}%',
                scoreLoadMedium: 'Carga actual: {0}',
                scoreMonitorDisabled: 'El monitoreo del host está deshabilitado',
                scorePanelLoginFailedHigh: 'Acceso al panel fallido {0} veces',
                scorePanelLoginFailedMedium: 'Acceso al panel fallido {0} veces',
                scoreSSHLoginFailedHigh: 'Acceso SSH fallido {0} veces',
                scoreSSHLoginFailedMedium: 'Acceso SSH fallido {0} veces',
                scoreMFADisabled: 'MFA deshabilitado',
                scoreAllowIPsOpen: 'IPs autorizadas y dominio vinculado no configurados o acceso sin restricciones',
                scorePanelHTTPSDisabled: 'HTTPS del panel deshabilitado',
                scoreSSHRootLogin: 'El acceso SSH como root está permitido',
                scoreSSHPasswordAuth: 'Autenticación por contraseña SSH habilitada sin autenticación por clave',
                scoreSSLExpired: 'El certificado {0} ha caducado',
                scoreSSLHigh: 'El certificado {0} expira en {1} días',
                scoreSSLMedium: 'El certificado {0} expira en {1} días',
                scoreWebsiteExpired: 'El sitio web {0} ha caducado',
                scoreWebsiteExpire: 'El sitio web {0} expira en {1} días',
                scoreWebsiteHTTP: '{0} no usa HTTPS',
                scoreWebsiteStopped: 'Estado anormal de {0}',
                scoreWebsiteMonitorUnavailable: 'El monitoreo web detectó un sitio no disponible',
                scoreWebsiteMonitorAvailability:
                    'La disponibilidad de solicitudes del monitoreo web ({0}%) está por debajo del umbral',
                scoreWebsiteMonitorStatusAbnormal:
                    'El monitoreo web está habilitado, pero no se inicializó o está en un estado anormal',
                scoreWafDisabled: 'WAF deshabilitado, los sitios web no están protegidos',
                scoreWafHighRiskHit: 'WAF detectó {0} reglas de riesgo en el periodo del informe',
                scoreCronjobFailed: '{0} registros de fallos de tareas programadas en los últimos 7 días',
                scoreAppFailed: 'La aplicación {0} está en estado anormal',
                scoreAppStopped: 'La aplicación {0} se ha detenido',
                scoreContainerHigh: 'Estado anormal del contenedor {0}',
                scoreContainerExited: 'El contenedor {0} se ha detenido',
                scoreContainerResource: 'Alto uso de recursos del contenedor {0}',
                scoreContainerPublicPort: 'El contenedor {0} tiene puertos expuestos públicamente',
                attentionItems: 'Elementos de atención',
                attentionAssets: 'Activos de atención',
                riskItems: 'Elementos de riesgo',
                object: 'Objeto',
                description: 'Descripción',
                itemUnit: 'elementos',
                recordUnit: 'registros',
                certUnit: 'certificados',
                containerUnit: 'contenedores',
                loginFailed: 'Inicios de sesión fallidos',
                sslExpire: 'Vencimiento de certificado',
                abnormalContainer: 'Contenedores anómalos',
                statAttentionDesc: '{0} puntos deducidos',
                statLoginDesc: 'Panel {0} · SSH {1}',
                statSslDesc: '{0} certificados verificados',
                statContainerDesc: '{0} contenedores verificados',
                assetHostDesc: 'Uso máximo de disco {0}%',
                assetWebsiteDesc: '{0} certificados por vencer, {1} sitios web anómalos',
                assetResourceDesc: '{0} aplicaciones anómalas, {1} contenedores anómalos',
                assetCronjobDesc: '{0} registros de fallos en los últimos 7 días, {1} tareas deshabilitadas',
                app: 'Aplicaciones',
                website: 'Sitios web',
                websiteSsl: 'Sitios web / Certificados',
                cronjob: 'Tareas programadas',
                container: 'Contenedores',
                sslCertificate: 'Certificados SSL',
                loginSecurity: 'Seguridad de acceso',
                panelLogin: 'Acceso al panel',
                sshLogin: 'Acceso SSH',
                failedRecord: 'Registros fallidos',
                expired: 'Caducado',
                expiredDays: 'Expiró hace {0} días',
                remainingDays: '{0} · {1} días restantes',
                enabled: 'Habilitado',
                disabled: 'Deshabilitado',
                exportRecordFailed: 'Error al guardar el registro de exportación',
                hostInfo: 'Información del host',
                hostname: 'Nombre del host',
                osVersion: 'Versión del SO',
                kernelVersion: 'Versión del kernel',
                arch: 'Arquitectura',
                uptime: 'Tiempo de actividad',
                diskUsage: 'Uso de disco',
                mountPoint: 'Punto de montaje',
                device: 'Dispositivo',
                capacity: 'Capacidad',
                used: 'Usado',
                usageRate: 'Uso',
                memory: 'Memoria',
                load: 'Carga',
                maxDiskUsage: 'Uso máximo de disco',
                panelLoginSecurity: 'Seguridad de acceso al panel',
                sshSecurity: 'Seguridad SSH del servidor Linux',
                panelFailedRecords: 'Registros de accesos fallidos al panel',
                sshFailedRecords: 'Registros de accesos SSH fallidos',
                location: 'Ubicación',
                configItem: 'Elemento de configuración',
                currentValue: 'Valor actual',
                securityEntrance: 'Entrada de seguridad',
                configured: 'Configurado',
                notConfigured: 'No configurado',
                normal: 'Normal',
                needAttention: 'Requiere atención',
                allowIPs: 'IPs autorizadas',
                restricted: 'Restringido',
                unrestricted: 'Sin restricciones',
                bindDomain: 'Dominio vinculado',
                accessRestriction: 'Restricción de acceso',
                panelHTTPS: 'HTTPS del panel',
                passwordComplexity: 'Complejidad de contraseña',
                sshService: 'Servicio SSH',
                running: 'En ejecución',
                notRunning: 'No en ejecución',
                listenPort: 'Puerto de escucha',
                read: 'Leído',
                rootLogin: 'Acceso Root',
                passwordAuth: 'Autenticación por contraseña',
                keyAuth: 'Autenticación por clave',
                panelLoginFailed: 'Accesos fallidos al panel',
                sshLoginFailed: 'Accesos SSH fallidos',
                panelSecurityItems: 'Elementos de seguridad del panel',
                sshSecurityItems: 'Elementos de seguridad SSH',
                loginSecurityHealthStatus: 'Estado de salud de seguridad de acceso',
                adjustSSHSecurity: 'Ajustar seguridad SSH',
                viewLoginLogs: 'Ver registros de acceso',
                riskLevel: 'Nivel de riesgo',
                goConfig: 'Configurar',
                viewMore: 'Ver más',
                involvedIPs: '{0} IPs involucradas',
                sessionTimeout: 'Tiempo de espera de sesión',
                countUnit: 'veces',
                recent24Hours: 'Últimas 24 horas',
                currentService: 'Servicio actual',
                riskItemsExist: '{0} elementos de riesgo',
                loginHealthRiskDesc:
                    'Se detectaron {0} configuraciones de riesgo. Refuerce la seguridad de acceso para reducir el riesgo de intrusión.',
                loginHealthNormalDesc: 'Las configuraciones de acceso y SSH están en estado normal',
                loginHealthNormalReason: 'La seguridad de acceso es normal',
                securityEntranceConfiguredDesc:
                    'Entrada de seguridad configurada para reducir la exposición de la entrada predeterminada',
                securityEntranceRiskDesc:
                    'Entrada de seguridad deshabilitada. Se recomienda ocultar la entrada predeterminada',
                allowIPsRestrictedDesc: 'IPs autorizadas restringidas para el acceso al panel',
                allowIPsRiskDesc: 'IPs de acceso sin restricciones. Configure IPs autorizadas para entornos públicos',
                bindDomainRestrictedDesc: 'Dominio de acceso vinculado',
                bindDomainRiskDesc: 'Dominio de acceso no vinculado. Se recomienda restringir a un dominio fijo',
                accessRestrictionValue: 'IPs autorizadas: {0} / Dominio vinculado: {1}',
                accessRestrictionNormalDesc:
                    'IPs autorizadas o dominio vinculado configurados para restringir el acceso al panel',
                accessRestrictionRiskDesc:
                    'IPs autorizadas y dominio vinculado no configurados o acceso sin restricciones. Configure al menos uno',
                panelHTTPSNormalDesc: 'HTTPS del panel habilitado',
                panelHTTPSRiskDesc: 'HTTPS del panel deshabilitado. El tráfico de acceso puede estar expuesto',
                passwordComplexityNormalDesc: 'Verificación de complejidad de contraseña habilitada',
                passwordComplexityRiskDesc:
                    'Verificación de complejidad de contraseña deshabilitada, aumentando el riesgo de contraseñas débiles',
                mfa: 'Autenticación MFA',
                mfaNormalDesc: 'Autenticación MFA habilitada, mayor seguridad de acceso',
                mfaRiskDesc: 'Autenticación MFA deshabilitada. Se recomienda habilitar la autenticación multifactor',
                sessionTimeoutNormalDesc: 'El tiempo de espera de sesión está en un rango seguro',
                sessionTimeoutRiskDesc:
                    'Tiempo de espera de sesión largo. Se recomienda limitar la duración de sesiones inactivas',
                sshServiceNormalDesc: 'El servicio SSH está ejecutándose normalmente',
                sshServiceRiskDesc: 'El servicio SSH no está ejecutándose o está en estado anormal',
                sshPortNormalDesc: 'El puerto SSH se ha cambiado del puerto predeterminado',
                sshPortRiskDesc: 'SSH aún usa el puerto predeterminado 22. Se recomienda cambiarlo según sea necesario',
                rootLoginNormalDesc: 'El usuario root no puede iniciar sesión directamente',
                rootLoginRiskDesc: 'El usuario root puede iniciar sesión directamente. Se recomienda deshabilitarlo',
                passwordAuthNormalDesc: 'El inicio de sesión SSH por contraseña está deshabilitado',
                passwordAuthRiskDesc:
                    'El inicio de sesión por contraseña está permitido, aumentando el riesgo de fuerza bruta',
                keyAuthNormalDesc: 'La autenticación SSH por clave está habilitada',
                keyAuthRiskDesc:
                    'La autenticación por clave no está habilitada. Se recomienda usar inicio de sesión por clave',
                websiteOverview: 'Resumen de sitios web',
                primaryDomain: 'Dominio principal',
                expireTime: 'Fecha de vencimiento',
                domain: 'Dominio',
                issuer: 'Entidad emisora',
                autoRenew: 'Renovación automática',
                websiteCount: 'Sitios web',
                httpsWebsite: 'Sitios web HTTPS',
                certCount: 'Certificados',
                websiteExpire: 'Vencimiento de sitio web',
                database: 'Bases de datos',
                remoteDatabase: 'Bases de datos remotas',
                address: 'Dirección',
                containerResourceUsage: 'Uso de recursos de contenedores',
                spaceUsage: 'Uso de espacio',
                reclaimable: 'Recuperable',
                containerReclaimable: 'Contenedores recuperables',
                image: 'Imágenes',
                volume: 'Volúmenes',
                buildCache: 'Caché de compilación',
                alert: 'Alerta',
                alertConfigured: 'Alertas configuradas',
                alertOperations: 'Notificaciones de alerta',
                alertTaskCount: 'Tareas de alerta',
                enabledAlertTask: 'Tareas habilitadas',
                disabledAlertTask: 'Tareas deshabilitadas',
                alertChannels: 'Canales de notificación',
                alertLogCount: 'Registros de alerta',
                alertSuccessRate: 'Tasa de éxito de alertas',
                alertFailedLogs: 'Registros de alerta fallidos',
                alertPendingLogs: 'Registros pendientes de sincronización',
                alertPending: 'Pendiente de sincronización',
                alertTaskStats: 'Estadísticas de tareas de alerta',
                alertTaskType: 'Tipo de alerta',
                alertLogStatusStats: 'Estado de ejecución de alertas',
                alertHealthNormal: 'Normal',
                alertHealthAttention: 'Requiere atención',
                alertHealthRisk: 'Riesgo alto',
                alertHealthSummary: 'Estado de salud de alertas',
                alertHealthNormalReason:
                    'Tareas de alerta, canales de notificación y registros de ejecución están saludables',
                alertNoChannelReason: 'No hay canal de notificación de alerta habilitado',
                alertFailedLogReason: '{0} registros de fallos de alerta encontrados',
                alertPendingReason: '{0} registros de alerta pendientes de sincronización',
                alertDisabledTaskReason: '{0} tareas de alerta deshabilitadas',
                alertNoTaskReason: 'No hay tareas de alerta configuradas',
                goAlertConfig: 'Configuración de alertas',
                goAlertLogs: 'Registros de alerta',
                configureAlertChannel: 'Configurar canales de notificación',
                createAlertTask: 'Crear tarea de alerta',
                viewAlertTasks: 'Ver tareas de alerta',
                viewFailedAlertLogs: 'Ver registros fallidos',
                viewAlertLogs: 'Ver registros de alerta',
                alertChannelSummary: '{0} / {1} canales habilitados',
                alertTaskEnabledDesc: '{0} tareas habilitadas',
                alertTaskSummary: '{0} habilitadas, {1} deshabilitadas',
                alertLogSummary: '{0} exitosos, {1} fallidos',
                alertPendingDesc: '{0} registros pendientes de sincronización',
                alertLogSuccessDesc: 'Notificación completada',
                alertLogFailedDesc: 'Verifique la configuración del canal o la ruta de envío',
                alertLogPendingDesc: 'Sin conexión o ruta de sincronización pendiente',
                failedAlertLogs: 'Registros de alerta fallidos',
                disabledAlertTasks: 'Tareas de alerta deshabilitadas',
                alertTableDisplayDesc: 'Mostrando {0} de {1}',
                noAlertTask: 'Sin tareas de alerta',
                noFailedAlertLog: 'Sin registros de alerta fallidos',
                noDisabledAlertTask: 'Sin tareas de alerta deshabilitadas',
                alertMsg: 'Mensaje de alerta',
                alertMethod: 'Método de alerta',
                alertRule: 'Regla de alerta',
                alertCronjobType: 'Tarea programada: {0}',
                alertAllTargets: 'Todos los objetivos',
                alertAllDisks: 'Todos los discos',
                alertAllCertificates: 'Todos los certificados',
                alertAllWebsites: 'Todos los sitios web',
                alertDiskRuleShort: '{0} supera {1}{2}, {3} veces al día',
                alertAverageRuleShort: 'Promedio de {0} min supera {1}%, {2} veces al día',
                alertTimeRuleShort: 'Disparar en {0} días, enviar {1} veces',
                alertSendCountRuleShort: 'Enviar {0} veces al día',
                scoreCategoryAlert: 'Notificaciones de alerta',
                scoreAlertNoTask: 'No hay tareas de alerta configuradas',
                scoreAlertNoEnabledTask: 'Todas las tareas de alerta están deshabilitadas',
                scoreAlertDisabledTask: '{0} tareas de alerta deshabilitadas',
                scoreAlertNoChannel: 'No hay canal de notificación de alerta habilitado',
                scoreAlertFailedHigh: '{0} registros de fallos de alerta encontrados',
                scoreAlertFailedMedium: '{0} registros de fallos de alerta encontrados',
                scoreAlertPending: '{0} registros de alerta pendientes de sincronización',
                statAlertDesc: '{0} tareas habilitadas · {1} canales',
                assetAlertDesc: '{0} registros fallidos, {1} registros pendientes de sincronización',
                failedExecutionRecords: 'Registros de ejecución fallidos',
                taskID: 'ID de tarea',
                executeTime: 'Tiempo de ejecución',
                backupTasks: 'Tareas de copia de seguridad',
                systemMetrics: 'Métricas de ejecución',
                cpu: 'CPU',
                thresholdPercent: 'Umbral {0}%',
                recent24HourPeakPercent: 'Pico en las últimas 24 h: {0}',
                loadAverage: 'Carga 1 / 5 / 15 minutos: {0} / {1} / {2}',
                sourceMount: 'Punto de montaje {0}',
                storageUsage: 'Uso de almacenamiento',
                localDisk: 'Disco local',
                highUsagePeriods: 'Períodos de alto uso',
                timeRange: 'Rango de tiempo',
                threshold: 'Umbral',
                duration: 'Duración',
                peak: 'Pico',
                scoring: 'Puntuación',
                counted: 'Contabilizado',
                notCounted: 'No contabilizado',
                dataSource: 'Fuente de datos',
                noHighUsagePeriod: 'Sin períodos de alto uso',
                monitorDisabledOrNoData: 'El monitoreo del host está deshabilitado o no hay datos disponibles',
                systemHealthStatus: 'Estado de riesgo de ejecución del host en las últimas 24 h',
                mainReasons: 'Causas principales',
                viewHostMonitor: 'Ver monitoreo del host',
                systemHealthAttentionDesc:
                    '{0} elementos de riesgo detectados en las últimas 24 horas. Priorice los picos de recursos y el uso de disco.',
                systemHealthNormalDesc:
                    'Las métricas de ejecución del host estuvieron normales en las últimas 24 horas',
                monitorEnabled: 'Monitoreo habilitado',
                cpuCoreUsage: '{0} / {1} núcleos',
                load1Minute: 'Carga 1 min',
                diskSpaceUsage: 'Uso de espacio en disco',
                usedCapacity: 'Usado / Total',
                fileSystem: 'Sistema de archivos',
                resourceTrendSummary: 'Resumen de tendencia de recursos',
                last24Hours: 'Últimas 24 horas',
                granularityHour: 'Granularidad: 1 hora',
                current: 'Actual',
                average: 'Promedio',
                totalItems: '{0} elementos',
                to: 'a',
                hoursShort: '{0} h',
                minutesShort: '{0} min',
                websiteStatus: 'Estado de sitios web',
                websiteHealthStatus: 'Estado de salud de protección web',
                websiteHealthNormalReason: 'Sitios web, certificados, WAF y monitoreo web están saludables',
                websiteHealthAttentionDesc:
                    '{0} elementos de riesgo detectados. Gestiónelos pronto para proteger la seguridad y disponibilidad del sitio web.',
                websiteHealthNormalDesc: 'Las métricas de protección web actuales están normales',
                handleSslRisk: 'Gestionar riesgos de certificados',
                viewWaf: 'Ver WAF',
                priority: 'Prioridad',
                riskDescription: 'Descripción del riesgo',
                deductScore: 'Puntuación deducida',
                remaining: 'Restante',
                wafSourceIpTop: 'IPs fuente WAF TOP5',
                wafAffectedSiteTop: 'Sitios afectados TOP5',
                sslRisk: 'Riesgos de certificados',
                sslExpiring: 'Certificados por vencer',
                includedInReport: 'Incluido en el informe',
                needRenewal: 'Renovación recomendada',
                fromExpireInfo: 'Desde información de vencimiento',
                runningWebsite: 'Sitios web en ejecución',
                fromWebsiteStatus: 'Desde la lista de sitios web',
                stoppedWebsite: 'Sitios web detenidos',
                confirmStoppedWebsite: 'Confirme si esto es lo esperado',
                expiringWebsite: 'Sitios web por vencer',
                expiringSoon: 'Vencimiento próximo',
                none: 'Ninguno',
                noSslRisk: 'No hay certificados que gestionar',
                websiteProtection: 'WAF y monitoreo web',
                websiteMonitor: 'Monitoreo web',
                waf: 'WAF',
                siteAvailability: 'Disponibilidad de las solicitudes',
                monitoredSites: 'Sitios monitoreados',
                requestCount: 'Solicitudes',
                abnormalSites: 'Sitios anómalos',
                count5xxSource: 'Contabilizado por solicitudes 5xx',
                wafIntercept: 'Bloqueos WAF',
                websiteMonitorDisabledOrNoData: 'El monitoreo web está deshabilitado o no hay datos disponibles',
                wafDisabledOrNoData: 'WAF deshabilitado o sin datos de bloqueos',
                serviceEnabledButAbnormal: 'Habilitado, pero en estado anómalo',
                noWafData: 'Sin datos de bloqueos WAF',
                sourceIP: 'IP de origen',
                hitCount: 'Detecciones',
                level: 'Nivel',
                attackType: 'Tipo de ataque',
                requestRatio: 'Proporción de solicitudes',
                installed: 'Instalado',
                normalRunning: 'Ejecución normal',
                failedStart: 'Fallo al iniciar',
                manualStopped: 'Detenido manualmente',
                failed: 'Fallido',
                success: 'Exitoso',
                canUpdate: 'Actualizable',
                listSeparator: ', ',
                containerCount: 'Contenedores',
                stopped: 'Detenido',
                abnormal: 'Anómalo',
                abnormalContainers: 'Contenedores anómalos',
                resourceUsage: 'Uso de recursos',
                exposedContainerPorts: 'Puertos expuestos',
                portMapping: 'Mapeo de puertos',
                risk: 'Riesgo',
                noAbnormalContainer: 'Sin contenedores anómalos',
                noExposedContainer: 'No se detectaron puertos expuestos',
                publicExpose: 'Exposición pública',
                privateExpose: 'Mapeo privado',
                resourceHealth: 'Estado de recursos en ejecución',
                checkTime: 'Hora de comprobación',
                resourceHealthNormalDesc: 'Las aplicaciones, bases de datos y contenedores están saludables',
                resourceHealthAttentionDesc:
                    'Se detectaron {0} elementos de atención. Prioriza recursos detenidos y puertos públicos.',
                resourceHealthRiskDesc:
                    'Se detectaron {0} elementos de alto riesgo. Prioriza contenedores anómalos o apps fallidas.',
                resourceThresholdContainers: 'Contenedores que superan el umbral de CPU / memoria',
                noThresholdExceededContainer: 'No hay contenedores que superen el umbral',
                triggerMetric: 'Métrica activada',
                resourceReasonAppFailed: '{0} aplicaciones no iniciaron',
                resourceReasonAppStopped: '{0} aplicaciones detenidas',
                resourceReasonContainerAbnormal: '{0} contenedores anómalos',
                resourceReasonContainerStopped: '{0} contenedores detenidos',
                resourceReasonPublicPorts: '{0} puertos expuestos públicamente',
                resourceReasonNormal: 'Aplicaciones, bases de datos y contenedores están saludables',
                viewAbnormalContainers: 'Ver contenedores anómalos',
                viewExposedPorts: 'Ver puertos expuestos',
                viewAppResources: 'Ver recursos de apps',
                viewRuntimeResources: 'Ver recursos en ejecución',
                viewContainerResources: 'Ver recursos de contenedores',
                configuredServices: 'Servicios configurados',
                publicPrivatePorts: '{0} públicos / {1} mapeos privados',
                currentDisplayTotal: 'Mostrando {0} de {1}',
                reclaimableSpace: 'Espacio recuperable',
                estimatedReclaimable: 'Recuperable estimado',
                unusedImageSpace: 'Espacio de imágenes sin usar',
                stoppedContainerSpace: 'Espacio de contenedores detenidos',
                unusedVolumeSpace: 'Espacio de volúmenes sin usar',
                buildCacheSpace: 'Caché de compilación de Docker',
                executionRecords: 'Registros de ejecución',
                successRate: 'Tasa de éxito',
                failedJobs: 'Tareas fallidas',
                recentRecoveryPoint: 'Último punto de recuperación',
                disabledCronjobTasks: 'Tareas programadas deshabilitadas',
                remoteCoverage: 'Cobertura remota',
                recent7Days: 'Últimos 7 días',
                taskTypeStats: 'Estadísticas por tipo de tarea',
                total: 'Total',
                taskTypeDesc: '{0} habilitadas, {1} deshabilitadas',
                failedOrAttentionTasks: 'Tareas fallidas o de atención',
                execution: 'Ejecución',
                latestExecution: 'Última ejecución',
                remoteBackup: 'Copia de seguridad remota',
                localOnly: 'Solo local',
                covered: 'Cubierto',
                noAttentionCronjob: 'Sin tareas programadas fallidas o de atención',
                cronjobHealth: 'Estado de salud de tareas programadas',
                cronjobHealthNormalDesc: 'La ejecución de tareas y la cobertura de copias están saludables',
                cronjobHealthAttentionDesc:
                    'Se detectaron {0} elementos de riesgo. Prioriza tareas deshabilitadas y cobertura de copias.',
                cronjobHealthRiskDesc:
                    'Se detectaron {0} elementos de riesgo. Prioriza tareas fallidas y deshabilitadas.',
                cronjobReasonFailed: '{0} registros fallidos',
                cronjobReasonDisabled: '{0} tareas deshabilitadas',
                cronjobReasonLocalOnlyBackup: '{0} copias solo locales',
                cronjobReasonNormal: 'La ejecución de tareas y la cobertura de copias son normales',
                riskLow: 'Riesgo bajo',
                viewFailedRecords: 'Ver tareas fallidas',
                viewCronjobTasks: 'Ver tareas programadas',
                checkBackupTasks: 'Comprobar tareas de copia',
                generationRule: 'Regla de generación',
                scheduleDaily: 'Diario',
                scheduleDailyDesc: 'Generar un informe de las últimas 24 horas a las 09:00 cada día',
                scheduleWeekly: 'Semanal',
                scheduleWeeklyDesc: 'Generar un informe de los últimos 7 días a las 09:00 cada lunes',
                scheduleMonthly: 'Mensual',
                scheduleMonthlyDesc: 'Generar un informe del mes anterior a las 09:00 el día 1',
                scheduleCurrentDaily: 'Cada día a las 09:00, generar informe de las últimas 24 horas · Próximo {0}',
                scheduleCurrentWeekly: 'Cada lunes a las 09:00, generar informe de los últimos 7 días · Próximo {0}',
                scheduleCurrentMonthly: 'El día 1 a las 09:00, generar informe del mes anterior · Próximo {0}',
                notificationMethod: 'Métodos de notificación',
                channel: 'Canal',
                receiver: 'Destinatario',
                systemThreshold: 'Umbral del sistema',
                metric: 'Métrica',
                currentRule: 'Regla actual',
                hostMonitor: 'Monitoreo del host',
                monitorInterval: 'Intervalo de monitoreo',
                exportSettings: 'Configuración de exportación',
                lastExportReport: 'Último resultado generado',
                noLastExportReport: 'Sin registros de informes exportados',
                lastExportStatus: 'Estado de última exportación',
                exportFile: 'Archivo exportado',
                generateTime: 'Fecha de generación',
                fileSize: 'Tamaño del archivo',
                viewExportHistory: 'Ver historial de exportación',
                defaultFormat: 'Formato predeterminado',
                savePath: 'Directorio de guardado',
                savePathRequired: 'Configure el directorio de guardado del informe',
                autoExport: 'Habilitar exportación automática',
                autoExportDesc:
                    'Generar automáticamente un informe de operaciones cada día a las 09:00 cuando esté habilitado',
                autoExportEnabled: 'Exportación automática habilitada',
                autoExportDisabled: 'Exportación automática deshabilitada',
                readOnlyPermissionTip:
                    'La cuenta actual solo puede ver la configuración del informe de operaciones. Contacte al administrador para realizar cambios.',
                refreshing: 'Actualizando',
                exporting: 'Exportando',
                exportFailed: 'Error al exportar el informe',
                generating: 'Generando',
                saved: 'Guardado',
                saveFailed: 'Error al guardar la configuración',
                generateNow: 'Generar ahora',
                generateSuccess: 'Archivo de informe generado: {0}',
                generateFailed: 'Error al generar el informe',
                enabledStatus: 'Habilitado',
                disabledStatus: 'Deshabilitado',
                alertConfigInvalid: 'Configuración inválida',
                thresholdRule: 'Umbral {0}, disparar después de {1} veces consecutivas',
                hours: '{0} horas',
                minutes: '{0} minutos',
                seconds: '{0} segundos',
                totalExports: 'Total de exportaciones',
                successExports: 'Exportaciones exitosas',
                failedExports: 'Exportaciones fallidas',
                reportName: 'Nombre del informe',
                exportFormat: 'Formato de exportación',
                operator: 'Operador',
                triggerType: 'Disparador',
                filePath: 'Ruta del archivo',
                manualExport: 'Manual',
                scheduledExport: 'Programado',
                exportResult: 'Resultado de exportación',
                exportDetail: 'Detalle de exportación',
            },
        },
        user: {
            user: 'Usuario',
            userInfo: 'Información de usuario',
            userManage: 'Gestión de usuarios',
            superAdmin: 'Superadministrador',
            superAdminDesc:
                'Tiene permisos completos de administración del sistema y puede gestionar todos los recursos y configuraciones.',
            nodeAdmin: 'Administrador de nodo',
            nodeAdminDesc:
                'Tiene permisos de administración para nodos especificados y puede gestionar recursos y configuraciones dentro de esos nodos.',
            readOnly: 'Solo lectura',
            readOnlyDesc: 'Tiene acceso de solo lectura a todos los recursos y configuraciones del sistema.',
            bindNode: 'Vincular nodo',
            boundUsers: 'Usuarios vinculados',
            role: 'Rol',
            roleName: 'Nombre',
            permission: 'Permisos',
            permissionDuplicate: 'Solo se puede asignar un rol a cada nodo',
            nodeAdminMasterConfirm:
                'Los permisos de administrador de nodo en el nodo principal son elevados. Asígnelos con cuidado según las necesidades reales de administración.',
            permissionLinkageTip:
                'Si hay dependencias, los permisos relacionados se seleccionarán automáticamente; tras quitarlos manualmente, algunas funciones pueden mostrar "El usuario actual no tiene permiso".',
            allViewPermissionHelper: 'Concede todos los permisos de visualización para AI Gateway.',
            apiKeyViewPermissionHelper: 'Solo permite ver las API Keys de AI Gateway.',
            masterOnlyPermission: 'Permiso del nodo principal',
            masterOnlyPermissionHelper: 'Este permiso solo tiene efecto en el nodo principal.',
            view: 'Ver',
            manage: 'Gestionar',
            authManage: 'Gestión de autenticación',
            auth: {
                providerNavigation: 'Proveedores de autenticación',
                defaultNode: 'Nodo predeterminado',
                defaultNodePlaceholder: 'Selecciona un nodo',
                defaultNodeHelper: 'Solo para usuarios nuevos.',
                defaultNodeRequired: 'Selecciona un nodo predeterminado válido.',
                nodesLoadFailed:
                    'No se pudieron cargar los nodos. Reinténtalo antes de seleccionar el nodo predeterminado.',
                nodeHandling: 'Gestión del nodo',
                assignDefaultNode: 'Asignar nodo predeterminado: {node}',
                keepExistingNode: 'Mantener los permisos de nodo existentes',
                providers: {
                    ldap: 'AD/LDAP',
                    passkey: 'Passkey',
                    radius: 'Radius',
                    oidc: 'OIDC',
                    saml2: 'SAML2',
                    cas: 'CAS',
                    oauth2: 'OAuth2',
                    dingtalk: 'DingTalk',
                    feishu: 'Feishu',
                    wecom: 'WeCom',
                },
                providerDescriptions: {
                    ldap: 'Compatible con Active Directory, OpenLDAP y otros servicios LDAP',
                    passkey: 'Utilice las credenciales del dispositivo para iniciar sesión sin contraseña',
                    radius: 'Autenticar el acceso a la red a través de un servicio Radius',
                    oidc: 'Conecte el inicio de sesión único empresarial con OpenID Connect',
                    saml2: 'Utilice SAML2 para la federación de identidades empresariales',
                    cas: 'Conecte un servicio de autenticación centralizado para inicio de sesión único',
                    oauth2: 'Conecte un servicio de identidad OAuth2 compatible',
                    dingtalk: 'Utilice la identidad de la organización DingTalk y el inicio de sesión QR',
                    feishu: 'Utilice la identidad de la organización Feishu y la sincronización de cuentas',
                    wecom: 'Autenticar con identidad de miembro de WeCom',
                },
                planned: 'Planificado',
                plannedTitle: 'Configuración de autenticación {0}',
                plannedDesc: 'Este proveedor de autenticación está planificado y aún no está disponible.',
                oidc: {
                    accessMode: 'Modo de conexión',
                    accessModeDesc: 'Usar Discovery estándar siempre que el proveedor de identidad lo admita.',
                    actionCreate: 'Crear usuario',
                    actionKeepName: 'Mantener el nombre actual',
                    actionPending: 'Esperando resultado',
                    actionReject: 'Rechazar inicio de sesión',
                    actionUpdate: 'Actualizar información de identidad',
                    advanced: 'Configuración avanzada',
                    advancedDesc:
                        'Mantener los valores predeterminados seguros a menos que el proveedor requiera una opción de compatibilidad.',
                    assignDefaultRole: 'Asignar rol predeterminado: {role}',
                    authorizationEndpoint: 'Authorization Endpoint',
                    authorizationEndpointInvalid: 'Ingrese un Authorization Endpoint válido.',
                    authorizationFlow: 'Flujo de autorización',
                    automatic: 'Automático',
                    automaticPolicy: 'Política de manejo automático',
                    automaticPolicyDesc: 'Estas reglas las aplica el backend y no son conmutadores de administrador.',
                    basic: 'Configuración básica',
                    basicDesc:
                        'Seleccione el modo de proveedor, luego configure el cliente y la devolución de llamada.',
                    browserTest: 'Prueba de inicio de sesión en el navegador',
                    browserTestConflict: 'Identidad verificada, pero el nombre de usuario está en conflicto',
                    browserTestConflictHelper:
                        'El nombre de usuario asignado pertenece a otra identidad y no se vinculará.',
                    browserTestExpired: 'La prueba del navegador expiró',
                    browserTestExpiredHelper:
                        'Inicie una nueva prueba del navegador y complete la autorización antes de que caduque.',
                    browserTestFailed: 'La prueba del navegador falló',
                    browserTestFailedHelper:
                        'No se pudo completar la vista previa de la identidad. Revise el error de backend localizado.',
                    browserTestIsolation:
                        'Esto realiza un flujo de autorización real de ida y vuelta, pero no crea ni actualiza usuarios, no asigna roles ni crea una sesión de autenticación real.',
                    browserTestPopupBlocked:
                        'Permite ventanas emergentes para este sitio, luego inicia la prueba del navegador nuevamente.',
                    browserTestPopupClosed: 'La ventana de autorización se cerró antes de completar la prueba.',
                    browserTestSuccess: 'Verificación del proveedor correcta',
                    browserTestSuccessHelper:
                        'Se obtuvo una vista previa de la asignación de identidad sin cambiar usuarios o sesiones.',
                    browserTestTitle: 'Inicio de sesión de prueba del navegador OIDC',
                    browserTestWaiting: 'Esperando la autorización del proveedor',
                    browserTestWaitingHelper:
                        'Inicio de sesión completo en la nueva ventana del navegador. Esta página se actualizará automáticamente.',
                    callbackCopied: 'URL de devolución de llamada OIDC copiada.',
                    callbackURL: 'URL de devolución de llamada',
                    callbackURLHelper:
                        'Añada esta URL a las URL de retorno permitidas del cliente en el proveedor de identidad.',
                    cancelClearSecret: 'Cancelar limpieza',
                    clearSecret: 'Borrar secreto',
                    clearSecretConfirm: 'El Client Secret se eliminará solo después de guardar. ¿Continuar?',
                    clientAuthMethod: 'Método de autenticación del cliente',
                    clientAuthMethodHelper:
                        'Seleccione el método de autenticación configurado para este cliente en el proveedor de identidad.',
                    clientAuthMethodRequired: 'Seleccione un método de autenticación del cliente.',
                    clientID: 'Client ID',
                    clientIDRequired: 'Ingrese el Client ID.',
                    clientSecret: 'Client Secret',
                    clockSkew: 'Tolerancia de tiempo del token',
                    clockSkewHelper:
                        'Permite una pequeña diferencia horaria entre el proveedor de identidad y 1Panel. Mantenga el valor predeterminado de 60 segundos.',
                    clockSkewRequired: 'Ingrese la tolerancia de tiempo del token.',
                    compatibilityMode: 'Modo de compatibilidad',
                    compatibilityModeHelper:
                        'Úselo solo para Discovery incompleto o puntos finales reescritos. La validación principal de OIDC permanece habilitada.',
                    configurationFailedHelper:
                        'La prueba falló. La página solo muestra el error de backend localizado.',
                    configurationFailedTag: 'Prueba fallida',
                    configurationHighRiskPassed:
                        'La configuración fue aprobada, pero contiene opciones de compatibilidad de alto riesgo.',
                    configurationHighRiskTag: 'Configuración de alto riesgo aprobada',
                    configurationNotTested: 'La configuración actual no se ha probado.',
                    configurationNotTestedTag: 'No probado',
                    configurationPassed: 'La configuración actual pasó las comprobaciones de seguridad y capacidad.',
                    configurationPassedTag: 'Prueba aprobada',
                    configurationStaleHelper: 'La configuración se modificó. Vuelva a probarla antes de guardar.',
                    configurationStaleTag: 'Resultado caducado',
                    configurationTestMeta:
                        'Probado el {time}; completado en {duration} ms. Las respuestas sin procesar del proveedor no se almacenan.',
                    configurationTestResult: 'Resultado de la prueba de configuración',
                    configurationTestResultDesc:
                        'Esto verifica Discovery y sus capacidades únicamente; no intercambia un código de autorización ni prueba el Client Secret. Utilice el inicio de sesión de prueba del navegador para la verificación de un extremo a otro.',
                    configurationTestSuccess: 'La prueba de configuración del OIDC fue exitosa.',
                    configurationTesting: 'Probando la configuración actual del OIDC…',
                    configurationTestingTag: 'Probando',
                    configureSecret: 'Configurar secreto',
                    conflictExistingRename:
                        'Un subject vinculado devuelve un nombre de usuario nuevo que ya está ocupado',
                    conflictExistingRenameResult:
                        'Mantenga el User.Name existente y permita que el usuario vinculado inicie sesión',
                    conflictLDAP: 'Usuario LDAP',
                    conflictLocal: 'Usuario local',
                    conflictNewAvailable: 'El subject nuevo y el nombre de usuario asignado están disponibles',
                    conflictNewAvailableResult: 'Cree un usuario empresarial y asigne el rol predeterminado',
                    conflictNone: 'Sin conflicto',
                    conflictOIDC: 'Otra identidad OIDC',
                    conflictOccupied:
                        'El nombre de usuario asignado pertenece a un usuario local, LDAP u otra identidad OIDC',
                    conflictOccupiedResult: 'Rechazar la nueva identidad; nunca se vincule ni fusione automáticamente',
                    conflictType: 'Tipo de conflicto',
                    connectionSecurity: 'Seguridad de la conexión',
                    connectionSecurityDesc:
                        'La política TLS se aplica a las solicitudes Discovery, Token, JWKS y UserInfo.',
                    connectionTest: 'Prueba de conexión y configuración',
                    connectionTestCompatibilityDesc:
                        'Valide los endpoints personalizados y la política de seguridad del protocolo.',
                    connectionTestStandardDesc:
                        'Los puntos finales y las capacidades se descubren automáticamente desde el Issuer.',
                    connectionTestTab: 'Prueba de conexión',
                    customCA: 'CA personalizada',
                    customCAHelper:
                        'Se aplica solo a esta fuente de autenticación y nunca se escribe en los registros.',
                    customCARequired: 'Proporcione el certificado de la CA personalizada.',
                    defaultRole: 'Rol predeterminado',
                    defaultRoleHelper:
                        'Se asigna solo al crear el usuario por primera vez; los siguientes inicios de sesión no cambian el rol.',
                    defaultRolePlaceholder: 'Seleccione un rol',
                    defaultRoleRequired: 'Seleccione un rol predeterminado válido.',
                    disableAfterSave: 'OIDC se deshabilitará después de guardar.',
                    disableConfirm:
                        'Deshabilitar OIDC inmediatamente invalida el acceso de los usuarios de esta fuente. ¿Continuar?',
                    disableDiscardConfirm:
                        'Desactivar OIDC es una acción de emergencia: solo cierra la entrada de inicio de sesión e inmediatamente invalida el acceso de los usuarios de esta fuente. Se descartarán otros cambios no guardados en esta página, incluidos los cambios Client Secret. ¿Continuar?',
                    disableTitle: 'Desactivar OIDC',
                    disabled: 'Desactivado',
                    discoveryAllowlist: 'Lista segura de Discovery',
                    enable: 'Activar',
                    enableAfterSave: 'OIDC se habilitará después de guardar correctamente.',
                    enabled: 'Activado',
                    endSessionEndpoint: 'End Session Endpoint',
                    endSessionEndpointHelper:
                        'Se guarda para uso futuro; el cierre de sesión iniciado por el proveedor no está incluido en esta versión.',
                    endSessionEndpointInvalid: 'Ingrese un End Session Endpoint válido.',
                    endpointDiscoveryPlaceholder: 'Se muestra después de probar la conexión',
                    firstLogin: 'Primer inicio de sesión',
                    firstLoginPolicy: 'Cree un usuario empresarial local y asigne el rol predeterminado configurado.',
                    fixedAuthorizationCode: 'Authorization Code Flow',
                    fixedNoTokenPersistence: 'Token, Claims y verifier nunca persisten',
                    fixedSecurityPolicy: 'Siempre se aplican; no se requiere configuración',
                    fixedStateNonce: 'state y nonce por única vez',
                    fixedTokenValidation: 'Firma ID Token y validación de Claims',
                    highRiskSaveConfirm:
                        'Esta configuración habilitada contiene opciones de compatibilidad de alto riesgo. Confirme que el entorno aislado los requiere.',
                    highRiskTitle: 'Configuración de OIDC de alto riesgo',
                    hs256Compatibility: 'HS256 (compatibilidad)',
                    hs256KeyHelper:
                        'HS256 siempre usa el Client Secret de esta fuente y no admite una clave de firma separada.',
                    hs256Warning:
                        'HS256 utiliza un secreto simétrico compartido para las firmas ID Token. Úselo solo cuando el proveedor no pueda usar un algoritmo asimétrico.',
                    identityBindingPolicy:
                        'La identidad se fija en AuthSourceID + issuer + subject. La coincidencia por nombre de usuario nunca reclama otra cuenta.',
                    identityMissing: 'Identidad inactiva',
                    issuer: 'Issuer URL',
                    issuerHelper:
                        'El valor iss de ID Token y Discovery issuer deben coincidir exactamente con este valor.',
                    issuerInvalid: 'Ingrese un valor válido HTTP o HTTPS Issuer URL sin consulta ni fragmento.',
                    issuerRequired: 'Ingrese el Issuer URL.',
                    jwksRotation: 'Rotación automática de JWKS',
                    jwksURI: 'JWKS URI',
                    jwksURIHelper: 'Requerido para la firma asimétrica cuando la fuente de clave es JWKS.',
                    jwksURIInvalid: 'Ingrese un JWKS URI válido para la fuente de clave de firma seleccionada.',
                    keepExistingRole: 'Mantener los roles y permisos locales existentes',
                    localSecurityData: 'Datos de seguridad locales',
                    localSecurityDataPolicy: 'Nunca sobrescriba roles, MFA, API Keys, Passkeys o permisos locales.',
                    localCredentialsManaged:
                        'El nombre de usuario y la contraseña local se administran mediante OIDC y no se pueden editar aquí. Los roles, permisos, MFA, API Keys y Passkeys permanecen locales.',
                    localUserFields: 'Campos de usuario locales',
                    localUserFieldsDesc:
                        'La primera versión asigna solo User.Name y no utiliza una expresión de asignación JSON.',
                    loginWith: 'Iniciar sesión con {provider}',
                    manualEndpoints: 'Endpoints personalizados',
                    manualEndpointsDesc:
                        'Úselo solo cuando Discovery esté incompleto o una puerta de enlace ascendente reescriba los endpoints.',
                    mappingResult: 'Resultado de la asignación',
                    mode: 'Modo de conexión',
                    modeRequired: 'Seleccione un modo de conexión.',
                    nameClaim: 'Claim de nombre de usuario',
                    nameClaimHelper: 'Introduzca el campo que contiene el nombre de usuario, como preferred_username.',
                    nameClaimRequired: 'Introduzca el Claim del nombre de usuario.',
                    nameConflict: 'Política de conflicto de nombres',
                    panelURL: 'URL pública de 1Panel',
                    panelURLHTTPWarning:
                        'HTTP no protege la respuesta de autorización. Úselo solo en un entorno privado aislado aceptado por el proveedor.',
                    panelURLHelper:
                        'Introduzca la dirección que usan los usuarios para acceder a 1Panel. Se utiliza para generar la URL de retorno.',
                    panelURLInvalid: 'Ingrese un origen que contenga solo esquema, host y puerto opcional.',
                    panelURLRequired: 'Introduzca la URL pública de 1Panel.',
                    pkceDisabled: 'Deshabilitado (solo compatibilidad)',
                    pkceDisabledWarning:
                        'Deshabilitar PKCE reduce la protección contra la interceptación de códigos de autorización.',
                    pkceHelper: 'Prefiere S256. El método de desafío plain nunca se ofrece.',
                    pkceS256: 'S256 (recomendado)',
                    plannedHandling: 'Manejo planificado',
                    privateNetworkIdP: 'IdP de red privada',
                    privateNetworkIdPHelper:
                        'Permite explícitamente direcciones privadas; las direcciones de metadatos, loopback y link-local, las redirecciones y el rebinding DNS permanecen bloqueados.',
                    privateNetworkWarning:
                        'El acceso a la red privada está habilitado para esta fuente de autenticación.',
                    protocolCompatibility: 'Compatibilidad de protocolo',
                    protocolCompatibilityDesc: 'La validación de la firma del ID Token no se puede deshabilitar.',
                    providerAndClient: 'Proveedor y cliente',
                    providerAndClientDesc:
                        'El Client Secret solo se puede reemplazar o borrar y la página nunca lo devuelve.',
                    providerCapabilities: 'Capacidades del proveedor',
                    recentTestSuccess: 'Última prueba correcta: {0}',
                    recommended: 'Recomendado',
                    rejectPlain: 'plain rechazado',
                    replaceSecret: 'Reemplazar secreto',
                    requestAndClaims: 'Solicitudes y atributos',
                    requestAndClaimsDesc:
                        'Configure los alcances de autorización, la información de usuario complementaria y los parámetros de solicitud.',
                    requestTimeout: 'Tiempo de espera de solicitud',
                    requestTimeoutRequired: 'Ingrese el tiempo de espera de solicitud.',
                    restore: 'Restaurar',
                    restored: 'Se restauró la última configuración de OIDC guardada.',
                    result: 'Resultado',
                    rolesLoadFailed:
                        'No se pudieron cargar los roles. Vuelva a intentarlo antes de seleccionar el rol predeterminado.',
                    roleHandling: 'Gestión de roles',
                    scenario: 'Escenario',
                    scopes: 'Alcances de autorización',
                    scopesHelper: 'Debe incluir openid. Separe varios alcances con espacios.',
                    scopesRequired: 'Scopes debe incluir openid.',
                    seconds: 'segundos',
                    secretClearHelper:
                        'Después de borrarlo, se requiere un Client Secret nuevo para volver a habilitar OIDC.',
                    secretConfigured: 'Configurado',
                    secretNotConfigured: 'No configurado',
                    secretPlaceholder: 'Ingrese un nuevo Client Secret',
                    secretReplaceHelper:
                        'El nuevo secreto sustituirá el valor guardado al guardar. Actualice también el Client Secret en el Provider OIDC.',
                    secretRequiredHelper: 'Configure un Client Secret antes de habilitar OIDC.',
                    secretRequiredToEnable: 'Configure un Client Secret antes de habilitar OIDC.',
                    secretSavedHelper: 'Se almacena cifrado. Deje el campo vacío para conservar el secreto actual.',
                    secretWaiting: 'Esperando entrada',
                    secretWillClear: 'Se borrará',
                    secretWillReplace: 'Será reemplazado',
                    signingAlgorithm: 'Algoritmo de firma ID Token',
                    signingAlgorithmHelper:
                        'Solo están disponibles los algoritmos de la lista de seguridad de backend.',
                    signingKey: 'Clave de firma',
                    signingKeyClientSecret: 'Client Secret (solo HS256)',
                    signingKeyJWKS: 'JWKS URI con rotación automática',
                    signingKeySource: 'Fuente de clave de firma',
                    signingKeySourceHelper: 'Prefiere JWKS. Una clave pública estática no puede rotar automáticamente.',
                    signingKeyStatic: 'Clave pública JWK o PEM estática',
                    standardDiscovery: 'OIDC Discovery estándar',
                    standardDiscoveryDesc:
                        '1Panel descubre los endpoints y las capacidades, pero no almacena el documento sin procesar.',
                    standardMode: 'Modo estándar',
                    standardModeHelper:
                        'Descubra puntos finales, capacidades de firma y compatibilidad con PKCE del Issuer.',
                    standardProtocolPolicy: 'Política de protocolo estándar',
                    standardProtocolPolicyDesc:
                        'Las capacidades de firma se negocian automáticamente; aquí no se ingresa ninguna clave de firma.',
                    staticSigningKey: 'Clave pública de firma estática',
                    staticSigningKeyHelper:
                        'Solo se acepta material de clave pública. Rótela manualmente cuando cambie la clave del proveedor.',
                    staticSigningKeyPlaceholder: 'Pegue una clave pública JWK, JWKS JSON o PEM',
                    staticSigningKeyRequired: 'Proporcione la clave pública de firma estática.',
                    staticSigningKeyWarning:
                        'Una clave de firma estática no puede rotar automáticamente; actualícela antes de que el proveedor rote sus claves.',
                    settingLoadFailed: 'La configuración del OIDC no se pudo cargar',
                    settingLoadFailedHelper:
                        'El formulario está bloqueado para evitar guardar una configuración predeterminada vacía sobre la configuración actual. Vuelva a intentarlo después de que se recupere la conexión.',
                    subsequentLogin: 'Inicio de sesión posterior',
                    subsequentLoginPolicy:
                        'Busque el vínculo por subject y actualice User.Name solo cuando el nombre nuevo esté disponible.',
                    testBeforeBrowserTest:
                        'Pruebe la configuración actual antes de iniciar la prueba de inicio de sesión en el navegador.',
                    testBeforeEnable: 'Prueba la configuración actual antes de guardar los cambios de configuración.',
                    testConfiguration: 'Probar configuración',
                    testDiscovery: 'Probar Discovery',
                    tlsCustomCA: 'HTTPS · Certificado CA personalizado',
                    tlsPrivateHTTP: 'HTTP · Solo red privada (peligroso)',
                    tlsPrivateHTTPWarning:
                        'HTTP no proporciona cifrado de transporte y está restringido a objetivos privados permitidos explícitamente.',
                    tlsSkipVerify: 'HTTPS · Omitir verificación de certificado (peligroso)',
                    tlsSystem: 'HTTPS · Verificación del certificado del sistema (recomendado)',
                    tokenEndpoint: 'Token Endpoint',
                    tokenEndpointInvalid: 'Ingrese un Token Endpoint válido.',
                    transportSecurity: 'Seguridad en el transporte',
                    transportSecurityHelper:
                        'Se recomienda HTTPS. El HTTP privado también requiere permitir explícitamente el acceso a la red privada.',
                    unsavedChanges: 'Hay cambios de OIDC sin guardar.',
                    usedClaim: 'Claim usado',
                    userInfoEndpoint: 'UserInfo Endpoint',
                    userInfoEndpointHelper:
                        'Si falta el campo de nombre de usuario, el sistema lo obtiene de este endpoint. Déjelo vacío para omitir el complemento.',
                    userInfoEndpointInvalid: 'Ingrese un UserInfo Endpoint válido.',
                    userMapping: 'Configuración de usuarios',
                    userMappingDesc:
                        'Configure la asignación del nombre de usuario OIDC y el nodo y rol predeterminados usados al crear un usuario en el primer inicio de sesión.',
                },
                saml2: {
                    actionCreate: 'Crear usuario',
                    actionPending: 'Esperando resultado',
                    actionReject: 'Rechazar inicio de sesión',
                    actionReuse: 'Usar usuario vinculado',
                    assignDefaultRole: 'Asignar rol predeterminado: {role}',
                    basic: 'Configuración básica',
                    basicDesc:
                        'Configure las opciones comunes requeridas por la mayoría de los proveedores SAML2 estándar.',
                    browserTest: 'Probar inicio de sesión',
                    browserTestConflict: 'Identidad verificada, pero el nombre de usuario está en conflicto',
                    browserTestConflictHelper:
                        'El nombre de usuario asignado pertenece a otra identidad y no se vinculará.',
                    browserTestExpired: 'La prueba del navegador expiró',
                    browserTestExpiredHelper:
                        'Inicie una nueva prueba del navegador y complete la autorización antes de que caduque.',
                    browserTestFailed: 'La prueba del navegador falló',
                    browserTestFailedHelper:
                        'No se pudo completar la vista previa de la identidad. Revise el error de backend localizado.',
                    browserTestIsolation:
                        'Esto realiza un flujo de autorización real de ida y vuelta, pero no crea ni actualiza usuarios, no asigna roles ni crea una sesión de autenticación real.',
                    browserTestPopupBlocked:
                        'Permite ventanas emergentes para este sitio, luego inicia la prueba del navegador nuevamente.',
                    browserTestPopupClosed: 'La ventana de autorización se cerró antes de completar la prueba.',
                    browserTestSuccess: 'Verificación del proveedor correcta',
                    browserTestSuccessHelper:
                        'Se obtuvo una vista previa de la asignación de identidad sin cambiar usuarios o sesiones.',
                    browserTestTitle: 'Inicio de sesión de prueba del navegador SAML2',
                    browserTestWaiting: 'Esperando la autorización del proveedor',
                    browserTestWaitingHelper:
                        'Inicio de sesión completo en la nueva ventana del navegador. Esta página se actualizará automáticamente.',
                    certificateFileInvalid: 'Seleccione un archivo de certificado PEM, CRT o CER válido.',
                    configured: 'Configurado',
                    configurationFailedHelper:
                        'La prueba falló. La página solo muestra el error de backend localizado.',
                    configurationNotTested: 'La configuración actual no se ha probado.',
                    configurationPassed: 'La configuración actual pasó las comprobaciones de seguridad y capacidad.',
                    configurationStaleHelper:
                        'Se cambiaron las configuraciones sensibles a la autenticación. Pruebe el borrador actual nuevamente.',
                    configurationTestSuccess: 'La prueba de configuración del SAML2 fue exitosa.',
                    configurationTesting: 'Probando la configuración actual del SAML2…',
                    conflictLDAP: 'Usuario LDAP',
                    conflictLocal: 'Usuario local',
                    conflictNone: 'Sin conflicto',
                    conflictOIDC: 'Otra identidad OIDC',
                    conflictSAML2: 'Otra identidad SAML2',
                    conflictType: 'Tipo de conflicto',
                    credentialFileReadFailed: 'No se pudo leer el archivo de credenciales.',
                    credentialFileTooLarge: 'Los archivos de credenciales no deben superar los 256 KiB.',
                    credentialsRequired: 'Configure la clave privada y el certificado del SP.',
                    defaultRole: 'Rol del nuevo usuario',
                    defaultRoleHelper:
                        'Se asigna solo en la primera creación; los inicios posteriores conservan roles, MFA y permisos locales.',
                    defaultRolePlaceholder: 'Seleccione un rol',
                    defaultRoleRequired: 'Seleccione un rol predeterminado válido.',
                    disableConfirm:
                        'Desactivar SAML2 rechaza inmediatamente los nuevos inicios de sesión e invalida sus sesiones de usuario. ¿Continuar?',
                    disableDiscardConfirm:
                        'Desactivar SAML2 descarta otros cambios no guardados de esta página e invalida de inmediato sus sesiones de usuario. ¿Continuar?',
                    disableTitle: 'Desactivar SAML2',
                    disabled: 'Desactivado',
                    enable: 'Activar',
                    enabled: 'Activado',
                    idpMetadata: 'Metadatos del IdP',
                    idpMetadataDesc: 'Introduzca una URL o pegue el XML. Si existen ambos, la URL tiene prioridad.',
                    keepExistingRole: 'Mantener los roles y permisos locales existentes',
                    loginWith: 'Iniciar sesión con {provider}',
                    mappingResult: 'Resultado de la asignación',
                    metadataRequired: 'Introduzca la URL o el XML de metadatos del IdP.',
                    metadataURLHelper: 'El backend descarga y valida los metadatos durante la prueba y el guardado.',
                    metadataURLInvalid: 'Introduzca una URL HTTPS de metadatos válida, sin credenciales ni fragmento.',
                    metadataURLRecommended: 'URL de metadatos (recomendada)',
                    metadataXML: 'XML de metadatos',
                    metadataXMLHelper: 'Úselo cuando el IdP no exponga una URL de metadatos accesible.',
                    metadataXMLInvalid: 'Introduzca un XML de metadatos EntityDescriptor válido.',
                    metadataXMLPlaceholder: 'Pegue <EntityDescriptor>...</EntityDescriptor>',
                    nameAttribute: 'Atributo de nombre de usuario',
                    nameAttributeHelper:
                        'Lee este atributo de la aserción SAML verificada y lo asigna al nombre de usuario de 1Panel.',
                    nameAttributePlaceholder: 'Por ejemplo: uid, username o account',
                    nameAttributeRequired: 'Introduzca el atributo de nombre de usuario.',
                    notConfigured: 'Sin configurar',
                    or: 'o',
                    pageDesc:
                        'Conecte el SSO empresarial mediante metadatos del IdP con las opciones comunes en una sola página.',
                    plannedHandling: 'Manejo planificado',
                    privateKeyFileInvalid: 'Seleccione un archivo de clave privada PEM válido.',
                    recentTestSuccess: 'Última prueba correcta: {0}',
                    restore: 'Restaurar',
                    restored: 'Se restauró la última configuración de SAML2 guardada.',
                    roleHandling: 'Gestión de roles',
                    rolesLoadFailed:
                        'No se pudieron cargar los roles. Vuelva a intentarlo antes de seleccionar el rol predeterminado.',
                    selectFile: 'Seleccionar archivo',
                    serviceStatus: 'Estado del servicio',
                    serviceStatusDesc: 'La configuración actual debe superar una prueba antes de activar SAML2.',
                    settingLoadFailed: 'La configuración del SAML2 no se pudo cargar',
                    settingLoadFailedHelper:
                        'El formulario está bloqueado para evitar guardar una configuración predeterminada vacía sobre la configuración actual. Vuelva a intentarlo después de que se recupere la conexión.',
                    spCertificate: 'Certificado del SP',
                    spCertificateHelper:
                        'Se publica en los metadatos del SP para que el IdP pueda verificar las solicitudes de inicio y cierre de sesión.',
                    spCredentials: 'Clave privada y certificado del SP',
                    spCredentialsDesc:
                        'Se usan para firmar mensajes de inicio y cierre de sesión. El backend fija la política de firma y validación.',
                    spEntityID: 'SP Entity ID',
                    spEntityIDHelper:
                        'Identificador único del SP. Debe coincidir con el ID de entidad o la audiencia configurada en el IdP; también es la URL de metadatos del SP.',
                    acsURL: 'ACS URL',
                    sloURL: 'SLO URL',
                    spPrivateKey: 'Clave privada del SP',
                    spPrivateKeyHelper:
                        'Se usa para firmar AuthnRequest y mensajes de cierre de sesión. Se cifra en reposo y nunca se muestra.',
                    syncLogout: 'Cierre de sesión sincronizado',
                    syncLogoutHelper:
                        'Cerrar sesión en 1Panel o en el proveedor de identidad también cierra la sesión del otro lado.',
                    testBeforeBrowserTest:
                        'Pruebe la configuración actual antes de iniciar la prueba de inicio de sesión en el navegador.',
                    testBeforeEnable: 'Prueba la configuración actual antes de habilitar o guardar cambios sensibles.',
                    testConfiguration: 'Probar configuración',
                    unsavedChanges: 'Hay cambios de SAML2 sin guardar.',
                    usedAttribute: 'Mapeo de nombre de usuario',
                    usersAndRoles: 'Usuarios y roles',
                    usersAndRolesDesc:
                        'Configure la asignación del nombre de usuario del panel y el nodo y rol predeterminados usados al crear un usuario en el primer inicio de sesión.',
                },
                ldap: {
                    basic: 'Configuración básica',
                    loginTitle: 'Inicio de sesión LDAP',
                    loginWith: 'Iniciar sesión con LDAP',
                    backToLocalLogin: 'Volver al inicio de sesión del panel',
                    enable: 'Habilitar',
                    enabled: 'Habilitado',
                    disabled: 'Deshabilitado',
                    connection: 'Conexión básica',
                    connectionDesc:
                        'Configure el servicio de directorio y la cuenta de vinculación utilizada para buscar usuarios.',
                    serverURL: 'URL del servidor',
                    serverURLHelper: 'Admite URL ldap:// y ldaps://.',
                    userBaseDN: 'Base DN de usuario',
                    userBaseDNHelper:
                        'DN inicial para las búsquedas de usuarios LDAP; puede ser una OU, un CN o el DN raíz del dominio.',
                    bindDN: 'DN de enlace',
                    bindPassword: 'Contraseña',
                    passwordSaved: 'Déjelo en blanco para conservar la contraseña guardada.',
                    userSearch: 'Búsqueda de usuarios',
                    userSearchDesc:
                        'Configure la base y el filtro de búsqueda, y asigne el atributo LDAP al campo name de 1Panel.',
                    userFilter: 'Filtro de usuario',
                    userFilterTooltip:
                        'Reemplace %(user)s con el nombre de usuario con carácter de escape o con * para leer el directorio completo.',
                    userFilterHelper:
                        'Los nombres de usuario tienen caracteres de escape antes de insertarlos en el filtro LDAP.',
                    attributeMap: 'Mapeo de atributos',
                    attributeMapTooltip: 'Mapeo JSON del campo name de 1Panel a un atributo LDAP.',
                    attributeMapHelper: 'Configure el atributo LDAP asignado al campo name de 1Panel.',
                    advanced: 'Configuraciones avanzadas',
                    advancedDesc: 'Configure la paginación de consultas TLS y LDAP.',
                    strictSync: 'Sincronización estricta',
                    strictSyncTooltip:
                        'Después de un procesamiento completo, el estado de autenticación de los usuarios que faltan en esta fuente LDAP se marca como No encontrado en LDAP, pero los usuarios no se eliminan.',
                    strictSyncHelper:
                        'Solo se aplica a un procesamiento completo correcto. Importar usuarios seleccionados no cambia el estado de autenticación de otros usuarios.',
                    skipTLSVerify: 'Saltar la verificación TLS',
                    skipTLSVerifyTooltip: 'Deshabilite la verificación de certificados para conexiones LDAPS.',
                    connectTimeout: 'Tiempo de espera de conexión (segundos)',
                    searchPageSize: 'Tamaño de página de consulta LDAP',
                    restore: 'Restaurar',
                    testConnection: 'Probar conexión',
                    testLogin: 'Probar inicio de sesión',
                    userImport: 'Importar usuarios',
                    saveBeforeImport: 'Guarde la configuración actual de AD/LDAP antes de importar usuarios.',
                    format: 'Formato',
                    restoreExample: 'Ejemplo de restauración',
                    mappingValid: 'JSON válido; el campo name está configurado.',
                    mappingInvalid: 'Introduzca un JSON válido.',
                    mappingObject: 'La asignación de atributos debe ser un objeto JSON.',
                    mappingOnlyName: 'Solo se admite la asignación name.',
                    mappingStringValues: 'Cada atributo asignado debe ser una cadena.',
                    mappingNameRequired: 'name debe ser una cadena que no esté vacía.',
                    restored: 'Se restauraron las últimas configuraciones guardadas.',
                    connectionTestSuccess: 'La prueba de conexión LDAP fue exitosa.',
                    recentTestSuccess: 'Última prueba exitosa: {0}',
                    recentTestFailed: 'Última prueba fallida: {0}',
                    serverURLRequired: 'Ingrese la URL del servidor LDAP.',
                    serverURLInvalid: 'Utilice una URL ldap:// o ldaps:// válida.',
                    userBaseDNRequired: 'Ingrese la Base DN de usuario.',
                    bindDNRequired: 'Ingrese el DN de enlace.',
                    passwordRequired: 'Ingrese la contraseña.',
                    userFilterRequired: 'Ingrese el filtro de usuario.',
                    connectTimeoutRequired: 'Introduzca el tiempo de espera de la conexión.',
                    searchPageSizeRequired: 'Ingrese el tamaño de la página de consulta LDAP.',
                    sync: {
                        title: 'Sincronización programada',
                        description:
                            'Lea el directorio LDAP completo de forma programada y mantenga los usuarios LDAP importados en 1Panel.',
                        enable: 'Habilitar horario',
                        enableHelper:
                            'Cuando está deshabilitado, la ejecución automática se detiene; la sincronización manual permanece disponible.',
                        schedule: 'Horario',
                        daily: 'Diariamente',
                        weekly: 'Semanal',
                        customCron: 'Personalizado Cron',
                        preview: 'Vista previa',
                        previewTitle: 'Próximas 5 ejecuciones',
                        previewEmpty: 'No hay tiempo de ejecución disponible',
                        cronHelper:
                            'Utilice una expresión Cron estándar de cinco campos: minuto, hora, día, mes y día de la semana.',
                        autoImport: 'Importar nuevos usuarios',
                        autoImportHelper:
                            'Cuando está deshabilitado, solo se mantienen los identificadores y el estado del directorio para los usuarios LDAP importados; no se crean nuevos usuarios.',
                        defaultRole: 'Nuevo rol de usuario',
                        defaultRolePlaceholder: 'Seleccione un rol',
                        defaultRoleHelper: 'Solo se aplica a usuarios creados mediante sincronización programada.',
                        defaultRoleRequired: 'Seleccione un rol para los nuevos usuarios de LDAP.',
                        strictSyncHelper:
                            'Tras una sincronización completa, marca a los usuarios ausentes en LDAP como No encontrado en LDAP y borra sus sesiones sin eliminar usuarios, roles ni permisos.',
                        runNow: 'Sincronizar ahora',
                        lastRunSuccess: 'Última sincronización exitosa: {0}',
                        lastRunFailed: 'La última sincronización falló: {0}',
                        lastRunRunning: 'Sincronización iniciada: {0}',
                        sourceDisabled: 'Habilite y guarde AD/LDAP antes de ejecutar la sincronización.',
                        cronRequired: 'Introduzca una expresión Cron.',
                        saveBeforeRun: 'Guarde la configuración de sincronización antes de ejecutar la tarea.',
                        runConfirmTitle: 'Ejecutar sincronización estricta',
                        runConfirmDescription:
                            'El estado de autenticación de los usuarios que falten en una consulta LDAP completa se marcará como No encontrado en LDAP y sus sesiones activas se borrarán. ¿Continuar?',
                        runSuccess: 'Sincronización LDAP completada.',
                        weekdays: {
                            0: 'domingo',
                            1: 'lunes',
                            2: 'martes',
                            3: 'miércoles',
                            4: 'jueves',
                            5: 'viernes',
                            6: 'sábado',
                        },
                    },
                    syncLogs: {
                        title: 'Registros de sincronización',
                        description: 'Revise los resultados de la sincronización manual y programada de LDAP.',
                        startedAt: 'Hora de inicio',
                        trigger: 'Tipo de ejecución',
                        manual: 'Manual',
                        scheduled: 'Programado',
                        success: 'Éxito',
                        failed: 'Fallido',
                        running: 'En ejecución',
                        result: 'Resultado',
                        resultSummary: 'Creados {0}, actualizados {1}, ausentes {2}',
                        duration: 'Duración',
                        action: 'acción',
                    },
                    testLoginTitle: 'Probar inicio de sesión AD/LDAP',
                    testLoginDesc:
                        'Vincule con una credencial de usuario AD/LDAP para probar solo la autenticación. No se crea ninguna sesión 1Panel.',
                    ldapUsername: 'nombre de usuario LDAP',
                    usernameRequired: 'Ingrese el nombre de usuario LDAP.',
                    startTest: 'Iniciar prueba',
                    testLoginSuccess: 'La autenticación fue exitosa.',
                    testLoginSuccessWithDN: 'La autenticación fue exitosa. Usuario DN: {0}',
                    import: {
                        title: 'Importar usuarios de AD/LDAP',
                        source: 'Fuente de datos: directorio AD/LDAP',
                        lastRead: 'Última lectura: {0}',
                        cacheHit: 'Resultado almacenado en caché',
                        keywordPlaceholder: 'Buscar nombre de usuario',
                        search: 'Buscar',
                        refresh: 'Leer de LDAP',
                        refreshTip: 'Ignore el caché a corto plazo y vuelva a leer el directorio LDAP.',
                        loadFailed: 'No se pudo leer el directorio LDAP.',
                        retry: 'Reintentar',
                        noData: 'No se encontraron usuarios del directorio.',
                        username: 'Nombre de usuario',
                        status: 'Estado',
                        changes: 'Cambios',
                        noChanges: 'Sin cambios',
                        importable: 'Listo para importar',
                        updateAvailable: 'Actualización disponible',
                        upToDate: 'actualizado',
                        conflict: 'Conflicto de nombres',
                        selectedCount: '{0} seleccionado',
                        totalCount: '{0} usuarios',
                        newUserRole: 'Nuevo rol de usuario',
                        newUserRoleRequired: 'Seleccione un rol para nuevos usuarios.',
                        noNewUsers: 'No hay nuevos usuarios en esta operación.',
                        roleOnlyForNewUsers: 'El rol seleccionado se aplica solo a los usuarios recién creados.',
                        strictOff:
                            'La sincronización estricta está deshabilitada. Una importación completa no deshabilitará a los usuarios.',
                        importSelected: 'Importar/actualizar seleccionado ({0})',
                        importAll: 'Importar/actualizar todo ({0})',
                        previewTitle: 'Confirmar importación completa',
                        previewDesc:
                            'Se leyó el directorio LDAP completo. La palabra clave de búsqueda no limita esta operación.',
                        created: 'crear',
                        updated: 'Actualizar',
                        unchanged: 'Sin cambios',
                        conflicts: 'Conflictos',
                        missing: 'Desactivar',
                        reactivated: 'Reactivar',
                        strictWarning:
                            'La sincronización estricta está habilitada. Los usuarios que faltan en LDAP no pueden iniciar sesión, pero se conservan sus registros, roles y permisos.',
                        missingUsers: 'Usuarios que faltan en LDAP',
                        missingScope: 'Sólo esta fuente LDAP se ve afectada.',
                        willDisable: 'Estará deshabilitado',
                        confirmAll: 'Confirmar importación',
                        confirmAllWithMissing: 'Confirmar importación y deshabilitar {0} usuarios',
                        executeSuccess: 'Los usuarios de LDAP se procesaron exitosamente.',
                        queryExpired: 'El resultado del directorio expiró. Lea de LDAP nuevamente.',
                        planIncomplete: 'La lectura completa del directorio está incompleta y no se puede ejecutar.',
                    },
                },
            },
        },
        app: {
            app: 'APP',
            title: 'Alias del Panel',
            titleHelper: 'El alias del panel se usa para mostrar en la APP (alias por defecto)',
            qrCode: 'Código QR',
            apiStatusHelper: 'La APP del Panel necesita que la API esté habilitada',
            apiInterfaceHelper: 'Permite acceso a la API del panel (debe estar habilitada para la APP)',
            apiInterfaceHelper1:
                'El acceso requiere añadir el visitante a la lista blanca; para IPs dinámicas se recomienda usar 0.0.0.0/0 (IPv4) o ::/0 (IPv6)',
            qrCodeExpired: 'Tiempo de refresco',
            apiLeakageHelper: 'No divulgues el código QR. Úsalo solo en entornos de confianza.',
        },
        logExport: {
            title: 'Exportar registros',
            records: 'Historial de exportación',
            retentionDays: 'Retención del historial de exportación',
            timeRange: 'Intervalo de tiempo',
            timeRequired: 'Selecciona el intervalo de exportación',
            websiteRequired: 'Selecciona un sitio web',
            blackStatus: 'Estado de lista negra',
            black: 'Bloqueado',
            notBlack: 'No bloqueado',
            fuzzy: 'Coincidencia parcial',
            regex: 'Expresión regular',
            invalidRegex: 'Introduce una expresión RE2 válida de hasta 256 caracteres',
            created: 'Tarea de exportación creada',
            fileName: 'Nombre del archivo',
            fileSize: 'Tamaño del archivo',
            expiresAt: 'Caduca el',
            cancelConfirm: '¿Cancelar esta tarea de exportación?',
            deleteConfirm: '¿Eliminar este registro y archivo de exportación?',
        },
        waf: {
            WAF: 'WAF',
            name: 'WAF',
            blackWhite: 'Lista Blanca y Negra',
            globalSetting: 'Configuración Global',
            websiteSetting: 'Configuración del Sitio',
            blockRecords: 'Registros Bloqueados',
            world: 'Mundial',
            china: 'China',
            intercept: 'Intercepciones',
            request: 'Peticiones',
            count4xx: 'Cantidad 4xx',
            count5xx: 'Cantidad 5xx',
            todayStatus: 'Estado de hoy',
            reqMap: 'Mapa de ataques (últimos 30 días)',
            resource: 'Fuente',
            count: 'Cantidad',
            hight: 'Alto',
            low: 'Bajo',
            reqCount: 'Solicitudes',
            interceptCount: 'Número de intercepciones',
            requestTrends: 'Tendencia de solicitudes (últimos 7 días)',
            interceptTrends: 'Tendencia de intercepciones (últimos 7 días)',
            whiteList: 'Whitelist',
            blackList: 'Blacklist',
            ipBlackListHelper: 'Las IP en la blacklist no pueden acceder al sitio web',
            ipWhiteListHelper: 'Las IP en la whitelist saltan todas las restricciones',
            uaBlackListHelper: 'Las peticiones con User-Agent en blacklist serán bloqueadas',
            uaWhiteListHelper: 'Las peticiones con User-Agent en whitelist saltan todas las restricciones',
            urlBlackListHelper: 'Las peticiones a URLs en blacklist serán bloqueadas',
            urlWhiteListHelper: 'Las peticiones a URLs en whitelist saltan todas las restricciones',
            ccHelper:
                'Si un sitio recibe más de {1} peticiones de la misma IP en {0} segundos, la IP será bloqueada por {2}',
            blockTime: 'Duración de bloqueo',
            attackHelper: 'Si las intercepciones acumuladas superan {1} en {0} segundos, la IP se bloquea por {2}',
            notFoundHelper: 'Si el número de errores 404 supera {1} en {0} segundos, la IP será bloqueada por {2}',
            frequencyLimit: 'Límite de frecuencia',
            regionLimit: 'Límite regional',
            defaultRule: 'Reglas por defecto',
            accessFrequencyLimit: 'Límite de frecuencia de acceso',
            attackLimit: 'Límite de frecuencia de ataques',
            notFoundLimit: 'Límite de 404',
            urlLimit: 'Límite de frecuencia por URL',
            urlLimitHelper: 'Configura el límite de acceso para una URL específica',
            sqliDefense: 'Protección contra SQL Injection',
            sqliHelper: 'Detecta SQL Injection en peticiones y las bloquea',
            xssHelper: 'Detecta XSS en peticiones y las bloquea',
            xssDefense: 'Protección contra XSS',
            uaDefense: 'Reglas contra User-Agent malicioso',
            uaHelper: 'Incluye reglas para bots maliciosos comunes',
            argsDefense: 'Reglas contra parámetros maliciosos',
            argsHelper: 'Bloquea peticiones con parámetros maliciosos',
            cookieDefense: 'Reglas contra cookies maliciosas',
            cookieHelper: 'Prohíbe cookies maliciosas en las peticiones',
            headerDefense: 'Reglas contra cabeceras maliciosas',
            headerHelper: 'Prohíbe cabeceras maliciosas en las peticiones',
            httpRule: 'Reglas de métodos HTTP',
            httpHelper:
                'Define qué métodos HTTP están permitidos. Ejemplo: solo GET. Para restringir, desactiva los métodos no deseados',
            geoRule: 'Restricciones geográficas',
            geoHelper:
                'Combina políticas de región y provincia con un solo interruptor. Primero se aplican las reglas regionales y después las provinciales',
            regionPolicy: 'Política regional',
            provincePolicy: 'Política provincial',
            provinceRuleLabel: 'Provincia',
            openRestyFeatureVersionAlert: 'OpenResty debe ser posterior a la versión 1.31.1.1-0 para que {0} funcione.',
            ipLocation: 'Ubicación IP',
            ipLocationSearchHelper: 'Introduzca la ubicación de la IP; se admite búsqueda aproximada',
            action: 'Acción',
            ruleType: 'Tipo de ataque',
            ipHelper: 'Introduce la dirección IP',
            attackLog: 'Log de ataques',
            rule: 'Regla',
            ipArr: 'Rango IPv4',
            ipStart: 'IP inicio',
            ipEnd: 'IP fin',
            ipv4: 'IPv4',
            ipv6: 'IPv6',
            urlDefense: 'Reglas de URL',
            urlHelper: 'URL prohibida',
            dirFilter: 'Filtro de directorios',
            sqlInject: 'SQL Injection',
            xss: 'XSS',
            webshell: 'WebShell',
            phpExec: 'Ejecución de scripts PHP',
            oneWordTrojan: 'Troyano de una línea',
            appFilter: 'Filtrado de directorios peligrosos',
            webShell: 'Webshell',
            args: 'Parámetros maliciosos',
            protocolFilter: 'Filtro de protocolos',
            javaFilter: 'Filtro de ficheros Java peligrosos',
            scannerFilter: 'Filtro de escáneres',
            escapeFilter: 'Filtro de escapes',
            customRule: 'Reglas personalizadas',
            httpMethod: 'Filtro de métodos HTTP',
            fileExt: 'Restricción de extensiones',
            fileExtHelper: 'Extensiones prohibidas para subir',
            deny: 'Prohibir',
            allow: 'Permitir',
            allowOnly: 'Permitir solo lo seleccionado',
            field: 'Objeto',
            pattern: 'Condición',
            ruleContent: 'Contenido',
            contain: 'contiene',
            equal: 'igual',
            regex: 'expresión regular',
            notEqual: 'distinto',
            customRuleHelper: 'Acciones basadas en condiciones definidas',
            actionAllow: 'Permitir',
            blockIP: 'Bloquear IP',
            code: 'Código de respuesta',
            noRes: 'Desconectar (444)',
            badReq: 'Parámetros inválidos (400)',
            forbidden: 'Acceso prohibido (403)',
            serverErr: 'Error de servidor (500)',
            resHtml: 'Página de respuesta',
            allowHelper: 'Permitir acceso salta las siguientes reglas del WAF, úsalo con precaución',
            captcha: 'Verificación humano-máquina',
            fiveSeconds: 'Verificación de 5 segundos',
            location: 'Región',
            redisConfig: 'Configuración Redis',
            redisHelper: 'Habilita Redis para persistir IPs bloqueadas temporalmente',
            wafHelper: 'Todos los sitios perderán protección al deshabilitar',
            websiteWafHelper: 'Este sitio perderá la protección al deshabilitar',
            attackIP: 'IP atacante',
            attackParam: 'Detalles del ataque',
            execRule: 'Regla aplicada',
            acl: 'ACL',
            sql: 'SQL Injection',
            cc: 'Límite de frecuencia de acceso',
            isBlocking: 'Bloqueado',
            isFree: 'Libre',
            unLock: 'Desbloquear',
            unLockHelper: '¿Quieres desbloquear la IP: {0}?',
            saveDefault: 'Guardar por defecto',
            saveToWebsite: 'Aplicar al sitio web',
            saveToWebsiteHelper: '¿Aplicar esta configuración a todos los sitios?',
            websiteHelper:
                'Estas son configuraciones por defecto al crear sitios. Para aplicar, edítalo en el sitio específico',
            websiteHelper2:
                'Configuraciones por defecto para sitios nuevos, modifica en cada sitio para que tengan efecto',
            ipGroup: 'Grupo de IPs',
            ipGroupHelper: 'Una IP o rango por línea. Soporta IPv4 e IPv6. Ejemplo: 192.168.1.1 o 192.168.1.0/24',
            ipBlack: 'IP blacklist',
            openRestyAlert: 'Se requiere versión de OpenResty mayor a {0}',
            initAlert:
                'La primera vez es necesario inicializar. El archivo de configuración será modificado y la configuración previa se perderá. Haz copia de seguridad',
            initHelper: 'La inicialización borrará la configuración existente del WAF. ¿Seguro que quieres continuar?',
            mainSwitch: 'Interruptor principal',
            websiteSwitch: 'Interruptor',
            websiteAlert: 'Crea un sitio primero',
            defaultUrlBlack: 'Reglas de URL',
            htmlRes: 'Página de intercepción',
            urlSearchHelper: 'Introduce la URL (búsqueda difusa)',
            hostSearchHelper: 'Introduce el Host para búsqueda difusa',
            toCreate: 'Crear',
            closeWaf: 'Cerrar WAF',
            closeWafHelper: 'Cerrar WAF desprotege el sitio. ¿Continuar?',
            addblack: 'Añadir a blacklist',
            addwhite: 'Añadir a whitelist',
            addblackHelper: '¿Añadir IP:{0} a la blacklist?',
            addwhiteHelper: '¿Añadir IP:{0} a la whitelist?',
            defaultUaBlack: 'Regla de User-Agent',
            defaultIpBlack: 'Grupo de IPs maliciosas',
            cookie: 'Reglas de cookies',
            urlBlack: 'Blacklist de URL',
            uaBlack: 'Blacklist de User-Agent',
            attackCount: 'Límite de frecuencia de ataques',
            fileExtCheck: 'Restricción de subida',
            geoRestrict: 'Restricción geográfica',
            originProtect: 'Protección del origen CDN',
            attacklog: 'Registro de intercepciones',
            unknownWebsite: 'Acceso a dominio no autorizado',
            geoRuleEmpty: 'Selecciona al menos una región o provincia',
            unknown: 'Sitio no existe',
            geo: 'Restricción por región',
            revertHtml: '¿Restaurar {0} como página por defecto?',
            five_seconds: 'Verificación de 5 segundos',
            header: 'Reglas de cabeceras',
            methodWhite: 'Reglas HTTP',
            expiryDate: 'Fecha de expiración',
            expiryDateHelper: 'Tras validación exitosa, no se verificará de nuevo durante el periodo de validez',
            defaultIpBlackHelper: 'IPs maliciosas recopiladas de internet para bloquear accesos',
            notFoundCount: 'Límite de errores 404',
            matchValue: 'Valor de coincidencia',
            headerName: 'Debe iniciar con letra o número, admite "-", longitud 3-30',
            cdnHelper: 'Para webs con CDN, obtener IP real aquí',
            clearLogWarn: 'No podrás recuperar los logs borrados. ¿Continuar?',
            commonRuleHelper: 'Las reglas usan coincidencia difusa',
            blockIPHelper:
                'Las IP bloqueadas se guardan temporalmente en OpenResty y se liberan tras reinicio. Para bloqueo permanente usa reglas',
            addWhiteUrlHelper: '¿Añadir URL {0} a la whitelist?',
            dashHelper: 'La versión community también soporta configuraciones globales y de sitio',
            wafStatusHelper:
                'El firewall no está activado. La protección de seguridad del sitio web está pausada. Actívalo cuanto antes.',
            enableProtection: 'Activar protección',
            ccMode: 'Modo',
            global: 'Modo global',
            uriMode: 'Modo URL',
            globalHelper: 'Modo global: cuando el total de peticiones a cualquier URL supera el límite en el periodo',
            uriModeHelper: 'Modo URL: cuando las peticiones a una URL superan el límite en el periodo',
            ip: 'Blacklist de IPs',
            globalSettingHelper:
                'Las configuraciones con etiqueta [Website] requieren activarse también en la Configuración del Sitio',
            globalSettingHelper2: 'Debe habilitarse en [Configuración Global] y [Configuración del Sitio] a la vez',
            urlCCHelper: 'Más de {1} peticiones a esta URL en {0} segundos bloquean la IP por {2}',
            urlCCHelper2: 'La URL no puede contener parámetros',
            notContain: 'No contiene',
            urlcc: 'Límite de frecuencia por URL',
            method: 'Método de petición',
            addIpsToBlock: 'Bloqueo masivo de IPs',
            addIpSegmentToBlock: 'Bloquear segmento IP',
            addIpSegmentsToBlock: 'Bloqueo masivo de segmentos IP',
            addUrlsToWhite: 'Añadir URLs en whitelist en lote',
            noBlackIp: 'IP ya bloqueada',
            noWhiteUrl: 'URL ya en whitelist',
            spiderIpHelper:
                'Al activarlo, solo se permiten los crawlers seleccionados; al desactivarlo, se bloquean todos.',
            spiderIp: 'Pool de IPs de crawlers',
            spider: 'Crawler',
            spiderAllowlist: 'Crawlers permitidos',
            spiderAllowlistEmpty: 'No hay crawlers seleccionados. Al guardar, se bloquearán todos.',
            geoIp: 'Base de datos IP',
            geoIpHelper: 'Usada para geolocalizar IPs',
            stat: 'Reporte de ataques',
            statTitle: 'Reporte',
            attackIp: 'IP',
            attackCountNum: 'Cantidad',
            percent: 'Porcentaje',
            addblackUrlHelper: '¿Añadir URL {0} a la blacklist?',
            rce: 'Ejecución remota de código',
            software: 'Software',
            cveHelper: 'Incluye vulnerabilidades de software y frameworks comunes',
            vulnCheck: 'Reglas adicionales',
            ssrf: 'Vulnerabilidad SSRF',
            afr: 'Lectura arbitraria de ficheros',
            ua: 'Acceso no autorizado',
            id: 'Divulgación de información',
            aa: 'Bypass de autenticación',
            dr: 'Recorrido de directorios',
            xxe: 'Vulnerabilidad XXE',
            suid: 'Vulnerabilidad de serialización',
            dos: 'Denegación de servicio',
            afd: 'Descarga arbitraria de ficheros',
            sqlInjection: 'SQL Injection',
            afw: 'Escritura arbitraria de ficheros',
            il: 'Fuga de información',
            clearAllLog: 'Borrar todos los logs',
            exportLog: 'Exportar logs',
            appRule: 'Reglas de aplicación',
            appRuleHelper: 'Reglas de apps comunes, reduce falsos positivos. Un sitio solo puede usar una regla',
            logExternal: 'Excluir tipos de registros',
            ipWhite: 'Whitelist de IPs',
            urlWhite: 'Whitelist de URLs',
            uaWhite: 'Whitelist de User-Agent',
            logExternalHelper:
                'Tipos de registro excluidos no se guardan. Whitelist/blacklist, restricciones regionales y reglas generan muchos logs, se recomienda excluir',
            ssti: 'Ataque SSTI',
            crlf: 'Inyección CRLF',
            strict: 'Modo estricto',
            strictHelper: 'Usa reglas más estrictas para validar peticiones',
            executionStrategy: 'Estrategia de ejecución',
            detectionStrength: 'Nivel de detección',
            protectionMode: 'Modo de protección',
            observationMode: 'Modo de observación',
            standardMode: 'Modo estándar',
            observationModeHelper: 'Detecta y registra solicitudes sin bloquearlas',
            observationModeConfirm:
                'En el modo de observación, todas las coincidencias del WAF se registran sin bloquear solicitudes. ¿Continuar?',
            globalStrictRequired: 'Primero habilite el modo estricto en la configuración global',
            websiteSearchHelper: 'Introduzca el dominio, alias o comentario del sitio web',
            configReadFailed: 'No se pudo cargar la configuración',
            detailSetting: 'Configuración detallada',
            observe: 'Observar',
            saveLog: 'Guardar log',
            remoteURLHelper: 'La URL remota debe tener solo una IP por línea y sin otros caracteres',
            notFound: 'No encontrado (404)',
            serviceUnavailable: 'Servicio no disponible (503)',
            gatewayTimeout: 'Tiempo de espera de gateway (504)',
            belongToIpGroup: 'Pertenece a grupo de IPs',
            notBelongToIpGroup: 'No pertenece a grupo de IPs',
            unknownWebsiteKey: 'Dominio desconocido',
            special: 'Especial',
            fileToLarge: 'Archivo supera 1MB y no puede subirse',
            uploadOverLimit: 'El archivo supera el límite, máximo 1',
            importRuleHelper: 'Una regla por línea',
        },
        monitor: {
            '360': '360 Search',
            name: 'Monitorización Web',
            pv: 'Page Views (PV)',
            uv: 'Unique Visitors (UV)',
            flow: 'Tráfico',
            ip: 'IP',
            spider: 'Crawler',
            visitors: 'Tendencia de visitantes',
            today: 'Hoy',
            last7days: 'Últimos 7 días',
            last30days: 'Últimos 30 días',
            uvMap: 'Mapa de visitantes (30 días)',
            qps: 'Solicitudes en tiempo real (por minuto)',
            flowSec: 'Tráfico en tiempo real (por minuto)',
            excludeCode: 'Excluir códigos de estado',
            excludeUrl: 'Excluir URLs',
            excludeExt: 'Excluir extensiones',
            cdnHelper: 'Obtiene la IP real desde la cabecera del CDN',
            reqRank: 'Ranking de visitas',
            refererDomain: 'Dominio referente',
            os: 'Sistema operativo',
            browser: 'Navegador/Cliente',
            device: 'Dispositivo',
            showMore: 'Más',
            unknown: 'Otro',
            pc: 'PC',
            mobile: 'Móvil',
            wechat: 'WeChat',
            machine: 'Máquina',
            tencent: 'Navegador Tencent',
            ucweb: 'UC Browser',
            '2345explorer': '2345 Browser',
            huaweibrowser: 'Navegador Huawei',
            log: 'Logs de solicitudes',
            statusCode: 'Código de estado',
            requestTime: 'Tiempo de respuesta',
            flowRes: 'Tráfico de respuesta',
            method: 'Método HTTP',
            statusCodeHelper: 'Introduce el código de estado',
            statusCodeError: 'Código de estado inválido',
            methodHelper: 'Introduce el método HTTP',
            all: 'Todos',
            baidu: 'Baidu',
            google: 'Google',
            bing: 'Bing',
            bytes: 'Bytedance',
            sogou: 'Sogou',
            failed: 'Error',
            ipCount: 'Número de IPs',
            spiderCount: 'Solicitudes de crawlers',
            averageReqTime: 'Tiempo de respuesta medio',
            totalFlow: 'Tráfico total',
            logSize: 'Tamaño de logs',
            realIPType: 'Método de obtención de IP real',
            realIPRecognition: 'Identificación de IP real',
            fromHeader: 'Desde cabecera HTTP',
            fromHeaders: 'Desde lista de cabeceras',
            header: 'Cabecera HTTP',
            cdnConfig: 'Configuración CDN',
            xff1: 'Proxy nivel 1 (X-Forwarded-For)',
            xff2: 'Proxy nivel 2 (X-Forwarded-For)',
            xff3: 'Proxy nivel 3 (X-Forwarded-For)',
            xffHelper: 'Ejemplo: X-Forwarded-For: <cliente>,<proxy1>,<proxy2>,<proxy3>. El último proxy es <proxy3>',
            headersHelper: 'Obtiene la IP real de cabeceras comunes de CDN, tomando la primera disponible',
            monitorCDNHelper: 'Modificar la config de CDN en monitorización también actualiza la del WAF',
            wafCDNHelper: 'Modificar la config de CDN en el WAF también actualiza la monitorización',
            originProtection: 'Protección del servidor de origen',
            originProtectionHelper:
                'Solo los nodos CDN de los grupos IP seleccionados pueden conectarse al origen. La detección de la IP real usa otro interruptor.',
            originProtectionIPGroups: 'Grupos IP de retorno CDN',
            originProtectionIPGroupsPlaceholder: 'Seleccione grupos IP de retorno CDN de confianza',
            originProtectionWarning:
                'Una configuración incorrecta puede impedir el acceso al sitio. Confirme que incluye todas las direcciones de retorno CDN.',
            originProtectionEnableConfirm:
                'Las conexiones fuera de los grupos IP seleccionados se tratarán como acceso directo al origen y se bloquearán. ¿Continuar?',
            statusErr: 'Formato de código de estado inválido',
            shenma: 'Shenma',
            duckduckgo: 'DuckDuckGo',
            yandex: 'Yandex',
            gptbot: 'GPTBot',
            excludeUri: 'Excluir URIs',
            top100Helper: 'Mostrar top 100',
            logSaveDay: 'Retención de logs (días)',
            cros: 'Chrome OS',
            theworld: 'TheWorld Browser',
            edge: 'Microsoft Edge',
            maxthon: 'Maxthon Browser',
            monitorStatusHelper: 'La monitorización del sitio web está deshabilitada. Actívala ahora',
            excludeIp: 'Excluir IPs',
            excludeUa: 'Excluir User-Agent',
            remotePort: 'Puerto remoto',
            unknown_browser: 'Navegador desconocido',
            unknown_os: 'SO desconocido',
            unknown_device: 'Dispositivo desconocido',
            logSaveSize: 'Tamaño máximo de logs',
            logSaveSizeHelper: 'Tamaño máximo de log por sitio',
            '360se': '360 Secure Browser',
            websites: 'Lista de sitios',
            trend: 'Estadísticas de tendencias',
            reqCount: 'Número de solicitudes',
            uriHelper: 'Puedes usar /test/* o /*/index.php para excluir URIs',
        },
        tamper: {
            tamper: 'Anti-manipulación web',
            tamperCreateHint:
                'El directorio actual puede verse afectado por la protección antimanipulación o los atributos de archivo, lo que provoca un error de creación.',
            ignoreTemplate: 'Plantilla de Exclusión',
            protectTemplate: 'Plantilla de Protección',
            ignoreTemplateHelper:
                'Ingrese contenido de exclusión, separado por Enter o espacio. (Directorio específico ./log o nombre de directorio tmp, para excluir archivos necesita ingresar archivo específico ./data/test.html)',
            protectTemplateHelper:
                'Ingrese contenido de protección, separado por Enter o espacio. (Archivo específico ./index.html, extensión de archivo .html, tipo de archivo js, para proteger directorios necesita ingresar directorio específico ./log)',
            templateContent: 'Contenido de Plantilla',
            template: 'Plantilla',
            saveTemplate: 'Guardar como Plantilla',
            tamperHelper1:
                'Para sitios web de implementación con un clic, se recomienda habilitar la protección contra manipulaciones del directorio de aplicaciones; si el sitio web no se puede usar normalmente o falla la copia de seguridad/restauración, desactive primero la protección contra manipulaciones;',
            tamperHelper2:
                'Restringirá las operaciones de lectura/escritura, eliminación, permisos y modificación de propietario para archivos protegidos en directorios no excluidos',
            tamperPath: 'Directorio de Protección',
            tamperPathEdit: 'Modificar Ruta',
            log: 'Registro de Bloqueo',
            totalProtect: 'Protección Total',
            todayProtect: 'Protección de Hoy',
            templateRule: 'Longitud 1-512, el nombre no puede contener {0} y otros símbolos',
            ignore: 'Excluir',
            ignoreHelper:
                'Seleccione o ingrese contenido de exclusión, separado por Enter o espacio. (Directorio específico ./log o nombre de directorio tmp, para excluir archivos necesita ingresar o seleccionar archivo específico ./data/test.html)',
            protect: 'Proteger',
            protectHelper:
                'Seleccione o ingrese contenido de protección, separado por Enter o espacio. (Archivo específico ./index.html, extensión de archivo .html, tipo de archivo js, para proteger directorios necesita ingresar o seleccionar directorio específico ./log)',
            tamperHelper00: 'La exclusión y protección solo admiten rutas relativas;',
            tamperHelper01:
                'Después de habilitar la protección contra manipulaciones, el sistema restringirá las operaciones de creación, edición y eliminación de archivos protegidos en directorios no excluidos;',
            tamperHelper02:
                'Prioridad: Protección de ruta específica > Exclusión de ruta específica > Protección > Exclusión',
            tamperHelper03:
                'Las operaciones de monitoreo solo se dirigen a directorios no excluidos, monitoreando la creación de archivos no protegidos en estos directorios.',
            disableHelper:
                'A punto de desactivar la protección contra manipulaciones para los siguientes sitios web, ¿continuar?',
            appendOnly: 'Solo añadir',
            appendOnlyHelper:
                'Restringe el borrado en este directorio, solo se permite añadir directorios excluidos o archivos no protegidos',
            immutable: 'Inmutable',
            immutableHelper: 'Restringe edición, borrado, permisos y cambio de propietario del archivo',
            onWatch: 'Monitorización',
            onWatchHelper:
                'Monitoriza y bloquea la creación de archivos protegidos o directorios no excluidos en este directorio',
            forceStop: 'Forzar cierre',
            forceStopHelper: 'Se forzará la desactivación de la función anti-manipulación en este sitio. ¿Continuar?',
        },
        setting: {
            setting: 'Configuración del panel',
            title: 'Descripción del panel',
            titleHelper:
                'Se mostrará en la página de login (ej.: Panel de administración de servidores Linux, recomendado 8-15 caracteres)',
            logo: 'Logo (sin texto)',
            logoHelper:
                'Se mostrará arriba a la izquierda cuando el menú esté colapsado (tamaño recomendado: 82px*82px)',
            logoWithText: 'Logo (con texto)',
            logoWithTextHelper:
                'Se mostrará arriba a la izquierda cuando el menú esté expandido (tamaño recomendado: 185px*55px)',
            favicon: 'Icono del sitio',
            faviconHelper: 'Icono del sitio (tamaño recomendado: 16px*16px)',
            setDefault: 'Restaurar por defecto',
            setHelper: 'Se guardará la configuración actual. ¿Continuar?',
            setDefaultHelper: 'Todas las configuraciones se restaurarán a valores por defecto. ¿Continuar?',
            logoGroup: 'Logo',
            imageGroup: 'Imagen',
            loginImage: 'Imagen',
            loginImageHelper: 'Se muestra en la página de login (tamaño recomendado: 500*416px)',
            loginBgType: 'Tipo de fondo',
            loginBgImage: 'Imagen de fondo',
            loginBgImageHelper: 'Se muestra como fondo de la página de login (tamaño recomendado: 1920*1080px)',
            loginBgColor: 'Color de fondo',
            loginBgColorHelper: 'Se muestra como color de fondo en la página de login',
            image: 'Imagen',
            bgColor: 'Color de fondo',
            loginGroup: 'Página de login',
            loginBtnLinkColor: 'Color de botones/enlaces',
            loginBtnLinkColorHelper: 'Se aplica a botones y enlaces en la página de login',
        },
        helper: {
            wafTitle1: 'Mapa de Intercepciones',
            wafContent1: 'Muestra la distribución geográfica de intercepciones en los últimos 30 días',
            wafTitle2: 'Restricciones de Acceso Regional',
            wafContent2: 'Restringe las fuentes de acceso al sitio web según la ubicación geográfica',
            wafTitle3: 'Página de Intercepción Personalizada',
            wafContent3: 'Crea una página personalizada que se muestre tras interceptar una petición',
            wafTitle4: 'Reglas Personalizadas (ACL)',
            wafContent4: 'Intercepta peticiones según reglas definidas por el usuario',
            tamperTitle1: 'Monitoreo de Integridad de Archivos',
            tamperContent1:
                'Supervisa la integridad de los archivos del sitio, incluyendo archivos core, scripts y de configuración.',
            tamperTitle2: 'Escaneo y Detección en Tiempo Real',
            tamperContent2:
                'Detecta archivos anómalos o manipulados escaneando en tiempo real el sistema de archivos del sitio.',
            tamperTitle3: 'Configuración de Permisos de Seguridad',
            tamperContent3:
                'Restringe el acceso a archivos del sitio mediante permisos adecuados y políticas de control de acceso, reduciendo la superficie de ataque.',
            tamperTitle4: 'Registro y Análisis',
            tamperContent4:
                'Registra accesos y operaciones sobre archivos para auditoría y análisis posteriores, ayudando a detectar amenazas de seguridad.',
            settingTitle1: 'Mensaje de Bienvenida Personalizado',
            settingContent1: 'Configura un mensaje de bienvenida en la página de login de 1Panel.',
            settingTitle2: 'Logo Personalizado',
            settingContent2: 'Permite subir logos con nombres de marca u otro texto.',
            settingTitle3: 'Icono del Sitio Web',
            settingContent3:
                'Permite subir un icono personalizado para reemplazar el favicon por defecto, mejorando la experiencia del usuario.',
            monitorTitle1: 'Tendencia de Visitantes',
            monitorContent1: 'Genera estadísticas y muestra la tendencia de visitantes del sitio web',
            monitorTitle2: 'Mapa de Visitantes',
            monitorContent2: 'Muestra la distribución geográfica de los visitantes del sitio',
            monitorTitle3: 'Estadísticas de Acceso',
            monitorContent3:
                'Genera estadísticas de solicitudes al sitio web, incluyendo crawlers, dispositivos de acceso, estados de respuesta, etc.',
            monitorTitle4: 'Monitoreo en Tiempo Real',
            monitorContent4:
                'Supervisa en tiempo real la información de peticiones al sitio web, incluyendo número de solicitudes y tráfico.',
            alertTitle1: 'Alertas por SMS',
            alertContent1:
                'Cuando se detecta uso anómalo de recursos del servidor, expiración de sitios o certificados, nueva versión disponible o expiración de contraseñas, los usuarios son notificados por SMS para garantizar respuesta oportuna.',
            alertTitle2: 'Registro de Alertas',
            alertContent2:
                'Permite a los usuarios consultar el historial de alertas para facilitar el seguimiento y análisis de eventos pasados.',
            alertTitle3: 'Configuración de Alertas',
            alertContent3:
                'Permite configurar números de teléfono, frecuencia y horarios de notificación para alertas más personalizadas.',
            nodeDashTitle1: 'Gestión de Aplicaciones',
            nodeDashContent1:
                'Gestión unificada de aplicaciones multi-nodo, admite monitoreo de estado, inicio/parada rápida, conexión de terminal y copia de seguridad',
            nodeDashTitle2: 'Gestión de Sitios Web',
            nodeDashContent2:
                'Gestión unificada de sitios web multi-nodo, monitoreo de estado en tiempo real, admite inicio/parada por lotes y copia de seguridad rápida',
            nodeDashTitle3: 'Gestión de Bases de Datos',
            nodeDashContent3:
                'Gestión unificada de bases de datos multi-nodo, estado clave de un vistazo, admite copia de seguridad con un clic',
            nodeDashTitle4: 'Gestión de Tareas Programadas',
            nodeDashContent4:
                'Gestión unificada de tareas programadas multi-nodo, admite monitoreo de estado, inicio/parada rápida y ejecución manual por activación',
            nodeTitle1: 'Adición de Nodo en un Clic',
            nodeContent1: 'Integra rápidamente múltiples nodos de servidor',
            nodeTitle2: 'Actualización en Lote',
            nodeContent2: 'Sincroniza y actualiza todos los nodos con una sola operación',
            nodeTitle3: 'Monitoreo del Estado de Nodos',
            nodeContent3: 'Supervisa en tiempo real el estado operativo de cada nodo',
            nodeTitle4: 'Conexión Remota Rápida',
            nodeContent4: 'Conecta directamente a la terminal remota de un nodo con un clic',
            fileExchangeTitle1: 'Transmisión con Autenticación por Claves',
            fileExchangeContent1: 'Autenticación vía claves SSH para garantizar seguridad en la transmisión.',
            fileExchangeTitle2: 'Sincronización de Archivos Eficiente',
            fileExchangeContent2:
                'Solo se sincroniza el contenido modificado, mejorando velocidad y estabilidad de transmisión.',
            fileExchangeTitle3: 'Intercomunicación Multi-Nodo',
            fileExchangeContent3:
                'Permite transferir fácilmente archivos entre diferentes nodos y gestionar múltiples servidores de forma flexible.',
            nodeAppTitle1: 'Gestión de Actualización de Aplicaciones',
            nodeAppContent1:
                'Monitoreo unificado de actualizaciones de aplicaciones multi-nodo, admite actualización con un clic',
            appTitle1: 'Gestión Flexible del Panel',
            appContent1: 'Gestiona tu servidor 1Panel en cualquier momento y lugar.',
            appTitle2: 'Información Completa de Servicios',
            appContent2:
                'Administra aplicaciones básicas, sitios web, Docker, bases de datos, etc., y crea nuevos servicios desde la app móvil.',
            appTitle3: 'Monitoreo de Anomalías en Tiempo Real',
            appContent3:
                'Consulta en la app móvil el estado del servidor, la seguridad WAF, estadísticas de tráfico web y la salud de procesos.',
            clusterTitle1: 'Despliegue Maestro-Esclavo',
            clusterContent1:
                'Soporta creación de instancias maestro-esclavo de MySQL/Postgres/Redis en distintos nodos, completando la asociación e inicialización automáticamente',
            clusterTitle2: 'Gestión Maestro-Esclavo',
            clusterContent2:
                'Página centralizada para gestionar múltiples nodos maestro-esclavo, ver sus roles y estado de ejecución.',
            clusterTitle3: 'Estado de Replicación',
            clusterContent3:
                'Muestra estado de replicación maestro-esclavo y retrasos, ayudando a diagnosticar problemas de sincronización',
            modelDownloaderTitle1: 'Descubrimiento de modelos',
            modelDownloaderContent1:
                'Busca repositorios de modelos de HuggingFace directamente y consulta descargas, me gusta, detalles y archivos.',
            modelDownloaderTitle2: 'Descargas aceleradas',
            modelDownloaderContent2:
                'Configura un endpoint de aceleración de HuggingFace y HF Token para el sitio oficial, espejos y modelos privados.',
            modelDownloaderTitle3: 'Seguimiento de tareas',
            modelDownloaderContent3:
                'Consulta la cola, el estado, el progreso y los errores de descarga, con soporte para cancelar, reintentar y limpiar registros.',
            modelDownloaderTitle4: 'Gestión local',
            modelDownloaderContent4:
                'Gestiona directorios de modelos locales en un solo lugar, incluyendo rutas, tamaños, fechas y eliminación de modelos no usados.',
            vllmTitle1: 'Gestión centralizada',
            vllmContent1:
                'Centralice la gestión de instancias vLLM distribuidas y supervise versiones, estado de ejecución y directorios de trabajo desde una única plataforma.',
            vllmTitle2: 'Despliegue rápido',
            vllmContent2:
                'Configure y despliegue servicios vLLM en minutos mediante formularios visuales, sin necesidad de complejas operaciones manuales.',
            vllmTitle3: 'Operación eficiente',
            vllmContent3:
                'Realice la creación, edición, inicio, detención, reinicio y eliminación de instancias desde una sola interfaz para simplificar la operación diaria.',
            vllmTitle4: 'Control avanzado',
            vllmContent4:
                'Personalice puertos, contenedores, comandos de arranque y archivos Compose con opciones avanzadas para lograr implementaciones más flexibles y estandarizadas.',
        },
        node: {
            master: 'Nodo Principal',
            masterBackup: 'Respaldo del Nodo Principal',
            backupNode: 'Nodo de Respaldo',
            backupFrequency: 'Frecuencia de Respaldo (horas)',
            backupCopies: 'Copias de Respaldo',
            noBackupNode: 'Actualmente no hay nodo de respaldo configurado. Selecciona uno y vuelve a intentarlo.',
            masterBackupAlert:
                'No se ha configurado un respaldo del nodo principal. Para garantizar la seguridad de los datos, configura un nodo de respaldo lo antes posible y así facilitar el cambio manual en caso de fallo.',
            node: 'Nodo',
            addr: 'Dirección',
            nodeUpgrade: 'Configuración de Actualización',
            nodeUpgradeHelper:
                'Los nodos seleccionados comenzarán a actualizarse automáticamente después de que se complete la actualización del nodo maestro, sin necesidad de operación manual.',
            nodeUpgradePackageManage: 'Gestión de Paquetes de Instalación',
            nodeUpgradePackageClean: 'Limpiar',
            nodeUpgradePackageFormatHelper:
                'Solo se admiten paquetes de instalación `1panel-agent_v*_*` o `1panel-v*-linux-*`',
            nodeUpgradePackageHostConfirm: 'Se seleccionará el archivo del servidor {0}. ¿Continuar?',
            nodeUpgradePackageCleanHelper:
                'Se limpiarán todos los paquetes de actualización de versiones anteriores. ¿Continuar?',
            nodeUpgradeOfflinePackageHelper:
                'En entornos sin conexión, los nodos con arquitecturas diferentes deben subir primero el paquete de actualización correspondiente.',
            healthCheck: 'Comprobación de estado',
            healthCheckFrequency: 'Frecuencia de comprobación automática',
            healthCheckFrequencyHelper:
                'Comprueba automáticamente el estado de los nodos con la frecuencia configurada. Introduzca 0 para desactivar las comprobaciones automáticas.',
            healthCheckFrequencyLimit: 'La frecuencia no puede superar un día y debe ser un número entero no negativo.',
            autoCheckFailedNodes: 'Comprobar automáticamente los nodos con error',
            autoCheckFailedNodesHelper:
                'Durante las comprobaciones automáticas, también comprueba los nodos con estado fallido o anómalo. Solo se aplica cuando la frecuencia no es 0.',
            loadFailedNodeResources: 'Actualizar recursos de nodos con error',
            loadFailedNodeResourcesHelper:
                'Al actualizar la lista de nodos, también consulta los recursos de los nodos con estado fallido o anómalo.',
            nodeUnhealthy: 'Estado del nodo anómalo',
            deletedNode: 'El nodo eliminado {0} no soporta operaciones de actualización.',
            nodeUnhealthyHelper:
                'Se ha detectado un estado anómalo en el nodo. Revisa [Gestión de Nodos] e inténtalo de nuevo.',
            nodeUnbind: 'Nodo no vinculado a licencia',
            nodeUnbindHelper:
                'Se ha detectado que este nodo no está vinculado a una licencia. Vincúlalo desde [Ajustes del Panel - Licencia] e inténtalo de nuevo.',
            memTotal: 'Memoria Total',
            nodeManagement: 'Gestión Multi-Máquina',
            multiOverview: 'Multimáquina',
            commonNodes: 'Nodos frecuentes',
            searchNodePlaceholder: 'Buscar nombre, grupo o dirección del nodo',
            nodeItem: 'Gestión de Nodos',
            panelItem: 'Gestión de Paneles',
            addNode: 'Añadir Nodo',
            connInfo: 'Información de Conexión',
            nodeInfo: 'Información del Nodo',
            withProxy: 'Habilitar Acceso por Proxy',
            withoutProxy: 'Deshabilitar Acceso por Proxy',
            withProxyHelper:
                'Utilizará el proxy del sistema {0} mantenido en la configuración del panel para acceder a los nodos secundarios. ¿Continuar?',
            withoutProxyHelper:
                'Dejará de usar el proxy del sistema mantenido en la configuración del panel para acceder a los nodos secundarios. ¿Continuar?',
            syncInfo: 'Sincronización',
            syncHelper:
                'Cuando cambian los datos en el nodo principal, se sincronizan en tiempo real con este nodo secundario.',
            syncBackupAccount: 'Configuración de Cuentas de Respaldo',
            syncWithMaster:
                'Tras actualizar a la edición comercial, todos los datos se sincronizarán por defecto. Las políticas de sincronización se pueden ajustar manualmente en la gestión de nodos.',
            syncProxy: 'Configuración del Proxy del Sistema',
            syncProxyHelper: 'La sincronización del proxy del sistema requiere reiniciar Docker.',
            syncProxyHelper1: 'Reiniciar Docker puede afectar a los contenedores actualmente en ejecución.',
            syncProxyHelper2: 'Puedes reiniciar manualmente desde la página Contenedores → Configuración.',
            syncProxyHelper3:
                'La sincronización del proxy del sistema requiere reiniciar Docker, lo que puede afectar a servicios en ejecución.',
            syncProxyHelper4:
                'La sincronización del proxy del sistema requiere reinicio de Docker. Puedes reiniciar manualmente más tarde en Contenedores → Configuración.',
            syncCustomApp: 'Sincronizar Repositorio de Apps Personalizadas',
            syncAlertSetting: 'Configuración de Alertas del Sistema',
            syncNodeInfo: 'Datos básicos del nodo,',
            nodeSyncHelper: 'La sincronización de información de nodos incluye:',
            nodeSyncHelper1: '1. Información de cuentas de respaldo públicas',
            nodeSyncHelper2: '2. Información de conexión entre el nodo principal y los nodos secundarios',
            nodeCheck: 'Comprobación de Disponibilidad',
            checkSSH: 'Verificar conexión SSH del nodo',
            checkUserPermission: 'Verificar permisos de usuario en el nodo',
            isNotRoot: 'Se ha detectado que este nodo no soporta sudo sin contraseña y el usuario actual no es root',
            checkLicense: 'Verificar estado de licencia del nodo',
            checkService: 'Verificar servicios existentes en el nodo',
            checkPort: 'Verificar accesibilidad del puerto del nodo',
            panelExist:
                'Se ha detectado que este nodo ejecuta 1Panel V1. Actualiza a V2 usando el script de migración antes de añadirlo.',
            coreExist:
                'Este nodo ya está configurado como nodo principal y no puede añadirse directamente como nodo secundario. Debe degradarse primero a nodo esclavo. Consulta la documentación.',
            agentExist:
                'Se ha detectado que 1panel-agent ya está instalado en este nodo. Continuar conservará los datos y solo reemplazará el servicio de 1panel-agent.',
            agentNotExist:
                'Se ha detectado que 1panel-agent no está instalado en este nodo, por lo que la información no puede editarse directamente. Elimínalo y vuelve a añadirlo.',
            oldDataExist:
                'Se han detectado datos históricos de 1Panel V2 en este nodo. La siguiente información sobrescribirá la configuración actual:',
            errLicense: 'La licencia vinculada a este nodo no es válida. Revisa e inténtalo de nuevo.',
            errNodePort:
                'El puerto del nodo [ {0} ] no es accesible. Verifica si el firewall o el grupo de seguridad permiten este puerto.',
            reinstallHelper: '¿Reinstalar el nodo {0}? ¿Quieres continuar?',
            unhealthyCheck: 'Comprobación Anómala',
            fixOperation: 'Operación de Corrección',
            checkName: 'Elemento de Comprobación',
            checkSSHConn: 'Comprobar disponibilidad de conexión SSH',
            fixSSHConn: 'Edita manualmente el nodo para confirmar la información de conexión',
            checkConnInfo: 'Comprobar información de conexión del agente',
            checkStatus: 'Comprobar disponibilidad de servicios del nodo',
            fixStatus:
                'Ejecuta "systemctl status 1panel-agent.service" para verificar si el servicio está en ejecución.',
            checkAPI: 'Comprobar disponibilidad de la API del nodo',
            fixAPI: 'Revisa los logs del nodo y verifica si los puertos del firewall están abiertos correctamente.',
            forceDelete: 'Eliminación Forzada',
            operateHelper: 'Los siguientes nodos se someterán a la operación {0}, ¿quieres continuar?',
            forceDeleteHelper: 'La eliminación forzada ignorará errores y borrará metadatos de la base de datos.',
            uninstall: 'Eliminar datos del nodo',
            uninstallHelper:
                'Esto eliminará todos los datos relacionados con 1Panel de este nodo. Procede con precaución.',
            baseDir: 'Directorio de Instalación',
            baseDirHelper: 'Si el directorio de instalación está vacío, se instalará en /opt por defecto.',
            nodePort: 'Puerto del Nodo',
            offline: 'Modo Offline',
            freeCount: 'Cuota gratuita [{0}]',
            offlineHelper: 'Usado cuando el nodo está en un entorno sin conexión',
            appUpgrade: 'Actualización de la aplicación',
            appUpgradeHelper: 'Hay {0} aplicaciones que necesitan ser actualizadas',
            dashboardSetting: 'Configuración del resumen',
            keepOneDashboardComponent: 'Mantenga al menos una sección del resumen',
            addPanel: 'Añadir panel',
            addPanelHelper: 'Tras añadir el panel, podrás acceder rápidamente en [Resumen - Paneles].',
            panel: 'Panel 1Panel',
            others: 'Otros paneles',
            operatePanelHelper: 'Los siguientes paneles ejecutarán {0}. ¿Continuar?',
        },
        customApp: {
            name: 'Repositorio de Apps Personalizadas',
            appStoreType: 'Fuente de Paquetes del App Store',
            appStoreUrl: 'URL del Repositorio',
            local: 'Ruta Local',
            remote: 'Enlace Remoto',
            imagePrefix: 'Prefijo de Imagen',
            imagePrefixHelper:
                'Función: Personaliza el prefijo de la imagen y modifica el campo image en el archivo compose. Ejemplo: si el prefijo es 1panel/custom, la imagen de MaxKB pasará a ser 1panel/custom/maxkb:v1.10.0',
            closeHelper: 'Cancelar el uso del repositorio de apps personalizadas',
            appStoreUrlHelper: 'Solo se admite el formato .tar.gz',
            postNode: 'Sincronizar al nodo secundario',
            postNodeHelper:
                'Sincroniza el paquete del repositorio personalizado en tmp/customApp/apps.tar.gz dentro del directorio de instalación del nodo secundario',
            nodes: 'Nodos',
            selectNode: 'Seleccionar Nodo',
            selectNodeError: 'Por favor, selecciona un nodo',
            licenseHelper: 'La versión comercial admite la función de repositorio de aplicaciones personalizadas',
            databaseHelper: 'Base de datos asociada a la aplicación, seleccione la base de datos del nodo destino',
            nodeHelper: 'No se puede seleccionar el nodo actual',
            migrateHelper:
                'Actualmente solo admite la migración de aplicaciones monolíticas y aplicaciones asociadas únicamente con bases de datos MySQL, MariaDB, PostgreSQL',
            opensslHelper:
                'Si se utiliza copia de seguridad cifrada, las versiones de OpenSSL entre los dos nodos deben ser consistentes, de lo contrario la migración puede fallar.',
            installApp: 'Instalación por lotes',
            installAppHelper: 'Instalar aplicaciones por lotes en los nodos seleccionados',
        },
        alert: {
            isAlert: 'Alerta',
            alertCount: 'Número de alertas',
            clamHelper: 'Generar alerta al detectar archivos infectados en escaneo',
            cronJobHelper: 'Generar alerta cuando falle la ejecución de una tarea programada',
            licenseHelper: 'La versión comercial soporta alertas',
            alertCountHelper: 'Frecuencia máxima diaria de alertas',
            alert: 'Alerta SMS',
            logs: 'Logs de alertas',
            list: 'Lista de alertas',
            addTask: 'Crear alerta',
            editTask: 'Editar alerta',
            alertMethod: 'Método',
            alertMsg: 'Mensaje de alerta',
            alertRule: 'Reglas de alerta',
            titleSearchHelper: 'Introduce el título de alerta para búsqueda difusa',
            taskType: 'Tipo',
            ssl: 'Expiración de certificado',
            siteEndTime: 'Expiración de sitio web',
            panelPwdEndTime: 'Expiración de contraseña del panel',
            panelUpdate: 'Nueva versión de panel disponible',
            cpu: 'Alerta de CPU',
            memory: 'Alerta de memoria',
            load: 'Alerta de carga',
            disk: 'Alerta de disco',
            website: 'Sitio web',
            certificate: 'Certificado SSL',
            remainingDays: 'Días restantes',
            sendCount: 'Envíos',
            recipientPlaceholder: 'Ingrese la dirección de correo',
            addRecipient: 'Agregar destinatario',
            webhookItem: 'Enlace Webhook',
            addWebhook: 'Agregar Webhook',
            selectAlertType: 'Seleccionar tipo de alerta',
            configDetail: 'Configurar detalles',
            webhookCount: 'Cantidad de Webhooks',
            sms: 'SMS',
            wechat: 'WeChat',
            dingTalk: 'DingTalk',
            feiShu: 'FeiShu',
            mail: 'Correo',
            email: 'Correo',
            weCom: 'WeCom',
            bark: 'Bark',
            sendCountRulesHelper: 'Número total de alertas enviadas antes de expirar (una vez al día)',
            panelUpdateRulesHelper: 'Alertas totales enviadas por nueva versión del panel (una vez al día)',
            oneDaySendCountRulesHelper: 'Número máximo de alertas diarias',
            siteEndTimeRulesHelper: 'Los sitios sin fecha de expiración no generan alertas',
            autoRenewRulesHelper:
                'Los certificados con auto-renovación habilitada y menos de 31 días restantes no generan alerta',
            panelPwdEndTimeRulesHelper:
                'La alerta de expiración de contraseña no aplica si no se ha configurado expiración',
            sslRulesHelper: 'Todos los certificados SSL',
            diskInfo: 'Disco',
            monitoringType: 'Tipo de monitorización',
            autoRenew: 'Auto-renovación',
            useDisk: 'Uso de disco',
            usePercentage: 'Porcentaje de uso',
            changeStatus: 'Cambiar estado',
            disableMsg: 'Detener la tarea de alerta evitará que envíe mensajes. ¿Continuar?',
            enableMsg: 'Al habilitar la tarea podrá enviar mensajes de alerta. ¿Continuar?',
            useExceed: 'Uso excedido',
            useExceedRulesHelper: 'Genera alerta cuando el uso supera el valor configurado',
            cpuUseExceedAvg: 'El uso medio de CPU supera el valor especificado',
            memoryUseExceedAvg: 'El uso medio de memoria supera el valor especificado',
            loadUseExceedAvg: 'La carga media supera el valor especificado',
            cpuUseExceedAvgHelper: 'El uso medio de CPU en el periodo supera el valor configurado',
            memoryUseExceedAvgHelper: 'El uso medio de memoria en el periodo supera el valor configurado',
            loadUseExceedAvgHelper: 'La carga media en el periodo supera el valor configurado',
            resourceAlertRulesHelper: 'Nota: múltiples alertas en 30 minutos se unifican en una',
            specifiedTime: 'Tiempo especificado',
            deleteTitle: 'Eliminar alerta',
            deleteMsg: '¿Seguro que quieres eliminar esta tarea de alerta?',
            allSslTitle: 'Alertas de expiración de certificados SSL en todos los sitios',
            sslTitle: 'Alerta de expiración de certificado SSL en sitio {0}',
            allSiteEndTimeTitle: 'Alertas de expiración de todos los sitios web',
            siteEndTimeTitle: 'Alerta de expiración para sitio {0}',
            panelPwdEndTimeTitle: 'Alerta de expiración de contraseña del panel',
            panelUpdateTitle: 'Notificación de nueva versión de panel',
            cpuTitle: 'Alerta de alta CPU',
            memoryTitle: 'Alerta de alta memoria',
            loadTitle: 'Alerta de alta carga',
            diskTitle: 'Alerta de alto uso de disco en {0}',
            allDiskTitle: 'Alerta de alto uso de disco',
            timeRule: 'Tiempo restante menor a {0} días (si no se gestiona, se reenviará al día siguiente)',
            panelUpdateRule:
                'Al detectar nueva versión del panel se envía una alerta (si no se gestiona, se reenviará al día siguiente)',
            avgRule: 'Uso medio de {1} supera {2}% en {0} minutos, genera alerta, {3} envíos/día',
            diskRule: 'Uso de disco en {0} supera {1}{2}, genera alerta, {3} envíos/día',
            allDiskRule: 'Uso de disco supera {0}{1}, genera alerta, {2} envíos/día',
            cpuName: 'CPU',
            memoryName: 'Memoria',
            loadName: 'Carga',
            diskName: 'Disco',
            syncAlertInfo: 'Push manual',
            syncAlertInfoMsg: '¿Deseas enviar manualmente la tarea de alerta?',
            pushError: 'Error en push',
            pushSuccess: 'Push exitoso',
            syncError: 'Error de sincronización',
            success: 'Alerta enviada',
            pushing: 'Enviando...',
            error: 'Error de alerta',
            cleanLog: 'Limpiar logs',
            cleanAlertLogs: 'Limpiar logs de alertas',
            daily: 'Alertas diarias: {0}',
            cumulative: 'Alertas acumuladas: {0}',
            clams: 'Alerta de escaneo antivirus',
            taskName: 'Nombre de tarea',
            cronJobType: 'Tipo de tarea',
            clamPath: 'Directorio a escanear',
            cronjob: 'Fallo en ejecución de cronjob {0}',
            app: 'Backup de app',
            web: 'Backup de sitio',
            database: 'Backup de base de datos',
            directory: 'Backup de directorio',
            log: 'Backup de logs',
            snapshot: 'Snapshot del sistema',
            clamsRulesHelper: 'Tareas de escaneo antivirus que requieren alerta',
            cronJobRulesHelper: 'Este tipo de tareas programadas necesita configuración',
            clamsTitle: 'Tarea antivirus 「 {0} 」 detectó archivo infectado',
            cronJobAppTitle: 'Cronjob - Backup de app 「 {0} 」 falló',
            cronJobWebsiteTitle: 'Cronjob - Backup de sitio 「 {0} 」 falló',
            cronJobDatabaseTitle: 'Cronjob - Backup de base de datos 「 {0} 」 falló',
            cronJobDirectoryTitle: 'Cronjob - Backup de directorio 「 {0} 」 falló',
            cronJobLogTitle: 'Cronjob - Backup de logs 「 {0} 」 falló',
            cronJobSnapshotTitle: 'Cronjob - Backup de snapshot 「 {0} 」 falló',
            cronJobShellTitle: 'Cronjob - Script shell 「 {0} 」 falló',
            cronJobCurlTitle: 'Cronjob - Acceso URL 「 {0} 」 falló',
            cronJobCutWebsiteLogTitle: 'Cronjob - Corte de logs web 「 {0} 」 falló',
            cronJobCleanTitle: 'Cronjob - Limpieza de caché 「 {0} 」 falló',
            cronJobNtpTitle: 'Cronjob - Sync hora de servidor 「 {0} 」 falló',
            clamsRule: 'Escaneo antivirus detectó infección, {0} envíos/día',
            cronJobAppRule: 'Fallo en backup de app, {0} envíos/día',
            cronJobWebsiteRule: 'Fallo en backup de sitio, {0} envíos/día',
            cronJobDatabaseRule: 'Fallo en backup de base de datos, {0} envíos/día',
            cronJobDirectoryRule: 'Fallo en backup de directorio, {0} envíos/día',
            cronJobLogRule: 'Fallo en backup de logs, {0} envíos/día',
            cronJobSnapshotRule: 'Fallo en backup de snapshot, {0} envíos/día',
            cronJobShellRule: 'Fallo en script shell, {0} envíos/día',
            cronJobCurlRule: 'Fallo en acceso URL, {0} envíos/día',
            cronJobCutWebsiteLogRule: 'Fallo en corte de logs web, {0} envíos/día',
            cronJobCleanRule: 'Fallo en limpieza de caché, {0} envíos/día',
            cronJobNtpRule: 'Fallo en sincronización de hora, {0} envíos/día',
            alertSmsHelper: 'Límite SMS: {0} mensajes totales, {1} usados',
            goBuy: 'Comprar más',
            phone: 'Teléfono',
            phoneHelper: 'Proporciona un número real para SMS de alertas',
            dailyAlertNum: 'Límite diario de alertas',
            dailyAlertNumHelper: 'Máximo de alertas por día (hasta 100)',
            timeRange: 'Rango de tiempo',
            sendTimeRange: 'Rango de envío',
            sendTimeRangeHelper: 'Puede enviarse en {0}',
            to: 'a',
            startTime: 'Hora inicio',
            endTime: 'Hora fin',
            defaultPhone: 'Usar el número vinculado a la licencia',
            noticeAlert: 'Alerta de notificación',
            resourceAlert: 'Alerta de recursos',
            agentOfflineAlertHelper: 'Con alerta offline habilitada, el nodo maestro escaneará cada 30 minutos.',
            offline: 'Alerta offline',
            offlineHelper: 'En modo offline, el nodo maestro escaneará cada 30 minutos para alertas.',
            offlineOff: 'Habilitar alerta offline',
            offlineOffHelper: 'Habilitar alerta offline hace que el nodo maestro ejecute alertas cada 30 minutos.',
            offlineClose: 'Desactivar alerta offline',
            offlineCloseHelper: 'Desactivarla obliga a que los sub-nodos gestionen alertas. Asegura conectividad.',
            alertNotice: 'Notificación de alerta',
            methodConfig: 'Config de métodos de notificación',
            createMethod: 'Crear método de notificación',
            methodInvalid: 'Configuración inválida {0}',
            commonConfig: 'Config global',
            smsConfig: 'SMS',
            smsConfigHelper: 'Configura teléfonos para notificaciones SMS',
            emailConfig: 'Correo',
            emailConfigHelper: 'Configura servicio SMTP de envío de correos',
            deleteConfigTitle: 'Eliminar configuración de alerta',
            deleteConfigMsg: '¿Seguro que quieres eliminar esta configuración?',
            test: 'Probar',
            alertTestOk: 'Notificación de prueba exitosa',
            alertTestFailed: 'Notificación de prueba fallida',
            displayName: 'Nombre',
            sender: 'Remitente',
            password: 'Contraseña',
            host: 'SMTP',
            port: 'Puerto',
            encryption: 'Cifrado',
            recipient: 'Destinatario',
            licenseTime: 'Recordatorio de expiración de licencia',
            licenseTimeTitle: 'Recordatorio de expiración de licencia',
            displayNameHelper: 'Nombre remitente para correos',
            senderHelper: 'Correo usado como remitente',
            passwordHelper: 'Código de autorización del servicio de correo',
            hostHelper: 'Servidor SMTP, ej. smtp.qq.com',
            portHelper: 'SSL normalmente 465, TLS normalmente 587',
            sslHelper: 'Si el puerto es 465, requiere SSL',
            tlsHelper: 'Si el puerto es 587, requiere TLS',
            triggerCondition: 'Condición de disparo',
            loginFail: ' fallos de login en',
            nodeException: 'Alerta de excepción de nodo',
            licenseException: 'Alerta de excepción de licencia',
            panelLogin: 'Alerta de login en panel',
            sshLogin: 'Alerta de login SSH',
            panelIpLogin: 'Alerta de login en panel por IP',
            sshIpLogin: 'Alerta de login SSH por IP',
            ipWhiteListHelper: 'Las IPs en whitelist no tienen restricciones ni generan alerta en login exitoso',
            nodeExceptionRule: 'Alerta de nodo anómalo, {0} envíos/día',
            licenseExceptionRule: 'Alerta de licencia anómala, {0} envíos/día',
            panelLoginRule: 'Alerta de login en panel, {0} envíos/día',
            sshLoginRule: 'Alerta de login SSH, {0} envíos/día',
            userNameHelper: 'El nombre de usuario está vacío, se usará la dirección del remitente por defecto',
            alertConfigHelper: 'Configurar canales de notificación de alerta para recibir mensajes push del panel',
            weComConfigHelper: 'Configuración de notificación de alerta WeCom',
            wechatConfigHelper: 'Configuración de notificación de alerta de Cuenta Oficial WeChat',
            dingTalkConfigHelper: 'Configuración de notificación de alerta DingTalk',
            feiShuConfigHelper: 'Configuración de notificación de alerta Feishu',
            barkConfigHelper: 'Configuración de notificación de alerta Bark',
            webhookName: 'Nombre del bot',
            webhookUrl: 'URL de Webhook',
            alertConfigProHelper: 'La edición comercial también admite alertas mediante WeCom, DingTalk, Feishu y SMS.',
        },
        theme: {
            lingXiaGold: 'LXware Gold',
            classicBlue: 'Azul clásico',
            freshGreen: 'Verde fresco',
            customColor: 'Color personalizado',
            setDefault: 'Por defecto',
            setDefaultHelper: 'La paleta de colores volverá al estado inicial. ¿Continuar?',
            setHelper: 'Se guardará la paleta actual como tema. ¿Continuar?',
        },
        sync: {
            menu: 'Sincronización de Recursos',
            file: 'Transferencia de archivos',
            fileSyncConfirm: '¿Transferir el archivo/carpeta {1} del nodo {0} al directorio {3} del nodo {2}?',

            image: 'Transferencia de imágenes',
            imageBatchDesc:
                'Seleccione primero el nodo de origen y las imágenes de origen, luego elija los nodos de destino para reenviar.',
            imageBatchConfirmPrefix: 'Se enviarán {0} imágenes a {1} nodos, creando {2} tareas.',

            ssl: 'Sincronización de certificados',
            sslBatchDesc:
                'Después de seleccionar el nodo de origen, los certificados especificados pueden sincronizarse con el entorno actual del panel.',
            sslBatchConfirmPrefix: 'Se sincronizarán {0} certificados a {1} nodos, creando {2} tareas.',

            app: 'Transferencia de Aplicaciones',
            appBatchDesc:
                'Seleccione el nodo de origen, la aplicación y los nodos de destino, luego confirme las dependencias de recursos y ejecute la tarea de transferencia de aplicaciones.',
            appSelectedApp: 'Aplicación seleccionada:',
            appPreviewTitle: 'Vista previa de transferencia',
            appPreviewDesc:
                'Confirme los nodos de destino y los recursos dependientes antes de iniciar la transferencia de aplicaciones.',
            appDatabaseDependency: 'Dependencia de base de datos',
            appResourceRequired: 'Seleccione primero todos los recursos asociados requeridos.',
            appUnsupportedMultipleResources:
                'Actualmente solo se admite la migración de aplicaciones asociadas con un máximo de un recurso.',
            appUnsupportedResourceType:
                'Actualmente solo se admite la migración de aplicaciones sin dependencias de recursos o que dependan únicamente de MySQL, MariaDB o PostgreSQL.',

            targetTitle: 'Nodos de destino',
            targetDesc: 'El nodo de origen se excluye automáticamente. Puede seleccionar uno o más nodos de destino.',
            targetSearchPlaceholder: 'Buscar nombre o dirección del nodo',
            noTargetNodes: 'No hay nodos de destino disponibles',
            noSourceNode: 'Seleccione primero un nodo de origen',
            reviewTargets: 'Nodos de destino',
            reviewEmpty: 'Seleccione primero los recursos y los nodos de destino',
            selectSourceFirst: 'Seleccione primero un nodo de origen.',
            selectResourceFirst: 'Seleccione primero un recurso para sincronizar.',
            selectTargetFirst: 'Seleccione al menos un nodo de destino.',
            submitSuccess: 'La tarea de sincronización se ha enviado correctamente.',
        },
        vm: {
            vm: 'Máquina virtual',
            title: 'Gestión de máquinas virtuales',
            healthCheck: 'Comprobación de estado',
            healthCheckResult: {
                pass: 'Correcto',
                info: 'Información',
                warn: 'Advertencia',
                fail: 'Error',
                normal: 'Normal',
                fixCommand: 'Comando de corrección',
                technicalDetail: 'Detalles técnicos',
                check: {
                    vmName: 'Nombre de la máquina virtual',
                    libvirtConnection: 'Conexión con Libvirt',
                    vmDefinition: 'Definición de la máquina virtual',
                    domainXML: 'XML de la máquina virtual',
                    architecture: 'Arquitectura',
                    virtualizationType: 'Tipo de virtualización',
                    machineType: 'Tipo de máquina',
                    efiCapability: 'Compatibilidad con EFI',
                    qemuEmulator: 'Emulador QEMU',
                    bootOrder: 'Orden de arranque',
                    arm64Firmware: 'Firmware ARM64',
                    arm64Features: 'Funciones de ARM64',
                    arm64Video: 'Pantalla ARM64',
                    arm64FirmwareFile: 'Archivo de firmware ARM64',
                    arm64CDROM: 'CD-ROM ARM64',
                    blockDevice: 'Dispositivo de bloques',
                    isoArchitecture: 'Arquitectura de la ISO',
                    network: 'Red',
                    qemuLog: 'Registro de QEMU',
                    arm64RuntimeFirmware: 'Firmware ARM64 en ejecución',
                },
                reason: {
                    invalidName: 'El nombre de la máquina virtual no es válido.',
                    connectionFailed: 'No se puede conectar con {uri}.',
                    vmNotFound: 'No se encontró la máquina virtual {name}.',
                    xmlReadFailed: 'No se pudo leer el XML de la máquina virtual.',
                    liveXMLFallback:
                        'No se pudo leer la configuración persistente; se está usando la configuración en ejecución.',
                    xmlParseFailed: 'No se pudo analizar el XML de la máquina virtual.',
                    stateReadFailed:
                        'No se pudo determinar el estado de la máquina virtual. Se omitió la comprobación del firmware en ejecución.',
                    guestArchMissing: 'Falta la arquitectura del sistema invitado en el XML.',
                    archMismatch:
                        'La arquitectura del host es {hostArch} y la del invitado es {guestArch}. No se admite la ejecución entre arquitecturas diferentes.',
                    nonKVMType: 'El tipo de virtualización es {type}, no el tipo KVM predeterminado.',
                    archOrMachineMissing: 'Falta la arquitectura o el tipo de máquina en el XML.',
                    machineUnsupported: 'El host no admite {arch}/{machine}.',
                    emulatorNotSpecified: 'No se especificó un emulador en el XML; Libvirt seleccionará uno.',
                    fileNotFound: 'No se encontró el archivo: {path}',
                    fileNotExecutable: 'El archivo no es ejecutable: {path}',
                    bootDeviceMissing: 'No hay ningún dispositivo de arranque definido en el XML.',
                    diskNotFirst: 'El disco no es el primer dispositivo de arranque. Orden actual: {order}',
                    cdromNotInBootOrder: 'Hay un CD-ROM conectado, pero no está incluido en el orden de arranque.',
                    firmwareNotConfigured:
                        'EFI o Loader no están configurados, por lo que el invitado podría no iniciar la pantalla o arrancar.',
                    acpiCustom: 'ACPI está configurado. Confirme que el invitado necesita esta personalización.',
                    acpiRequiresUEFI: 'ACPI está configurado sin UEFI, lo que provoca el error ACPI requires UEFI.',
                    apicUnsupported: 'x86 APIC está configurado, pero no es válido para ARM64.',
                    gicNotDeclared:
                        'GIC no aparece en el XML persistente; Libvirt puede añadirlo durante la ejecución.',
                    videoNotConfigured: 'No hay ningún dispositivo de pantalla configurado en el XML.',
                    videoNotVirtio: 'El tipo de dispositivo de pantalla es {type}; se recomienda Virtio.',
                    firmwareFileMissing: 'El archivo de firmware no existe o no es un archivo normal: {path}',
                    firmwareNotAvailable:
                        'Libvirt no informa de compatibilidad con EFI y no se encontró firmware UEFI para ARM64.',
                    cdromBusNotSCSI: 'El CD-ROM utiliza el bus {bus}; ARM64 requiere SCSI.',
                    cdromNotOnVirtioSCSI: 'El CD-ROM no está conectado a un controlador Virtio SCSI.',
                    diskSourceMissing: 'No hay un archivo de origen configurado para {device} {target}.',
                    sourceNotFound: 'El archivo de origen de {device} {target} no existe: {path}',
                    sourceIsDirectory: 'La ruta de origen de {device} {target} es un directorio: {path}',
                    systemDiskNotFound: 'No se detectó ningún disco del sistema.',
                    isoArchMismatch:
                        'El invitado {guestArch} tiene conectada una imagen que parece corresponder a {imageArch}: {path}',
                    networkReadFailed: 'No se puede leer la red {name}.',
                    networkStateReadFailed: 'No se puede leer el estado de la red {name}.',
                    networkInactive: 'La red {name} existe, pero está inactiva.',
                    logUnavailable: 'No hay ningún registro de inicio disponible para analizar.',
                    logErrorsFound: 'Se encontraron errores comunes en el registro de inicio más reciente.',
                    vmNotRunning:
                        'La máquina virtual no está en ejecución, por lo que se omitió la comprobación de los argumentos de QEMU.',
                    runtimeFirmwareMissing: 'No se encontró pflash, AAVMF ni QEMU_EFI en el registro de QEMU.',
                },
            },
            dependencies: 'Dependencias',
            dependencyPurpose: 'Propósito',
            dependencyPurposeMap: {
                libvirt: 'Proporciona servicios de gestión de VM para el ciclo de vida y la planificación de recursos.',
                storage:
                    'Proporciona el directorio o pool de almacenamiento predeterminado para los archivos de disco de la VM.',
            },
            dependencyNotReady:
                'Las comprobaciones de dependencias de la VM han fallado. Corrija las dependencias antes de usar máquinas virtuales.',
            helperUnavailable:
                'La inicialización de la capacidad de VM falló. Revise los registros de Core o actualice de nuevo antes de usar máquinas virtuales.',
            cpu: 'CPU',
            memory: 'Memoria',
            disk: 'Disco',
            overview: 'Resumen',
            kvmUnavailable: 'No se detectó ninguna capacidad de virtualización KVM disponible.',
            kvmCheckCpu: 'Confirme que la CPU del host admite virtualización Intel VT-x o AMD-V.',
            kvmCheckBios: 'Active las opciones de virtualización en BIOS/UEFI.',
            kvmCheckModule: 'Confirme que el módulo del kernel kvm, kvm_intel o kvm_amd esté cargado correctamente.',
            kvmCheckDevice:
                'Confirme que /dev/kvm existe y que el entorno actual no sea un contenedor o un host en la nube sin compatibilidad con KVM.',
            abnormal: 'Anormal',
            resourceOverview: 'Resumen de recursos',
            cpuAllocated: 'CPU asignada',
            memoryAllocated: 'Memoria asignada',
            storageUsed: 'Almacenamiento usado',
            riskReminder: 'Avisos de riesgo',
            noRisk: 'Sin riesgos',
            runtimeHealth: 'Estado del entorno de ejecución',
            runtimeAbnormal: 'El entorno de ejecución de la VM presenta anomalías',
            noDependency: 'No hay datos de comprobación de dependencias',
            storageOverview: 'Resumen del almacenamiento',
            totalAllocated: 'Calculado a partir de la configuración total de las VM',
            runningAllocated: 'Asignación en ejecución: {0}',
            storageAvailable: 'Disponible: {0}',
            inProgress: 'En curso',
            needAttention: 'Requiere atención',
            normal: 'Normal',
            environmentRisk:
                'El entorno de ejecución de VM no está listo. Corrija las dependencias o los servicios de virtualización.',
            storageRisk: 'El uso del pool de almacenamiento {0} ha alcanzado el {1}%.',
            abnormalRisk: '{0} VM se encuentran en un estado anormal.',
            pausedRisk: '{0} VM están pausadas.',
            memoryRisk: 'La asignación de memoria de las VM ha alcanzado el {0}%.',
            cpuLimitHelper: 'CPU disponible actualmente: {0} núcleos',
            cpuLimitExceeded: 'La CPU supera el límite. Máximo disponible actual: {0} núcleos.',
            memoryLimitHelper: 'Memoria actualmente asignable: {0} (el host debe reservar {1} de memoria)',
            memoryLimitExceeded: 'La memoria supera el límite. Máximo asignable actual: {0}.',
            storageLimitHelper: 'Espacio libre actual en el pool de almacenamiento de destino: {0}',
            storageLimitExceeded: 'La capacidad del disco supera el límite. Máximo disponible actual: {0}.',
            iso: 'ISO',
            createFromTemplate: 'Crear desde plantilla',
            template: 'Plantilla',
            templateName: 'Nombre de la plantilla',
            convertToTemplate: 'Convertir en plantilla',
            sourceVM: 'VM de origen',
            templateSize: 'Tamaño de la plantilla',
            deleteTemplateConfirm: 'Eliminar plantilla {0}. Esta operación no se puede revertir. ¿Continuar?',
            orphanClean: 'Limpieza de datos huérfanos',
            orphanScan: 'Volver a escanear',
            orphanCleanHelper:
                'Solo se muestran archivos candidatos no referenciados por máquinas virtuales, instantáneas o plantillas registradas. Confirme que ya no se usan antes de limpiarlos; la operación no se puede deshacer.',
            orphanSelected: '{0} archivos seleccionados, {1} en total',
            orphanSize: 'Tamaño',
            orphanCleanConfirm: '¿Limpiar los {0} archivos seleccionados ({1})? Esta operación no se puede deshacer.',
            orphanCleanSuccess: 'Se limpiaron {0} archivos y se liberaron {1}.',
            orphanType: {
                orphan_domain_disk: 'Disco huérfano',
                orphan_snapshot: 'Instantánea huérfana',
                partial_file: 'Archivo incompleto',
            },
            diskSize: 'Tamaño del disco',
            diskPath: 'Ruta del disco',
            isoPath: 'Ruta ISO',
            storagePool: 'Pool de almacenamiento',
            network: 'Red',
            bridgeName: 'Nombre del bridge',
            natNetworkHelper:
                'Las VM pueden acceder a la red a través del host, pero los dispositivos externos normalmente no pueden acceder a ellas directamente.',
            bridgeNetworkHelper:
                'Conecta las VM a un bridge existente del host (como br0). Si el host tiene una NIC adicional sin usar, puedes crear un bridge para ella y utilizarlo.',
            bridgeNameHelper:
                'Seleccione un Linux bridge existente en el host, como br0. Las NIC físicas no son bridges, y los bridges gestionados por docker/libvirt no pueden seleccionarse aquí.',
            natCIDRHelper: 'CIDR, puerta de enlace y rango DHCP se usarán en la nueva red virtual NAT.',
            networkCIDR: 'CIDR de red',
            gateway: 'Puerta de enlace',
            dhcpStart: 'Inicio DHCP',
            dhcpEnd: 'Fin DHCP',
            bootOrder: 'Orden de arranque',
            bootDiskFirst: 'Disco primero (HD → CD-ROM)',
            bootIsoFirst: 'ISO primero (CD-ROM → HD)',
            bootOrderConfirm:
                '¿Cambiar el orden de arranque a {0}? La próxima vez que se inicie, la VM probará en este orden los dispositivos arrancables que estén montados.',
            startAfterCreate: 'Iniciar después de crear',
            autoStart: 'Inicio automático',
            resourceAutoStart: 'Inicio automático',
            capacity: 'Capacidad',
            available: 'Disponible',
            vmCount: 'VM vinculadas',
            usedIPs: 'IP usadas',
            monitor: 'Supervisión',
            monitorNotReady: 'La máquina virtual no está en ejecución. Los datos de supervisión no están disponibles.',
            monitorLoadFailed: 'No se pudieron obtener los datos de supervisión de la VM.',
            monitorLoadFailedWithReason: 'No se pudieron obtener los datos de supervisión de la VM: {0}',
            rename: 'Renombrar',
            newName: 'Nuevo nombre',
            renameHelper: 'Introduzca un nuevo nombre. La VM debe estar apagada antes de renombrarla.',
            renameConfirm: '¿Renombrar la máquina virtual [{0}] como [{1}]?',
            renameRunningHelper: 'Apague la máquina virtual antes de renombrarla.',
            cpuUsage: 'Uso de CPU',
            memoryUsage: 'Uso de memoria',
            diskIO: 'E/S de disco',
            networkIO: 'E/S de red',
            diskReadWrite: 'Lectura/escritura de disco',
            networkRxTx: 'Recepción/transmisión de red',
            rx: 'RX',
            tx: 'TX',
            console: 'Consola',
            consoleNotReady:
                'La consola VNC no está disponible. Inicie la VM y compruebe su configuración gráfica VNC.',
            consoleDisconnected: 'La consola VNC se ha desconectado.',
            consoleConnectFailed: 'No se pudo conectar a la consola VNC. Compruebe el servicio proxy de consola.',
            consoleCredentialsRequired:
                'La consola VNC requiere credenciales. Compruebe la configuración del proxy backend.',
            snapshot: 'Instantánea',
            createSnapshot: 'Crear instantánea',
            recoverSnapshot: 'Restaurar instantánea',
            snapshotSize: 'Uso',
            currentSnapshot: 'Actual',
            snapshotEmpty: 'No hay instantáneas',
            snapshotHelper:
                'Una instantánea guarda el estado actual de la VM como punto de restauración. Los cambios posteriores se registran en un archivo delta sin modificar el disco original. Al restaurarla, la VM vuelve a ese momento.',
            snapshotOperationHelper:
                'La instantánea actual no se puede eliminar. Las instantáneas solo se pueden restaurar cuando la máquina virtual está apagada.',
            snapshotRecoverConfirm:
                '¿Restaurar la máquina virtual [{1}] a la instantánea [{0}]? El disco de la VM volverá al estado de la instantánea.',
            interface: 'Interfaz de red',
            device: 'Dispositivo',
            path: 'Ruta',
            start: 'Iniciar',
            shutdown: 'Apagar',
            reboot: 'Reiniciar',
            destroy: 'Forzar detención',
            suspend: 'Suspender',
            resume: 'Reanudar',
            operateConfirm: '¿Confirmar {0} máquina virtual [{1}]?',
            forceDelete: 'Forzar eliminación',
            forceDeleteHelper:
                'La eliminación forzada ignorará los errores al eliminar la VM, borrará los metadatos del panel y liberará el uso de recursos.',
            deleteNameHelper: '" para eliminar esta máquina virtual',
            isoSource: 'Origen ISO',
            downloadFromServer: 'Descarga remota',
            isoTargetDir: 'Ruta de destino ISO',
            isoTargetDirHelper:
                'Los ISO cargados localmente o descargados desde el servidor se guardarán en este directorio.',
            addingIsoRecord: 'Agregando registro ISO',
            transferInProgress: 'La transferencia ISO está en curso. No cierre este panel ni la página.',
            isoSize: 'Tamaño ISO',
            deleteIsoConfirm: 'Esta operación de eliminación no se puede revertir. ¿Continuar?',
            deleteSourceFile: 'Eliminar archivo de origen',
            deleteSourceFileHelper:
                'Si se marca, también se eliminará el archivo de origen referenciado por este registro ISO y no se podrá recuperar.',
            dir: 'Directorio local',
        },
        cluster: {
            cluster: 'Alta disponibilidad de aplicaciones',
            name: 'Nombre del clúster',
            addCluster: 'Añadir clúster',
            installNode: 'Instalar nodo',
            master: 'Nodo maestro',
            slave: 'Nodo esclavo',
            replicaStatus: 'Estado maestro-esclavo',
            unhealthyDeleteError: 'El nodo tiene estado anómalo, revisa la lista e inténtalo de nuevo',
            replicaStatusError: 'Error al obtener estado, revisa el nodo maestro',
            masterHostError: 'La IP del nodo maestro no puede ser 127.0.0.1',
        },
    },
    template: {
        create: 'Crear plantilla',
        edit: 'Editar plantilla',
        name: 'Nombre de plantilla',
        type: 'Tipo de plantilla',
        single: 'Archivo único',
        multi: 'Varios archivos (zip)',
        content: 'Contenido de la plantilla',
        variables: 'Definición de variables',
        remark: 'Observación',
        filePath: 'Ruta del archivo',
        upload: 'Subir zip',
        preview: 'Vista previa',
        previewEmpty: 'Seleccione una plantilla para previsualizar en tiempo real',
        generate: 'Generar salida',
        outputName: 'Nombre de la salida',
        outputList: 'Lista de salidas',
        outputCreate: 'Generar salida',
        confirmDelete: '¿Está seguro de que desea eliminar esta plantilla? Las salidas asociadas también se eliminarán',
        confirmDeleteOutput: '¿Está seguro de que desea eliminar esta salida?',
        variableKey: 'Nombre de variable',
        variableLabel: 'Etiqueta',
        variableType: 'Tipo',
        variableDefault: 'Valor predeterminado',
        variableOptions: 'Opciones (separadas por comas)',
        variableRequired: 'Obligatorio',
        varTypeText: 'Texto de una línea',
        varTypeTextHelper: 'Campo de texto normal',
        varTypeTextarea: 'Texto multilínea',
        varTypeTextareaHelper: 'Adecuado para párrafos y textos largos',
        varTypeNumber: 'Número',
        varTypeNumberHelper: 'Solo entrada numérica',
        varTypeSelect: 'Selección desplegable',
        varTypeSelectHelper: 'Elegir entre opciones predefinidas, se deben indicar las opciones',
        varTypeColor: 'Color',
        varTypeColorHelper: 'Selector de color',
        autoDetectHelper: 'Las variables entre llaves dobles se detectan automáticamente y se añaden a la tabla',
        selectTemplate: 'Seleccionar plantilla',
        fillVariables: 'Completar variables',
        noVariables: 'Esta plantilla no tiene variables definidas',
        outputSuccess: 'Salida generada correctamente',
        importButton: 'Importar desde plantilla',
    },
};

export default {
    ...getFuLocaleMessage('es-ES'),
    ...message,
};
