diff --git a/agent/app/dto/app.go b/agent/app/dto/app.go index 18eb7bda5..6d28b2e7a 100644 --- a/agent/app/dto/app.go +++ b/agent/app/dto/app.go @@ -128,6 +128,7 @@ type Locale struct { Zh string `json:"zh"` Ko string `json:"ko"` Tr string `json:"tr"` + Es string `json:"es-es" yaml:"es-es"` } type AppForm struct { diff --git a/agent/i18n/i18n.go b/agent/i18n/i18n.go index 669699343..9cac10637 100644 --- a/agent/i18n/i18n.go +++ b/agent/i18n/i18n.go @@ -134,6 +134,7 @@ func Init() { _, _ = bundle.LoadMessageFileFS(fs, "lang/ms.yaml") _, _ = bundle.LoadMessageFileFS(fs, "lang/ko.yaml") _, _ = bundle.LoadMessageFileFS(fs, "lang/tr.yaml") + _, _ = bundle.LoadMessageFileFS(fs, "lang/es-ES.yaml") lang := GetLanguageFromDB() global.I18n = i18n.NewLocalizer(bundle, lang) } diff --git a/agent/i18n/lang/es-ES.yaml b/agent/i18n/lang/es-ES.yaml new file mode 100644 index 000000000..0450ba0e6 --- /dev/null +++ b/agent/i18n/lang/es-ES.yaml @@ -0,0 +1,490 @@ +ErrInvalidParams: 'Error en los parámetros de la solicitud: {{ .detail }}' +ErrTokenParse: 'Error al generar el token: {{ .detail }}' +ErrInitialPassword: 'La contraseña original es incorrecta' +ErrInternalServer: 'Error interno del servidor: {{ .detail }}' +ErrRecordExist: 'El registro ya existe' +ErrRecordNotFound: 'Registro no encontrado' +ErrStructTransform: 'Error de conversión de tipo: {{ .err }}' +ErrNotLogin: 'Usuario no ha iniciado sesión: {{ .detail }}' +ErrPasswordExpired: 'La contraseña actual ha expirado: {{ .detail }}' +ErrNotSupportType: 'El sistema no admite el tipo actual: {{ .name }}' +ErrProxy: 'Error en la solicitud, por favor revise el estado del nodo: {{ .detail }}' +ErrApiConfigStatusInvalid: 'Se prohíbe el acceso a la interfaz API: {{ .detail }}' +ErrApiConfigKeyInvalid: 'Error en la clave de la interfaz API: {{ .detail }}' +ErrApiConfigIPInvalid: 'La IP usada para llamar a la API no está en la lista blanca: {{ .detail }}' +ErrApiConfigDisable: 'Esta interfaz prohíbe el uso de llamadas a la API: {{ .detail }}' +ErrApiConfigKeyTimeInvalid: 'Error en la marca de tiempo de la interfaz API: {{ .detail }}' +ErrMinQuickJump: "¡Por favor configure al menos una entrada de acceso rápido!" +ErrMaxQuickJump: "¡Puede configurar hasta cuatro entradas de acceso rápido!" + +#común +ErrUsernameIsExist: 'El nombre de usuario ya existe' +ErrNameIsExist: 'El nombre ya existe' +ErrDemoEnvironment: '¡Servidor de demostración, esta operación está prohibida!' +ErrCmdTimeout: '¡Tiempo de espera excedido en la ejecución del comando!' +ErrCmdIllegal: 'Hay caracteres ilegales en el comando, ¡modifíquelo e intente de nuevo!' +ErrPortExist: 'El puerto {{ .port }} ya está ocupado por {{ .type }} [{{ .name }}]' +TYPE_APP: 'Aplicación' +TYPE_RUNTIME: 'Entorno de ejecución' +TYPE_DOMAIN: 'Nombre de dominio' +ErrTypePort: 'El formato del puerto {{ .name }} es incorrecto' +ErrTypePortRange: 'El rango de puertos debe estar entre 1-65535' +Success: 'Éxito' +Failed: 'Error' +SystemRestart: 'La tarea fue interrumpida debido a un reinicio del sistema' +ErrGroupIsDefault: 'Grupo predeterminado, no se puede eliminar' +ErrGroupIsInWebsiteUse: 'El grupo está siendo usado por otro sitio web y no se puede eliminar.' + +#backup +ErrBackupInUsed: 'La cuenta de respaldo está siendo utilizada en una tarea programada y no se puede eliminar.' +ErrBackupCheck: 'Error al probar la conexión de la cuenta de respaldo {{ .err }}' +ErrBackupLocalDelete: 'No se admite aún la eliminación de la cuenta de respaldo del servidor local' +ErrBackupLocalCreate: 'No se admite aún la creación de cuentas de respaldo del servidor local' +Localhost: "Máquina local" + +#app +ErrPortInUsed: '¡El puerto {{ .detail }} ya está ocupado!' +ErrAppLimit: 'El número de aplicaciones instaladas ha superado el límite' +ErrNotInstall: 'Aplicación no instalada' +ErrPortInOtherApp: '¡El puerto {{ .port }} ya está ocupado por la aplicación {{ .apps }}!' +ErrDbUserNotValid: '¡Base de datos existente, usuario y contraseña no coinciden!' +ErrUpdateBuWebsite: 'La aplicación se actualizó correctamente, pero falló la modificación del archivo de configuración del sitio web. ¡Por favor revise la configuración!' +Err1PanelNetworkFailed: '¡Fallo la creación de la red por defecto del contenedor! {{ .detail }}' +ErrFileParse: '¡Fallo al analizar el archivo docker-compose de la aplicación!' +ErrInstallDirNotFound: 'El directorio de instalación no existe. Si desea desinstalar, seleccione Desinstalación forzada' +AppStoreIsUpToDate: 'La tienda de aplicaciones ya está en la última versión' +LocalAppVersionNull: '¡La aplicación {{ .name }} no está sincronizada a la versión! No se puede agregar a la lista de aplicaciones' +LocalAppVersionErr: '¡La sincronización de la versión {{ .version }} de {{ .name }} falló! {{ .err }}' +ErrFileNotFound: 'El archivo {{ .name }} no existe' +ErrFileParseApp: '¡El archivo {{ .name }} falló al analizarse! {{ .err }}' +ErrAppDirNull: 'La carpeta de la versión no existe' +LocalAppErr: '¡La sincronización de la aplicación {{ .name }} falló! {{ .err }}' +ErrContainerName: 'El nombre del contenedor ya existe' +ErrCreateHttpClient: 'Fallo al crear la solicitud {{ .err }}' +ErrHttpReqTimeOut: 'La solicitud superó el tiempo de espera {{ .err }}' +ErrHttpReqFailed: 'La solicitud falló {{ .err }}' +ErrNoSuchHost: 'No se pudo encontrar el servidor solicitado {{ .err }}' +ErrHttpReqNotFound: 'No se pudo encontrar el recurso solicitado {{ .err }}' +ErrContainerNotFound: 'El contenedor {{ .name }} no existe' +ErrContainerMsg: 'El contenedor {{ .name }} presenta anomalías. Revise el log en la página de contenedores para más detalles' +ErrAppBackup: 'Falló el respaldo de la aplicación {{ .name }} {{ .err }}' +ErrVersionTooLow: 'La versión actual de 1Panel es demasiado baja para actualizar la tienda de aplicaciones. Actualice primero.' +ErrAppNameExist: 'El nombre de la aplicación ya existe' +AppStoreIsSyncing: 'La tienda de aplicaciones está sincronizando, inténtelo más tarde' +ErrGetCompose: '¡Fallo al obtener el archivo docker-compose.yml! {{ .detail }}' +ErrAppWarn: 'Estado anómalo, revise el log' +ErrAppParamKey: 'El campo de parámetro {{ .name }} es anómalo' +ErrAppUpgrade: 'La actualización de la aplicación {{ .name }} falló {{ .err }}' +AppRecover: 'Revertir la aplicación {{ .name }}' +PullImageStart: 'Iniciar descarga de la imagen {{ .name }}' +PullImageSuccess: 'Descarga de imagen exitosa' +AppStoreIsLastVersion: 'La tienda de aplicaciones ya está en la última versión' +AppStoreSyncSuccess: 'Sincronización de la tienda de aplicaciones exitosa' +SyncAppDetail: 'Sincronizar configuración de la aplicación' +AppVersionNotMatch: 'La aplicación {{ .name }} requiere una versión superior de 1Panel, se omite la sincronización' +MoveSiteDir: 'La actualización actual requiere migrar el directorio del sitio web OpenResty' +MoveSiteDirSuccess: 'Migración del directorio del sitio exitosa' +DeleteRuntimePHP: 'Eliminar entorno de ejecución PHP' +CustomAppStoreFileValid: 'Los paquetes de la tienda de aplicaciones deben estar en formato .tar.gz' +PullImageTimeout: 'Tiempo de espera al descargar la imagen, intente aumentar la aceleración o use otra' +ErrAppIsDown: 'El estado de la aplicación {{ .name }} es anómalo, revise' +ErrCustomApps: 'Hay una aplicación instalada, desinstálela primero' +ErrCustomRuntimes: 'Hay un entorno de ejecución instalado, elimínelo primero' +ErrAppVersionDeprecated: "La aplicación {{ .name }} no es compatible con la versión actual de 1Panel, omitida" +ErrDockerFailed: "El estado de Docker es anómalo, revise el servicio" +ErrDockerComposeCmdNotFound: "El comando Docker Compose no existe, por favor instálelo primero en el host" + +#ssh +ExportIP: "IP de inicio de sesión" +ExportArea: "Ubicación" +ExportPort: "Puerto" +ExportAuthMode: "Método de inicio de sesión" +ExportUser: "Usuario" +ExportStatus: "Estado de inicio de sesión" +ExportDate: "Fecha y hora" + +#file +ErrFileCanNotRead: 'Este archivo no soporta vista previa' +ErrFileToLarge: 'El archivo es mayor a 10M y no puede abrirse' +ErrPathNotFound: 'El directorio no existe' +ErrMovePathFailed: '¡La ruta de destino no puede contener la ruta original!' +ErrLinkPathNotFound: '¡La ruta de destino no existe!' +ErrFileIsExist: '¡El archivo o carpeta ya existe!' +ErrFileUpload: '{{ .name }} falló al subir archivo {{ .detail }}' +ErrFileDownloadDir: 'No se admite la descarga de carpetas' +ErrCmdNotFound: 'El comando {{ .name }} no existe, instálelo primero en el host' +ErrSourcePathNotFound: 'El directorio fuente no existe' +ErrFavoriteExist: 'Esta ruta ya ha sido marcada como favorita' +ErrInvalidChar: 'No se permiten caracteres ilegales' +ErrPathNotDelete: 'No se puede eliminar el directorio seleccionado' +FileDropFailed: "Error al limpiar el archivo {{ .name }}: {{ .err }}" +FileDropSuccess: "Archivo {{ .name }} limpiado correctamente, {{ .count }} archivos eliminados, {{ .size }} de espacio liberado" +FileDropSum: "Limpieza de archivos completada, total {{ .count }} archivos eliminados, {{ .size }} de espacio liberado" + +#website +ErrAliasIsExist: 'El alias ya existe' +ErrBackupMatch: 'El archivo de respaldo no coincide con parte de los datos actuales del sitio web {{ .detail }}' +ErrBackupExist: 'Parte de los datos fuente del respaldo no existe {{ .detail }}' +ErrPHPResource: '¡El entorno local no soporta cambio!' +ErrPathPermission: 'Se detectó una carpeta con permisos distintos a 1000:1000 en el directorio index, lo cual puede causar errores de acceso denegado. Haga clic en Guardar arriba' +ErrDomainIsUsed: 'El dominio ya está en uso por el sitio web [{{ .name }}]' +ErrDomainFormat: 'El formato del dominio {{ .name }} es incorrecto' +ErrDefaultAlias: 'default es un código reservado, use otro' +ErrParentWebsite: 'Primero debe eliminar el sub-sitio {{ .name }}' +ErrBuildDirNotFound: 'El directorio de compilación no existe' +ErrImageNotExist: 'La imagen del entorno {{ .name }} no existe, edítela de nuevo' +ErrProxyIsUsed: "El balanceo de carga ya está usado por un proxy reverso, no se puede eliminar" +ErrSSLValid: 'Archivo de certificado anómalo, ¡revise el estado del certificado!' +ErrWebsiteDir: "Por favor seleccione un directorio dentro del directorio del sitio web" +ErrComposerFileNotFound: "El archivo composer.json no existe" +ErrRuntimeNoPort: "El entorno de ejecución no tiene configurado un puerto, edítelo primero" + +#ssl +ErrSSLCannotDelete: 'El certificado {{ .name }} está siendo utilizado por un sitio web y no puede eliminarse' +ErrAccountCannotDelete: 'La cuenta está asociada a un certificado y no puede eliminarse' +ErrSSLApply: 'Renovación del certificado exitosa, recarga de openresty fallida, ¡revise la configuración!' +ErrEmailIsExist: 'El correo ya existe' +ErrSSLKeyNotFound: 'El archivo de clave privada no existe' +ErrSSLCertificateNotFound: 'El archivo de certificado no existe' +ErrSSLKeyFormat: 'Error en la verificación del archivo de clave privada' +ErrSSLCertificateFormat: 'Formato de certificado incorrecto, use formato pem' +ErrEabKidOrEabHmacKeyCannotBlank: 'EabKid o EabHmacKey no pueden estar en blanco' +ErrOpenrestyNotFound: 'El modo Http requiere tener Openresty instalado primero' +ApplySSLStart: 'Iniciando solicitud de certificado, dominio [{{ .domain }}] método de solicitud [{{ .type }}]' +dnsAccount: 'DNS Automático' +dnsManual: 'DNS Manual' +http: 'HTTP' +ApplySSLFailed: 'Solicitud de certificado para [{{ .domain }}] fallida, {{ .detail }}' +ApplySSLSuccess: '¡Solicitud de certificado para [{{ .domain }}] exitosa!' +DNSAccountName: 'Cuenta DNS [{{ .name }}] proveedor [{{ .type }}]' +PushDirLog: 'Certificado empujado al directorio [{{ .path }}] {{ .status }}' +ErrDeleteCAWithSSL: 'La organización actual tiene un certificado emitido y no puede eliminarse.' +ErrDeleteWithPanelSSL: 'La configuración SSL del panel utiliza este certificado y no puede eliminarse' +ErrDefaultCA: 'La autoridad por defecto no puede eliminarse' +ApplyWebSiteSSLLog: 'Iniciando renovación del certificado del sitio web {{ .name }}' +ErrUpdateWebsiteSSL: 'Actualización de certificado del sitio web {{ .name }} falló: {{ .err }}' +ApplyWebSiteSSLSuccess: 'Certificado del sitio web actualizado exitosamente' +ErrExecShell: 'Ejecución del script fallida {{ .err }}' +ExecShellStart: 'Iniciando ejecución de script' +ExecShellSuccess: 'Ejecución de script exitosa' +StartUpdateSystemSSL: 'Iniciando actualización del certificado del sistema' +UpdateSystemSSLSuccess: 'Certificado del sistema actualizado correctamente' +ErrWildcardDomain: 'No se puede solicitar certificado de dominio wildcard en modo HTTP' +ErrDeleteCAWithSSL: "La organización actual tiene un certificado emitido y no puede eliminarse." +ErrApplySSLCanNotDelete: "El certificado {{ .name }} en proceso de solicitud no puede eliminarse, inténtelo más tarde" +StartPushSSLToNode: "Iniciando envío de certificado al nodo" +PushSSLToNodeFailed: "Error al enviar el certificado al nodo: {{ .err }}" +PushSSLToNodeSuccess: "Certificado enviado correctamente al nodo" + +#mysql +ErrUserIsExist: 'El usuario actual ya existe, intente con otro' +ErrDatabaseIsExist: 'La base de datos actual ya existe, intente con otro nombre' +ErrExecTimeOut: 'Tiempo de espera en la ejecución SQL, revise la base de datos' +ErrRemoteExist: 'La base de datos remota ya existe con ese nombre, modifíquelo e intente de nuevo' +ErrLocalExist: 'El nombre ya existe en la base de datos local, modifíquelo e intente de nuevo' + +#redis +ErrTypeOfRedis: 'El tipo de archivo de recuperación no coincide con el método de persistencia actual, modifíquelo e intente' + +#container +ErrInUsed: '{{ .detail }} está en uso y no puede eliminarse' +ErrObjectInUsed: 'El objeto está en uso y no puede eliminarse' +ErrObjectBeDependent: 'Esta imagen depende de otras imágenes y no puede eliminarse' +ErrPortRules: 'El número de puerto no coincide, ingrese de nuevo' +ErrPgImagePull: 'Tiempo de espera al descargar la imagen, configure la aceleración o descárguela manualmente ({{ .name }}) e intente de nuevo' +PruneHelper: "Esta limpieza eliminó {{ .name }} {{ .count }} elementos, liberando {{ .size }} de espacio en disco" +ImageRemoveHelper: "Imagen {{ .name }} eliminada, liberando {{ .size }} de espacio en disco" +BuildCache: "Caché de compilación" +Volume: "Volumen de almacenamiento" +Network: "Red" + +#runtime +ErrFileNotExist: 'El archivo {{ .detail }} no existe, ¡verifique la integridad!' +ErrImageBuildErr: 'Fallo al construir la imagen' +ErrImageExist: "¡La imagen ya existe! Modifique el nombre de la imagen." +ErrDelWithWebsite: 'El entorno de ejecución ya está asociado a un sitio web y no puede eliminarse' +ErrRuntimeStart: 'Fallo al iniciar' +ErrPackageJsonNotFound: 'El archivo package.json no existe' +ErrScriptsNotFound: 'No se encontró la configuración de scripts en package.json' +ErrContainerNameNotFound: 'No se puede obtener el nombre del contenedor, revise el archivo .env' +ErrNodeModulesNotFound: 'La carpeta node_modules no existe, edite o espere a que inicie' +ErrContainerNameIsNull: 'El nombre del contenedor no existe' +ErrPHPPortIsDefault: "El puerto 9000 es el predeterminado, modifique e intente de nuevo" +ErrPHPRuntimePortFailed: "El puerto {{ .name }} ya está en uso por el entorno actual, modifique e intente" + +#tool +ErrConfigNotFound: 'El archivo de configuración no existe' +ErrConfigParse: 'El formato del archivo de configuración es incorrecto' +ErrConfigIsNull: 'El archivo de configuración no puede estar vacío' +ErrConfigDirNotFound: 'El directorio de ejecución no existe' +ErrConfigAlreadyExist: 'Ya existe un archivo de configuración con ese nombre' +ErrUserFindErr: 'Búsqueda del usuario {{ .name }} fallida {{ .err }}' + +#cronjob +CutWebsiteLogSuccess: 'Log del sitio web {{ .name }} cortado con éxito, ruta de respaldo {{ .path }}' +HandleShell: 'Ejecutar script {{ .name }}' +HandleNtpSync: 'Sincronizar hora del sistema' +HandleSystemClean: 'Limpiar caché del sistema' +SystemLog: 'Log del sistema' +CutWebsiteLog: 'Rotar log del sitio web' +FileOrDir: 'Directorio / Archivo' +UploadFile: 'Subiendo archivo de respaldo {{ .file }} a {{ .backup }}' +IgnoreBackupErr: 'Fallo en el respaldo, error: {{ .detail }}, se ignora este error...' +IgnoreUploadErr: 'Fallo en la subida, error: {{ .detail }}, se ignora este error...' +Upload: "Subir" +LoadBackupFailed: "Error al obtener la conexión de la cuenta de respaldo, error: {{ .detail }}" +InExecuting: "La tarea actual se está ejecutando, por favor no la repita" +NoSuchResource: "No se encontraron contenidos de respaldo en la base de datos, omitiendo..." + +#toolbox +ErrNotExistUser: 'El usuario actual no existe, modifíquelo e intente de nuevo' +ErrBanAction: 'Fallo al configurar. El servicio {{ .name }} no está disponible, revise e intente de nuevo' +ErrClamdscanNotFound: 'El comando clamdscan no fue detectado, siga la documentación para instalarlo' + +#waf +ErrScope: 'No se admite la modificación de esta configuración' +ErrStateChange: 'Fallo al cambiar de estado' +ErrRuleExist: 'La regla ya existe' +ErrRuleNotExist: 'La regla no existe' +ErrParseIP: 'Formato de IP incorrecto' +ErrDefaultIP: 'default es un nombre reservado, cámbielo' +ErrGroupInUse: 'El grupo IP está en uso por listas negras/blancas y no se puede eliminar' +ErrIPGroupAclUse: "El grupo IP está en uso por reglas personalizadas del sitio web {{ .name }}, no puede eliminarse" +ErrGroupExist: 'El nombre del grupo IP ya existe' +ErrIPRange: 'Rango de IP incorrecto' +ErrIPExist: 'La IP ya existe' +urlDefense: 'Reglas de URL' +urlHelper: 'URL prohibida' +dirFilter: 'Filtro de directorio' +xss: 'XSS' +phpExec: 'Ejecución de scripts PHP' +oneWordTrojan: 'Troyano de una sola palabra' +appFilter: 'Filtrar directorios peligrosos' +webshell: 'Webshell' +args: 'Reglas de parámetros' +protocolFilter: 'Filtrado de protocolos' +javaFileter: 'Filtrado de archivos Java peligrosos' +scannerFilter: 'Filtrado de escáneres' +escapeFilter: 'Filtro de escape' +customRule: 'Regla personalizada' +httpMethod: 'Filtrado de métodos HTTP' +fileExt: 'Restricciones de carga de archivos' +defaultIpBlack: 'Grupo de IPs maliciosas' +cookie: 'Reglas de Cookie' +urlBlack: 'Lista negra de URLs' +uaBlack: 'Lista negra de User-Agent' +attackCount: 'Límite de frecuencia de ataques' +fileExtCheck: 'Restricción de carga de archivos' +geoRestrict: 'Restricciones de acceso regional' +unknownWebsite: 'Acceso no autorizado al dominio' +notFoundCount: 'Límite de tasa 404' +headerDefense: 'Reglas de encabezado' +defaultUaBlack: 'Reglas de User-Agent' +methodWhite: 'Reglas HTTP' +captcha: 'Verificación humano-máquina' +fiveSeconds: 'Verificación de 5 segundos' +vulnCheck: 'Reglas suplementarias' +acl: 'Reglas personalizadas' +sql: 'Inyección SQL' +cc: 'Límite de frecuencia de acceso' +defaultUrlBlack: 'Reglas de URL' +sqlInject: 'Inyección SQL' +ErrDBNotExist: 'La base de datos no existe' +allow: 'permitir' +deny: 'denegar' +OpenrestyNotFound: 'Openresty no está instalado' +remoteIpIsNull: "La lista de IP está vacía" +OpenrestyVersionErr: "La versión de Openresty es demasiado baja, actualice a 1.27.1.2-2-2-focal" + +#task +TaskStart: 'La tarea {{ .name }} inicia [INICIO]' +TaskEnd: 'La tarea {{ .name }} completada [COMPLETADA]' +TaskFailed: 'La tarea {{ .name }} falló' +TaskTimeout: 'La tarea {{ .name }} excedió el tiempo' +TaskSuccess: 'La tarea {{ .name }} se realizó con éxito' +TaskRetry: 'Iniciar el {{ .name }} reintento' +SubTaskSuccess: '{{ .name }} exitoso' +SubTaskFailed: '{{ .name }} falló: {{ .err }}' +TaskInstall: 'Instalar' +TaskUninstall: 'Desinstalar' +TaskCreate: 'Crear' +TaskDelete: 'Eliminar' +TaskUpgrade: 'Actualizar' +TaskUpdate: 'Actualizar' +TaskRestart: 'Reiniciar' +TaskBackup: 'Respaldar' +TaskRecover: 'Recuperar' +TaskRollback: 'Revertir' +TaskPull: 'Descargar' +TaskCommit: 'Commit' +TaskBuild: 'Construir' +TaskPush: 'Subir' +TaskHandle: 'Ejecutar' +Website: 'Sitio web' +App: 'Aplicación' +Runtime: 'Entorno de ejecución' +Database: 'Base de datos' +ConfigFTP: 'Crear usuario FTP {{ .name }}' +ConfigOpenresty: 'Crear archivo de configuración Openresty' +InstallAppSuccess: 'Aplicación {{ .name }} instalada correctamente' +ConfigRuntime: 'Configurar entorno de ejecución' +ConfigApp: 'Configurar aplicación' +SuccessStatus: '{{ .name }} exitoso' +FailedStatus: '{{ .name }} falló {{ .err }}' +HandleLink: 'Gestionar asociación de aplicación' +HandleDatabaseApp: 'Gestionar parámetros de aplicación' +ExecShell: 'Ejecutar script {{ .name }}' +PullImage: 'Descargar imagen' +Start: 'Iniciar' +Run: 'Ejecutar' +Stop: 'Detener' +Image: 'Imagen' +Compose: 'Orquestación' +Container: 'Contenedor' +AppLink: 'Aplicación enlazada' +EnableSSL: 'Habilitar HTTPS' +AppStore: 'Tienda de aplicaciones' +TaskSync: 'Sincronizar' +LocalApp: 'Aplicación local' +SubTask: 'Subtarea' +RuntimeExtension: 'Extensión del entorno de ejecución' +TaskIsExecuting: 'Tarea en ejecución' +CustomAppstore: 'Almacén de aplicaciones personalizado' +TaskClean: "Limpieza" +TaskExec: "Ejecutar" + +# task - ai +OllamaModelPull: 'Descargar modelo Ollama {{ .name }}' +OllamaModelSize: 'Obtener tamaño del modelo Ollama {{ .name }}' + +# task - clam +Clamscan: "Escanear {{ .name }}" +TaskScan: "Escaneo" + +# task-snapshot +Snapshot: 'Instantánea' +SnapDBInfo: 'Escribir información de base de datos de 1Panel' +SnapCopy: 'Copiar archivos y directorios {{ .name }}' +SnapNewDB: 'Inicializar conexión a base de datos {{ .name }}' +SnapDeleteOperationLog: 'Eliminar log de operaciones' +SnapDeleteLoginLog: 'Eliminar log de accesos' +SnapDeleteMonitor: 'Eliminar datos de monitoreo' +SnapRemoveSystemIP: 'Eliminar IP del sistema' +SnapBaseInfo: 'Escribir información básica de 1Panel' +SnapInstallAppImageEmpty: 'No se seleccionaron imágenes de aplicaciones, omitiendo...' +SnapInstallApp: 'Respaldar aplicaciones instaladas de 1Panel' +SnapDockerSave: 'Comprimir aplicaciones instaladas' +SnapLocalBackup: 'Respaldar directorio local de 1Panel' +SnapCompressBackup: 'Comprimir directorio local de respaldo' +SnapPanelData: 'Respaldar directorio de datos de 1Panel' +SnapCompressPanel: 'Directorio de datos comprimido' +SnapWebsite: 'Respaldar directorio de sitios web de 1Panel' +SnapCloseDBConn: 'Cerrar conexión de base de datos' +SnapCompress: 'Crear archivos de instantánea' +SnapCompressFile: 'Comprimir archivo de instantánea' +SnapCheckCompress: 'Verificar archivo de compresión de instantánea' +SnapCompressSize: 'Tamaño del archivo de instantánea {{ .name }}' +SnapUpload: 'Subir archivo de instantánea' +SnapUploadTo: 'Subir archivo de instantánea a {{ .name }}' + +SnapshotRecover: 'Restaurar instantánea' +RecoverDownload: 'Descargar archivo de instantánea' +Download: 'Descargar' +RecoverDownloadAccount: 'Obtener cuenta de respaldo para descargar instantánea {{ .name }}' +RecoverDecompress: 'Descomprimir archivos de instantánea' +Decompress: 'Descompresión' +BackupBeforeRecover: 'Respaldar datos del sistema antes de restaurar instantánea' +Readjson: 'Leer archivo Json de la instantánea' +ReadjsonPath: 'Obtener ruta del archivo Json en la instantánea' +ReadjsonContent: 'Leer archivo Json' +ReadjsonMarshal: 'Procesar escape de Json' +RecoverApp: 'Restaurar aplicaciones instaladas' +RecoverWebsite: 'Recuperar directorio del sitio web' +RecoverAppImage: 'Restaurar imagen de la instantánea' +RecoverCompose: 'Restaurar otros contenidos de compose' +RecoverComposeList: 'Obtener todos los compose a restaurar' +RecoverComposeItem: 'Restaurar compose {{ .name }}' +RecoverAppEmpty: 'No se encontraron imágenes de respaldo de aplicaciones en la instantánea' +RecoverBaseData: 'Recuperar datos y archivos básicos' +RecoverDaemonJsonEmpty: 'El archivo daemon.json no existe ni en la instantánea ni en el equipo actual' +RecoverDaemonJson: 'Restaurar archivo daemon.json de configuración de contenedor' +RecoverDBData: 'Restaurar datos de base de datos' +RecoverBackups: 'Restaurar directorio local de respaldo' +RecoverPanelData: 'Recuperar directorio de datos' + +# task - container +ContainerNewCliet: 'Inicializar cliente Docker' +ContainerImagePull: 'Descargar imagen de contenedor {{ .name }}' +ContainerRemoveOld: 'Eliminar el contenedor original {{ .name }}' +ContainerImageCheck: 'Comprobar si la imagen se descargó correctamente' +ContainerLoadInfo: 'Obtener información básica del contenedor' +ContainerRecreate: 'Actualización del contenedor fallida, restaurando el contenedor original' +ContainerCreate: 'Crear nuevo contenedor {{ .name }}' +ContainerCreateFailed: 'Falló la creación del contenedor, eliminando el contenedor fallido' +ContainerStartCheck: 'Verificar si el contenedor ha iniciado' + +# task - image +ImageBuild: 'Construcción de imagen' +ImageBuildStdoutCheck: 'Analizar salida de la imagen' +ImageBuildRes: 'Salida de construcción de imagen: {{ .name }}' +ImagePull: 'Descargar imagen' +ImageRepoAuthFromDB: 'Obtener autenticación de repositorio desde base de datos' +ImaegPullRes: 'Salida de descarga de imagen: {{ .name }}' +ImagePush: 'Subir imagen' +ImageRenameTag: 'Modificar etiqueta de imagen' +ImageNewTag: 'Nueva etiqueta de imagen {{ .name }}' +ImaegPushRes: 'Salida de subida de imagen: {{ .name }}' +ComposeCreate: 'Crear orquestación' +ComposeCreateRes: 'Salida de creación de orquestación: {{ .name }}' +ImageRepoAuthFromDB: "Obtener información de autenticación del repositorio desde la base de datos" +ImaegPullRes: "Salida de descarga de imagen: {{ .name }}" +ImaegPushRes: "Salida de subida de imagen: {{ .name }}" + +# task - website +BackupNginxConfig: 'Respaldar archivo de configuración OpenResty' +CompressFileSuccess: 'Directorio comprimido con éxito, guardado en {{ .name }}' +CompressDir: 'Directorio comprimido' +DeCompressFile: 'Descomprimir archivo {{ .name }}' +ErrCheckValid: 'Verificación de archivo de respaldo fallida, {{ .name }}' +Rollback: 'Revertir' +websiteDir: 'Directorio del sitio web' +RecoverFailedStartRollBack: 'Restauración fallida, iniciando reversión' +AppBackupFileIncomplete: 'El archivo de respaldo está incompleto, falta app.json o app.tar.gz' +AppAttributesNotMatch: 'El tipo o nombre de la aplicación no coincide' + +#alert +ErrAlert: 'El formato del mensaje de alerta es incorrecto, ¡revise e intente de nuevo!' +ErrAlertPush: 'Error al enviar la alerta, ¡revise e intente de nuevo!' +ErrAlertSave: 'Error al guardar la alerta, ¡revise e intente de nuevo!' +ErrAlertSync: 'Error en la sincronización de la alerta, ¡revise e intente de nuevo!' +ErrAlertRemote: 'Error remoto de alerta, ¡revise e intente de nuevo!' +CommonAlert: "Su 1Panel: {{ .msg }}, por favor inicie sesión en el panel para más detalles." +NodeExceptionAlert: "Su 1Panel tiene {{ .num }} nodos anómalos, inicie sesión para más detalles." +LicenseExceptionAlert: "Su 1Panel tiene {{ .num }} licencias anómalas, inicie sesión para más detalles." +SSHAndPanelLoginAlert: "Su 1Panel detectó un inicio de sesión anómalo en el panel {{ .name }} desde {{ .ip }}, revise en el panel para más detalles." + +#task - runtime +ErrInstallExtension: "Ya hay una tarea de instalación en curso, espere a que termine" + +# alert mail template +PanelAlertTitle: "Notificación de alerta del panel" +TestAlertTitle: "Correo de prueba - Verificar conectividad de correo" +TestAlert: "Este es un correo de prueba para verificar que la configuración de envío de correos es correcta." +LicenseExpirationAlert: "Su licencia de 1Panel expirará en {{ .day }} días. Inicie sesión para más detalles." +CronJobFailedAlert: "Su tarea programada '{{ .name }}' ha fallado. Inicie sesión en el panel para más detalles." +ClamAlert: "La tarea de escaneo de virus detectó {{ .num }} archivos infectados. Inicie sesión para detalles." +WebSiteAlert: "Hay {{ .num }} sitios web en su 1Panel que expirarán en {{ .day }} días. Inicie sesión para más detalles." +SSLAlert: "Hay {{ .num }} certificados SSL en su 1Panel que expirarán en {{ .day }} días. Inicie sesión para detalles." +DiskUsedAlert: "El disco '{{ .name }}' de su 1Panel ha utilizado {{ .used }}. Inicie sesión para más detalles." +ResourceAlert: "El uso promedio de {{ .name }} en {{ .time }} minutos es de {{ .used }}. Inicie sesión para más detalles." +PanelVersionAlert: "Hay una nueva versión de 1Panel disponible. Inicie sesión para actualizar." +PanelPwdExpirationAlert: "Su contraseña de 1Panel expirará en {{ .day }} días. Inicie sesión para más detalles." + +#disk +DeviceNotFound: "Dispositivo {{ .name }} no encontrado" +DeviceIsMounted: "El dispositivo {{ .name }} está montado, desmóntelo primero" +PartitionDiskErr: "Error al particionar, {{ .err }}" +FormatDiskErr: "Error al formatear disco, {{ .err }}" +MountDiskErr: "Error al montar disco, {{ .err }}" +UnMountDiskErr: "Error al desmontar disco, {{ .err }}" +XfsNotFound: "No se detectó el sistema de archivos xfs, por favor instale xfsprogs primero" diff --git a/core/app/dto/auth.go b/core/app/dto/auth.go index 7096dbbce..79ae08561 100644 --- a/core/app/dto/auth.go +++ b/core/app/dto/auth.go @@ -28,7 +28,7 @@ type Login struct { IgnoreCaptcha bool `json:"ignoreCaptcha"` Captcha string `json:"captcha"` CaptchaID string `json:"captchaID"` - Language string `json:"language" validate:"required,oneof=zh en 'zh-Hant' ko ja ru ms 'pt-BR' tr"` + Language string `json:"language" validate:"required,oneof=zh en 'zh-Hant' ko ja ru ms 'pt-BR' tr 'es-ES'"` } type MFALogin struct { diff --git a/core/i18n/i18n.go b/core/i18n/i18n.go index a85cfdd8c..802a60850 100644 --- a/core/i18n/i18n.go +++ b/core/i18n/i18n.go @@ -134,6 +134,7 @@ func Init() { _, _ = bundle.LoadMessageFileFS(fs, "lang/ms.yaml") _, _ = bundle.LoadMessageFileFS(fs, "lang/ko.yaml") _, _ = bundle.LoadMessageFileFS(fs, "lang/tr.yaml") + _, _ = bundle.LoadMessageFileFS(fs, "lang/es-ES.yaml") lang := GetLanguageFromDB() global.I18n = i18n.NewLocalizer(bundle, lang) } diff --git a/core/i18n/lang/es-ES.yaml b/core/i18n/lang/es-ES.yaml new file mode 100644 index 000000000..d491153eb --- /dev/null +++ b/core/i18n/lang/es-ES.yaml @@ -0,0 +1,233 @@ +ErrInvalidParams: "Parámetros de solicitud no son válidos: {{ .detail }}" +ErrTokenParse: "Error al generar el token: {{ .detail }}" +ErrInitialPassword: "Contraseña inicial incorrecta" +ErrInternalServer: "Error interno del servidor: {{ .detail }}" +ErrRecordExist: "El registro ya existe" +ErrRecordNotFound: "Registro no encontrado" +ErrStructTransform: "Error en la conversión de tipo: {{ .detail }}" +ErrNotLogin: "Usuario no ha iniciado sesión: {{ .detail }}" +ErrPasswordExpired: "La contraseña actual ha expirado: {{ .detail }}" +ErrNotSupportType: "El tipo actual no es compatible: {{ .detail }}" +ErrProxy: "Error en la solicitud, por favor revise el estado de este nodo: {{ .detail }}" +ErrApiConfigStatusInvalid: "Acceso a la API prohibido: {{ .detail }}" +ErrApiConfigKeyInvalid: "Error de clave API: {{ .detail }}" +ErrApiConfigIPInvalid: "La IP de la solicitud API no está en la lista blanca: {{ .detail }}" +ErrApiConfigDisable: "Esta interfaz prohíbe llamadas a la API: {{ .detail }}" +ErrApiConfigKeyTimeInvalid: "Error de marca de tiempo de API: {{ .detail }}" + +# request +ErrNoSuchHost: "No se pudo encontrar el servidor solicitado {{ .err }}" +ErrHttpReqNotFound: "No se pudo encontrar el recurso solicitado {{ .err }}" +ErrHttpReqFailed: "Solicitud fallida {{ .err }}" +ErrHttpReqTimeOut: "La solicitud ha expirado {{ .err }}" +ErrCreateHttpClient: "Error al crear la solicitud {{ .err }}" + +# common +ErrDemoEnvironment: "Servidor de demostración, ¡esta operación está prohibida!" +ErrCmdTimeout: "¡Tiempo de espera al ejecutar el comando!" +ErrEntrance: "Error en la información de entrada de seguridad, ¡por favor revise e intente de nuevo!" +ErrGroupIsDefault: "Grupo predeterminado, no se puede eliminar" +ErrGroupIsInUse: "El grupo está en uso y no se puede eliminar." +ErrLocalDelete: "¡No se puede eliminar el nodo local!" +ErrPortInUsed: "¡El puerto {{ .name }} ya está en uso!" +ErrInternalServerKey: "Error interno del servidor:" + +# app +CustomAppStoreFileValid: "El paquete de la tienda de aplicaciones debe tener formato .tar.gz" +ErrFileNotFound: "El archivo {{ .name }} no existe" + +# backup +ErrBackupInUsed: "Esta cuenta de respaldo se utiliza en tareas programadas y no se puede eliminar" +ErrBackupCheck: "Fallo en la prueba de conexión de la cuenta de respaldo {{ .err }}" +ErrBackupLocal: "¡La cuenta de respaldo del servidor local no admite esta operación!" +ErrBackupPublic: "Se detectó que esta cuenta de respaldo no es pública, ¡verifique e intente de nuevo!" +ErrOSSConn: "No se pudo obtener la última versión, por favor revise la conectividad de red externa del servidor." + +#license +LicenseCheck: 'Comprobar si la licencia está disponible' +ErrLicenseInUsed: 'La licencia ya está vinculada. ¡Verifique e intente de nuevo!' +ErrLicenseExpired: 'La licencia ha expirado. ¡Verifique e intente de nuevo!' +ErrLicense: "Error en el formato de la licencia, ¡verifique y reintente!" +ErrLicenseCheck: "Validación de licencia fallida, ¡verifique y reintente!" +ErrXpackVersion: "Validación de licencia fallida, esta licencia está limitada por versión, no se puede importar, ¡verifique y reintente!" +ErrLicenseSave: "Error al guardar la información de la licencia, error {{ .err }}, ¡reintente!" +ErrLicenseSync: "Sincronización de licencia fallida, ¡no se detectó información de licencia en la base de datos!" +ErrLicenseExist: "Este registro de licencia ya existe. Puede ir directamente a la página de licencia para la vinculación del nodo." +ErrXpackNotFound: "Esta sección es para la edición profesional, importe la licencia en Panel > Ajustes > Licencia" +ErrXpackExceptional: "Esta sección es para la edición profesional, sincronice el estado de la licencia en Panel > Ajustes > Licencia" +ErrXpackOutOfDate: "La licencia actual ha expirado, importe nuevamente la licencia en Panel > Ajustes > Licencia" +ErrXpackLost: "La licencia ha alcanzado el número máximo de reintentos, vaya a [Ajustes del Panel] [Licencia] y haga clic en el botón de sincronización manualmente para asegurar el funcionamiento correcto de las funciones profesionales" +ErrDeviceLost: "Faltan archivos necesarios para la verificación de licencia, ¡verifique e intente de nuevo!" +ErrDeviceErr: "El entorno actual no coincide con el entorno de importación de la licencia. ¡Edite la licencia e impórtela de nuevo!" +ErrXpackTimeout: "Tiempo de espera de la solicitud, puede que la conexión de red sea inestable, ¡intente más tarde!" +ErrUnbindMaster: "Se detectaron nodos en la gestión de nodos, no se puede desvincular la licencia actual, elimine los nodos primero e intente de nuevo!" +ErrFreeNodeLimit: "Se alcanzó el límite de nodos en la versión comunitaria, ¡vaya a www.lxware.cn/1panel para comprar y reintentar!" +ErrNodeBound: "Esta licencia está vinculada a otro nodo, ¡verifique e intente de nuevo!" +ErrNodeBoundDelete: "Esta licencia está vinculada y no admite operaciones de eliminación. ¡Verifique e intente de nuevo!" +ErrNodeBoundLimit: "El nodo gratuito actual ha alcanzado su límite, ¡verifique e intente de nuevo!" +ErrLicenseFree: "Los nodos gratuitos solo pueden usarse si la licencia está correctamente vinculada a un nodo. ¡Verifique e intente de nuevo!" +ErrLicenseUnbind: "Se detectaron nodos de la Edición Comunitaria para esta licencia. ¡Desvincule en [Panel > Ajustes > Licencia] y vuelva a intentarlo!" +ErrNoSuchNode: "Información del nodo no encontrada, ¡verifique e intente de nuevo!" +ErrNodeUnbind: "Este nodo no está dentro del rango de vinculación de la licencia, ¡verifique e intente de nuevo!" +ErrNodeBind: "Este nodo ya está vinculado a una licencia, ¡verifique e intente de nuevo!" +ErrNodeLocalRollback: "El nodo principal no admite la reversión directa. ¡Ejecute manualmente el comando '1pctl restore' para revertir!" +InvalidRequestBodyType: "Formato del cuerpo de la solicitud no válido, por favor revisa y asegúrate de que el contenido cumpla con el formato requerido antes de reintentar." +InvalidLicenseCodeType: "Formato de código de licencia no válido, por favor revisa e inténtalo de nuevo." +LicenseNotFoundType: "Licencia no encontrada, no existe ningún registro coincidente en el sistema para la licencia proporcionada. Por favor revisa e inténtalo de nuevo." +LicenseRevokedType: "La licencia solicitada ha sido revocada y ya no se puede utilizar. Por favor revisa e inténtalo de nuevo." +LicenseExpiredType: "La licencia ha expirado. Renuévala o vuelve a importarla en Configuración del Panel - Sección de Licencia antes de reintentar." +LicenseProductMismatchType: "La licencia no corresponde con el producto o servicio solicitado." +InvalidAssigneeType: "Información de usuario o dispositivo de destino no válida para la asignación de licencia. Por favor revisa e inténtalo de nuevo." +LicenseUsageNotFoundType: "No se encontraron registros de uso. Esta licencia no ha sido activada o utilizada aún. Por favor revisa e inténtalo de nuevo." +LicenseUsageLimitExceededType: "Esta licencia ya está vinculada a otro nodo. Por favor revisa e inténtalo de nuevo." + +# alert +ErrAlertSync: "Error al sincronizar la información de alertas, ¡verifique e intente de nuevo!" + +# task +TaskStart: "Tarea {{ .name }} iniciada [INICIO]" +TaskEnd: "Tarea {{ .name }} finalizada [COMPLETADA]" +TaskFailed: "Tarea {{ .name }} fallida" +TaskTimeout: "{{ .name }} ha expirado" +TaskSuccess: "Tarea {{ .name }} terminada con éxito" +TaskRetry: "Iniciando reintento {{ .name }}" +SubTaskSuccess: "{{ .name }} completada correctamente" +SubTaskFailed: "{{ .name }} falló: {{ .err }}" +TaskInstall: "Instalar" +TaskUpgrade: "Actualizar" +TaskSync: 'Sincronizar' +TaskBackup: "Respaldar" +SuccessStatus: "{{ .name }} correcta" +FailedStatus: "{{ .name }} fallida {{ .err }}" +Start: "Iniciar" +SubTask: "Subtarea" +Skip: "Omitir errores y continuar..." + +#script +ScriptLibrary: "Biblioteca de scripts" +ScriptSyncSkip: "¡La biblioteca de scripts ya está en la última versión!" +DownloadData: "Descargando archivo de datos de la biblioteca de scripts data.yaml" +DownloadPackage: "Descargando paquete de la biblioteca de scripts" +AnalyticCompletion: "Análisis completado, sincronizando con la base de datos..." + +Node: "Nodo" +SyncNode: "Sincronizar datos del nodo" +LocalName: "El nombre 'local' solo se utiliza para la identificación local del sistema" +SyncPackageData: "Sincronizar datos del paquete [{{ .detail }}]" +SyncPackageEncrypt: "Encriptación del paquete de datos" +SyncRequest: "Solicitar API de sincronización de nodos" +SyncFailedRetry: "Tiempo de espera en la sincronización de datos del nodo (intento {{ .index }}), reintentando..." +SyncFailed: "¡La sincronización falló, sincronice manualmente en la lista de nodos!" +SyncSystemProxy: "Configuración del proxy del sistema" +SyncScripts: "Biblioteca de scripts" +SyncBackupAccounts: "Cuentas de copia de seguridad" +SyncAlertSetting: "Configuración de alertas" +SyncCustomApp: "Aplicación personalizada" +SyncLanguage: "Idioma del sistema" + +#upgrade node +NodeUpgrade: "Actualizar nodo {{ .name }}" +UpgradeCheck: "Comprobar actualizaciones de nodos" +UpgradeCheckLocal: "Los nodos locales no admiten actualizaciones en lote, omitiendo..." +UpgradeCheckLatest: "El nodo ya está en la última versión, omitiendo..." +NewSSHClient: "Inicializando conexión SSH" +BackupBeforeUpgrade: "Respaldar datos antes de actualizar" +UploadUpgradeFile: "Distribuir archivos de actualización" +RestartAfterUpgrade: "Iniciar servicio después de actualizar" + +#add node +MasterData: "Datos del nodo principal" +LoadSftpClient: "Cargar cliente SFTP" +PackageMasterData: "Generar paquete de respaldo del nodo principal" +UploadBackup: "Subir datos de respaldo" +MvBackup: "Mover datos al directorio de respaldos" +TaskAddNode: "Agregar nodo" +LoadNodeArch: "Obtener información de arquitectura del nodo" +LoadNodeArchDetail: "Arquitectura detectada - principal: {{ .local }}, nodo secundario: {{ .node }}" +LoadNodeUpgradeDetail: "Usando el directorio de instalación histórico versión v1: {{ .baseDir }}, puerto de escucha del servicio: {{ .port }}" +SyncAgentBaseInfo: "Sincronizar información básica del nodo" +GenerateSSLInfo: "Generar información SSL del nodo" +ConnInfoNotMatch: "La información de conexión no coincide" +MakeAgentPackage: "Generar paquete de instalación del nodo" +SendAgent: "Distribuir paquete de instalación del nodo" +StartService: "Iniciar servicio" +NoBackupNode: "Actualmente no hay nodo de respaldo. Seleccione uno para guardar e intente de nuevo." + +#cmd +AppVersion: "Versión de la aplicación" +AppCommands: "Comandos relacionados con la app" +AppInit: "Inicializar aplicación" +AppKeyVal: "Clave de la app (solo admite inglés)" +AppCreateFileErr: "Error al crear el archivo {{ .name }} {{ .err }}" +AppCreateDirErr: "Error al crear la carpeta {{ .name }} {{ .err }}" +AppMissKey: "Falta la clave de la app, use -k para especificar" +AppMissVersion: "Falta la versión de la app, use -v para especificar" +AppVersionExist: "¡La versión ya existe!" +AppCreateSuccessful: "¡Creación finalizada con éxito!" +AppWriteErr: "Error al escribir el archivo {{ .name }} {{ .err }}" +SudoHelper: "Por favor use {{ .cmd }} o cambie al usuario root" +ListenIPCommands: "Cambiar ip de escucha" +ListenIPv4: "Escuchar en IPv4" +ListenIPv6: "Escuchar en IPv6" +ListenChangeSuccessful: "¡Cambio exitoso! Ahora escuchando en {{ .value }}" +ResetCommands: "Restablecer información del sistema" +ResetMFA: "Cancelar autenticación de dos factores de 1Panel" +ResetHttps: "Cancelar inicio de sesión https de 1Panel" +ResetEntrance: "Cancelar entrada segura de 1Panel" +ResetIPs: "Cancelar restricciones de IP autorizadas de 1Panel" +ResetDomain: "Cancelar vinculación de dominio de 1Panel" +RestoreCommands: "Revertir servicio y datos de 1Panel" +RestoreNoSuchFile: "No hay archivos disponibles para revertir" +RestoreStep1: "(1/5) Iniciando reversión del servicio y datos de 1Panel desde el directorio {{ .name }}..." +RestoreStep2: "(2/5) Reversión de binarios de 1Panel finalizada con éxito" +RestoreStep3: "(3/5) Reversión de scripts de 1Panel finalizada con éxito" +RestoreStep4: "(4/5) Reversión de servicio de 1Panel finalizada con éxito" +RestoreStep5: "(5/5) Reversión de datos de 1Panel finalizada con éxito" +RestoreSuccessful: "¡Reversión finalizada con éxito! Reiniciando el servicio, espere..." +UpdateCommands: "Actualizar información del panel" +UpdateUser: "Actualizar usuario del panel" +UpdatePassword: "Actualizar contraseña del panel" +UpdatePort: "Actualizar puerto del panel" +UpdateUserNull: "Error: ¡el usuario del panel está vacío!" +UpdateUserBlank: "Error: ¡el usuario del panel contiene espacios!" +UpdateUserFormat: "Error: ¡formato de usuario del panel inválido! Solo admite inglés, chino, números y _, longitud 3-30" +UpdateUserErr: "Error: Fallo al actualizar usuario del panel, {{ .err }}" +UpdateSuccessful: "¡Actualización finalizada con éxito!" +UpdateUserResult: "Usuario del panel: {{ .name }}" +UpdatePasswordRead: "Error: Fallo al leer información de la contraseña del panel, {{ .err }}" +UpdatePasswordNull: "Error: ¡la contraseña del panel está vacía!" +UpdateUPasswordBlank: "Error: ¡la contraseña del panel contiene espacios!" +UpdatePasswordFormat: "Error: ¡La contraseña solo admite letras, números y los caracteres especiales !@#$%*_,.?, longitud 8-30!" +UpdatePasswordLen: "Error: ¡Ingrese una contraseña mayor a 6 caracteres!" +UpdatePasswordRe: "Confirmar contraseña:" +UpdatePasswordErr: "Error: Fallo al actualizar la contraseña del panel, {{ .err }}" +UpdatePasswordSame: "Error: Las dos contraseñas no coinciden, ¡verifique e intente de nuevo!" +UpdatePasswordResult: "Contraseña del panel: {{ .name }}" +UpdatePortFormat: "Error: ¡El puerto debe estar entre 1 y 65535!" +UpdatePortUsed: "Error: ¡El puerto ya está en uso, verifique e intente de nuevo!" +UpdatePortErr: "Error: Fallo al actualizar el puerto del panel, {{ .err }}" +UpdatePortResult: "Puerto del panel: {{ .name }}" +UpdatePortFirewallAdd: "Fallo al agregar la regla de puerto al firewall, {{ .err }}, agregue manualmente el puerto {{ .name }} al firewall." +UpdatePortFirewallDel: "Error: Fallo al eliminar el puerto del firewall, {{ .err }}" +UpdatePortFirewallReload: "Fallo al recargar el firewall, {{ .err }}, recargue el firewall manualmente." +UserInfo: "Obtener información del panel" +UserInfoAddr: "Dirección del panel: " +UserInfoPassHelp: "Consejo: para cambiar la contraseña, ejecute el comando: " +DBConnErr: "Error: Fallo al inicializar la conexión a la base de datos, {{ .err }}" +SystemVersion: "versión: " +SystemMode: "modo: " + +#mobile app +ErrVerifyToken: 'Error al verificar el token, por favor restablezca y escanee de nuevo.' +ErrInvalidToken: 'Token inválido, por favor restablezca y escanee de nuevo.' +ErrExpiredToken: 'El token ha expirado, por favor restablezca y escanee de nuevo.' + +#cluster +ErrMasterDelete: "No se puede eliminar el nodo principal, elimine primero los nodos secundarios." +ClusterNameIsExist: "El nombre del clúster ya existe." +AppStatusUnHealthy: "Adquisición anormal del estado de la aplicación, revise el estado del nodo en la lista de nodos." +MasterNodePortNotAvailable: "Verificación de conectividad del puerto {{ .port }} del nodo {{ .name }} fallida, verifique la configuración del firewall/grupo de seguridad y el estado del nodo principal." +ClusterMasterNotExist: "El nodo principal del clúster está desconectado, elimine los nodos secundarios." + +#ssl +ErrReqFailed: "{{.name}} petición fallida: {{ .err }}" diff --git a/docs/README.es.md b/docs/README.es-es.md similarity index 92% rename from docs/README.es.md rename to docs/README.es-es.md index 9f4366309..d365ebf88 100644 --- a/docs/README.es.md +++ b/docs/README.es-es.md @@ -1,5 +1,5 @@

1Panel

-

Herramienta de gestión de servidores Linux basada en la web mejor valorada

+

La herramienta de gestión más valorada para administrar servidores Linux.

1Panel-dev%2F1Panel | Trendshift 1Panel - Top-Rated web-based Linux server management tool | Product Hunt @@ -32,9 +32,9 @@ ------------------------------ -1Panel es un panel de control moderno y de código abierto basado en la web para la gestión de servidores Linux. +1Panel es un panel de control moderno y de código abierto basado en web para la gestión de servidores Linux. -- **Gestión eficiente**: los usuarios pueden gestionar fácilmente servidores Linux a través de una interfaz web, como monitoreo de hosts, gestión de archivos, gestión de bases de datos, gestión de contenedores, entre otros; +- **Gestión eficiente**: los usuarios pueden gestionar fácilmente servidores Linux a través de una interfaz web, como monitorización de hosts, gestión de archivos, gestión de bases de datos, gestión de contenedores, entre otros; - **Creación rápida de sitios web**: integración profunda con el software de creación de sitios web de código abierto WordPress y Halo, operaciones como vinculación de dominios y configuración de certificados SSL se realizan con un solo clic; - **Tienda de aplicaciones**: selección de diversas herramientas y software de código abierto de alta calidad, ayudando a los usuarios a instalar y actualizar fácilmente; - **Seguro y confiable**: basado en la gestión de contenedores y el despliegue de aplicaciones, se logra la mínima exposición a vulnerabilidades, al tiempo que se ofrecen funciones como protección contra virus, cortafuegos y auditoría de registros; @@ -42,13 +42,13 @@ ## Inicio Rápido -Ejecute el script a continuación y siga las indicaciones para instalar 1Panel: +Ejecute el siguiente script y siga las indicaciones para instalar 1Panel: ```bash curl -sSL https://resource.1panel.pro/quick_start.sh -o quick_start.sh && bash quick_start.sh ``` -Por favor, consulte nuestra [dokumentasi](https://docs.1panel.pro/quick_start/) para más detalles. +Por favor, consulte nuestra [documentación](https://docs.1panel.pro/quick_start/) para más detalles. ## Captura de Pantalla diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 44fc7e5cb..dd7091460 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -16,6 +16,7 @@ import ptBR from 'element-plus/es/locale/lang/pt-br'; import ru from 'element-plus/es/locale/lang/ru'; import ko from 'element-plus/es/locale/lang/ko'; import tr from 'element-plus/es/locale/lang/tr'; +import esES from 'element-plus/es/locale/lang/es-es'; import { useTheme } from '@/global/use-theme'; useTheme(); @@ -34,6 +35,7 @@ const i18nLocale = computed(() => { if (globalStore.language === 'pt-br') return ptBR; if (globalStore.language === 'ko') return ko; if (globalStore.language === 'tr') return tr; + if (globalStore.language === 'es-es') return esES; return zhCn; }); diff --git a/frontend/src/api/interface/app.ts b/frontend/src/api/interface/app.ts index c7e8eff7d..0e3731d0a 100644 --- a/frontend/src/api/interface/app.ts +++ b/frontend/src/api/interface/app.ts @@ -29,6 +29,7 @@ export namespace App { ru: string; ko: string; tr: string; + 'es-es': string; } export interface AppDTO extends App { diff --git a/frontend/src/lang/index.ts b/frontend/src/lang/index.ts index 4a898e358..786045021 100644 --- a/frontend/src/lang/index.ts +++ b/frontend/src/lang/index.ts @@ -8,6 +8,7 @@ import ru from './modules/ru'; import ms from './modules/ms'; import ko from './modules/ko'; import tr from './modules/tr'; +import esES from './modules/es-es'; const i18n = createI18n({ legacy: false, @@ -25,6 +26,7 @@ const i18n = createI18n({ ms, ko, tr, + 'es-ES': esES, }, warnHtmlMessage: false, }); diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts new file mode 100644 index 000000000..4c67a309c --- /dev/null +++ b/frontend/src/lang/modules/es-es.ts @@ -0,0 +1,3792 @@ +import fit2cloudEsEsLocale from 'fit2cloud-ui-plus/src/locale/lang/es-es'; + +const message = { + commons: { + true: 'verdadero', + false: 'falso', + colon: ': ', + example: 'Por ejemplo, ', + fit2cloud: 'FIT2CLOUD', + lingxia: 'Lingxia', + button: { + run: 'Ejecutar', + prev: 'Anterior', + next: 'Siguiente', + create: 'Crear ', + add: 'Agregar ', + save: 'Guardar ', + set: 'Establecer', + sync: 'Sincronizar ', + delete: 'Eliminar', + edit: 'Editar ', + enable: 'Habilitar', + disable: 'Deshabilitar', + confirm: 'Confirmar', + cancel: 'Cancelar', + reset: 'Restablecer', + setDefault: 'Restaurar valores predeterminados', + restart: 'Reiniciar', + conn: 'Conectar', + disconn: 'Desconectar', + clean: 'Limpiar', + login: 'Iniciar sesión', + close: 'Cerrar', + stop: 'Detener', + start: 'Iniciar', + view: 'Ver', + watch: 'Observar', + handle: 'Disparar', + clone: 'Clonar', + expand: 'Expandir', + collapse: 'Colapsar', + log: 'Ver registros', + back: 'Atrás', + backup: 'Respaldar', + recover: 'Recuperar', + retry: 'Reintentar', + upload: 'Subir', + download: 'Descargar', + init: 'Inicializar', + verify: 'Verificar', + saveAndEnable: 'Guardar y habilitar', + import: 'Importar', + export: 'Exportar', + power: 'Autorización', + search: 'Buscar', + refresh: 'Actualizar', + get: 'Obtener', + upgrade: 'Actualizar', + update: 'Actualizar', + ignore: 'Ignorar actualización', + copy: 'Copiar', + random: 'Aleatorio', + 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: 'Documento de ayuda', + bind: 'Vincular', + unbind: 'Desvincular', + cover: 'cubrir', + skip: 'omitir', + fix: 'Arreglar', + down: 'Detener', + up: 'Iniciar', + sure: 'Confirmar', + show: 'Mostrar', + hide: 'Ocultar', + }, + 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', + }, + table: { + all: 'Todo', + total: 'Total {0}', + name: 'Nombre', + type: 'Tipo', + 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', + }, + 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', + copySuccess: 'Copiado completado correctamente', + notSupportOperation: 'Esta operación no es compatible', + requestTimeout: 'La solicitud excedió el tiempo de espera, por favor intente de nuevo más tarde', + infoTitle: 'Aviso', + notRecords: 'No se ha generado ningún registro de ejecución para la tarea actual', + sureLogOut: '¿Está seguro de que desea cerrar sesión?', + createSuccess: 'Creación completada correctamente', + updateSuccess: 'Actualización completada correctamente', + uploadSuccess: 'Carga completada correctamente', + operateConfirm: 'Si está seguro de la operación, por favor ingréselo manualmente: ', + inputOrSelect: 'Por favor seleccione o ingrese', + copyFailed: 'Error al copiar', + operatorHelper: 'Se realizará la operación "{1}" en "{0}" y no se puede deshacer. ¿Desea 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 realizará una copia de seguridad de {0}. ¿Desea continuar?', + recoverHelper: 'Restaurando desde el archivo {0}. Esta operación es irreversible. ¿Desea continuar?', + refreshSuccess: 'Actualización completada con éxito', + rootInfoErr: 'Ya se encuentra en el directorio raíz', + resetSuccess: 'Restablecimiento completado correctamente', + creatingInfo: 'Creando, no es necesario realizar esta operación', + installSuccess: 'Instalación completada correctamente', + uninstallSuccess: 'Desinstalación completada correctamente', + }, + login: { + username: 'Usuario', + password: 'Contraseña', + welcome: '¡Bienvenido de nuevo! Por favor, ingrese su nombre de usuario y contraseña para iniciar sesión.', + errorAuthInfo: 'El nombre de usuario o la contraseña que ingresó son incorrectos, ¡inténtelo de nuevo!', + errorMfaInfo: 'Información de autenticación incorrecta, ¡por favor intente nuevamente!', + captchaHelper: 'Captcha', + errorCaptcha: '¡Código captcha incorrecto!', + notSafe: 'Acceso denegado', + safeEntrance1: 'El inicio de sesión seguro está habilitado en el entorno actual', + safeEntrance2: 'Ingrese el siguiente comando en la terminal SSH para ver la entrada al panel: 1pctl user-info', + errIP1: 'El acceso mediante dirección IP autorizada está habilitado en el entorno actual', + errDomain1: 'La vinculación del nombre de dominio de acceso está habilitada en el entorno actual', + errHelper: 'Para restablecer la información de vinculación, ejecute el siguiente comando en la terminal SSH: ', + 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: '', + 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 « Acuerdo de Licencia Comunitaria »', + 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.', + 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.', + '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: + 'Este campo debe estar compuesto por letras, números, con una longitud de 8 a 30 y contener al menos dos 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', + alias: 'Soporta A->Z, números, - and _, largo 1-30 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', + failed: 'Fallido', + stopped: 'Detenido', + error: 'Error', + created: 'Creado', + restarting: 'Reiniciando', + uploading: 'Cargando', + unhealthy: 'No saludable', + removing: 'Eliminando', + paused: 'Pausado', + exited: 'Finalizado', + 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', + 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', + }, + 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', + }, + log: { + noLog: 'No logs available', + }, + }, + menu: { + home: 'Resumen', + apps: 'Tienda de aplicaciones', + website: 'Sitio web | Sitios web', + 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 | Configuraciones', + 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: 'Centro de tareas', + }, + home: { + recommend: 'recomendar', + dir: 'directorio', + quickDir: 'Directorio rápido', + database: 'Database - All', + restart_1panel: 'Reiniciar panel', + restart_system: 'Reiniciar servidor', + operationSuccess: 'Operación completada con éxito, reiniciando, ¡por favor actualice el navegador manualmente más tarde!', + entranceHelper: 'La entrada de seguridad no está habilitada. Puede habilitarla en "Configuraciones -> Seguridad" para mejorar la seguridad del sistema.', + 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: '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', + loadAverage: 'Promedio de carga en el último minuto | Promedio de carga en los últimos {n} 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', + }, + 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', + create: 'Crear base 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', + 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: 'Ver información de 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.', + 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', + 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á la información de la base de datos del servidor a 1Panel. ¿Desea continuar?', + passwordHelper: 'No se puede recuperar, por favor modifique', + remote: 'Remoto', + remoteDB: 'Servidor remoto | Servidores remotos', + manageRemoteDB: 'Administrar 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.', + 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', + formatHelper: + 'El conjunto de caracteres actual de la base de datos es {0}, la inconsistencia de conjuntos puede causar errores al recuperar', + selectFile: 'Seleccionar archivo', + 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?', + 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', + 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: { + model: { + model: 'Modelo', + create: 'Agregar modelo', + 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.', + }, + proxy: { + proxy: 'Mejoras de proxy 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', + }, + gpu: { + gpu: 'Monitor de GPU', + base: 'Información básica', + gpuHelper: 'No se detectó el comando NVIDIA-SMI o XPU-SMI en el sistema actual. ¡Por favor verifique e intente nuevamente!', + driverVersion: 'Versión del controlador', + cudaVersion: 'Versión de CUDA', + process: 'Información del proceso', + type: 'Tipo', + typeG: 'Gráficos', + typeC: 'Cómputo', + typeCG: 'Cómputo + Gráficos', + processName: 'Nombre del proceso', + processMemoryUsage: 'Uso de memoria', + temperatureHelper: 'Una temperatura alta de la GPU puede causar reducción de frecuencia', + performanceStateHelper: 'Desde P0 (máximo rendimiento) hasta P12 (mínimo rendimiento)', + busID: 'ID del bus', + persistenceMode: 'Modo de persistencia', + enabled: 'Habilitado', + disabled: 'Deshabilitado', + persistenceModeHelper: + 'El modo de persistencia permite respuestas más rápidas, pero incrementa el consumo en reposo.', + displayActive: 'Tarjeta gráfica inicializada', + displayActiveT: 'Sí', + displayActiveF: 'No', + ecc: 'Tecnología de corrección y verificación de errores', + computeMode: 'Modo de cómputo', + default: 'Predeterminado', + exclusiveProcess: 'Proceso exclusivo', + exclusiveThread: 'Hilo exclusivo', + prohibited: 'Prohibido', + defaultHelper: 'Predeterminado: Los procesos pueden ejecutarse simultáneamente', + exclusiveProcessHelper: + 'Proceso exclusivo: Solo un contexto CUDA puede usar la GPU, pero puede ser compartido por varios hilos', + exclusiveThreadHelper: 'Hilo exclusivo: Solo un hilo en un contexto CUDA puede usar la GPU', + prohibitedHelper: 'Prohibido: No se permite la ejecución simultánea de procesos', + migModeHelper: 'Se utiliza para crear instancias MIG y aislar físicamente la GPU a nivel de usuario.', + migModeNA: 'No compatible', + }, + mcp: { + server: 'Servidor MCP', + create: 'Agregar servidor MCP', + edit: 'Editar 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', + }, + }, + container: { + create: 'Crear', + createByCommand: 'Crear por comando', + 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?', + edit: 'Editar contenedor', + 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?', + 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.', + lastDay: 'Último día', + last4Hour: 'Últimas 4 horas', + lastHour: 'Última hora', + last10Min: 'Últimos 10 minutos', + cleanLog: 'Limpiar logs', + downLogHelper1: 'Esto descargará todos los logs del contenedor {0}. ¿Desea continuar?', + downLogHelper2: 'Esto descargará los últimos {0} 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', + 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', + 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', + 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!', + editComposeHelper: + 'Nota: Las variables de entorno configuradas se guardarán en el archivo 1panel.env por defecto.\nSi desea usar estos parámetros en el contenedor, también debe agregar manualmente una referencia a env_file en el archivo compose.', + 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', + 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.', + 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', + modeRW: 'RW', + modeR: 'R', + 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', + imagePush: 'Subir', + imagePushHelper: + 'Detected that this image has multiple tags. Please confirm that the image name used for pushing is: {0}', + imageDelete: 'Eliminar imagen', + imageTagDeleteHelper: 'Eliminar otras etiquetas asociadas con este ID de imagen', + repoName: 'Repositorio de contenedores', + imageName: 'Nombre de la imagen', + pull: 'Descargar', + path: 'Ruta', + importImage: 'Importar', + build: 'Construir', + imageBuild: 'Construir', + pathSelect: 'Ruta', + label: 'Etiqueta', + imageTag: 'Etiqueta de imagen', + 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?', + createNetwork: 'Crear', + networkName: 'Nombre', + driver: 'Driver', + option: 'Opción', + attachable: 'Adjuntable', + 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', + createVolume: 'Crear', + repo: 'Repositorio de contenedores | Repositorios de contenedores', + createRepo: 'Agregar', + 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', + fromChangeHelper: 'Cambiar la fuente limpiará el contenido actualmente editado. ¿Desea continuar?', + composePathHelper: 'Ruta de guardado del archivo de configuración: {0}', + 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.', + createCompose: 'Crear', + composeDirectory: 'Directorio de compose', + template: 'Plantilla', + composeTemplate: 'Plantilla de compose | Plantillas de compose', + createComposeTemplate: 'Crear', + 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', + 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?', + setting: 'Configuración | Configuraciones', + goSetting: 'Ir a editar', + 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: '', + 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?', + }, + cronjob: { + create: 'Crear tarea programada', + edit: 'Editar tarea programada', + errImport: 'Excepción en el contenido del archivo:', + errImportFormat: 'Los datos o el formato de la tarea programada son anormales. ¡Por favor verifique e inténtelo de nuevo!', + 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', + log: 'Registros de respaldo', + logHelper: 'Registro del sistema de copias de seguridad', + ogHelper1: '1. Registro del sistema de 1Panel', + 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', + 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: + 'Custom execution cycles only support the [minute hour day month week] format, e.g., 0 0 * * *. For details, please refer to the official documentation.', + 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: 'Las reglas de exclusión se aplicarán a todas las operaciones de compresión de este respaldo.', + default_download_path: 'Enlace de descarga predeterminado', + saveLocal: 'Retener respaldos locales (igual al número de copias en la nube)', + url: 'Dirección URL', + 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: 'Respaldar todas las imágenes de aplicaciones', + 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.', + requestExpirationTime: 'Tiempo de expiración de solicitud de subida (Horas)', + unitHours: 'Unidad: Horas', + alertTitle: 'Tarea programada - {0} 「{1}」 Alerta de fallo', + library: { + script: 'Script', + isInteractive: 'Interactivo', + interactive: 'Script interactivo', + interactiveHelper: 'Requiere introducir datos durante la ejecución y no puede ser usada en tareas programadas.', + 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?', + }, + }, + monitor: { + globalFilter: 'Filtro global', + enableMonitor: 'Habilitar', + storeDays: 'Días de retención', + defaultNetwork: 'Adaptador de red predeterminado', + defaultNetworkHelper: 'Opción de adaptador de red mostrada en la vista predeterminada de monitorización y resumen', + cleanMonitor: 'Limpiar registros de monitorización', + 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: 'Últimos seis meses', + memory: 'Memoria', + cache: 'Caché', + disk: 'Disco', + network: 'Red', + up: 'Subida', + down: 'Bajada', + interval: 'Intervalo (minutos)', + gpuUtil: 'Uso de GPU', + temperature: 'Temperatura', + performanceState: 'Estado de rendimiento', + powerUsage: 'Consumo de energía', + memoryUsage: 'Uso de memoria', + fanSpeed: 'Velocidad del ventilador', + }, + terminal: { + local: 'Local', + defaultConn: 'Conexión predeterminada', + defaultConnHelper: 'Indica si se conecta al host por defecto después de abrir la terminal', + 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', + 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?', + 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', + cursorBlink: 'Parpadeo del cursor', + cursorStyle: 'Estilo de cursor', + cursorUnderline: 'Subrayado', + cursorBlock: 'Bloque', + cursorBar: 'Barra', + scrollback: 'Scrollback', + scrollSensitivity: 'Sensibilidad de scroll', + 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.', + }, + 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!', + 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 versión profesional soporta el escaneo programado', + 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 versión profesional soporta escaneo programado 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', + deleteLogs: 'Limpiar logs', + resource: 'Recurso', + detail: { + dashboard: 'Resumen general', + ai: 'IA', + groups: 'Grupo', + hosts: 'Host', + apps: 'Aplicación', + websites: 'Sitio 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', + }, + 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 @.lower:file.mode', + 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', + 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', + 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', + 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: 'Incluir subdirectorios', + downloadSuccess: 'Descarga completada correctamente', + theme: 'Tema', + language: 'Idioma', + eol: 'Fin de línea', + copyDir: 'Copiar', + 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}]....', + currentSelect: 'Seleccionado: ', + 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', + 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.', + uploadOverLimit: '¡El número de archivos supera los 1000! Por favor, comprima y cargue', + clashDitNotSupport: '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: 'Asegúrese de tener instalado VS Code y configurado el plugin SSH Remote', + 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', + panelInstallDir: 'El directorio de instalación de 1Panel no puede eliminarse', + wgetTask: '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', + }, + 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', + 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.', + 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 inicio de sesión', + 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', + }, + 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: 'Usa {0} para representar el nombre e IP del nodo actual', + 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ú', + dark: 'Oscuro', + darkGold: 'Dorado oscuro', + light: 'Claro', + auto: 'Seguir sistema', + language: 'Idioma', + 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', + 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 desde la tienda de aplicaciones (solo edición profesional)', + proxyHelper2: 'Actualización del sistema y recuperación de información de actualización (solo edición profesional)', + proxyHelper3: 'Verificación y sincronización de licencias del sistema', + proxyHelper4: 'La red de Docker se accederá a través de un servidor proxy (solo edición profesional)', + proxyHelper5: 'Descarga y sincronización unificada para bibliotecas de scripts del sistema (Profesional)', + proxyHelper6: 'Solicitud de certificado (Profesional)', + 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: 'Documento de API:', + apiInterfaceAlert4: 'Documento 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)', + 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', + 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', + 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', + expiredHelper: 'La contraseña actual ha expirado. Por favor cámbiala de nuevo.', + timeoutHelper: + '[ {0} días ] La contraseña del panel está a punto de expirar. Tras expirar, deberás restablecerla', + complexity: 'Validación de complejidad', + complexityHelper: 'Tras habilitarlo, la regla de validación de contraseña será: 8-30 caracteres, incluyendo letras, números y al menos dos caracteres especiales.', + bindDomain: 'Vincular dominio', + unBindDomain: 'Desvincular dominio', + panelSSL: 'SSL del panel', + panelSSLHelper: + 'Tras la renovación automática del SSL del panel, deberás reiniciar manualmente el servicio 1Panel para que los cambios surtan efecto.', + 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 (2FA)', + 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 tiempo de refresco, vuelve a escanear o añade la clave secreta manualmente.', + 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 acceso al panel mediante protocolo HTTPS puede mejorar la seguridad del acceso.', + 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', + createSnapshot: 'Crear instantánea', + importSnapshot: 'Sincronizar instantánea', + 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})', + 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', + 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: 'Documento 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ú', + 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?', + compressPassword: 'Contraseña de compresión', + backupRecoverMessage: 'Introduce la contraseña de compresión o descompresión (déjalo en blanco para no establecerla)', + }, + license: { + community: 'OSS', + oss: 'Software Open Source', + pro: 'Pro', + trial: 'Prueba', + add: 'Agregar versión Community', + 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', + 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 Pro.', + exceptionalHelper: + 'Verificación de licencia anómala. Sincronícela manualmente para activar funciones Pro. detalle: ', + quickUpdate: 'Actualización rápida', + import: 'Importar', + power: 'Autorizar', + unbindHelper: 'Se eliminarán todos los ajustes Pro tras desvincular. ¿Desea continuar?', + importLicense: 'Importar licencia', + importHelper: 'Haga clic o arrastre el archivo de licencia aquí', + levelUpPro: 'Actualizar a Pro', + licenseSync: 'Sincronizar licencia', + knowMorePro: 'Ver más', + closeAlert: 'Puede cerrar la página en la configuración del panel', + introduce: 'Introducción de funciones', + waf: 'Actualizar a Pro permite interceptación, logs, geobloqueo, reglas, páginas personalizadas, etc.', + tamper: 'Actualizar a Pro 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 Pro permite personalizar logo, mensaje de bienvenida y más.', + monitor: + 'Pro permite ver estado web en tiempo real, tendencias, logs, etc.', + alert: 'Pro permite recibir alertas SMS y ver logs, control total de eventos clave.', + node: 'Pro permite gestionar múltiples servidores Linux con 1Panel.', + fileExchange: 'Pro permite transferir archivos entre varios servidores.', + app: 'Pro permite ver información de servicio, monitoreo, etc. vía app móvil.', + cluster: + 'Actualizar a la Edición Profesional te permite gestionar clústeres maestro-esclavo de MySQL/Postgres/Redis.', + }, + clean: { + scan: 'Iniciar escaneo', + scanHelper: 'Limpie fácilmente archivos basura generados por 1Panel', + clean: 'Limpiar ahora', + reScan: 'Volver a escanear', + cleanHelper: 'Esto eliminará los archivos seleccionados y no se puede deshacer. ¿Desea 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 de instantáneas, actualizaciones, archivos obsoletos, etc.', + panelOriginal: 'Archivos de recuperación de instantáneas', + backup: 'Temporary backup directory', + upgrade: 'Archivos de actualización', + upgradeHelper: '(Mantenga el último respaldo para restaurar el sistema)', + cache: 'Archivos de caché', + cacheHelper: '(Precaución, limpiar requiere reiniciar servicios)', + snapshot: 'Archivos temporales de instantáneas', + rollback: 'Archivos de respaldo antes de recuperación', + 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: 'Archivos de log del sistema', + systemLogHelper: + 'Logs del sistema, construcción de contenedores, pulls, tareas programadas', + dockerLog: 'Logs de operaciones de contenedores', + taskLog: 'Logs de tareas programadas', + shell: 'Tareas programadas de shell', + containerShell: 'Tareas de shell dentro de contenedor', + curl: 'Tareas programadas CURL', + containerTrash: 'Papelera de contenedores', + volumes: 'Volúmenes', + buildCache: 'Caché de build de contenedores', + }, + 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.', + gotoInstalled: 'Ir a 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: 'Edad', + syncAppList: 'Sincronizar', + less1Minute: 'Menos de 1 minuto', + appOfficeWebsite: 'Sitio web', + github: 'Github', + document: 'Documento', + 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: 'Desinstalar', + allReadyInstalled: 'Instaladas', + installHelper: 'Si tiene problemas con el pull de imagen, configure aceleración.', + 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.', + 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', + }, + 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', + create: 'Crear', + 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', + rateHelper: 'Limita el flujo de cada petición (unidad: KB)', + 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', + 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', + deleteConfirmHelper: `Esta acción es irreversible. Escribe "{0}" 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', + accessLog: 'Log de accesos', + 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', + logFolder: 'Logs 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 documentación oficial.", + 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', + 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.", + huaweicloud: 'Huawei Cloud', + createDb: 'Crear base de datos', + enableSSLHelper: 'Si falla, no afectará la creación del sitio', + batchAdd: 'Añadir múltiples dominios', + 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', + staticChangePHPHelper: 'Actualmente es un sitio estático, puedes cambiarlo a PHP', + proxyCache: 'Caché de proxy inverso', + cacheLimit: 'Límite de espacio de caché', + shareCahe: 'Tamaño de memoria para conteo de caché', + cacheExpire: 'Expiración de caché', + shareCaheHelper: '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.', + 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://', + favorite: 'Favorito', + cancelFavorite: 'Quitar favorito', + 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', + }, + 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)', + }, + 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: + 'Compilar OpenResty requiere reservar CPU y memoria, puede tomar tiempo, ten paciencia', + mirrorUrl: 'Fuente de software', + paramsHelper: 'Por ejemplo: --add-module=/tmp/ngx_brotli', + 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: + 'Haz clic en compilar después de agregar/modificar un módulo. OpenResty se reiniciará automáticamente tras una compilación exitosa.', + defaultHttps: 'HTTPS Anti-manipulación', + defaultHttpsHelper1: 'Habilitar esto puede resolver problemas de manipulación de HTTPS.', + }, + 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.', + 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', + }, + 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 de Linux "{0}" no puede deshabilitar el mapeo de puertos de Docker. La aplicación puede editar los parámetros en la página "App Store -> Instaladas" para controlar si el puerto se libera.`, + 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', + 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?', + portHelper: 'Se pueden ingresar múltiples puertos, ej. 80,81, o rangos, ej. 80-88', + 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', + createPortRule: '@:commons.button.create @.lower:firewall.portRule', + forwardRule: 'Regla de redirección de puertos | Reglas de redirección de puertos', + createForwardRule: '@:commons.button.create @:firewall.forwardRule', + ipRule: 'Regla IP | Reglas IP', + createIpRule: '@:commons.button.create @:firewall.ipRule', + 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.', + forwardHelper3: 'Solo se admite redirección de puertos IPv4.', + }, + runtime: { + runtime: 'Runtime', + workDir: 'Directorio de trabajo', + create: 'Crear', + localHelper: 'El entorno de ejecución local debe instalarse manualmente', + 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: 'Proporciona un comando de inicio completo. Ejemplo: "npm run start".', + 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', + }, + 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})?', + 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', + }, + xpack: { + expiresTrialAlert: + 'Aviso: Tu prueba de Pro expirará en {0} días y todas las funciones Pro dejarán de estar disponibles. Renueva o actualiza a la versión completa a tiempo.', + expiresAlert: + 'Aviso: Tu licencia Pro expirará en {0} días y todas las funciones Pro dejarán de estar disponibles. Renueva pronto para asegurar el uso continuo.', + menu: 'Pro', + upage: 'Constructor Web con IA', + 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.', + }, + 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: + 'Restringe accesos desde ciertas regiones. Ejemplo: permitir solo China, bloqueando el resto', + ipLocation: 'Ubicación IP', + 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', + 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', + 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', + 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', + websiteAlert: 'Crea un sitio primero', + defaultUrlBlack: 'Reglas de URL', + htmlRes: 'Página de intercepción', + urlSearchHelper: 'Introduce la URL (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', + attacklog: 'Registro de intercepciones', + unknownWebsite: 'Acceso a dominio no autorizado', + geoRuleEmpty: 'La región no puede estar vacía', + 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: 'WAF no está activo, habilítalo en Configuración Global', + 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', + addUrlsToWhite: 'Añadir URLs en whitelist en lote', + noBlackIp: 'IP ya bloqueada', + noWhiteUrl: 'URL ya en whitelist', + spiderIpHelper: + 'Incluye Baidu, Bing, Google, 360, Shenma, Sogou, ByteDance, DuckDuckGo, Yandex. Al cerrar se bloquea todo acceso de crawlers', + spiderIp: 'Pool de IPs de crawlers', + 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: 'Remote Code Execution', + 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: 'Directory Traversal', + 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', + 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: { + 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', + 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: ,,,. El último proxy es ', + 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', + statusErr: 'Formato de código de estado inválido', + shenma: 'Shenma', + duckduckgo: 'DuckDuckGo', + '360': '360 Search', + 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: 'Monitorización no habilitada, actívala en Configuración', + 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: 'Protección contra manipulación web', + ignoreTemplate: 'Plantilla de exclusión de directorios', + protectTemplate: 'Plantilla de archivos protegidos', + templateContent: 'Contenido de la plantilla', + template: 'Plantilla', + tamperHelper1: + 'Para sitios de despliegue automático, se recomienda habilitar la protección contra manipulación en el directorio de la aplicación; si el sitio no funciona correctamente o fallan las copias de seguridad, desactiva primero esta función.', + tamperHelper2: + 'Las operaciones de lectura, escritura, borrado, cambios de permisos o de propietario en archivos protegidos fuera de directorios excluidos estarán restringidas.', + tamperPath: 'Directorio protegido', + tamperPathEdit: 'Editar ruta', + log: 'Log de intercepciones', + totalProtect: 'Protecciones totales', + todayProtect: 'Protecciones de hoy', + addRule: 'Añadir regla', + ignore: 'Excluir directorio', + ignoreHelper: 'Uno por línea, ej.: \ntmp\n./tmp', + ignoreTemplateHelper: 'Añade nombres de carpetas separados por comas, ej.: tmp,cache', + templateRule: 'Longitud 1-512, el nombre no puede contener símbolos como {0}', + ignoreHelper1: 'Añade carpetas o rutas específicas a excluir', + ignoreHelper2: 'Para excluir un directorio usa ruta relativa con ./', + protect: 'Proteger archivo', + protectHelper: 'Uno por línea, ej.: \npng\n./test.css', + protectTemplateHelper: 'Añade nombres de archivos o extensiones separados por comas, ej.: conf,.css', + protectHelper1: 'Puedes especificar nombres, extensiones o archivos concretos', + protectHelper2: 'Para proteger un archivo usa ruta relativa con ./', + enableHelper: + 'La protección contra manipulación se activará en los siguientes sitios para mejorar la seguridad. ¿Continuar?', + disableHelper: + 'La protección contra manipulación se desactivará en los siguientes sitios. ¿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)', + reUpload: 'Elegir archivo', + 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 de login', + loginImageHelper: 'Se muestra en la página de login (tamaño recomendado: 500*416px)', + loginBgType: 'Tipo de fondo de login', + loginBgImage: 'Imagen de fondo de login', + loginBgImageHelper: 'Se muestra como fondo de la página de login (tamaño recomendado: 1920*1080px)', + loginBgColor: 'Color de fondo de login', + 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.', + 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.', + 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', + }, + node: { + master: 'Nodo Principal', + masterBackup: 'Respaldo del Nodo Principal', + backupNode: 'Nodo de Respaldo', + backupFrequency: 'Frecuencia de Respaldo (horas)', + backupCopies: 'Copias de Retención 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', + 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 de Nodos', + addNode: 'Añadir Nodo', + connInfo: 'Información de Conexión', + nodeInfo: 'Información del Nodo', + 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 Pro, 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', + }, + 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 Pro admite la función de repositorio de aplicaciones personalizadas', + }, + 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 Pro soporta alertas SMS', + 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', + sms: 'SMS', + wechat: 'WeChat', + dingTalk: 'DingTalk', + feiShu: 'FeiShu', + mail: 'Correo', + weCom: 'WeCom', + 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', + 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 mostrado', + sender: 'Dirección remitente', + password: 'Contraseña', + host: 'Servidor SMTP', + port: 'Puerto', + encryption: 'Método de 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', + }, + theme: { + lingXiaGold: 'Ling Xia 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?', + }, + exchange: { + exchange: 'Intercambio de archivos', + exchangeConfirm: '¿Quieres transferir {1} de {0} a {2}:{3}?', + }, + 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', + }, + }, +}; + +export default { + ...fit2cloudEsEsLocale, + ...message, +};