new funcionality

This commit is contained in:
2026-07-27 17:20:02 +02:00
parent c2b5291a74
commit c5ce8a7a36
101 changed files with 6889 additions and 176 deletions

View File

@@ -4,8 +4,10 @@ const es = {
clients: 'Clientes OAuth',
tokens: 'Personal Access Tokens',
authorizedApps: 'Apps autorizadas',
security: 'Seguridad',
users: 'Usuarios',
analytics: 'Analíticas',
auditLog: 'Audit log',
apiDocs: 'API Docs',
logout: 'Salir',
},
@@ -30,6 +32,34 @@ const es = {
noAccount: '¿No tenés cuenta?',
signUp: 'Registrate',
invalidCredentials: 'Credenciales inválidas.',
twoFactorTitle: 'Verificación en dos pasos',
twoFactorSubtitle: 'Ingresá el código de tu app autenticadora (o un código de recuperación).',
twoFactorCode: 'Código',
twoFactorSubmit: 'Verificar',
invalidTwoFactorCode: 'Código inválido.',
backToLogin: 'Volver a ingresar',
forgotPassword: '¿Olvidaste tu contraseña?',
},
forgotPassword: {
title: 'Restablecer contraseña',
subtitle: 'Ingresá tu email y te mandamos un enlace para elegir una contraseña nueva.',
email: 'Email',
submit: 'Enviar enlace',
submitting: 'Enviando…',
sent: 'Si existe una cuenta con ese email, te enviamos un enlace para restablecer la contraseña. Revisá tu bandeja de entrada.',
backToLogin: 'Volver a ingresar',
},
resetPassword: {
title: 'Elegí una contraseña nueva',
subtitle: 'Ya casi — confirmá la contraseña nueva para tu cuenta.',
password: 'Contraseña nueva',
passwordConfirm: 'Confirmar contraseña',
submit: 'Restablecer contraseña',
submitting: 'Restableciendo…',
success: 'Tu contraseña se restableció. Ya podés ingresar con la nueva — cerramos las sesiones activas por seguridad.',
goToLogin: 'Ir a ingresar',
invalidLink: 'Este enlace es inválido o venció. Pedí uno nuevo.',
missingParams: 'Falta información en el enlace. Pedí uno nuevo desde "¿Olvidaste tu contraseña?".',
},
register: {
title: 'Crear cuenta',
@@ -56,6 +86,8 @@ const es = {
tokensDesc: 'Generá tokens de acceso directo a la API, como API keys.',
appsTitle: 'Apps autorizadas',
appsDesc: 'Apps de terceros a las que le diste acceso a tu cuenta.',
securityTitle: 'Seguridad',
securityDesc: 'Activá verificación en dos pasos (2FA) para tu cuenta.',
usersTitle: 'Usuarios',
usersDesc: 'Alta, edición de rol/estado y baja de cuentas (solo admins).',
analyticsTitle: 'Analíticas',
@@ -83,6 +115,32 @@ const es = {
revokeConfirm: '¿Revocar el cliente "{name}"? Sus tokens dejarán de funcionar.',
clientIdShort: 'client_id',
redirectLabel: 'redirect',
webhooksTitle: 'Webhooks',
hideWebhooks: 'Ocultar webhooks',
webhooksDesc: 'Notificaciones salientes a tu app cuando pasa algo relevante — sin tener que hacer polling.',
webhookSecretWarning: 'Guardá este secret ahora, no se puede volver a ver. Usalo para verificar la firma HMAC-SHA256 en el header X-Webhook-Signature.',
webhookSecretLabel: 'secret:',
webhookPaused: 'pausado',
lastDelivery: 'último envío',
pending: 'pendiente',
pause: 'Pausar',
resume: 'Reanudar',
viewHistory: 'Ver historial',
hideHistory: 'Ocultar historial',
noDeliveries: 'Todavía no hubo entregas para este webhook.',
attempts: 'intentos: {count}',
retryDelivery: 'Reintentar',
retrying: 'Reintentando…',
noWebhooks: 'Todavía no registraste ningún webhook para esta app.',
webhookUrl: 'URL del webhook',
addWebhook: 'Agregar webhook',
webhookDeleteConfirm: '¿Borrar el webhook "{url}"?',
eventTokenRevoked: 'Token revocado',
eventUserDeactivated: 'Usuario desactivado',
rotateSecret: 'Rotar secret',
rotateSecretConfirm: '¿Rotar el secret de "{name}"? El secret actual va a seguir funcionando 48 horas más para no cortar integraciones que todavía no se actualizaron.',
rotateSecretFailed: 'No se pudo rotar el secret.',
previousSecretStillValid: 'El secret anterior sigue siendo válido hasta el {date}.',
},
tokens: {
title: 'Personal Access Tokens',
@@ -167,6 +225,14 @@ const es = {
reject: 'Rechazar',
rejectConfirm: '¿Rechazar el registro de "{name}"? Va a la papelera y se puede restaurar después.',
rejectFailed: 'No se pudo rechazar el registro.',
sessionsTitle: 'Sesiones activas',
sessionsDesc: 'Tokens OAuth vigentes de este usuario — apps con acceso a su cuenta ahora mismo.',
noSessions: 'No hay sesiones activas.',
sessionUnknownClient: '(app borrada)',
revokeSession: 'Revocar',
revokeSessionConfirm: '¿Revocar la sesión de "{name}"? Esa app va a dejar de tener acceso.',
revokeAllSessions: 'Cerrar todas',
revokeAllSessionsConfirm: '¿Cerrar todas las sesiones activas de "{name}"? Todos sus tokens OAuth van a quedar revocados.',
},
analytics: {
title: 'Analíticas',
@@ -174,6 +240,7 @@ const es = {
last7: 'Últimos 7 días',
last30: 'Últimos 30 días',
last90: 'Últimos 90 días',
exportPdf: 'Exportar PDF',
totalUsers: 'Usuarios totales',
activeSessions: 'Sesiones activas',
activeSessionsHint: 'tokens OAuth vigentes',
@@ -201,6 +268,86 @@ const es = {
tooltipAppLabel: 'Apps (OAuth):',
tooltipSessionLabel: 'Panel admin:',
barAriaLabel: '{date}: {oauth} logins de apps, {session} al panel admin',
loginFailureRate: 'Tasa de fallos de login',
loginFailureRateHint: '{count} fallidos en 7 días',
oauthApprovalRate: 'Tasa de aprobación OAuth',
oauthApprovalRateHint: '{approved}/{attempted} en el período',
funnelTitle: 'Funnel de autorización OAuth',
funnelEmpty: 'Todavía no hay intentos de autorización en este período.',
colClient: 'Cliente',
colAttempted: 'Intentos',
colApproved: 'Aprobados',
colDenied: 'Denegados',
colApprovalRate: 'Aprobación',
activeTokensByClient: 'Tokens activos por cliente',
noActiveTokens: 'No hay tokens activos por ahora.',
scopeUsageTitle: 'Uso de scopes',
noScopeUsage: 'Todavía no se otorgó ningún scope en este período.',
},
auditLog: {
title: 'Audit log',
subtitle: 'Cambios de permisos, altas/bajas de usuarios y clientes OAuth.',
allSubjects: 'Todos los sujetos',
subjectUser: 'Usuarios',
subjectClient: 'Clientes OAuth',
allActions: 'Todas las acciones',
empty: 'Todavía no hay eventos registrados.',
colWhen: 'Cuándo',
colActor: 'Quién',
colAction: 'Acción',
colSubject: 'Sujeto',
colDetails: 'Detalles',
colIp: 'IP',
systemActor: '(sistema)',
fieldChanged: '{field} cambiada',
prevPage: 'Anterior',
nextPage: 'Siguiente',
pageInfo: 'Página {page} de {lastPage} — {total} eventos',
actions: {
userCreated: 'Usuario creado',
userUpdated: 'Usuario editado',
userDeleted: 'Usuario borrado',
userRestored: 'Usuario restaurado',
userForceDeleted: 'Usuario borrado definitivamente',
userApproved: 'Usuario aprobado',
appRoleAssigned: 'Rol por app asignado',
appRoleRevoked: 'Rol por app revocado',
clientCreated: 'Cliente OAuth creado',
clientRevoked: 'Cliente OAuth revocado',
twoFactorEnabled: '2FA activado',
twoFactorDisabled: '2FA desactivado',
twoFactorRecoveryRegenerated: 'Códigos de recuperación regenerados',
sessionRevoked: 'Sesión revocada',
sessionsRevokedAll: 'Todas las sesiones cerradas',
webhookCreated: 'Webhook creado',
webhookDeleted: 'Webhook borrado',
secretRotated: 'Secret rotado',
passwordReset: 'Contraseña restablecida',
},
},
security: {
title: 'Seguridad',
subtitle: 'Verificación en dos pasos (2FA) para tu cuenta.',
enabled: '2FA activo',
enabledDesc: 'Tu cuenta pide un código de tu app autenticadora cada vez que iniciás sesión.',
disabled: '2FA desactivado',
disabledDesc: 'Agregá una capa extra de seguridad: un código de tu teléfono además de la contraseña.',
enable: 'Activar 2FA',
disable: 'Desactivar',
disableConfirm: 'Confirmar desactivación',
regenerateCodes: 'Regenerar códigos de recuperación',
confirmPassword: 'Confirmá tu contraseña',
confirm: 'Confirmar',
setupTitle: 'Escaneá el código QR',
setupDesc: 'Usá Google Authenticator, Authy o cualquier app compatible con TOTP.',
manualEntry: '¿No podés escanear? Ingresá este código a mano:',
enterCode: 'Código de 6 dígitos',
invalidCode: 'Código inválido. Probá de nuevo.',
invalidPassword: 'Contraseña incorrecta.',
setupFailed: 'No se pudo iniciar la activación de 2FA.',
qrAlt: 'Código QR para configurar 2FA',
recoveryCodesTitle: 'Guardá estos códigos de recuperación',
recoveryCodesWarning: 'Cada uno sirve una sola vez. Usalos si perdés acceso a tu app autenticadora. No se van a volver a mostrar.',
},
};