mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-08-28 14:07:13 +00:00
chore(i18n): delete 230 dead translation keys and guard against new ones (#6132)
* chore(i18n): delete 230 dead translation keys and guard against new ones The 13 locale files carried 230 keys (11% of the set) that nothing in the frontend or Go sources references — leftovers of renamed features (the email notifier reuses tgbot.messages.* for subjects, the old email.subject*/title* set was orphaned; likewise menu.*, the clients bulk-copy strings, and the secAlert* family). Nothing detected this: a missing key falls back to en-US and an unused key fails nothing. A new test now fails the build when an en-US key has no reference in frontend/src or internal Go sources (dynamic keys are covered by harvesting concatenation and template-literal prefixes), and pins that all 13 locales carry exactly the en-US key set, so parity drift surfaces at test time instead of as a silent fallback. Each locale shrinks by the same 230 keys; net -2,900 lines across the translation set. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(i18n): restore the 29 live remarkVars keys, match whole tokens, unmask 9 more From review: the template-literal harvester required the prefix to end on a dot, so pages.hosts.remarkVars.desc${token} harvested nothing and all 29 desc* tooltip keys were wrongly deleted — and the guard shared the flawed logic, so CI stayed green while the Hosts page would have shown raw key names in 13 languages. Restored from the parent commit; the harvester now requires at least one dot but not a trailing one. Also from review: references are matched as whole dotted tokens instead of substrings (a dead key can no longer hide behind a longer sibling — that unmasked 9 more genuinely dead keys, each verified by hand before deletion), and the test excludes itself from the scan so its own prose cannot whitelist a subtree. Net: -210 keys per locale instead of the previous -230. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -48,7 +48,6 @@
|
||||
"copySuccess": "Copiado exitosamente",
|
||||
"sure": "Seguro",
|
||||
"encryption": "Encriptación",
|
||||
"useIPv4ForHost": "Usar IPv4 para el host",
|
||||
"transmission": "Transmisión",
|
||||
"host": "Host",
|
||||
"path": "Ruta",
|
||||
@@ -74,18 +73,9 @@
|
||||
"twoFactorCode": "Código",
|
||||
"remained": "Restante",
|
||||
"security": "Seguridad",
|
||||
"secAlertTitle": "Alerta de Seguridad",
|
||||
"secAlertSsl": "Esta conexión no es segura. Por favor, evite ingresar información sensible hasta que se active TLS para la protección de datos.",
|
||||
"secAlertConf": "Ciertas configuraciones son vulnerables a ataques. Se recomienda reforzar los protocolos de seguridad para prevenir posibles violaciones.",
|
||||
"secAlertSSL": "El panel carece de una conexión segura. Por favor, instale un certificado TLS para la protección de datos.",
|
||||
"secAlertPanelPort": "El puerto predeterminado del panel es vulnerable. Por favor, configure un puerto aleatorio o específico.",
|
||||
"secAlertPanelURI": "La ruta URI predeterminada del panel no es segura. Por favor, configure una ruta URI compleja.",
|
||||
"secAlertSubURI": "La ruta URI predeterminada de la suscripción no es segura. Por favor, configure una ruta URI compleja.",
|
||||
"secAlertSubJsonURI": "La ruta URI JSON predeterminada de la suscripción no es segura. Por favor, configure una ruta URI compleja.",
|
||||
"emptyDnsDesc": "No hay servidores DNS añadidos.",
|
||||
"emptyFakeDnsDesc": "No hay servidores Fake DNS añadidos.",
|
||||
"emptyBalancersDesc": "No hay balanceadores añadidos.",
|
||||
"emptyReverseDesc": "No hay proxies inversos añadidos.",
|
||||
"somethingWentWrong": "Algo salió mal",
|
||||
"subscription": {
|
||||
"title": "Información de suscripción",
|
||||
@@ -106,8 +96,6 @@
|
||||
},
|
||||
"menu": {
|
||||
"theme": "Tema",
|
||||
"dark": "Oscuro",
|
||||
"ultraDark": "Ultra Oscuro",
|
||||
"dashboard": "Estado del Sistema",
|
||||
"inbounds": "Entradas",
|
||||
"clients": "Clientes",
|
||||
@@ -118,7 +106,6 @@
|
||||
"routing": "Enrutamiento",
|
||||
"outbounds": "Salidas",
|
||||
"apiDocs": "Documentación de la API",
|
||||
"logout": "Cerrar Sesión",
|
||||
"link": "Gestionar",
|
||||
"donate": "Donar",
|
||||
"hosts": "Hosts",
|
||||
@@ -139,7 +126,6 @@
|
||||
}
|
||||
},
|
||||
"index": {
|
||||
"title": "Estado del Sistema",
|
||||
"cpu": "CPU",
|
||||
"logicalProcessors": "Procesadores lógicos",
|
||||
"frequency": "Frecuencia",
|
||||
@@ -152,7 +138,6 @@
|
||||
"restartXray": "Reiniciar",
|
||||
"xraySwitch": "Versión",
|
||||
"xrayUpdates": "Actualizaciones de Xray",
|
||||
"xraySwitchClick": "Elige la versión a la que deseas cambiar.",
|
||||
"xraySwitchClickDesk": "Elige sabiamente, ya que las versiones anteriores pueden no ser compatibles con las configuraciones actuales.",
|
||||
"updatePanel": "Actualizar panel",
|
||||
"panelUpdateDesc": "Esto actualizará 3X-UI a la última versión y reiniciará el servicio del panel.",
|
||||
@@ -164,12 +149,10 @@
|
||||
"currentCommit": "Commit actual",
|
||||
"latestCommit": "Último commit",
|
||||
"updateChannelChanged": "Canal de actualización cambiado",
|
||||
"upToDate": "Actualizado",
|
||||
"xrayStatusUnknown": "Desconocido",
|
||||
"xrayStatusRunning": "En ejecución",
|
||||
"xrayStatusStop": "Detenido",
|
||||
"xrayStatusError": "Error",
|
||||
"xrayErrorPopoverTitle": "Se produjo un error al ejecutar Xray",
|
||||
"operationHours": "Tiempo de Funcionamiento",
|
||||
"systemHistoryTitle": "Historial del Sistema",
|
||||
"historyTitleCpu": "Uso de CPU",
|
||||
@@ -211,9 +194,6 @@
|
||||
"xrayObservatoryDead": "Caído",
|
||||
"xrayObservatoryLastSeen": "Visto por última vez",
|
||||
"xrayObservatoryLastTry": "Último intento",
|
||||
"trendLast2Min": "Últimos 2 minutos",
|
||||
"systemLoad": "Carga del Sistema",
|
||||
"systemLoadDesc": "promedio de carga del sistema en los últimos 1, 5 y 15 minutos",
|
||||
"connectionCount": "Número de Conexiones",
|
||||
"ipAddresses": "Direcciones IP",
|
||||
"toggleIpVisibility": "Alternar visibilidad de la IP",
|
||||
@@ -223,13 +203,11 @@
|
||||
"totalData": "Datos totales",
|
||||
"sent": "Enviado",
|
||||
"received": "Recibido",
|
||||
"documentation": "Documentación",
|
||||
"xraySwitchVersionDialog": "¿Realmente deseas cambiar la versión de Xray?",
|
||||
"xraySwitchVersionDialogDesc": "Esto cambiará la versión de Xray a #version#.",
|
||||
"xraySwitchVersionPopover": "Xray se actualizó correctamente",
|
||||
"panelUpdateDialog": "¿Deseas actualizar el panel?",
|
||||
"panelUpdateDialogDesc": "Esto actualizará 3X-UI a la versión #version# y reiniciará el servicio del panel.",
|
||||
"panelUpdateCheckPopover": "Fallo al comprobar actualización del panel",
|
||||
"panelUpdateStartedPopover": "Actualización del panel iniciada",
|
||||
"panelUpdateFailedTitle": "Error al actualizar el panel",
|
||||
"panelUpdateFailedDesc": "La actualización no se completó correctamente. Revisa los registros del servidor o ejecuta 'x-ui update' desde la línea de comandos.",
|
||||
@@ -258,7 +236,6 @@
|
||||
"accessLogs": "Registros de acceso",
|
||||
"autoUpdate": "Actualización automática",
|
||||
"config": "Configuración",
|
||||
"backup": "Copia de seguridad",
|
||||
"backupTitle": "Copia & Restauración",
|
||||
"exportDatabase": "Copia de seguridad",
|
||||
"exportDatabaseDesc": "Haz clic para descargar un archivo .db que contiene una copia de seguridad de tu base de datos actual en tu dispositivo. El mismo archivo también puede restaurarse en un panel que funcione con PostgreSQL.",
|
||||
@@ -276,7 +253,6 @@
|
||||
"migrationDownloadPgDesc": "Haz clic para descargar una base de datos SQLite .db creada a partir de tus datos de PostgreSQL, lista para ejecutar este panel en SQLite."
|
||||
},
|
||||
"inbounds": {
|
||||
"title": "Entradas",
|
||||
"totalDownUp": "Subidas/Descargas Totales",
|
||||
"totalUsage": "Uso Total",
|
||||
"inboundCount": "Número de Entradas",
|
||||
@@ -288,21 +264,11 @@
|
||||
"localPanel": "Panel local",
|
||||
"fallbacks": {
|
||||
"title": "Fallbacks",
|
||||
"help": "Cuando una conexión en este inbound no coincide con ningún cliente, redirígela a otro lugar. Elige un inbound hijo abajo para rellenar automáticamente los campos de enrutamiento (SNI / ALPN / Path / xver) desde su transporte, o deja el selector vacío y define Dest directamente (p. ej. 8080 o 127.0.0.1:8080) para redirigir a un servidor externo como Nginx. Cada inbound hijo debe escuchar en 127.0.0.1 con security=none.",
|
||||
"empty": "Aún no hay fallbacks",
|
||||
"add": "Añadir fallback",
|
||||
"pickInbound": "Selecciona un inbound",
|
||||
"matchAny": "cualquiera",
|
||||
"destPlaceholder": "automático (listen:puerto del hijo)",
|
||||
"rederive": "Rellenar desde el hijo",
|
||||
"rederived": "Rellenado desde el hijo",
|
||||
"editAdvanced": "Editar campos de enrutamiento",
|
||||
"hideAdvanced": "Ocultar avanzado",
|
||||
"quickAddAll": "Añadir todos los elegibles",
|
||||
"quickAdded": "Se añadieron {n} fallback(s)",
|
||||
"quickAddedNone": "No hay nuevos inbounds elegibles",
|
||||
"routesWhen": "Enruta cuando",
|
||||
"defaultCatchAll": "Por defecto — captura cualquier otra cosa",
|
||||
"needsTls": "Los fallbacks estarán disponibles al seleccionar TLS o Reality en la pestaña de Seguridad (solo VLESS/Trojan sobre RAW)."
|
||||
},
|
||||
"protocol": "Protocolo",
|
||||
@@ -310,8 +276,6 @@
|
||||
"portMap": "Asignación de puertos",
|
||||
"traffic": "Tráfico",
|
||||
"speed": "Velocidad",
|
||||
"details": "Detalles",
|
||||
"transportConfig": "Transporte",
|
||||
"expireDate": "Fecha de Expiración",
|
||||
"createdAt": "Creado",
|
||||
"updatedAt": "Actualizado",
|
||||
@@ -319,8 +283,6 @@
|
||||
"addInbound": "Agregar Entrada",
|
||||
"generalActions": "Acciones Generales",
|
||||
"modifyInbound": "Modificar Entrada",
|
||||
"deleteInbound": "Eliminar Entrada",
|
||||
"deleteInboundContent": "¿Confirmar eliminación de entrada?",
|
||||
"deleteConfirmTitle": "¿Eliminar el inbound \"{remark}\"?",
|
||||
"deleteConfirmContent": "Esto elimina el inbound y todos sus clientes. No se puede deshacer.",
|
||||
"resetConfirmTitle": "¿Restablecer el tráfico de \"{remark}\"?",
|
||||
@@ -364,8 +326,6 @@
|
||||
"exportAllLinksFileName": "Todas-las-entradas",
|
||||
"exportAllSubsFileName": "Todas-las-entradas-Subs",
|
||||
"inboundJsonTitle": "JSON de entrada",
|
||||
"deleteClient": "Eliminar cliente",
|
||||
"deleteClientContent": "¿Está seguro de que desea eliminar el cliente?",
|
||||
"resetTrafficContent": "¿Confirmar restablecimiento de tráfico?",
|
||||
"copyLink": "Copiar Enlace",
|
||||
"address": "Dirección",
|
||||
@@ -376,36 +336,19 @@
|
||||
"meansNoLimit": "= Ilimitado. (unidad: GB)",
|
||||
"totalFlow": "Flujo Total",
|
||||
"leaveBlankToNeverExpire": "Dejar en Blanco para Nunca Expirar",
|
||||
"noRecommendKeepDefault": "No hay requisitos especiales para mantener la configuración predeterminada",
|
||||
"certificatePath": "Ruta Cert",
|
||||
"certificateContent": "Datos Cert",
|
||||
"publicKey": "Clave Pública",
|
||||
"privatekey": "Clave Privada",
|
||||
"clickOnQRcode": "Haz clic en el Código QR para Copiar",
|
||||
"client": "Cliente",
|
||||
"export": "Exportar Enlaces",
|
||||
"clone": "Clonar",
|
||||
"cloneInbound": "Clonar Entradas",
|
||||
"cloneInboundContent": "Se aplicarán todas las configuraciones de esta entrada, excepto el Puerto, la IP de Escucha y los Clientes, al clon.",
|
||||
"cloneInboundOk": "Clonar",
|
||||
"resetAllTraffic": "Restablecer Tráfico de Todas las Entradas",
|
||||
"resetAllTrafficTitle": "Restablecer tráfico de todas las entradas",
|
||||
"resetAllTrafficContent": "¿Estás seguro de que deseas restablecer el tráfico de todas las entradas?",
|
||||
"resetInboundClientTraffics": "Restablecer Tráfico de Clientes",
|
||||
"resetInboundClientTrafficTitle": "Restablecer todo el tráfico de clientes",
|
||||
"resetInboundClientTrafficContent": "¿Estás seguro de que deseas restablecer todo el tráfico para los clientes de esta entrada?",
|
||||
"resetAllClientTraffics": "Restablecer Tráfico de Todos los Clientes",
|
||||
"resetAllClientTrafficTitle": "Restablecer todo el tráfico de clientes",
|
||||
"resetAllClientTrafficContent": "¿Estás seguro de que deseas restablecer todo el tráfico para todos los clientes?",
|
||||
"delDepletedClients": "Eliminar Clientes Agotados",
|
||||
"delDepletedClientsTitle": "Eliminar clientes agotados",
|
||||
"delDepletedClientsContent": "¿Estás seguro de que deseas eliminar todos los clientes agotados?",
|
||||
"email": "Email",
|
||||
"emailDesc": "Por favor proporciona una dirección de correo electrónico única.",
|
||||
"IPLimit": "Límite de IP",
|
||||
"IPLimitDesc": "Desactiva la entrada si la cantidad supera el valor ingresado (ingresa 0 para desactivar el límite de IP).",
|
||||
"IPLimitlog": "Registro de IP",
|
||||
"IPLimitlogDesc": "Registro de historial de IPs (antes de habilitar la entrada después de que haya sido desactivada por el límite de IP, debes borrar el registro).",
|
||||
"IPLimitlogclear": "Limpiar el Registro",
|
||||
"setDefaultCert": "Establecer certificado desde el panel",
|
||||
"setDefaultCertEmpty": "No hay certificado configurado para el panel. Configura uno en Ajustes primero.",
|
||||
@@ -438,21 +381,15 @@
|
||||
"sniffing": "Sniffing",
|
||||
"sniffingHelp": "Envoltorio del bloque sniffing de Xray:",
|
||||
"stream": "Stream",
|
||||
"streamHelp": "Envoltorio del bloque stream de Xray:",
|
||||
"jsonErrorPrefix": "JSON avanzado"
|
||||
"streamHelp": "Envoltorio del bloque stream de Xray:"
|
||||
},
|
||||
"telegramDesc": "Por favor, proporciona el ID de Chat de Telegram. (usa el comando '/id' en el bot) o ({'@'}userinfobot)",
|
||||
"subscriptionDesc": "Puedes encontrar tu enlace de suscripción en Detalles, también puedes usar el mismo nombre para varias configuraciones.",
|
||||
"subSortIndex": "Orden sub",
|
||||
"same": "misma",
|
||||
"inboundInfo": "Información de entrada",
|
||||
"exportInbound": "Exportación entrante",
|
||||
"import": "Importar",
|
||||
"importInbound": "Importar un entrante",
|
||||
"periodicTrafficResetTitle": "Reset de Tráfico",
|
||||
"periodicTrafficResetDesc": "Reiniciar automáticamente el contador de tráfico en intervalos especificados",
|
||||
"periodicTrafficResetDay": "Día de reinicio mensual",
|
||||
"lastReset": "Último reinicio",
|
||||
"periodicTrafficReset": {
|
||||
"never": "Nunca",
|
||||
"daily": "Diariamente",
|
||||
@@ -464,7 +401,6 @@
|
||||
"obtain": "Recibir",
|
||||
"updateSuccess": "La actualización fue exitosa",
|
||||
"logCleanSuccess": "El registro ha sido limpiado",
|
||||
"inboundsUpdateSuccess": "Entradas actualizadas correctamente",
|
||||
"inboundUpdateSuccess": "Entrada actualizada correctamente",
|
||||
"inboundCreateSuccess": "Entrada creada correctamente",
|
||||
"bulkDeleted": "{count} inbounds eliminados",
|
||||
@@ -474,7 +410,6 @@
|
||||
"inboundClientDeleteSuccess": "Cliente de entrada eliminado",
|
||||
"inboundClientUpdateSuccess": "Cliente de entrada actualizado",
|
||||
"savedNodeOfflineWillSync": "Guardado localmente. Un nodo de respaldo está desconectado o deshabilitado: el cambio se sincronizará cuando vuelva a conectarse.",
|
||||
"delDepletedClientsSuccess": "Todos los clientes con tráfico agotado fueron eliminados",
|
||||
"resetAllClientTrafficSuccess": "Todo el tráfico del cliente ha sido reiniciado",
|
||||
"resetAllTrafficSuccess": "Todo el tráfico ha sido reiniciado",
|
||||
"resetInboundClientTrafficSuccess": "El tráfico ha sido reiniciado",
|
||||
@@ -717,23 +652,6 @@
|
||||
"peerNumber": "Peer {n}",
|
||||
"peerNumberConfig": "Config Peer {n}"
|
||||
},
|
||||
"stream": {
|
||||
"general": {
|
||||
"request": "Pedido",
|
||||
"response": "Respuesta",
|
||||
"name": "Nombre",
|
||||
"value": "Valor"
|
||||
},
|
||||
"tcp": {
|
||||
"version": "Versión",
|
||||
"method": "Método",
|
||||
"path": "Ruta",
|
||||
"status": "Estado",
|
||||
"statusDescription": "Descripción de la Situación",
|
||||
"requestHeader": "Encabezado de solicitud",
|
||||
"responseHeader": "Encabezado de respuesta"
|
||||
}
|
||||
},
|
||||
"sniffingDestOverride": "Anulación de destino"
|
||||
},
|
||||
"clients": {
|
||||
@@ -747,24 +665,9 @@
|
||||
"addExternalSubscription": "Añadir suscripción externa",
|
||||
"noExternalLinks": "Aún no hay enlaces externos.",
|
||||
"noExternalSubscriptions": "Aún no hay suscripciones externas.",
|
||||
"add": "Añadir cliente",
|
||||
"edit": "Editar cliente",
|
||||
"submitAdd": "Añadir cliente",
|
||||
"submitEdit": "Guardar cambios",
|
||||
"clientCount": "Número de clientes",
|
||||
"bulk": "Añadir en lote",
|
||||
"copyFromInbound": "Copiar clientes desde inbound",
|
||||
"copyToInbound": "Copiar clientes a",
|
||||
"copySelected": "Copiar selección",
|
||||
"copySource": "Origen",
|
||||
"copyEmailPreview": "Vista previa del correo resultante",
|
||||
"copySelectSourceFirst": "Selecciona primero un inbound de origen.",
|
||||
"copyResult": "Resultado de la copia",
|
||||
"copyResultSuccess": "Copiado correctamente",
|
||||
"copyResultNone": "Nada que copiar: no hay clientes seleccionados o el origen está vacío",
|
||||
"copyResultErrors": "Errores de copia",
|
||||
"copyFlowLabel": "Flow para clientes nuevos (VLESS)",
|
||||
"copyFlowHint": "Se aplica a todos los clientes copiados. Déjalo vacío para omitir.",
|
||||
"selectAll": "Seleccionar todo",
|
||||
"clearAll": "Limpiar todo",
|
||||
"method": "Método",
|
||||
@@ -775,7 +678,6 @@
|
||||
"postfix": "Sufijo",
|
||||
"delayedStart": "Iniciar tras el primer uso",
|
||||
"expireDays": "Duración (días)",
|
||||
"days": "Día(s)",
|
||||
"renew": "Renovación automática",
|
||||
"renewDesc": "Renovación automática tras la expiración. (0 = desactivado) (unidad: día)",
|
||||
"renewDays": "Renovación automática (días)",
|
||||
@@ -798,7 +700,6 @@
|
||||
"sortExpiringSoonest": "Caducidad más próxima",
|
||||
"has": "Tiene",
|
||||
"hasNot": "No tiene",
|
||||
"title": "Clientes",
|
||||
"actions": "Acciones",
|
||||
"totalGB": "Límite de tráfico (GB)",
|
||||
"totalGBDesc": "Cuota de datos para este cliente. 0 = ilimitado.",
|
||||
@@ -826,8 +727,6 @@
|
||||
"addClient": "Añadir cliente",
|
||||
"qrCode": "Código QR",
|
||||
"clientInfo": "Información del cliente",
|
||||
"delete": "Eliminar",
|
||||
"reset": "Restablecer tráfico",
|
||||
"editClient": "Editar cliente",
|
||||
"client": "Cliente",
|
||||
"enabled": "Habilitado",
|
||||
@@ -841,13 +740,11 @@
|
||||
"noLinks": "No hay enlaces compartibles — asocia primero este cliente a un inbound con protocolo válido.",
|
||||
"link": "Enlace",
|
||||
"resetNotPossible": "Asocia primero este cliente a un inbound.",
|
||||
"general": "General",
|
||||
"resetAllTraffics": "Restablecer tráfico de todos los clientes",
|
||||
"resetAllTrafficsTitle": "¿Restablecer tráfico de todos los clientes?",
|
||||
"resetAllTrafficsContent": "El contador de subida/bajada de cada cliente vuelve a cero. Las cuotas y la expiración no se modifican. Esta acción no se puede deshacer.",
|
||||
"deleteConfirmTitle": "¿Eliminar al cliente {email}?",
|
||||
"deleteConfirmContent": "Esto elimina al cliente de cada inbound asociado y descarta su registro de tráfico. No se puede deshacer.",
|
||||
"deleteSelected": "Eliminar ({count})",
|
||||
"adjustSelected": "Ajustar ({count})",
|
||||
"subLinksSelected": "Enlaces sub ({count})",
|
||||
"addToGroupTitle": "Añadir {count} cliente(s) a un grupo",
|
||||
@@ -869,12 +766,10 @@
|
||||
"bulkDisableConfirmTitle": "¿Deshabilitar {count} clientes?",
|
||||
"bulkDisableConfirmContent": "Deshabilita cada cliente seleccionado en todos los inbounds asociados. Pierden el acceso de inmediato, pero se conservan sus registros y su tráfico.",
|
||||
"selectedCount": "{count} seleccionado(s)",
|
||||
"attachSelected": "Asociar ({count})",
|
||||
"attachToInboundsTitle": "Asociar {count} cliente(s) a entrada(s)",
|
||||
"attachToInboundsDesc": "Asocia los {count} cliente(s) seleccionados (mismo UUID/contraseña y tráfico compartido) a las entradas elegidas. Mantienen sus asociaciones existentes.",
|
||||
"attachToInboundsTargets": "Entradas objetivo",
|
||||
"attachToInboundsNoTargets": "No hay entradas multiusuario disponibles para asociar.",
|
||||
"detachSelected": "Desasociar ({count})",
|
||||
"detach": "Desasociar",
|
||||
"detachFromInboundsTitle": "Desasociar {count} cliente(s) de entrada(s)",
|
||||
"detachFromInboundsDesc": "Quita los {count} cliente(s) seleccionados de las entradas elegidas. Las parejas donde el cliente no estaba asociado se omiten silenciosamente. Los registros de los clientes se conservan (usa Delete para eliminar por completo).",
|
||||
@@ -928,8 +823,6 @@
|
||||
"reverseTagPlaceholder": "Reverse tag opcional",
|
||||
"telegramId": "ID de usuario de Telegram",
|
||||
"telegramIdPlaceholder": "ID numérico de usuario de Telegram (0 = ninguno)",
|
||||
"created": "Creado",
|
||||
"updated": "Actualizado",
|
||||
"ipLimit": "Límite de IP",
|
||||
"toasts": {
|
||||
"deleted": "Cliente eliminado",
|
||||
@@ -952,7 +845,6 @@
|
||||
}
|
||||
},
|
||||
"groups": {
|
||||
"title": "Grupos",
|
||||
"name": "Nombre",
|
||||
"clientCount": "Clientes",
|
||||
"totalGroups": "Total de grupos",
|
||||
@@ -994,7 +886,6 @@
|
||||
"removeFromGroupResult": "Quitados {count} cliente(s) de {name}."
|
||||
},
|
||||
"nodes": {
|
||||
"title": "Nodos",
|
||||
"addNode": "Agregar nodo",
|
||||
"editNode": "Editar nodo",
|
||||
"totalNodes": "Total de nodos",
|
||||
@@ -1013,8 +904,6 @@
|
||||
"apiTokenPlaceholder": "Token desde la página de Configuración del panel remoto",
|
||||
"apiTokenHint": "El panel remoto expone su token de API en Configuraciones de Seguridad → Token de API.",
|
||||
"apiTokenKeepHint": "Déjalo en blanco para mantener el token actual",
|
||||
"regenerate": "Regenerar token",
|
||||
"regenerateConfirm": "Regenerar invalida el token actual. Cualquier panel central que lo use perderá el acceso hasta que se actualice. ¿Continuar?",
|
||||
"allowPrivateAddress": "Permitir dirección privada",
|
||||
"allowPrivateAddressHint": "Habilitar solo para nodos en una red privada o VPN.",
|
||||
"outboundTag": "Outbound de conexión",
|
||||
@@ -1046,7 +935,6 @@
|
||||
"updatePanel": "Actualizar panel",
|
||||
"updateSelected": "Actualizar seleccionados ({count})",
|
||||
"updateAvailable": "Actualización disponible",
|
||||
"upToDate": "Actualizado",
|
||||
"updateConfirmTitle": "¿Actualizar {count} nodo(s) a la última versión?",
|
||||
"updateConfirmContent": "Cada nodo seleccionado descarga la última versión y se reinicia con ella. Solo se actualizan los nodos habilitados y en línea.",
|
||||
"updateDevChannel": "Actualizar al canal de desarrollo (último commit)",
|
||||
@@ -1447,13 +1335,8 @@
|
||||
"secretClearUndo": "Deshacer borrado"
|
||||
},
|
||||
"xray": {
|
||||
"title": "Xray Configuración",
|
||||
"save": "Guardar configuración",
|
||||
"restart": "Reiniciar Xray",
|
||||
"restartSuccess": "Xray se ha reiniciado correctamente",
|
||||
"restartOutputTitle": "Salida del reinicio de Xray",
|
||||
"restartConfirmTitle": "¿Reiniciar xray?",
|
||||
"restartConfirmContent": "Recarga el servicio xray con la configuración guardada.",
|
||||
"stopSuccess": "Xray se ha detenido correctamente",
|
||||
"restartError": "Ocurrió un error al reiniciar Xray.",
|
||||
"stopError": "Ocurrió un error al detener Xray.",
|
||||
@@ -1463,7 +1346,6 @@
|
||||
"generalConfigsDesc": "Estas opciones proporcionarán ajustes generales.",
|
||||
"logConfigs": "Registro",
|
||||
"logConfigsDesc": "Los registros pueden afectar la eficiencia de su servidor. Se recomienda habilitarlos sabiamente solo en caso de sus necesidades.",
|
||||
"blockConfigsDesc": "Estas opciones evitarán que los usuarios se conecten a protocolos y sitios web específicos.",
|
||||
"basicRouting": "Enrutamiento Básico",
|
||||
"blockConnectionsConfigsDesc": "Estas opciones bloquearán el tráfico según el país solicitado específico.",
|
||||
"directConnectionsConfigsDesc": "Una conexión directa asegura que el tráfico específico no sea enrutado a través de otro servidor.",
|
||||
@@ -1473,10 +1355,6 @@
|
||||
"directdomains": "Dominios Directos",
|
||||
"ipv4Routing": "Enrutamiento IPv4",
|
||||
"ipv4RoutingDesc": "Estas opciones solo enrutarán a los dominios objetivo a través de IPv4.",
|
||||
"warpRouting": "Enrutamiento WARP",
|
||||
"warpRoutingDesc": "Precaución: Antes de usar estas opciones, instale WARP en modo de proxy socks5 en su servidor siguiendo los pasos en el GitHub del panel. WARP enrutará el tráfico a los sitios web a través de los servidores de Cloudflare.",
|
||||
"nordRouting": "Enrutamiento NordVPN",
|
||||
"nordRoutingDesc": "Estas opciones enrutarán el tráfico basado en un destino específico a través de NordVPN.",
|
||||
"Template": "Plantilla de Configuración de Xray",
|
||||
"TemplateDesc": "Genera el archivo de configuración final de Xray basado en esta plantilla.",
|
||||
"FreedomStrategy": "Configurar Estrategia para el Protocolo Freedom",
|
||||
@@ -1490,10 +1368,7 @@
|
||||
"outboundTestUrlDesc": "URL usada al probar la conectividad del outbound",
|
||||
"Torrent": "Prohibir Uso de BitTorrent",
|
||||
"Inbounds": "Entradas",
|
||||
"InboundsDesc": "Cambia la plantilla de configuración para aceptar clientes específicos.",
|
||||
"Outbounds": "Salidas",
|
||||
"OutboundSubscriptions": "Suscripciones de salida",
|
||||
"OutboundSubscriptionsDesc": "Importa salidas desde URLs de suscripción remotas (vmess/vless/trojan/ss/...). Las etiquetas se mantienen estables para usarlas en balanceadores y reglas de enrutamiento. Las actualizaciones son automáticas.",
|
||||
"Balancers": "Equilibradores",
|
||||
"balancerTagRequired": "La etiqueta es obligatoria",
|
||||
"balancerSelectorRequired": "Elige al menos una salida",
|
||||
@@ -1512,9 +1387,7 @@
|
||||
"routeTesterMatchedOutbound": "Salida coincidente",
|
||||
"routeTesterViaBalancer": "vía balanceador",
|
||||
"routeTesterDefaultOutbound": "Ninguna regla de enrutamiento coincidió — el tráfico va a la salida predeterminada (primera).",
|
||||
"OutboundsDesc": "Cambia la plantilla de configuración para definir formas de salida para este servidor.",
|
||||
"Routings": "Reglas de enrutamiento",
|
||||
"RoutingsDesc": "¡La prioridad de cada regla es importante!",
|
||||
"completeTemplate": "Todo",
|
||||
"logLevel": "Nivel de registro",
|
||||
"logLevelDesc": "El nivel de registro para registros de errores, que indica la información que debe registrarse.",
|
||||
@@ -1528,13 +1401,9 @@
|
||||
"maskAddressDesc": "Máscara de dirección IP, cuando se habilita, reemplazará automáticamente la dirección IP que aparece en el registro.",
|
||||
"statistics": "Estadísticas",
|
||||
"statsInboundUplink": "Estadísticas de Subida de Entrada",
|
||||
"statsInboundUplinkDesc": "Habilita la recopilación de estadísticas para el tráfico ascendente de todos los proxies de entrada.",
|
||||
"statsInboundDownlink": "Estadísticas de Bajada de Entrada",
|
||||
"statsInboundDownlinkDesc": "Habilita la recopilación de estadísticas para el tráfico descendente de todos los proxies de entrada.",
|
||||
"statsOutboundUplink": "Estadísticas de Subida de Salida",
|
||||
"statsOutboundUplinkDesc": "Habilita la recopilación de estadísticas para el tráfico ascendente de todos los proxies de salida.",
|
||||
"statsOutboundDownlink": "Estadísticas de Bajada de Salida",
|
||||
"statsOutboundDownlinkDesc": "Habilita la recopilación de estadísticas para el tráfico descendente de todos los proxies de salida.",
|
||||
"connectionLimits": "Límites de conexión",
|
||||
"connectionLimitsDesc": "Políticas a nivel de conexión para el nivel de usuario 0. Deja un campo vacío para usar el valor predeterminado de Xray.",
|
||||
"connIdle": "Tiempo de inactividad",
|
||||
@@ -1552,18 +1421,10 @@
|
||||
"metricsListenDesc": "Expone las métricas estilo Prometheus de Xray en esta dirección:puerto (por ejemplo, 127.0.0.1:11111). Déjalo vacío para deshabilitarlo. Vincúlalo a localhost y ponlo tras un proxy inverso — no está autenticado.",
|
||||
"metricsTag": "Etiqueta de métricas",
|
||||
"rules": {
|
||||
"first": "Primero",
|
||||
"last": "Último",
|
||||
"up": "Arriba",
|
||||
"down": "Abajo",
|
||||
"source": "Fuente",
|
||||
"dest": "Destino",
|
||||
"inbound": "Entrante",
|
||||
"outbound": "Saliente",
|
||||
"balancer": "Equilibrador",
|
||||
"info": "Info",
|
||||
"add": "Agregar Regla",
|
||||
"edit": "Editar Regla",
|
||||
"useComma": "Elementos separados por comas"
|
||||
},
|
||||
"routing": {
|
||||
@@ -1604,7 +1465,6 @@
|
||||
"ruleN": "Regla {n}",
|
||||
"action": "Acción",
|
||||
"redirect": "Redirect",
|
||||
"fragment": "Fragment",
|
||||
"finalRules": "Reglas finales",
|
||||
"overrideXrayPrivateIp": "Sobrescribir el bloqueo de IP privada por defecto de Xray",
|
||||
"blockDelay": "Retraso de bloqueo (ms)",
|
||||
@@ -1630,43 +1490,17 @@
|
||||
"keepAliveInterval": "Intervalo keep alive",
|
||||
"markFwmark": "Mark (fwmark)",
|
||||
"interface": "Interfaz",
|
||||
"ipv6Only": "Solo IPv6",
|
||||
"acceptProxyProtocol": "Aceptar proxy protocol",
|
||||
"proxyProtocol": "Proxy protocol",
|
||||
"tcpUserTimeoutMs": "TCP user timeout (ms)",
|
||||
"tcpKeepAliveIdleS": "TCP keep-alive idle (s)"
|
||||
},
|
||||
"outbound": {
|
||||
"addOutbound": "Agregar salida",
|
||||
"addReverse": "Agregar reverso",
|
||||
"editOutbound": "Editar salida",
|
||||
"editReverse": "Editar reverso",
|
||||
"reverseTag": "Etiqueta Reverso",
|
||||
"reverseTagDesc": "Etiqueta de salida del proxy inverso simple VLESS. Dejar vacío para deshabilitar. Cuando se establece, las conexiones de este cliente pueden usarse como túnel de proxy inverso.",
|
||||
"reverseTagPlaceholder": "etiqueta de salida (vacío para deshabilitar)",
|
||||
"tag": "Etiqueta",
|
||||
"tagDesc": "etiqueta única",
|
||||
"address": "Dirección",
|
||||
"egress": "Egress",
|
||||
"egressHint": "Run an HTTP test to show egress IP and country.",
|
||||
"reverse": "Reverso",
|
||||
"domain": "Dominio",
|
||||
"type": "Tipo",
|
||||
"bridge": "Bridge",
|
||||
"portal": "Portal",
|
||||
"link": "Enlace",
|
||||
"intercon": "Interconexión",
|
||||
"settings": "Configuración",
|
||||
"accountInfo": "Información de la Cuenta",
|
||||
"outboundStatus": "Estado de Salida",
|
||||
"sendThrough": "Enviar a través de",
|
||||
"targetStrategy": "Estrategia de destino",
|
||||
"test": "Probar",
|
||||
"testResult": "Resultado de la prueba",
|
||||
"testing": "Probando conexión...",
|
||||
"testSuccess": "Prueba exitosa",
|
||||
"testFailed": "Prueba fallida",
|
||||
"testError": "Error al probar la salida",
|
||||
"modeRealDelay": "Retardo real",
|
||||
"testModeTooltip": "TCP: sonda rápida solo de dial. HTTP: petición completa a través de xray. Retardo real: tiempo total incluyendo el establecimiento de la conexión.",
|
||||
"testAll": "Probar todo",
|
||||
@@ -1674,14 +1508,10 @@
|
||||
"breakdownConnect": "Conexión al proxy",
|
||||
"breakdownTls": "TLS vía salida",
|
||||
"breakdownTtfb": "Primer byte",
|
||||
"nordvpn": "NordVPN",
|
||||
"accessToken": "Token de acceso",
|
||||
"country": "País",
|
||||
"server": "Servidor",
|
||||
"city": "Ciudad",
|
||||
"allCities": "Todas las ciudades",
|
||||
"privateKey": "Clave privada",
|
||||
"load": "Carga",
|
||||
"moveToTop": "Mover al principio"
|
||||
},
|
||||
"outboundSub": {
|
||||
@@ -1711,16 +1541,11 @@
|
||||
"active": "Suscripciones activas",
|
||||
"empty": "Aún no hay suscripciones. Añade una arriba.",
|
||||
"colRemark": "Notas",
|
||||
"colPrefix": "Prefijo",
|
||||
"colInterval": "Intervalo",
|
||||
"colLastFetch": "Última descarga",
|
||||
"colEnabled": "Habilitado",
|
||||
"auto": "auto",
|
||||
"never": "nunca",
|
||||
"yes": "Sí",
|
||||
"no": "No",
|
||||
"refreshNow": "Actualizar ahora",
|
||||
"lastError": "Último error",
|
||||
"deleteConfirm": "¿Eliminar esta suscripción?",
|
||||
"restartHint": "Después de añadir o actualizar, reinicia Xray (o espera a la próxima recarga automática) para activar las salidas.",
|
||||
"fromSubsTitle": "Desde suscripciones de salida (solo lectura)",
|
||||
@@ -1737,8 +1562,6 @@
|
||||
"tabBalancerSettings": "Ajustes del balanceador",
|
||||
"tabObservatory": "Observatorio",
|
||||
"observatory": {
|
||||
"title": "Observatorio",
|
||||
"burstTitle": "Observatorio Burst",
|
||||
"autoManaged": "Los observadores se gestionan automáticamente a partir de tus balanceadores. Ajusta abajo cómo sondean; las salidas vigiladas siguen los selectores del balanceador.",
|
||||
"emptyHint": "No hay ningún observador de conexión activo. Se añade uno automáticamente al crear un balanceador Least Ping o Least Load —o un balanceador Random / Round-robin con fallback— para que los balanceadores que usan observador puedan comprobar la salud de las salidas antes de elegir un destino.",
|
||||
"mixedLegacy": "Esta configuración contiene Observatory y Burst Observatory a la vez. Xray usa un único observador global, por lo que este estado mixto heredado no está soportado; al guardar balanceadores se normalizará a un solo observador.",
|
||||
@@ -1772,12 +1595,8 @@
|
||||
"balancerRemoved": "Balanceador {tag} — eliminado (sin destinos restantes)"
|
||||
},
|
||||
"balancer": {
|
||||
"addBalancer": "Agregar equilibrador",
|
||||
"editBalancer": "Editar balanceador",
|
||||
"balancerStrategy": "Estrategia",
|
||||
"balancerSelectors": "Selectores",
|
||||
"tag": "Etiqueta",
|
||||
"tagDesc": "etiqueta única",
|
||||
"tagDuplicate": "Etiqueta ya usada por otro balanceador",
|
||||
"tagPlaceholder": "etiqueta única de balanceador",
|
||||
"selector": "Selector",
|
||||
@@ -1789,7 +1608,6 @@
|
||||
"tolerance": "Tolerancia",
|
||||
"baselines": "Baselines",
|
||||
"costs": "Costs",
|
||||
"balancerDesc": "No es posible utilizar balancerTag y outboundTag al mismo tiempo. Si se utilizan al mismo tiempo, sólo funcionará outboundTag.",
|
||||
"costMatch": "Patrón de etiqueta",
|
||||
"costValue": "Peso",
|
||||
"costRegexp": "Coincidencia por expresión regular",
|
||||
@@ -1804,14 +1622,10 @@
|
||||
"publicKey": "Llave pública",
|
||||
"allowedIPs": "IP permitidas",
|
||||
"endpoint": "Punto final",
|
||||
"psk": "Clave precompartida",
|
||||
"domainStrategy": "Estrategia de dominio"
|
||||
},
|
||||
"tun": {
|
||||
"nameDesc": "El nombre de la interfaz TUN. El valor predeterminado es 'xray0'",
|
||||
"mtuDesc": "Unidad Máxima de Transmisión. El tamaño máximo de los paquetes de datos. El valor predeterminado es 1500",
|
||||
"userLevel": "Nivel de Usuario",
|
||||
"userLevelDesc": "Todas las conexiones realizadas a través de este entrada utilizarán este nivel de usuario. El valor predeterminado es 0"
|
||||
"userLevel": "Nivel de Usuario"
|
||||
},
|
||||
"nord": {
|
||||
"accessToken": "Access token",
|
||||
@@ -1896,7 +1710,6 @@
|
||||
},
|
||||
"fakedns": {
|
||||
"add": "Agregar DNS Falso",
|
||||
"edit": "Editar DNS Falso",
|
||||
"ipPool": "Subred del grupo de IP",
|
||||
"poolSize": "Tamaño del grupo"
|
||||
},
|
||||
@@ -2032,7 +1845,6 @@
|
||||
"add": "Añadir",
|
||||
"month": "Mes",
|
||||
"months": "Meses",
|
||||
"day": "Día",
|
||||
"days": "Días",
|
||||
"hours": "Horas",
|
||||
"minutes": "Minutos",
|
||||
@@ -2071,7 +1883,6 @@
|
||||
"userSaved": "✅ Usuario de Telegram guardado.",
|
||||
"loginSuccess": "✅ Has iniciado sesión en el panel con éxito.\r\n",
|
||||
"loginFailed": "❗️ Falló el inicio de sesión en el panel.\r\n",
|
||||
"2faFailed": "Error de 2FA",
|
||||
"report": "🕰 Informes programados: {{ .RunTime }}\r\n",
|
||||
"datetime": "⏰ Fecha y Hora: {{ .DateTime }}\r\n",
|
||||
"hostname": "💻 Host: {{ .Hostname }}\r\n",
|
||||
@@ -2104,7 +1915,6 @@
|
||||
"download": "🔽 Descarga: ↓{{ .Download }}\r\n",
|
||||
"total": "📊 Total: ↑↓{{ .UpDown }} / {{ .Total }}\r\n",
|
||||
"TGUser": "👤 Usuario de Telegram: {{ .TelegramID }}\r\n",
|
||||
"exhaustedMsg": "🚨 Agotado {{ .Type }}:\r\n",
|
||||
"exhaustedCount": "🚨 Cantidad de Agotados {{ .Type }}:\r\n",
|
||||
"onlinesCount": "🌐 Clientes en línea: {{ .Count }}\r\n",
|
||||
"disabled": "🛑 Desactivado: {{ .Disabled }}\r\n",
|
||||
@@ -2113,16 +1923,10 @@
|
||||
"refreshedOn": "\r\n📋🔄 Actualizado en: {{ .Time }}\r\n\r\n",
|
||||
"yes": "✅ Sí",
|
||||
"no": "❌ No",
|
||||
"received_id": "🔑📥 ID actualizado.",
|
||||
"received_password": "🔑📥 Contraseña actualizada.",
|
||||
"received_email": "📧📥 Correo electrónico actualizado.",
|
||||
"received_comment": "💬📥 Comentario actualizado.",
|
||||
"id_prompt": "🔑 ID predeterminado: {{ .ClientId }}\n\nIntroduce tu ID.",
|
||||
"pass_prompt": "🔑 Contraseña predeterminada: {{ .ClientPassword }}\n\nIntroduce tu contraseña.",
|
||||
"email_prompt": "📧 Correo electrónico predeterminado: {{ .ClientEmail }}\n\nIntroduce tu correo electrónico.",
|
||||
"comment_prompt": "💬 Comentario predeterminado: {{ .ClientComment }}\n\nIntroduce tu comentario.",
|
||||
"inbound_client_data_id": "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Correo: {{ .ClientEmail }}\n📊 Tráfico: {{ .ClientTraffic }}\n📅 Fecha de expiración: {{ .ClientExp }}\n🌐 Límite de IP: {{ .IpLimit }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Ahora puedes agregar al cliente a la entrada!",
|
||||
"inbound_client_data_pass": "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 Contraseña: {{ .ClientPass }}\n📧 Correo: {{ .ClientEmail }}\n📊 Tráfico: {{ .ClientTraffic }}\n📅 Fecha de expiración: {{ .ClientExp }}\n🌐 Límite de IP: {{ .IpLimit }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Ahora puedes agregar al cliente a la entrada!",
|
||||
"cancel": "❌ ¡Proceso cancelado! \n\nPuedes /start de nuevo en cualquier momento. 🔄",
|
||||
"error_add_client": "⚠️ Error:\n\n {{ .error }}",
|
||||
"using_default_value": "Está bien, me quedaré con el valor predeterminado. 😊",
|
||||
@@ -2139,8 +1943,6 @@
|
||||
"eventXrayCrashError": "Error: {{ .Error }}",
|
||||
"eventNodeDown": "El nodo {{ .Name }} está CAÍDO",
|
||||
"eventNodeUp": "El nodo {{ .Name }} está ACTIVO",
|
||||
"eventCPUHigh": "CPU alta",
|
||||
"eventCPUHighDetail": "CPU: {{ .Detail }}",
|
||||
"eventLoginFallback": "Inicio de sesión fallido desde {{ .Source }}",
|
||||
"memoryThreshold": "Uso de memoria {{ .Percent }}% supera el umbral de {{ .Threshold }}%"
|
||||
},
|
||||
@@ -2181,11 +1983,8 @@
|
||||
"submitDisable": "Enviar como deshabilitado ☑️",
|
||||
"submitEnable": "Enviar como habilitado ✅",
|
||||
"use_default": "🏷️ Usar por defecto",
|
||||
"change_id": "⚙️🔑 ID",
|
||||
"change_password": "⚙️🔑 Contraseña",
|
||||
"change_email": "⚙️📧 Email",
|
||||
"change_comment": "⚙️💬 Comentario",
|
||||
"change_flow": "⚙️🚦 Flow",
|
||||
"ResetAllTraffics": "Reiniciar todo el tráfico",
|
||||
"SortedTrafficUsageReport": "Informe de uso de tráfico ordenado"
|
||||
},
|
||||
@@ -2214,31 +2013,16 @@
|
||||
}
|
||||
},
|
||||
"email": {
|
||||
"subjectOutboundDown": "El saliente {{ .Tag }} está CAÍDO",
|
||||
"subjectOutboundUp": "El saliente {{ .Tag }} está ACTIVO",
|
||||
"subjectXrayCrash": "Xray se ha BLOQUEADO",
|
||||
"subjectCPUHigh": "CPU alta",
|
||||
"subjectLoginSuccess": "Inicio de sesión correcto",
|
||||
"subjectLoginFailed": "Inicio de sesión fallido",
|
||||
"titleOutboundDown": "Saliente CAÍDO",
|
||||
"titleOutboundUp": "Saliente ACTIVO",
|
||||
"titleXrayCrash": "Xray se ha BLOQUEADO",
|
||||
"titleCPUHigh": "CPU alta",
|
||||
"titleLoginSuccess": "Inicio de sesión correcto",
|
||||
"titleLoginFailed": "Inicio de sesión fallido",
|
||||
"labelStatus": "Estado",
|
||||
"labelOutbound": "Saliente",
|
||||
"labelNode": "Nodo",
|
||||
"labelError": "Error",
|
||||
"labelDelay": "Retardo",
|
||||
"labelDetail": "Detalle",
|
||||
"labelUsername": "Usuario",
|
||||
"labelIP": "IP",
|
||||
"labelReason": "Motivo",
|
||||
"labelSource": "Origen",
|
||||
"labelTime": "Hora",
|
||||
"statusCrashed": "BLOQUEADO",
|
||||
"statusRunning": "En ejecución",
|
||||
"statusHigh": "ALTA",
|
||||
"statusSuccess": "CORRECTO",
|
||||
"statusFailed": "FALLIDO",
|
||||
|
||||
Reference in New Issue
Block a user