feat: Dev v2 spanish (#10352)

This commit is contained in:
CEO DaXyS 2025-09-17 12:02:29 +02:00 committed by GitHub
parent aa91bb88bc
commit 1999f102bf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 4529 additions and 6 deletions

View file

@ -128,6 +128,7 @@ type Locale struct {
Zh string `json:"zh"` Zh string `json:"zh"`
Ko string `json:"ko"` Ko string `json:"ko"`
Tr string `json:"tr"` Tr string `json:"tr"`
Es string `json:"es-es" yaml:"es-es"`
} }
type AppForm struct { type AppForm struct {

View file

@ -134,6 +134,7 @@ func Init() {
_, _ = bundle.LoadMessageFileFS(fs, "lang/ms.yaml") _, _ = bundle.LoadMessageFileFS(fs, "lang/ms.yaml")
_, _ = bundle.LoadMessageFileFS(fs, "lang/ko.yaml") _, _ = bundle.LoadMessageFileFS(fs, "lang/ko.yaml")
_, _ = bundle.LoadMessageFileFS(fs, "lang/tr.yaml") _, _ = bundle.LoadMessageFileFS(fs, "lang/tr.yaml")
_, _ = bundle.LoadMessageFileFS(fs, "lang/es-ES.yaml")
lang := GetLanguageFromDB() lang := GetLanguageFromDB()
global.I18n = i18n.NewLocalizer(bundle, lang) global.I18n = i18n.NewLocalizer(bundle, lang)
} }

490
agent/i18n/lang/es-ES.yaml Normal file
View file

@ -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"

View file

@ -28,7 +28,7 @@ type Login struct {
IgnoreCaptcha bool `json:"ignoreCaptcha"` IgnoreCaptcha bool `json:"ignoreCaptcha"`
Captcha string `json:"captcha"` Captcha string `json:"captcha"`
CaptchaID string `json:"captchaID"` 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 { type MFALogin struct {

View file

@ -134,6 +134,7 @@ func Init() {
_, _ = bundle.LoadMessageFileFS(fs, "lang/ms.yaml") _, _ = bundle.LoadMessageFileFS(fs, "lang/ms.yaml")
_, _ = bundle.LoadMessageFileFS(fs, "lang/ko.yaml") _, _ = bundle.LoadMessageFileFS(fs, "lang/ko.yaml")
_, _ = bundle.LoadMessageFileFS(fs, "lang/tr.yaml") _, _ = bundle.LoadMessageFileFS(fs, "lang/tr.yaml")
_, _ = bundle.LoadMessageFileFS(fs, "lang/es-ES.yaml")
lang := GetLanguageFromDB() lang := GetLanguageFromDB()
global.I18n = i18n.NewLocalizer(bundle, lang) global.I18n = i18n.NewLocalizer(bundle, lang)
} }

233
core/i18n/lang/es-ES.yaml Normal file
View file

@ -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 }}"

View file

@ -1,5 +1,5 @@
<p align="center"><a href="https://1panel.pro"><img src="https://resource.1panel.pro/img/1panel-logo.png" alt="1Panel" width="300" /></a></p> <p align="center"><a href="https://1panel.pro"><img src="https://resource.1panel.pro/img/1panel-logo.png" alt="1Panel" width="300" /></a></p>
<p align="center"><b>Herramienta de gestión de servidores Linux basada en la web mejor valorada</b></p> <p align="center"><b>La herramienta de gestión más valorada para administrar servidores Linux.</b></p>
<p align="center"> <p align="center">
<a href="https://trendshift.io/repositories/2462" target="_blank"><img src="https://trendshift.io/api/badge/repositories/2462" alt="1Panel-dev%2F1Panel | Trendshift" style="width: 180px; height: auto;" /></a> <a href="https://trendshift.io/repositories/2462" target="_blank"><img src="https://trendshift.io/api/badge/repositories/2462" alt="1Panel-dev%2F1Panel | Trendshift" style="width: 180px; height: auto;" /></a>
<a href="https://www.producthunt.com/posts/1panel?embed=true&utm_source=badge-featured&utm_medium=badge&utm_souce=badge-1panel" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=639696&theme=light" alt="1Panel - Top&#0045;Rated&#0032;web&#0045;based&#0032;Linux&#0032;server&#0032;management&#0032;tool | Product Hunt" style="width: 180px; height: auto;" /></a> <a href="https://www.producthunt.com/posts/1panel?embed=true&utm_source=badge-featured&utm_medium=badge&utm_souce=badge-1panel" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=639696&theme=light" alt="1Panel - Top&#0045;Rated&#0032;web&#0045;based&#0032;Linux&#0032;server&#0032;management&#0032;tool | Product Hunt" style="width: 180px; height: auto;" /></a>
@ -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; - **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; - **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; - **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 ## 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 ```bash
curl -sSL https://resource.1panel.pro/quick_start.sh -o quick_start.sh && bash quick_start.sh 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 ## Captura de Pantalla

View file

@ -16,6 +16,7 @@ import ptBR from 'element-plus/es/locale/lang/pt-br';
import ru from 'element-plus/es/locale/lang/ru'; import ru from 'element-plus/es/locale/lang/ru';
import ko from 'element-plus/es/locale/lang/ko'; import ko from 'element-plus/es/locale/lang/ko';
import tr from 'element-plus/es/locale/lang/tr'; 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'; import { useTheme } from '@/global/use-theme';
useTheme(); useTheme();
@ -34,6 +35,7 @@ const i18nLocale = computed(() => {
if (globalStore.language === 'pt-br') return ptBR; if (globalStore.language === 'pt-br') return ptBR;
if (globalStore.language === 'ko') return ko; if (globalStore.language === 'ko') return ko;
if (globalStore.language === 'tr') return tr; if (globalStore.language === 'tr') return tr;
if (globalStore.language === 'es-es') return esES;
return zhCn; return zhCn;
}); });

View file

@ -29,6 +29,7 @@ export namespace App {
ru: string; ru: string;
ko: string; ko: string;
tr: string; tr: string;
'es-es': string;
} }
export interface AppDTO extends App { export interface AppDTO extends App {

View file

@ -8,6 +8,7 @@ import ru from './modules/ru';
import ms from './modules/ms'; import ms from './modules/ms';
import ko from './modules/ko'; import ko from './modules/ko';
import tr from './modules/tr'; import tr from './modules/tr';
import esES from './modules/es-es';
const i18n = createI18n({ const i18n = createI18n({
legacy: false, legacy: false,
@ -25,6 +26,7 @@ const i18n = createI18n({
ms, ms,
ko, ko,
tr, tr,
'es-ES': esES,
}, },
warnHtmlMessage: false, warnHtmlMessage: false,
}); });

File diff suppressed because it is too large Load diff