Initial commit: OAuth IAM Laravel application

Laravel-based OAuth/IAM service with Passport, Vue 3 frontend, and
Docker Compose setup for local and production deployment.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-26 01:02:41 +02:00
commit c2b5291a74
174 changed files with 29318 additions and 0 deletions

208
resources/js/i18n/es.ts Normal file
View File

@@ -0,0 +1,208 @@
const es = {
nav: {
dashboard: 'Dashboard',
clients: 'Clientes OAuth',
tokens: 'Personal Access Tokens',
authorizedApps: 'Apps autorizadas',
users: 'Usuarios',
analytics: 'Analíticas',
apiDocs: 'API Docs',
logout: 'Salir',
},
common: {
loading: 'Cargando…',
creating: 'Creando…',
create: 'Crear',
save: 'Guardar',
cancel: 'Cancelar',
close: 'Cerrar',
edit: 'Editar',
delete: 'Borrar',
none: '(ninguno)',
},
login: {
title: 'Ingresar',
subtitle: 'Servidor OAuth2 — panel de administración.',
email: 'Email',
password: 'Contraseña',
submit: 'Ingresar',
submitting: 'Ingresando…',
noAccount: '¿No tenés cuenta?',
signUp: 'Registrate',
invalidCredentials: 'Credenciales inválidas.',
},
register: {
title: 'Crear cuenta',
name: 'Nombre',
email: 'Email',
password: 'Contraseña',
passwordConfirm: 'Confirmar contraseña',
submit: 'Crear cuenta',
submitFirstUser: 'Crear cuenta de administrador',
submitting: 'Creando…',
haveAccount: '¿Ya tenés cuenta?',
signIn: 'Ingresá',
firstUserBanner: 'Todavía no hay ningún usuario. Esta cuenta va a quedar como administradora, con acceso inmediato (sin aprobación).',
pendingTitle: 'Cuenta creada',
pendingBody: 'Un administrador tiene que aprobar tu cuenta antes de que puedas ingresar. Te va a poder avisar por fuera de la app cuando esté lista.',
backToLogin: 'Volver a ingresar',
},
dashboard: {
greeting: 'Hola, {name}',
subtitle: 'Este es el panel de administración del servidor OAuth2.',
clientsTitle: 'Clientes OAuth',
clientsDesc: 'Registrá apps (Authorization Code+PKCE, Client Credentials o Password Grant).',
tokensTitle: 'Personal Access Tokens',
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.',
usersTitle: 'Usuarios',
usersDesc: 'Alta, edición de rol/estado y baja de cuentas (solo admins).',
analyticsTitle: 'Analíticas',
analyticsDesc: 'Sesiones activas, logins por app y usuarios más activos (solo admins).',
apiTitle: 'API REST',
apiDesc: 'Este servidor expone el recurso {resource} (scopes {read}/{write}) para que aplicaciones de terceros gestionen usuarios vía OAuth2. Requiere un access token de Passport. Documentación interactiva en {link}.',
},
clients: {
title: 'Clientes OAuth',
subtitle: 'Apps registradas que pueden pedir tokens a este servidor.',
secretWarning: 'Guardá este client secret ahora, no se puede volver a ver:',
clientIdLabel: 'client_id:',
clientSecretLabel: 'client_secret:',
newClient: 'Nuevo cliente',
name: 'Nombre',
grantType: 'Grant type',
grantAuthCode: 'Authorization Code + PKCE',
grantClientCredentials: 'Client Credentials',
grantPassword: 'Password Grant',
redirectUris: 'Redirect URIs (separadas por coma)',
confidentialLabel: 'Cliente confidencial (con secret). Desmarcá para un cliente público que solo use PKCE.',
create: 'Crear cliente',
empty: 'Todavía no creaste ningún cliente.',
revoke: 'Revocar',
revokeConfirm: '¿Revocar el cliente "{name}"? Sus tokens dejarán de funcionar.',
clientIdShort: 'client_id',
redirectLabel: 'redirect',
},
tokens: {
title: 'Personal Access Tokens',
subtitle: 'Tokens de acceso directo a la API, sin pasar por el flujo de authorize (tipo API key).',
tokenWarning: 'Guardá este token ahora, no se puede volver a ver:',
newToken: 'Nuevo token',
name: 'Nombre',
namePlaceholder: 'Mi script',
scopes: 'Scopes',
create: 'Crear token',
empty: 'Todavía no creaste ningún token.',
revoke: 'Revocar',
revokeConfirm: '¿Revocar el token "{name}"?',
scopesLabel: 'scopes',
},
authorizedApps: {
title: 'Apps autorizadas',
subtitle: 'Aplicaciones de terceros a las que le diste acceso a tu cuenta.',
empty: 'No autorizaste ninguna app todavía.',
revoke: 'Revocar acceso',
revokeConfirm: '¿Revocar el acceso de "{name}"?',
scopesLabel: 'scopes',
},
authorize: {
title: 'Autorizar aplicación',
wantsAccess: '{client} quiere acceder a tu cuenta ({email}) con los siguientes permisos:',
noScopes: 'No solicita permisos adicionales (acceso básico).',
approve: 'Autorizar',
cancel: 'Cancelar',
notFoundTitle: 'Solicitud no encontrada',
notFoundBody: 'Esta pantalla solo funciona cuando llegás acá redirigido por una aplicación cliente vía {path}. Volvé a intentar desde esa app.',
goDashboard: 'Ir al dashboard',
},
adminUsers: {
title: 'Usuarios',
subtitle: 'Alta, edición de rol/estado y baja de cuentas.',
newUser: 'Nuevo usuario',
name: 'Nombre',
email: 'Email',
password: 'Contraseña',
role: 'Rol',
roleUser: 'Usuario',
roleAdmin: 'Admin',
create: 'Crear usuario',
colName: 'Nombre',
colEmail: 'Email',
colRole: 'Rol',
colStatus: 'Estado',
active: 'Activo',
inactive: 'Desactivado',
noRole: '(sin rol)',
edit: 'Editar',
delete: 'Borrar',
deleteConfirm: '¿Borrar al usuario "{name}"? Va a la papelera y se puede restaurar.',
deleteFailed: 'No se pudo borrar el usuario.',
newPassword: 'Nueva contraseña',
noChange: '(sin cambios)',
save: 'Guardar',
cancel: 'Cancelar',
appRolesTitle: 'Roles por app',
appRolesDesc: 'El rol global de arriba manda en este panel. Acá se define qué rol tiene {name} dentro de cada app cuando esa app pide su usuario por API.',
noAppRoles: 'Sin roles asignados en ninguna app todavía.',
chooseApp: 'Elegir app…',
assign: 'Asignar',
assignFailed: 'No se pudo asignar el rol.',
trashTitle: 'Papelera',
viewTrash: 'Ver papelera',
viewActive: 'Ver activos',
trashEmpty: 'No hay usuarios borrados.',
deletedAt: 'Borrado el {date}',
restore: 'Restaurar',
restoreFailed: 'No se pudo restaurar el usuario.',
forceDelete: 'Borrar definitivamente',
forceDeleteConfirm: '¿Borrar definitivamente a "{name}"? Esta acción no se puede deshacer.',
forceDeleteFailed: 'No se pudo borrar definitivamente.',
pendingTitle: 'Pendientes',
viewPending: 'Pendientes',
pendingEmpty: 'No hay registros pendientes de aprobación.',
registeredAt: 'Se registró el {date}',
approve: 'Aprobar',
approveFailed: 'No se pudo aprobar el usuario.',
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.',
},
analytics: {
title: 'Analíticas',
subtitle: 'Sesiones, logins por app y actividad de usuarios.',
last7: 'Últimos 7 días',
last30: 'Últimos 30 días',
last90: 'Últimos 90 días',
totalUsers: 'Usuarios totales',
activeSessions: 'Sesiones activas',
activeSessionsHint: 'tokens OAuth vigentes',
loginsToday: 'Logins hoy',
logins7d: 'Logins últimos 7 días',
loginsByDay: 'Logins por día',
appsOAuth: 'Apps (OAuth)',
panelAdmin: 'Panel admin',
loginsByApp: 'Logins por app',
topUsers: 'Usuarios más activos',
noAppLogins: 'Todavía no hay logins de apps en este período.',
noUserActivity: 'Todavía no hay actividad en este período.',
recentActivity: 'Actividad reciente',
hide: 'Ocultar',
viewAll: 'Ver todo',
colUser: 'Usuario',
colApp: 'App',
colType: 'Tipo',
colIp: 'IP',
colWhen: 'Cuándo',
serviceNoUser: '(servicio, sin usuario)',
deletedApp: '(app borrada)',
recentCount: '{count} eventos recientes — click en "Ver todo" para la tabla completa.',
chartAriaLabel: 'Logins por día, apilado por tipo',
tooltipAppLabel: 'Apps (OAuth):',
tooltipSessionLabel: 'Panel admin:',
barAriaLabel: '{date}: {oauth} logins de apps, {session} al panel admin',
},
};
export default es;
export type MessageSchema = typeof es;