const es: Record = { // Common 'common.save': 'Guardar', 'common.cancel': 'Cancelar', 'common.delete': 'Eliminar', 'common.edit': 'Editar', 'common.add': 'Añadir', 'common.loading': 'Cargando...', 'common.import': 'Importar', 'common.error': 'Error', 'common.back': 'Atrás', 'common.all': 'Todo', 'common.close': 'Cerrar', 'common.open': 'Abrir', 'common.upload': 'Subir', 'common.search': 'Buscar', 'common.confirm': 'Confirmar', 'common.ok': 'Aceptar', 'common.yes': 'Sí', 'common.no': 'No', 'common.or': 'o', 'common.none': 'Ninguno', 'common.date': 'Fecha', 'common.rename': 'Renombrar', 'common.name': 'Nombre', 'common.email': 'Correo', 'common.password': 'Contraseña', 'common.saving': 'Guardando...', 'common.saved': 'Guardado', 'trips.reminder': 'Recordatorio', 'trips.reminderNone': 'Ninguno', 'trips.reminderDay': 'día', 'trips.reminderDays': 'días', 'trips.reminderCustom': 'Personalizado', 'trips.reminderDaysBefore': 'días antes de la salida', 'trips.reminderDisabledHint': 'Los recordatorios de viaje están desactivados. Actívalos en Admin > Configuración > Notificaciones.', 'common.update': 'Actualizar', 'common.change': 'Cambiar', 'common.uploading': 'Subiendo…', 'common.backToPlanning': 'Volver a la planificación', 'common.reset': 'Restablecer', // Navbar 'nav.trip': 'Viaje', 'nav.share': 'Compartir', 'nav.settings': 'Ajustes', 'nav.admin': 'Administración', 'nav.logout': 'Cerrar sesión', 'nav.lightMode': 'Modo claro', 'nav.darkMode': 'Modo oscuro', 'nav.autoMode': 'Modo automático', 'nav.administrator': 'Administrador', 'nav.myTrips': 'Mis viajes', // Dashboard 'dashboard.title': 'Mis viajes', 'dashboard.subtitle.loading': 'Cargando viajes...', 'dashboard.subtitle.trips': '{count} viajes ({archived} archivados)', 'dashboard.subtitle.empty': 'Empieza tu primer viaje', 'dashboard.subtitle.activeOne': '{count} viaje activo', 'dashboard.subtitle.activeMany': '{count} viajes activos', 'dashboard.subtitle.archivedSuffix': ' · {count} archivados', 'dashboard.newTrip': 'Nuevo viaje', 'dashboard.gridView': 'Vista de cuadrícula', 'dashboard.listView': 'Vista de lista', 'dashboard.currency': 'Divisa', 'dashboard.timezone': 'Zonas horarias', 'dashboard.localTime': 'Hora local', 'dashboard.timezoneCustomTitle': 'Zona horaria personalizada', 'dashboard.timezoneCustomLabelPlaceholder': 'Nombre (opcional)', 'dashboard.timezoneCustomTzPlaceholder': 'ej. America/New_York', 'dashboard.timezoneCustomAdd': 'Añadir', 'dashboard.timezoneCustomErrorEmpty': 'Introduce una zona horaria', 'dashboard.timezoneCustomErrorInvalid': 'Zona horaria no válida. Usa formato como Europe/Madrid', 'dashboard.timezoneCustomErrorDuplicate': 'Ya añadida', 'dashboard.emptyTitle': 'Aún no hay viajes', 'dashboard.emptyText': 'Crea tu primer viaje y empieza a planificar', 'dashboard.emptyButton': 'Crear primer viaje', 'dashboard.nextTrip': 'Próximo viaje', 'dashboard.shared': 'Compartido', 'dashboard.sharedBy': 'Compartido por {name}', 'dashboard.days': 'Días', 'dashboard.places': 'Lugares', 'dashboard.members': 'Compañeros de viaje', 'dashboard.archive': 'Archivar', 'dashboard.copyTrip': 'Copiar', 'dashboard.copySuffix': 'copia', 'dashboard.restore': 'Restaurar', 'dashboard.archived': 'Archivado', 'dashboard.status.ongoing': 'En curso', 'dashboard.status.today': 'Hoy', 'dashboard.status.tomorrow': 'Mañana', 'dashboard.status.past': 'Pasado', 'dashboard.status.daysLeft': 'Quedan {count} días', 'dashboard.toast.loadError': 'No se pudieron cargar los viajes', 'dashboard.toast.created': '¡Viaje creado correctamente!', 'dashboard.toast.createError': 'No se pudo crear el viaje', 'dashboard.toast.updated': '¡Viaje actualizado!', 'dashboard.toast.updateError': 'No se pudo actualizar el viaje', 'dashboard.toast.deleted': 'Viaje eliminado', 'dashboard.toast.deleteError': 'No se pudo eliminar el viaje', 'dashboard.toast.archived': 'Viaje archivado', 'dashboard.toast.archiveError': 'No se pudo archivar el viaje', 'dashboard.toast.restored': 'Viaje restaurado', 'dashboard.toast.restoreError': 'No se pudo restaurar el viaje', 'dashboard.toast.copied': '¡Viaje copiado!', 'dashboard.toast.copyError': 'No se pudo copiar el viaje', 'dashboard.confirm.delete': '¿Eliminar el viaje "{title}"? Todos los lugares y planes se borrarán permanentemente.', 'dashboard.editTrip': 'Editar viaje', 'dashboard.createTrip': 'Crear nuevo viaje', 'dashboard.tripTitle': 'Título', 'dashboard.tripTitlePlaceholder': 'p. ej. Verano en Japón', 'dashboard.tripDescription': 'Descripción', 'dashboard.tripDescriptionPlaceholder': '¿De qué trata este viaje?', 'dashboard.startDate': 'Fecha de inicio', 'dashboard.endDate': 'Fecha de fin', 'dashboard.dayCount': 'Número de días', 'dashboard.dayCountHint': 'Cuántos días planificar cuando no se han establecido fechas de viaje.', 'dashboard.noDateHint': 'Sin fecha definida: se crearán 7 días por defecto. Puedes cambiarlo cuando quieras.', 'dashboard.coverImage': 'Imagen de portada', 'dashboard.addCoverImage': 'Añadir imagen de portada', 'dashboard.addMembers': 'Compañeros de viaje', 'dashboard.addMember': 'Añadir miembro', 'dashboard.coverSaved': 'Imagen de portada guardada', 'dashboard.coverUploadError': 'Error al subir la imagen', 'dashboard.coverRemoveError': 'Error al eliminar la imagen', 'dashboard.titleRequired': 'El título es obligatorio', 'dashboard.endDateError': 'La fecha de fin debe ser posterior a la de inicio', // Settings 'settings.title': 'Ajustes', 'settings.subtitle': 'Configura tus ajustes personales', 'settings.tabs.display': 'Pantalla', 'settings.tabs.map': 'Mapa', 'settings.tabs.notifications': 'Notificaciones', 'settings.tabs.integrations': 'Integraciones', 'settings.tabs.account': 'Cuenta', 'settings.tabs.about': 'Acerca de', 'settings.map': 'Mapa', 'settings.mapTemplate': 'Plantilla del mapa', 'settings.mapTemplatePlaceholder.select': 'Seleccionar plantilla...', 'settings.mapDefaultHint': 'Déjalo vacío para OpenStreetMap (por defecto)', 'settings.mapTemplatePlaceholder': 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', 'settings.mapHint': 'Plantilla de URL para los mosaicos del mapa', 'settings.latitude': 'Latitud', 'settings.longitude': 'Longitud', 'settings.saveMap': 'Guardar mapa', 'settings.apiKeys': 'Claves API', 'settings.mapsKey': 'Clave API de Google Maps', 'settings.mapsKeyHint': 'Necesaria para buscar lugares. Consíguela en console.cloud.google.com', 'settings.weatherKey': 'Clave API de OpenWeatherMap', 'settings.weatherKeyHint': 'Para datos meteorológicos. Gratis en openweathermap.org/api', 'settings.keyPlaceholder': 'Introduce la clave...', 'settings.configured': 'Configurado', 'settings.saveKeys': 'Guardar claves', 'settings.display': 'Visualización', 'settings.colorMode': 'Modo de color', 'settings.light': 'Claro', 'settings.dark': 'Oscuro', 'settings.auto': 'Automático', 'settings.language': 'Idioma', 'settings.temperature': 'Unidad de temperatura', 'settings.timeFormat': 'Formato de hora', 'settings.routeCalculation': 'Cálculo de ruta', 'settings.blurBookingCodes': 'Difuminar códigos de reserva', 'settings.notifications': 'Notificaciones', 'settings.notifyTripInvite': 'Invitaciones de viaje', 'settings.notifyBookingChange': 'Cambios en reservas', 'settings.notifyTripReminder': 'Recordatorios de viaje', 'settings.notifyVacayInvite': 'Invitaciones de fusión Vacay', 'settings.notifyPhotosShared': 'Fotos compartidas (Immich)', 'settings.notifyCollabMessage': 'Mensajes de chat (Collab)', 'settings.notifyPackingTagged': 'Lista de equipaje: asignaciones', 'settings.notifyWebhook': 'Notificaciones webhook', 'settings.notificationsDisabled': 'Las notificaciones no están configuradas. Pida a un administrador que active las notificaciones por correo o webhook.', 'settings.notificationsActive': 'Canal activo', 'settings.notificationsManagedByAdmin': 'Los eventos de notificación son configurados por el administrador.', 'admin.notifications.title': 'Notificaciones', 'admin.notifications.hint': 'Elija un canal de notificación. Solo uno puede estar activo a la vez.', 'admin.notifications.none': 'Desactivado', 'admin.notifications.email': 'Correo (SMTP)', 'admin.notifications.webhook': 'Webhook', 'admin.notifications.events': 'Eventos de notificación', 'admin.notifications.eventsHint': 'Elige qué eventos activan notificaciones para todos los usuarios.', 'admin.notifications.configureFirst': 'Configura primero los ajustes SMTP o webhook a continuación, luego activa los eventos.', 'admin.notifications.save': 'Guardar configuración de notificaciones', 'admin.notifications.saved': 'Configuración de notificaciones guardada', 'admin.notifications.testWebhook': 'Enviar webhook de prueba', 'admin.notifications.testWebhookSuccess': 'Webhook de prueba enviado correctamente', 'admin.notifications.testWebhookFailed': 'Error al enviar webhook de prueba', 'admin.smtp.title': 'Correo y notificaciones', 'admin.smtp.hint': 'Configuración SMTP para el envío de notificaciones por correo.', 'admin.smtp.testButton': 'Enviar correo de prueba', 'admin.webhook.hint': 'Enviar notificaciones a un webhook externo (Discord, Slack, etc.).', 'admin.smtp.testSuccess': 'Correo de prueba enviado correctamente', 'admin.smtp.testFailed': 'Error al enviar correo de prueba', 'dayplan.icsTooltip': 'Exportar calendario (ICS)', 'share.linkTitle': 'Enlace público', 'share.linkHint': 'Crea un enlace que cualquiera puede usar para ver este viaje sin iniciar sesión. Solo lectura — no se puede editar.', 'share.createLink': 'Crear enlace', 'share.deleteLink': 'Eliminar enlace', 'share.createError': 'No se pudo crear el enlace', 'common.copy': 'Copiar', 'common.copied': 'Copiado', 'share.permMap': 'Mapa y plan', 'share.permBookings': 'Reservas', 'share.permPacking': 'Equipaje', 'shared.expired': 'Enlace expirado o inválido', 'shared.expiredHint': 'Este enlace de viaje compartido ya no está activo.', 'shared.readOnly': 'Vista de solo lectura', 'shared.tabPlan': 'Plan', 'shared.tabBookings': 'Reservas', 'shared.tabPacking': 'Equipaje', 'shared.tabBudget': 'Presupuesto', 'shared.tabChat': 'Chat', 'shared.days': 'días', 'shared.places': 'lugares', 'shared.other': 'Otro', 'shared.totalBudget': 'Presupuesto total', 'shared.messages': 'mensajes', 'shared.sharedVia': 'Compartido vía', 'shared.confirmed': 'Confirmado', 'shared.pending': 'Pendiente', 'share.permBudget': 'Presupuesto', 'share.permCollab': 'Chat', 'settings.on': 'Activado', 'settings.off': 'Desactivado', 'settings.mcp.title': 'Configuración MCP', 'settings.mcp.endpoint': 'Endpoint MCP', 'settings.mcp.clientConfig': 'Configuración del cliente', 'settings.mcp.clientConfigHint': 'Reemplaza con un token de la lista de abajo. Es posible que debas ajustar la ruta de npx según tu sistema (p. ej. C:\\PROGRA~1\\nodejs\\npx.cmd en Windows).', 'settings.mcp.copy': 'Copiar', 'settings.mcp.copied': '¡Copiado!', 'settings.mcp.apiTokens': 'Tokens de API', 'settings.mcp.createToken': 'Crear nuevo token', 'settings.mcp.noTokens': 'Sin tokens aún. Crea uno para conectar clientes MCP.', 'settings.mcp.tokenCreatedAt': 'Creado', 'settings.mcp.tokenUsedAt': 'Usado', 'settings.mcp.deleteTokenTitle': 'Eliminar token', 'settings.mcp.deleteTokenMessage': 'Este token dejará de funcionar de inmediato. Cualquier cliente MCP que lo use perderá el acceso.', 'settings.mcp.modal.createTitle': 'Crear token de API', 'settings.mcp.modal.tokenName': 'Nombre del token', 'settings.mcp.modal.tokenNamePlaceholder': 'p. ej. Claude Desktop, Portátil de trabajo', 'settings.mcp.modal.creating': 'Creando…', 'settings.mcp.modal.create': 'Crear token', 'settings.mcp.modal.createdTitle': 'Token creado', 'settings.mcp.modal.createdWarning': 'Este token solo se mostrará una vez. Cópialo y guárdalo ahora — no se podrá recuperar.', 'settings.mcp.modal.done': 'Listo', 'settings.mcp.toast.created': 'Token creado', 'settings.mcp.toast.createError': 'Error al crear el token', 'settings.mcp.toast.deleted': 'Token eliminado', 'settings.mcp.toast.deleteError': 'Error al eliminar el token', 'settings.account': 'Cuenta', 'settings.about': 'Acerca de', 'settings.about.reportBug': 'Reportar un error', 'settings.about.reportBugHint': 'Encontraste un problema? Avísanos', 'settings.about.featureRequest': 'Solicitar función', 'settings.about.featureRequestHint': 'Sugiere una nueva función', 'settings.about.wikiHint': 'Documentación y guías', 'settings.about.description': 'TREK es un planificador de viajes autoalojado que te ayuda a organizar tus viajes desde la primera idea hasta el último recuerdo. Planificación diaria, presupuesto, listas de equipaje, fotos y mucho más — todo en un solo lugar, en tu propio servidor.', 'settings.about.madeWith': 'Hecho con', 'settings.about.madeBy': 'por Maurice y una creciente comunidad de código abierto.', 'settings.username': 'Usuario', 'settings.email': 'Correo', 'settings.role': 'Rol', 'settings.roleAdmin': 'Administrador', 'settings.oidcLinked': 'Vinculado con', 'settings.changePassword': 'Cambiar contraseña', 'settings.mustChangePassword': 'Debe cambiar su contraseña antes de continuar. Establezca una nueva contraseña a continuación.', 'settings.currentPassword': 'Contraseña actual', 'settings.newPassword': 'Nueva contraseña', 'settings.confirmPassword': 'Confirmar nueva contraseña', 'settings.updatePassword': 'Actualizar contraseña', 'settings.passwordRequired': 'Introduce la contraseña actual y la nueva', 'settings.passwordTooShort': 'La contraseña debe tener al menos 8 caracteres', 'settings.passwordMismatch': 'Las contraseñas no coinciden', 'settings.passwordChanged': 'Contraseña cambiada correctamente', 'settings.deleteAccount': 'Eliminar cuenta', 'settings.deleteAccountTitle': '¿Eliminar tu cuenta?', 'settings.deleteAccountWarning': 'Tu cuenta y todos tus viajes, lugares y archivos se eliminarán permanentemente. Esta acción no se puede deshacer.', 'settings.deleteAccountConfirm': 'Eliminar permanentemente', 'settings.deleteBlockedTitle': 'No es posible eliminarla', 'settings.deleteBlockedMessage': 'Eres el único administrador. Asciende a otro usuario a administrador antes de eliminar tu cuenta.', 'settings.roleUser': 'Usuario', 'settings.saveProfile': 'Guardar perfil', 'settings.mfa.title': 'Autenticación de dos factores (2FA)', 'settings.mfa.description': 'Añade un segundo paso al iniciar sesión. Usa una app de autenticación (Google Authenticator, Authy, etc.).', 'settings.mfa.requiredByPolicy': 'Tu administrador exige autenticación en dos factores. Configura una app de autenticación abajo antes de continuar.', 'settings.mfa.backupTitle': 'Códigos de respaldo', 'settings.mfa.backupDescription': 'Usa estos códigos de un solo uso si pierdes acceso a tu app autenticadora.', 'settings.mfa.backupWarning': 'Guárdalos ahora. Cada código solo se puede usar una vez.', 'settings.mfa.backupCopy': 'Copiar códigos', 'settings.mfa.backupDownload': 'Descargar TXT', 'settings.mfa.backupPrint': 'Imprimir / PDF', 'settings.mfa.backupCopied': 'Códigos de respaldo copiados', 'settings.mfa.enabled': '2FA está activado en tu cuenta.', 'settings.mfa.disabled': '2FA no está activado.', 'settings.mfa.setup': 'Configurar autenticador', 'settings.mfa.scanQr': 'Escanea este código QR con tu app o introduce la clave manualmente.', 'settings.mfa.secretLabel': 'Clave secreta (entrada manual)', 'settings.mfa.codePlaceholder': 'Código de 6 dígitos', 'settings.mfa.enable': 'Activar 2FA', 'settings.mfa.cancelSetup': 'Cancelar', 'settings.mfa.disableTitle': 'Desactivar 2FA', 'settings.mfa.disableHint': 'Introduce tu contraseña y un código actual de tu autenticador.', 'settings.mfa.disable': 'Desactivar 2FA', 'settings.mfa.toastEnabled': 'Autenticación de dos factores activada', 'settings.mfa.toastDisabled': 'Autenticación de dos factores desactivada', 'settings.mfa.demoBlocked': 'No disponible en modo demo', 'settings.toast.mapSaved': 'Ajustes del mapa guardados', 'settings.toast.keysSaved': 'Claves API guardadas', 'settings.toast.displaySaved': 'Ajustes de visualización guardados', 'settings.toast.profileSaved': 'Perfil guardado', 'settings.uploadAvatar': 'Subir foto de perfil', 'settings.removeAvatar': 'Eliminar foto de perfil', 'settings.avatarUploaded': 'Foto de perfil actualizada', 'settings.avatarRemoved': 'Foto de perfil eliminada', 'settings.avatarError': 'Falló la subida', // Login 'login.error': 'Inicio de sesión fallido. Revisa tus credenciales.', 'login.tagline': 'Tus viajes.\nTu plan.', 'login.description': 'Planifica viajes en colaboración con mapas interactivos, presupuestos y sincronización en tiempo real.', 'login.features.maps': 'Mapas interactivos', 'login.features.mapsDesc': 'Google Places, rutas y agrupación', 'login.features.realtime': 'Sincronización en tiempo real', 'login.features.realtimeDesc': 'Planificad juntos mediante WebSocket', 'login.features.budget': 'Control de presupuesto', 'login.features.budgetDesc': 'Categorías, gráficos y costes por persona', 'login.features.collab': 'Colaboración', 'login.features.collabDesc': 'Multiusuario con viajes compartidos', 'login.features.packing': 'Listas de equipaje', 'login.features.packingDesc': 'Categorías, progreso y sugerencias', 'login.features.bookings': 'Reservas', 'login.features.bookingsDesc': 'Vuelos, hoteles, restaurantes y más', 'login.features.files': 'Documentos', 'login.features.filesDesc': 'Sube y gestiona documentos', 'login.features.routes': 'Rutas inteligentes', 'login.features.routesDesc': 'Optimización automática y exportación a Google Maps', 'login.selfHosted': 'Autoalojado · Código abierto · Tus datos siguen siendo tuyos', 'login.title': 'Iniciar sesión', 'login.subtitle': 'Bienvenido de nuevo', 'login.signingIn': 'Iniciando sesión…', 'login.signIn': 'Entrar', 'login.createAdmin': 'Crear cuenta de administrador', 'login.createAdminHint': 'Configura la primera cuenta administradora de TREK.', 'login.setNewPassword': 'Establecer nueva contraseña', 'login.setNewPasswordHint': 'Debe cambiar su contraseña antes de continuar.', 'login.createAccount': 'Crear cuenta', 'login.createAccountHint': 'Crea una cuenta nueva.', 'login.creating': 'Creando…', 'login.noAccount': '¿No tienes cuenta?', 'login.hasAccount': '¿Ya tienes cuenta?', 'login.register': 'Registrarse', 'login.emailPlaceholder': 'tu@correo.com', 'login.username': 'Usuario', 'login.oidc.registrationDisabled': 'El registro está desactivado. Contacta con tu administrador.', 'login.oidc.noEmail': 'No se recibió ningún correo del proveedor.', 'login.mfaTitle': 'Autenticación de dos factores', 'login.mfaSubtitle': 'Introduce el código de 6 dígitos de tu app de autenticación.', 'login.mfaCodeLabel': 'Código de verificación', 'login.mfaCodeRequired': 'Introduce el código de tu app de autenticación.', 'login.mfaHint': 'Abre Google Authenticator, Authy u otra app TOTP.', 'login.mfaBack': '← Volver al inicio de sesión', 'login.mfaVerify': 'Verificar', 'login.oidc.tokenFailed': 'La autenticación falló.', 'login.oidc.invalidState': 'Sesión no válida. Inténtalo de nuevo.', 'login.demoFailed': 'Falló el acceso a la demo', 'login.oidcSignIn': 'Entrar con {name}', 'login.demoHint': 'Prueba la demo: no necesitas registrarte', // Register 'register.passwordMismatch': 'Las contraseñas no coinciden', 'register.passwordTooShort': 'La contraseña debe tener al menos 8 caracteres', 'register.failed': 'Falló el registro', 'register.getStarted': 'Empezar', 'register.subtitle': 'Crea una cuenta y empieza a planificar tus viajes.', 'register.feature1': 'Planes de viaje ilimitados', 'register.feature2': 'Vista de mapa interactiva', 'register.feature3': 'Gestiona lugares y categorías', 'register.feature4': 'Haz seguimiento de las reservas', 'register.feature5': 'Crea listas de equipaje', 'register.feature6': 'Guarda fotos y archivos', 'register.createAccount': 'Crear cuenta', 'register.startPlanning': 'Empieza a planificar tu viaje', 'register.minChars': 'Mín. 6 caracteres', 'register.confirmPassword': 'Confirmar contraseña', 'register.repeatPassword': 'Repetir contraseña', 'register.registering': 'Registrando...', 'register.register': 'Registrarse', 'register.hasAccount': '¿Ya tienes cuenta?', 'register.signIn': 'Iniciar sesión', // Admin 'admin.title': 'Administración', 'admin.subtitle': 'Gestión de usuarios y ajustes del sistema', 'admin.tabs.users': 'Usuarios', 'admin.tabs.categories': 'Categorías', 'admin.tabs.backup': 'Copia de seguridad', 'admin.tabs.audit': 'Audit', 'admin.stats.users': 'Usuarios', 'admin.stats.trips': 'Viajes', 'admin.stats.places': 'Lugares', 'admin.stats.photos': 'Fotos', 'admin.stats.files': 'Archivos', 'admin.table.user': 'Usuario', 'admin.table.email': 'Correo', 'admin.table.role': 'Rol', 'admin.table.created': 'Creado', 'admin.table.lastLogin': 'Último acceso', 'admin.table.actions': 'Acciones', 'admin.you': '(Tú)', 'admin.editUser': 'Editar usuario', 'admin.newPassword': 'Nueva contraseña', 'admin.newPasswordHint': 'Déjalo vacío para mantener la contraseña actual', 'admin.deleteUser': '¿Eliminar al usuario "{name}"? Todos sus viajes se borrarán permanentemente.', 'admin.deleteUserTitle': 'Eliminar usuario', 'admin.newPasswordPlaceholder': 'Introduce una nueva contraseña…', 'admin.toast.loadError': 'No se pudieron cargar los datos de administración', 'admin.toast.userUpdated': 'Usuario actualizado', 'admin.toast.updateError': 'No se pudo actualizar', 'admin.toast.userDeleted': 'Usuario eliminado', 'admin.toast.deleteError': 'No se pudo eliminar', 'admin.toast.cannotDeleteSelf': 'No puedes eliminar tu propia cuenta', 'admin.toast.userCreated': 'Usuario creado', 'admin.toast.createError': 'No se pudo crear el usuario', 'admin.toast.fieldsRequired': 'Usuario, correo y contraseña son obligatorios', 'admin.createUser': 'Crear usuario', 'admin.invite.title': 'Enlaces de invitación', 'admin.invite.subtitle': 'Crear enlaces de registro de un solo uso', 'admin.invite.create': 'Crear enlace', 'admin.invite.createAndCopy': 'Crear y copiar', 'admin.invite.empty': 'No se han creado enlaces de invitación', 'admin.invite.maxUses': 'Usos máx.', 'admin.invite.expiry': 'Expira después de', 'admin.invite.uses': 'usado(s)', 'admin.invite.expiresAt': 'expira el', 'admin.invite.createdBy': 'por', 'admin.invite.active': 'Activo', 'admin.invite.expired': 'Expirado', 'admin.invite.usedUp': 'Agotado', 'admin.invite.copied': 'Enlace de invitación copiado', 'admin.invite.copyLink': 'Copiar enlace', 'admin.invite.deleted': 'Enlace de invitación eliminado', 'admin.invite.createError': 'Error al crear el enlace', 'admin.invite.deleteError': 'Error al eliminar el enlace', 'admin.tabs.settings': 'Ajustes', 'admin.allowRegistration': 'Permitir el registro', 'admin.allowRegistrationHint': 'Los nuevos usuarios pueden registrarse por sí mismos', 'admin.requireMfa': 'Exigir autenticación en dos factores (2FA)', 'admin.requireMfaHint': 'Los usuarios sin 2FA deben completar la configuración en Ajustes antes de usar la aplicación.', 'admin.apiKeys': 'Claves API', 'admin.apiKeysHint': 'Opcional. Activa datos ampliados de lugares, como fotos y previsión del tiempo.', 'admin.mapsKey': 'Clave API de Google Maps', 'admin.mapsKeyHint': 'Obligatoria para buscar lugares. Consíguela en console.cloud.google.com', 'admin.mapsKeyHintLong': 'Sin una clave API, la búsqueda de lugares usa OpenStreetMap. Con una clave de Google también se pueden cargar fotos, valoraciones y horarios de apertura. Consíguela en console.cloud.google.com.', 'admin.recommended': 'Recomendado', 'admin.weatherKey': 'Clave API de OpenWeatherMap', 'admin.weatherKeyHint': 'Para datos meteorológicos. Gratis en openweathermap.org', 'admin.validateKey': 'Probar', 'admin.keyValid': 'Conectado', 'admin.keyInvalid': 'No válida', 'admin.keySaved': 'Claves API guardadas', 'admin.oidcTitle': 'Inicio de sesión único (OIDC)', 'admin.oidcSubtitle': 'Permite iniciar sesión mediante proveedores externos como Google, Apple, Authentik o Keycloak.', 'admin.oidcDisplayName': 'Nombre visible', 'admin.oidcIssuer': 'URL del emisor', 'admin.oidcIssuerHint': 'La URL Issuer de OpenID Connect del proveedor. Ej.: https://accounts.google.com', 'admin.oidcSaved': 'Configuración OIDC guardada', // File Types 'admin.fileTypes': 'Tipos de archivo permitidos', 'admin.fileTypesHint': 'Configura qué tipos de archivo pueden subir los usuarios.', 'admin.fileTypesFormat': 'Extensiones separadas por comas (p. ej. jpg,png,pdf,doc). Usa * para permitir todos los tipos.', 'admin.fileTypesSaved': 'Ajustes de tipos de archivo guardados', 'admin.bagTracking.title': 'Seguimiento de equipaje', 'admin.bagTracking.subtitle': 'Activar peso y asignación de equipaje para artículos de la lista', 'admin.tabs.config': 'Personalización', 'admin.tabs.templates': 'Plantillas de equipaje', 'admin.packingTemplates.title': 'Plantillas de equipaje', 'admin.packingTemplates.subtitle': 'Crear listas de equipaje reutilizables para tus viajes', 'admin.packingTemplates.create': 'Nueva plantilla', 'admin.packingTemplates.namePlaceholder': 'Nombre de la plantilla (ej. Vacaciones en la playa)', 'admin.packingTemplates.empty': 'No se han creado plantillas aún', 'admin.packingTemplates.items': 'artículos', 'admin.packingTemplates.categories': 'categorías', 'admin.packingTemplates.itemName': 'Nombre del artículo', 'admin.packingTemplates.itemCategory': 'Categoría', 'admin.packingTemplates.categoryName': 'Nombre de categoría (ej. Ropa)', 'admin.packingTemplates.addCategory': 'Añadir categoría', 'admin.packingTemplates.created': 'Plantilla creada', 'admin.packingTemplates.deleted': 'Plantilla eliminada', 'admin.packingTemplates.loadError': 'Error al cargar plantillas', 'admin.packingTemplates.createError': 'Error al crear plantilla', 'admin.packingTemplates.deleteError': 'Error al eliminar plantilla', 'admin.packingTemplates.saveError': 'Error al guardar', // Addons 'admin.tabs.addons': 'Complementos', 'admin.addons.title': 'Complementos', 'admin.addons.subtitle': 'Activa o desactiva funciones para personalizar tu experiencia en TREK.', 'admin.addons.subtitleBefore': 'Activa o desactiva funciones para personalizar tu experiencia en ', 'admin.addons.subtitleAfter': '.', 'admin.addons.enabled': 'Activo', 'admin.addons.disabled': 'Desactivado', 'admin.addons.type.trip': 'Viaje', 'admin.addons.type.global': 'Global', 'admin.addons.type.integration': 'Integración', 'admin.addons.tripHint': 'Disponible como pestaña dentro de cada viaje', 'admin.addons.globalHint': 'Disponible como sección independiente en la navegación principal', 'admin.addons.integrationHint': 'Servicios backend e integraciones de API sin página dedicada', 'admin.addons.toast.updated': 'Complemento actualizado', 'admin.addons.toast.error': 'No se pudo actualizar el complemento', 'admin.addons.noAddons': 'No hay complementos disponibles', 'admin.weather.title': 'Datos meteorológicos', 'admin.weather.badge': 'Desde el 24 de marzo de 2026', 'admin.weather.description': 'TREK utiliza Open-Meteo como fuente de datos meteorológicos. Open-Meteo es un servicio meteorológico gratuito y de código abierto: no requiere clave API.', 'admin.weather.forecast': 'Pronóstico de 16 días', 'admin.weather.forecastDesc': 'Antes eran 5 días (OpenWeatherMap)', 'admin.weather.climate': 'Datos climáticos históricos', 'admin.weather.climateDesc': 'Promedios de los últimos 85 años para fechas posteriores al pronóstico de 16 días', 'admin.weather.requests': '10.000 solicitudes / día', 'admin.weather.requestsDesc': 'Gratis, sin necesidad de clave API', 'admin.weather.locationHint': 'El tiempo se basa en el primer lugar con coordenadas de cada día. Si no hay ningún lugar asignado a un día, se usa como referencia cualquier lugar de la lista.', // MCP Tokens 'admin.tabs.mcpTokens': 'Tokens MCP', 'admin.mcpTokens.title': 'Tokens MCP', 'admin.mcpTokens.subtitle': 'Gestionar tokens de API de todos los usuarios', 'admin.mcpTokens.owner': 'Propietario', 'admin.mcpTokens.tokenName': 'Nombre del token', 'admin.mcpTokens.created': 'Creado', 'admin.mcpTokens.lastUsed': 'Último uso', 'admin.mcpTokens.never': 'Nunca', 'admin.mcpTokens.empty': 'Aún no se han creado tokens MCP', 'admin.mcpTokens.deleteTitle': 'Eliminar token', 'admin.mcpTokens.deleteMessage': 'Este token se revocará inmediatamente. El usuario perderá el acceso MCP a través de este token.', 'admin.mcpTokens.deleteSuccess': 'Token eliminado', 'admin.mcpTokens.deleteError': 'No se pudo eliminar el token', 'admin.mcpTokens.loadError': 'No se pudieron cargar los tokens', // GitHub 'admin.tabs.github': 'GitHub', 'admin.audit.subtitle': 'Eventos sensibles de seguridad y administración (copias de seguridad, usuarios, MFA, ajustes).', 'admin.audit.empty': 'Aún no hay entradas de auditoría.', 'admin.audit.refresh': 'Actualizar', 'admin.audit.loadMore': 'Cargar más', 'admin.audit.showing': '{count} cargados · {total} en total', 'admin.audit.col.time': 'Fecha y hora', 'admin.audit.col.user': 'Usuario', 'admin.audit.col.action': 'Acción', 'admin.audit.col.resource': 'Recurso', 'admin.audit.col.ip': 'IP', 'admin.audit.col.details': 'Detalles', 'admin.github.title': 'Historial de versiones', 'admin.github.subtitle': 'Últimas novedades de {repo}', 'admin.github.latest': 'Última', 'admin.github.prerelease': 'Prelanzamiento', 'admin.github.showDetails': 'Mostrar detalles', 'admin.github.hideDetails': 'Ocultar detalles', 'admin.github.loadMore': 'Cargar más', 'admin.github.loading': 'Cargando...', 'admin.github.support': 'Ayuda a seguir desarrollando TREK', 'admin.github.error': 'No se pudieron cargar las versiones', 'admin.github.by': 'por', 'admin.update.available': 'Actualización disponible', 'admin.update.text': 'TREK {version} está disponible. Estás usando {current}.', 'admin.update.button': 'Ver en GitHub', 'admin.update.install': 'Instalar actualización', 'admin.update.confirmTitle': '¿Instalar actualización?', 'admin.update.confirmText': 'TREK se actualizará de {current} a {version}. Después, el servidor se reiniciará automáticamente.', 'admin.update.dataInfo': 'Todos tus datos (viajes, usuarios, claves API, subidas, Vacay, Atlas, presupuestos) se conservarán.', 'admin.update.warning': 'La app estará brevemente no disponible durante el reinicio.', 'admin.update.confirm': 'Actualizar ahora', 'admin.update.installing': 'Actualizando…', 'admin.update.success': '¡Actualización instalada! El servidor se está reiniciando…', 'admin.update.failed': 'La actualización falló', 'admin.update.backupHint': 'Recomendamos crear una copia de seguridad antes de actualizar.', 'admin.update.backupLink': 'Ir a Copia de seguridad', 'admin.update.howTo': 'Cómo actualizar', 'admin.update.dockerText': 'Tu instancia de TREK se ejecuta en Docker. Para actualizar a {version}, ejecuta los siguientes comandos en tu servidor:', 'admin.update.reloadHint': 'Recarga la página en unos segundos.', // Vacay addon 'vacay.subtitle': 'Planifica y gestiona días de vacaciones', 'vacay.settings': 'Ajustes', 'vacay.year': 'Año', 'vacay.addYear': 'Añadir año siguiente', 'vacay.addPrevYear': 'Añadir año anterior', 'vacay.removeYear': 'Eliminar año', 'vacay.removeYearConfirm': '¿Eliminar {year}?', 'vacay.removeYearHint': 'Todas las vacaciones y festivos de empresa de este año se borrarán permanentemente.', 'vacay.remove': 'Eliminar', 'vacay.persons': 'Personas', 'vacay.noPersons': 'No se han añadido personas', 'vacay.addPerson': 'Añadir persona', 'vacay.editPerson': 'Editar persona', 'vacay.removePerson': 'Eliminar persona', 'vacay.removePersonConfirm': '¿Eliminar a {name}?', 'vacay.removePersonHint': 'Todas las vacaciones de esta persona se borrarán permanentemente.', 'vacay.personName': 'Nombre', 'vacay.personNamePlaceholder': 'Introduce un nombre', 'vacay.color': 'Color', 'vacay.add': 'Añadir', 'vacay.legend': 'Leyenda', 'vacay.publicHoliday': 'Festivo', 'vacay.companyHoliday': 'Festivo de empresa', 'vacay.weekend': 'Fin de semana', 'vacay.modeVacation': 'Vacaciones', 'vacay.modeCompany': 'Festivo de empresa', 'vacay.entitlement': 'Derecho', 'vacay.entitlementDays': 'Días', 'vacay.used': 'Usados', 'vacay.remaining': 'Restantes', 'vacay.carriedOver': 'de {year}', 'vacay.blockWeekends': 'Bloquear fines de semana', 'vacay.blockWeekendsHint': 'Impide marcar vacaciones en sábados y domingos', 'vacay.weekendDays': 'Días de fin de semana', 'vacay.mon': 'Lun', 'vacay.tue': 'Mar', 'vacay.wed': 'Mié', 'vacay.thu': 'Jue', 'vacay.fri': 'Vie', 'vacay.sat': 'Sáb', 'vacay.sun': 'Dom', 'vacay.publicHolidays': 'Festivos', 'vacay.publicHolidaysHint': 'Marcar festivos en el calendario', 'vacay.selectCountry': 'Seleccionar país', 'vacay.selectRegion': 'Seleccionar región (opcional)', 'vacay.companyHolidays': 'Festivos de empresa', 'vacay.companyHolidaysHint': 'Permitir marcar días festivos comunes de la empresa', 'vacay.companyHolidaysNoDeduct': 'Los festivos de empresa no descuentan días de vacaciones.', 'vacay.carryOver': 'Arrastrar saldo', 'vacay.carryOverHint': 'Trasladar automáticamente los días restantes al año siguiente', 'vacay.sharing': 'Compartir', 'vacay.sharingHint': 'Comparte tu calendario de vacaciones con otros usuarios de TREK', 'vacay.owner': 'Propietario', 'vacay.shareEmailPlaceholder': 'Correo electrónico del usuario de TREK', 'vacay.shareSuccess': 'Plan compartido correctamente', 'vacay.shareError': 'No se pudo compartir el plan', 'vacay.dissolve': 'Deshacer fusión', 'vacay.dissolveHint': 'Separar de nuevo los calendarios. Tus entradas se conservarán.', 'vacay.dissolveAction': 'Disolver', 'vacay.dissolved': 'Calendario separado', 'vacay.fusedWith': 'Fusionado con', 'vacay.you': 'tú', 'vacay.noData': 'Sin datos', 'vacay.changeColor': 'Cambiar color', 'vacay.inviteUser': 'Invitar usuario', 'vacay.inviteHint': 'Invita a otro usuario de TREK a compartir un calendario combinado de vacaciones.', 'vacay.selectUser': 'Seleccionar usuario', 'vacay.sendInvite': 'Enviar invitación', 'vacay.inviteSent': 'Invitación enviada', 'vacay.inviteError': 'No se pudo enviar la invitación', 'vacay.pending': 'pendiente', 'vacay.noUsersAvailable': 'No hay usuarios disponibles', 'vacay.accept': 'Aceptar', 'vacay.decline': 'Rechazar', 'vacay.acceptFusion': 'Aceptar y fusionar', 'vacay.inviteTitle': 'Solicitud de fusión', 'vacay.inviteWantsToFuse': 'quiere compartir un calendario de vacaciones contigo.', 'vacay.fuseInfo1': 'Ambos veréis todas las entradas de vacaciones en un único calendario compartido.', 'vacay.fuseInfo2': 'Ambas partes pueden crear y editar entradas mutuamente.', 'vacay.fuseInfo3': 'Ambas partes pueden borrar entradas y cambiar el número de días de vacaciones disponibles.', 'vacay.fuseInfo4': 'Ajustes como festivos y festivos de empresa se comparten.', 'vacay.fuseInfo5': 'La fusión puede disolverse en cualquier momento por cualquiera de las partes. Tus entradas se conservarán.', 'vacay.addCalendar': 'Añadir calendario', 'vacay.calendarColor': 'Color', 'vacay.calendarLabel': 'Etiqueta', 'vacay.noCalendars': 'Sin calendarios', // Atlas addon 'atlas.subtitle': 'Tu huella viajera por el mundo', 'atlas.countries': 'Países', 'atlas.trips': 'Viajes', 'atlas.places': 'Lugares', 'atlas.days': 'Días', 'atlas.visitedCountries': 'Países visitados', 'atlas.cities': 'Ciudades', 'atlas.noData': 'Aún no hay datos de viaje', 'atlas.noDataHint': 'Crea un viaje y añade lugares para ver tu mapa del mundo', 'atlas.lastTrip': 'Último viaje', 'atlas.nextTrip': 'Próximo viaje', 'atlas.daysLeft': 'días restantes', 'atlas.streak': 'Racha', 'atlas.year': 'año', 'atlas.years': 'años', 'atlas.yearInRow': 'año seguido', 'atlas.yearsInRow': 'años seguidos', 'atlas.tripIn': 'viaje en', 'atlas.tripsIn': 'viajes en', 'atlas.since': 'desde', 'atlas.europe': 'Europa', 'atlas.asia': 'Asia', 'atlas.northAmerica': 'América del Norte', 'atlas.southAmerica': 'América del Sur', 'atlas.africa': 'África', 'atlas.oceania': 'Oceanía', 'atlas.other': 'Otros', 'atlas.firstVisit': 'Primer viaje', 'atlas.lastVisitLabel': 'Último viaje', 'atlas.tripSingular': 'Viaje', 'atlas.tripPlural': 'Viajes', 'atlas.placeVisited': 'Lugar visitado', 'atlas.placesVisited': 'Lugares visitados', 'atlas.statsTab': 'Estadísticas', 'atlas.bucketTab': 'Lista de deseos', 'atlas.addBucket': 'Añadir a lista de deseos', 'atlas.bucketNamePlaceholder': 'Lugar o destino...', 'atlas.bucketNotesPlaceholder': 'Notas (opcional)', 'atlas.bucketEmpty': 'Tu lista de deseos está vacía', 'atlas.bucketEmptyHint': 'Añade lugares que sueñas con visitar', 'atlas.unmark': 'Eliminar', 'atlas.confirmMark': '¿Marcar este país como visitado?', 'atlas.confirmUnmark': '¿Eliminar este país de tu lista de visitados?', 'atlas.confirmUnmarkRegion': '¿Eliminar esta región de tu lista de visitados?', 'atlas.markVisited': 'Marcar como visitado', 'atlas.markVisitedHint': 'Añadir este país a tu lista de visitados', 'atlas.markRegionVisitedHint': 'Añadir esta región a tu lista de visitados', 'atlas.addToBucket': 'Añadir a lista de deseos', 'atlas.addPoi': 'Añadir lugar', 'atlas.searchCountry': 'Buscar un país...', 'atlas.month': 'Mes', 'atlas.addToBucketHint': 'Guardar como lugar que quieres visitar', 'atlas.bucketWhen': '¿Cuándo planeas visitarlo?', // Trip Planner 'trip.tabs.plan': 'Plan', 'trip.tabs.reservations': 'Reservas', 'trip.tabs.reservationsShort': 'Reservas', 'trip.tabs.packing': 'Lista de equipaje', 'trip.tabs.packingShort': 'Equipaje', 'trip.tabs.lists': 'Listas', 'trip.tabs.listsShort': 'Listas', 'trip.tabs.budget': 'Presupuesto', 'trip.tabs.files': 'Archivos', 'trip.loading': 'Cargando viaje...', 'trip.loadingPhotos': 'Cargando fotos de los lugares...', 'trip.mobilePlan': 'Plan', 'trip.mobilePlaces': 'Lugares', 'trip.toast.placeUpdated': 'Lugar actualizado', 'trip.toast.placeAdded': 'Lugar añadido', 'trip.toast.placeDeleted': 'Lugar eliminado', 'trip.toast.selectDay': 'Selecciona primero un día', 'trip.toast.assignedToDay': 'Lugar asignado al día', 'trip.toast.reorderError': 'No se pudo reordenar', 'trip.toast.reservationUpdated': 'Reserva actualizada', 'trip.toast.reservationAdded': 'Reserva añadida', 'trip.toast.deleted': 'Eliminado', 'trip.confirm.deletePlace': '¿Seguro que quieres eliminar este lugar?', // Day Plan Sidebar 'dayplan.emptyDay': 'No hay lugares planificados para este día', 'dayplan.addNote': 'Añadir nota', 'dayplan.editNote': 'Editar nota', 'dayplan.noteAdd': 'Añadir nota', 'dayplan.noteEdit': 'Editar nota', 'dayplan.noteTitle': 'Nota', 'dayplan.noteSubtitle': 'Nota diaria', 'dayplan.totalCost': 'Coste total', 'dayplan.days': 'Días', 'dayplan.dayN': 'Día {n}', 'dayplan.calculating': 'Calculando...', 'dayplan.route': 'Ruta', 'dayplan.optimize': 'Optimizar', 'dayplan.optimized': 'Ruta optimizada', 'dayplan.routeError': 'No se pudo calcular la ruta', 'dayplan.toast.needTwoPlaces': 'Se necesitan al menos dos lugares para optimizar la ruta', 'dayplan.toast.routeOptimized': 'Ruta optimizada', 'dayplan.toast.noGeoPlaces': 'No se encontraron lugares con coordenadas para calcular la ruta', 'dayplan.confirmed': 'Confirmado', 'dayplan.pendingRes': 'Pendiente', 'dayplan.pdf': 'PDF', 'dayplan.pdfTooltip': 'Exportar plan diario como PDF', 'dayplan.pdfError': 'No se pudo exportar el PDF', 'dayplan.cannotReorderTransport': 'Las reservas con hora fija no se pueden reordenar', 'dayplan.confirmRemoveTimeTitle': '¿Eliminar hora?', 'dayplan.confirmRemoveTimeBody': 'Este lugar tiene una hora fija ({time}). Al moverlo se eliminará la hora y se permitirá el orden libre.', 'dayplan.confirmRemoveTimeAction': 'Eliminar hora y mover', 'dayplan.cannotDropOnTimed': 'No se pueden colocar elementos entre entradas con hora fija', 'dayplan.cannotBreakChronology': 'Esto rompería el orden cronológico de los elementos y reservas programados', // Places Sidebar 'places.addPlace': 'Añadir lugar/actividad', 'places.importGpx': 'GPX', 'places.gpxImported': '{count} lugares importados desde GPX', 'places.gpxError': 'Error al importar GPX', 'places.importGoogleList': 'Lista Google', 'places.googleListHint': 'Pega un enlace compartido de una lista de Google Maps para importar todos los lugares.', 'places.googleListImported': '{count} lugares importados de "{list}"', 'places.googleListError': 'Error al importar la lista de Google Maps', 'places.viewDetails': 'Ver detalles', 'places.urlResolved': 'Lugar importado desde URL', 'places.assignToDay': '¿A qué día añadirlo?', 'places.all': 'Todo', 'places.unplanned': 'Sin planificar', 'places.search': 'Buscar lugares...', 'places.allCategories': 'Todas las categorías', 'places.categoriesSelected': 'categorías', 'places.clearFilter': 'Borrar filtro', 'places.count': '{count} lugares', 'places.countSingular': '1 lugar', 'places.allPlanned': 'Todos los lugares están planificados', 'places.noneFound': 'No se encontraron lugares', 'places.editPlace': 'Editar lugar', 'places.formName': 'Nombre', 'places.formNamePlaceholder': 'p. ej. Torre Eiffel', 'places.formDescription': 'Descripción', 'places.formDescriptionPlaceholder': 'Descripción breve...', 'places.formAddress': 'Dirección', 'places.formAddressPlaceholder': 'Calle, ciudad, país', 'places.formLat': 'Latitud (p. ej. 48.8566)', 'places.formLng': 'Longitud (p. ej. 2.3522)', 'places.formCategory': 'Categoría', 'places.noCategory': 'Sin categoría', 'places.categoryNamePlaceholder': 'Nombre de la categoría', 'places.formTime': 'Hora', 'places.startTime': 'Inicio', 'places.endTime': 'Fin', 'places.endTimeBeforeStart': 'La hora de fin es anterior a la de inicio', 'places.timeCollision': 'Solapamiento horario con:', 'places.formWebsite': 'Página web', 'places.formNotesPlaceholder': 'Notas personales...', 'places.formReservation': 'Reserva', 'places.reservationNotesPlaceholder': 'Notas de reserva, número de confirmación...', 'places.mapsSearchPlaceholder': 'Buscar lugares...', 'places.mapsSearchError': 'La búsqueda de lugares falló.', 'places.osmHint': 'Usando búsqueda con OpenStreetMap (sin fotos, horarios ni valoraciones). Añade una clave API de Google en Ajustes para obtener todos los detalles.', 'places.osmActive': 'Búsqueda mediante OpenStreetMap (sin fotos, valoraciones ni horarios). Añade una clave API de Google en Ajustes para datos ampliados.', 'places.categoryCreateError': 'No se pudo crear la categoría', 'places.nameRequired': 'Introduce un nombre', 'places.saveError': 'No se pudo guardar', // Place Inspector 'inspector.opened': 'Abierto', 'inspector.closed': 'Cerrado', 'inspector.openingHours': 'Horario de apertura', 'inspector.showHours': 'Mostrar horario', 'inspector.files': 'Archivos', 'inspector.filesCount': '{count} archivos', 'inspector.removeFromDay': 'Quitar del día', 'inspector.addToDay': 'Añadir al día', 'inspector.confirmedRes': 'Reserva confirmada', 'inspector.pendingRes': 'Reserva pendiente', 'inspector.google': 'Abrir en Google Maps', 'inspector.website': 'Abrir la web', 'inspector.addRes': 'Reserva', 'inspector.editRes': 'Editar reserva', 'inspector.participants': 'Participantes', 'inspector.trackStats': 'Datos de la ruta', // Reservations 'reservations.title': 'Reservas', 'reservations.empty': 'Aún no hay reservas', 'reservations.emptyHint': 'Añade reservas de vuelos, hoteles y más', 'reservations.add': 'Añadir reserva', 'reservations.addManual': 'Reserva manual', 'reservations.placeHint': 'Consejo: es mejor crear las reservas directamente desde un lugar para vincularlas con el plan del día.', 'reservations.confirmed': 'Confirmada', 'reservations.pending': 'Pendiente', 'reservations.summary': '{confirmed} confirmadas, {pending} pendientes', 'reservations.fromPlan': 'Del plan', 'reservations.showFiles': 'Mostrar archivos', 'reservations.editTitle': 'Editar reserva', 'reservations.status': 'Estado', 'reservations.datetime': 'Fecha y hora', 'reservations.startTime': 'Hora de inicio', 'reservations.endTime': 'Hora de fin', 'reservations.date': 'Fecha', 'reservations.time': 'Hora', 'reservations.timeAlt': 'Hora (alternativa, p. ej. 19:30)', 'reservations.notes': 'Notas', 'reservations.notesPlaceholder': 'Notas adicionales...', 'reservations.type.flight': 'Vuelo', 'reservations.type.hotel': 'Alojamiento', 'reservations.type.restaurant': 'Restaurante', 'reservations.type.train': 'Tren', 'reservations.type.car': 'Coche de alquiler', 'reservations.type.cruise': 'Crucero', 'reservations.type.event': 'Evento', 'reservations.type.tour': 'Tour', 'reservations.type.other': 'Otro', 'reservations.confirm.delete': '¿Seguro que quieres eliminar la reserva "{name}"?', 'reservations.confirm.deleteTitle': '¿Eliminar reserva?', 'reservations.confirm.deleteBody': '« {name} » se eliminará permanentemente.', 'reservations.toast.updated': 'Reserva actualizada', 'reservations.toast.removed': 'Reserva eliminada', 'reservations.toast.fileUploaded': 'Archivo subido', 'reservations.toast.uploadError': 'No se pudo subir', 'reservations.newTitle': 'Nueva reserva', 'reservations.bookingType': 'Tipo de reserva', 'reservations.titleLabel': 'Título', 'reservations.titlePlaceholder': 'p. ej. Lufthansa LH123, Hotel Adlon, ...', 'reservations.locationAddress': 'Ubicación / dirección', 'reservations.locationPlaceholder': 'Dirección, aeropuerto, hotel...', 'reservations.confirmationCode': 'Código de reserva', 'reservations.confirmationPlaceholder': 'p. ej. ABC12345', 'reservations.day': 'Día', 'reservations.noDay': 'Sin día', 'reservations.place': 'Lugar', 'reservations.noPlace': 'Sin lugar', 'reservations.pendingSave': 'se guardará…', 'reservations.uploading': 'Subiendo...', 'reservations.attachFile': 'Adjuntar archivo', 'reservations.linkExisting': 'Vincular archivo existente', 'reservations.toast.saveError': 'No se pudo guardar', 'reservations.toast.updateError': 'No se pudo actualizar', 'reservations.toast.deleteError': 'No se pudo eliminar', 'reservations.confirm.remove': '¿Eliminar la reserva de "{name}"?', 'reservations.linkAssignment': 'Vincular a una asignación del día', 'reservations.pickAssignment': 'Selecciona una asignación de tu plan...', 'reservations.noAssignment': 'Sin vínculo (independiente)', 'reservations.price': 'Precio', 'reservations.budgetCategory': 'Categoría de presupuesto', 'reservations.budgetCategoryPlaceholder': 'ej. Transporte, Alojamiento', 'reservations.budgetCategoryAuto': 'Automático (según tipo de reserva)', 'reservations.budgetHint': 'Se creará automáticamente una entrada presupuestaria al guardar.', 'reservations.departureDate': 'Salida', 'reservations.arrivalDate': 'Llegada', 'reservations.departureTime': 'Hora salida', 'reservations.arrivalTime': 'Hora llegada', 'reservations.pickupDate': 'Recogida', 'reservations.returnDate': 'Devolución', 'reservations.pickupTime': 'Hora recogida', 'reservations.returnTime': 'Hora devolución', 'reservations.endDate': 'Fecha fin', 'reservations.meta.departureTimezone': 'TZ salida', 'reservations.meta.arrivalTimezone': 'TZ llegada', 'reservations.span.departure': 'Salida', 'reservations.span.arrival': 'Llegada', 'reservations.span.inTransit': 'En tránsito', 'reservations.span.pickup': 'Recogida', 'reservations.span.return': 'Devolución', 'reservations.span.active': 'Activo', 'reservations.span.start': 'Inicio', 'reservations.span.end': 'Fin', 'reservations.span.ongoing': 'En curso', 'reservations.validation.endBeforeStart': 'La fecha/hora de fin debe ser posterior a la de inicio', // Budget 'budget.title': 'Presupuesto', 'budget.exportCsv': 'Exportar CSV', 'budget.emptyTitle': 'Aún no se ha creado ningún presupuesto', 'budget.emptyText': 'Crea categorías y entradas para planificar el presupuesto de tu viaje', 'budget.emptyPlaceholder': 'Introduce el nombre de la categoría...', 'budget.createCategory': 'Crear categoría', 'budget.category': 'Categoría', 'budget.categoryName': 'Nombre de la categoría', 'budget.table.name': 'Nombre', 'budget.table.total': 'Total', 'budget.table.persons': 'Personas', 'budget.table.days': 'Días', 'budget.table.perPerson': 'Por persona', 'budget.table.perDay': 'Por día', 'budget.table.perPersonDay': 'Por pers. / día', 'budget.table.note': 'Nota', 'budget.table.date': 'Fecha', 'budget.newEntry': 'Nueva entrada', 'budget.defaultEntry': 'Nueva entrada', 'budget.defaultCategory': 'Nueva categoría', 'budget.total': 'Total', 'budget.totalBudget': 'Presupuesto total', 'budget.byCategory': 'Por categoría', 'budget.editTooltip': 'Haz clic para editar', 'budget.confirm.deleteCategory': '¿Seguro que quieres eliminar la categoría "{name}" con {count} entradas?', 'budget.deleteCategory': 'Eliminar categoría', 'budget.perPerson': 'Por persona', 'budget.paid': 'Pagado', 'budget.open': 'Abrir', 'budget.noMembers': 'No hay miembros asignados', 'budget.settlement': 'Liquidación', 'budget.settlementInfo': 'Haz clic en el avatar de un miembro en una partida del presupuesto para marcarlo en verde — esto significa que ha pagado. La liquidación muestra quién debe cuánto a quién.', 'budget.netBalances': 'Saldos netos', // Files 'files.title': 'Archivos', 'files.count': '{count} archivos', 'files.countSingular': '1 archivo', 'files.uploaded': '{count} archivos subidos', 'files.uploadError': 'La subida falló', 'files.dropzone': 'Arrastra aquí los archivos', 'files.dropzoneHint': 'o haz clic para explorar', 'files.allowedTypes': 'Imágenes, PDF, DOC, DOCX, XLS, XLSX, TXT, CSV · Máx. 50 MB', 'files.uploading': 'Subiendo...', 'files.filterAll': 'Todo', 'files.filterPdf': 'PDF', 'files.filterImages': 'Imágenes', 'files.filterDocs': 'Documentos', 'files.filterCollab': 'Notas de colaboración', 'files.sourceCollab': 'Desde notas de colaboración', 'files.empty': 'Aún no hay archivos', 'files.emptyHint': 'Sube archivos para adjuntarlos a tu viaje', 'files.openTab': 'Abrir en una pestaña nueva', 'files.confirm.delete': '¿Seguro que quieres eliminar este archivo?', 'files.toast.deleted': 'Archivo eliminado', 'files.toast.deleteError': 'No se pudo eliminar el archivo', 'files.sourcePlan': 'Plan diario', 'files.sourceBooking': 'Reserva', 'files.attach': 'Adjuntar', 'files.pasteHint': 'También puedes pegar imágenes desde el portapapeles (Ctrl+V)', // Packing 'packing.title': 'Lista de equipaje', 'packing.empty': 'La lista de equipaje está vacía', 'packing.import': 'Importar', 'packing.importTitle': 'Importar lista de equipaje', 'packing.importHint': 'Un elemento por línea. Categoría y cantidad opcionales separadas por coma, punto y coma o tabulación: Nombre, Categoría, Cantidad', 'packing.importPlaceholder': 'Cepillo de dientes\nProtector solar, Higiene\nCamisetas, Ropa, 5\nPasaporte, Documentos', 'packing.importCsv': 'Cargar CSV/TXT', 'packing.importAction': 'Importar {count}', 'packing.importSuccess': '{count} elementos importados', 'packing.importError': 'Error al importar', 'packing.importEmpty': 'Sin elementos para importar', 'packing.progress': '{packed} de {total} preparados ({percent}%)', 'packing.clearChecked': 'Eliminar {count} marcados', 'packing.clearCheckedShort': 'Eliminar {count}', 'packing.suggestions': 'Sugerencias', 'packing.suggestionsTitle': 'Añadir sugerencias', 'packing.allSuggested': 'Todas las sugerencias añadidas', 'packing.allPacked': '¡Todo preparado!', 'packing.addPlaceholder': 'Añadir nuevo elemento...', 'packing.categoryPlaceholder': 'Categoría...', 'packing.filterAll': 'Todo', 'packing.filterOpen': 'Pendientes', 'packing.filterDone': 'Hecho', 'packing.emptyTitle': 'La lista de equipaje está vacía', 'packing.emptyHint': 'Añade elementos o usa las sugerencias', 'packing.emptyFiltered': 'Ningún elemento coincide con este filtro', 'packing.menuRename': 'Renombrar', 'packing.menuCheckAll': 'Marcar todo', 'packing.menuUncheckAll': 'Desmarcar todo', 'packing.menuDeleteCat': 'Eliminar categoría', 'packing.addItem': 'Añadir artículo', 'packing.addItemPlaceholder': 'Nombre del artículo...', 'packing.addCategory': 'Añadir categoría', 'packing.newCategoryPlaceholder': 'Nombre de categoría (ej. Ropa)', 'packing.applyTemplate': 'Aplicar plantilla', 'packing.template': 'Plantilla', 'packing.templateApplied': '{count} artículos añadidos desde plantilla', 'packing.templateError': 'Error al aplicar plantilla', 'packing.assignUser': 'Asignar usuario', 'packing.noMembers': 'Sin miembros', 'packing.bags': 'Equipaje', 'packing.noBag': 'Sin asignar', 'packing.totalWeight': 'Peso total', 'packing.bagName': 'Nombre...', 'packing.addBag': 'Añadir equipaje', 'packing.changeCategory': 'Cambiar categoría', 'packing.confirm.clearChecked': '¿Seguro que quieres eliminar {count} elementos marcados?', 'packing.confirm.deleteCat': '¿Seguro que quieres eliminar la categoría "{name}" con {count} elementos?', 'packing.defaultCategory': 'Otros', 'packing.toast.saveError': 'No se pudo guardar', 'packing.toast.deleteError': 'No se pudo eliminar', 'packing.toast.renameError': 'No se pudo renombrar', 'packing.toast.addError': 'No se pudo añadir', // Packing suggestions 'packing.suggestions.items': [ { name: 'Pasaporte', category: 'Documentos' }, { name: 'Documento de identidad', category: 'Documentos' }, { name: 'Seguro de viaje', category: 'Documentos' }, { name: 'Billetes de vuelo', category: 'Documentos' }, { name: 'Tarjeta de crédito', category: 'Finanzas' }, { name: 'Efectivo', category: 'Finanzas' }, { name: 'Visado', category: 'Documentos' }, { name: 'Camisetas', category: 'Ropa' }, { name: 'Pantalones', category: 'Ropa' }, { name: 'Ropa interior', category: 'Ropa' }, { name: 'Calcetines', category: 'Ropa' }, { name: 'Chaqueta', category: 'Ropa' }, { name: 'Pijama', category: 'Ropa' }, { name: 'Ropa de baño', category: 'Ropa' }, { name: 'Impermeable', category: 'Ropa' }, { name: 'Zapatos cómodos', category: 'Ropa' }, { name: 'Cepillo de dientes', category: 'Aseo' }, { name: 'Pasta de dientes', category: 'Aseo' }, { name: 'Champú', category: 'Aseo' }, { name: 'Desodorante', category: 'Aseo' }, { name: 'Protector solar', category: 'Aseo' }, { name: 'Maquinilla de afeitar', category: 'Aseo' }, { name: 'Cargador', category: 'Electrónica' }, { name: 'Batería externa', category: 'Electrónica' }, { name: 'Auriculares', category: 'Electrónica' }, { name: 'Adaptador de viaje', category: 'Electrónica' }, { name: 'Cámara', category: 'Electrónica' }, { name: 'Analgésicos', category: 'Salud' }, { name: 'Tiritas', category: 'Salud' }, { name: 'Desinfectante', category: 'Salud' }, ], // Members / Sharing 'members.shareTrip': 'Compartir viaje', 'members.inviteUser': 'Invitar usuario', 'members.selectUser': 'Seleccionar usuario…', 'members.invite': 'Invitar', 'members.allHaveAccess': 'Todos los usuarios ya tienen acceso.', 'members.access': 'Acceso', 'members.person': 'persona', 'members.persons': 'personas', 'members.you': 'tú', 'members.owner': 'Propietario', 'members.leaveTrip': 'Abandonar viaje', 'members.removeAccess': 'Quitar acceso', 'members.confirmLeave': '¿Abandonar el viaje? Perderás el acceso.', 'members.confirmRemove': '¿Quitar el acceso de este usuario?', 'members.loadError': 'No se pudieron cargar los miembros', 'members.added': 'añadido', 'members.addError': 'No se pudo añadir', 'members.removed': 'Miembro eliminado', 'members.removeError': 'No se pudo eliminar', // Categories (Admin) 'categories.title': 'Categorías', 'categories.subtitle': 'Gestiona categorías para lugares', 'categories.new': 'Nueva categoría', 'categories.empty': 'Aún no hay categorías', 'categories.namePlaceholder': 'Nombre de la categoría', 'categories.icon': 'Icono', 'categories.color': 'Color', 'categories.customColor': 'Elegir color personalizado', 'categories.preview': 'Vista previa', 'categories.defaultName': 'Categoría', 'categories.update': 'Actualizar', 'categories.create': 'Crear', 'categories.confirm.delete': '¿Eliminar la categoría? Los lugares de esta categoría no se eliminarán.', 'categories.toast.loadError': 'No se pudieron cargar las categorías', 'categories.toast.nameRequired': 'Introduce un nombre', 'categories.toast.updated': 'Categoría actualizada', 'categories.toast.created': 'Categoría creada', 'categories.toast.saveError': 'No se pudo guardar', 'categories.toast.deleted': 'Categoría eliminada', 'categories.toast.deleteError': 'No se pudo eliminar', // Backup (Admin) 'backup.title': 'Copia de seguridad de datos', 'backup.subtitle': 'Base de datos y todos los archivos subidos', 'backup.refresh': 'Actualizar', 'backup.upload': 'Subir copia de seguridad', 'backup.uploading': 'Subiendo…', 'backup.create': 'Crear copia', 'backup.creating': 'Creando…', 'backup.empty': 'Aún no hay copias', 'backup.createFirst': 'Crear la primera copia', 'backup.download': 'Descargar', 'backup.restore': 'Restaurar', 'backup.confirm.restore': '¿Restaurar la copia "{name}"?\n\nTodos los datos actuales serán reemplazados por la copia.', 'backup.confirm.uploadRestore': '¿Subir y restaurar el archivo de copia "{name}"?\n\nTodos los datos actuales se sobrescribirán.', 'backup.confirm.delete': '¿Eliminar la copia "{name}"?', 'backup.toast.loadError': 'No se pudieron cargar las copias', 'backup.toast.created': 'Copia de seguridad creada correctamente', 'backup.toast.createError': 'No se pudo crear la copia', 'backup.toast.restored': 'Copia restaurada. La página se recargará…', 'backup.toast.restoreError': 'No se pudo restaurar', 'backup.toast.uploadError': 'No se pudo subir', 'backup.toast.deleted': 'Copia eliminada', 'backup.toast.deleteError': 'No se pudo eliminar', 'backup.toast.downloadError': 'La descarga falló', 'backup.toast.settingsSaved': 'Ajustes de copia automática guardados', 'backup.toast.settingsError': 'No se pudieron guardar los ajustes', 'backup.auto.title': 'Copia automática', 'backup.auto.subtitle': 'Copia de seguridad automática según una programación', 'backup.auto.enable': 'Activar copia automática', 'backup.auto.enableHint': 'Se crearán copias automáticamente según la frecuencia elegida', 'backup.auto.interval': 'Intervalo', 'backup.auto.hour': 'Ejecutar a la hora', 'backup.auto.hourHint': 'Hora local del servidor (formato {format})', 'backup.auto.dayOfWeek': 'Día de la semana', 'backup.auto.dayOfMonth': 'Día del mes', 'backup.auto.dayOfMonthHint': 'Limitado a 1–28 para compatibilidad con todos los meses', 'backup.auto.scheduleSummary': 'Programación', 'backup.auto.summaryDaily': 'Todos los días a las {hour}:00', 'backup.auto.summaryWeekly': 'Cada {day} a las {hour}:00', 'backup.auto.summaryMonthly': 'El día {day} de cada mes a las {hour}:00', 'backup.auto.envLocked': 'Docker', 'backup.auto.envLockedHint': 'La copia automática está configurada mediante variables de entorno Docker. Para cambiar estos ajustes, actualiza tu docker-compose.yml y reinicia el contenedor.', 'backup.auto.copyEnv': 'Copiar variables de entorno Docker', 'backup.auto.envCopied': 'Variables de entorno Docker copiadas al portapapeles', 'backup.auto.keepLabel': 'Eliminar copias antiguas después de', 'backup.dow.sunday': 'Dom', 'backup.dow.monday': 'Lun', 'backup.dow.tuesday': 'Mar', 'backup.dow.wednesday': 'Mié', 'backup.dow.thursday': 'Jue', 'backup.dow.friday': 'Vie', 'backup.dow.saturday': 'Sáb', 'backup.interval.hourly': 'Cada hora', 'backup.interval.daily': 'Diaria', 'backup.interval.weekly': 'Semanal', 'backup.interval.monthly': 'Mensual', 'backup.keep.1day': '1 día', 'backup.keep.3days': '3 días', 'backup.keep.7days': '7 días', 'backup.keep.14days': '14 días', 'backup.keep.30days': '30 días', 'backup.keep.forever': 'Conservar para siempre', // Photos 'photos.allDays': 'Todos los días', 'photos.noPhotos': 'Aún no hay fotos', 'photos.uploadHint': 'Sube y organiza las fotos compartidas de este viaje', 'photos.clickToSelect': 'o haz clic para seleccionar', 'photos.linkPlace': 'Vincular lugar', 'photos.noPlace': 'Sin lugar', 'photos.uploadN': 'Subida de {n} foto(s)', 'admin.addons.catalog.memories.name': 'Fotos (Immich)', 'admin.addons.catalog.memories.description': 'Comparte fotos de viaje a través de tu instancia de Immich', 'admin.addons.catalog.mcp.name': 'MCP', 'admin.addons.catalog.mcp.description': 'Protocolo de contexto de modelo para integración con asistentes de IA', 'admin.addons.catalog.packing.name': 'Listas', 'admin.addons.catalog.packing.description': 'Listas de equipaje y tareas pendientes para tus viajes', 'admin.addons.catalog.budget.name': 'Presupuesto', 'admin.addons.catalog.budget.description': 'Controla los gastos y planifica el presupuesto del viaje', 'admin.addons.catalog.documents.name': 'Documentos', 'admin.addons.catalog.documents.description': 'Guarda y gestiona la documentación del viaje', 'admin.addons.catalog.vacay.name': 'Vacaciones', 'admin.addons.catalog.vacay.description': 'Planificador personal de vacaciones con vista de calendario', 'admin.addons.catalog.atlas.name': 'Atlas', 'admin.addons.catalog.atlas.description': 'Mapa del mundo con los países visitados y estadísticas de viaje', 'admin.addons.catalog.collab.name': 'Colaboración', 'admin.addons.catalog.collab.description': 'Notas, encuestas y chat en tiempo real para organizar el viaje', // Backup restore modal 'backup.restoreConfirmTitle': '¿Restaurar copia?', 'backup.restoreWarning': 'Todos los datos actuales (viajes, lugares, usuarios, subidas) serán reemplazados permanentemente por la copia. Esta acción no se puede deshacer.', 'backup.restoreTip': 'Consejo: crea una copia del estado actual antes de restaurar.', 'backup.restoreConfirm': 'Sí, restaurar', // PDF 'pdf.travelPlan': 'Plan de viaje', 'pdf.planned': 'Planificado', 'pdf.costLabel': 'Coste EUR', 'pdf.preview': 'Vista previa PDF', 'pdf.saveAsPdf': 'Guardar como PDF', // Planner 'planner.places': 'Lugares', 'planner.bookings': 'Reservas', 'planner.packingList': 'Lista de equipaje', 'planner.documents': 'Documentos', 'planner.dayPlan': 'Plan por días', 'planner.reservations': 'Reservas', 'planner.minTwoPlaces': 'Se necesitan al menos 2 lugares con coordenadas', 'planner.noGeoPlaces': 'No hay lugares con coordenadas disponibles', 'planner.routeCalculated': 'Ruta calculada', 'planner.routeCalcFailed': 'No se pudo calcular la ruta', 'planner.routeError': 'Error al calcular la ruta', 'planner.routeOptimized': 'Ruta optimizada', 'planner.reservationUpdated': 'Reserva actualizada', 'planner.reservationAdded': 'Reserva añadida', 'planner.confirmDeleteReservation': '¿Eliminar reserva?', 'planner.reservationDeleted': 'Reserva eliminada', 'planner.days': 'Días', 'planner.allPlaces': 'Todos los lugares', 'planner.totalPlaces': '{n} lugares en total', 'planner.noDaysPlanned': 'Aún no hay días planificados', 'planner.editTrip': 'Editar viaje →', 'planner.placeOne': '1 lugar', 'planner.placeN': '{n} lugares', 'planner.addNote': 'Añadir nota', 'planner.noEntries': 'No hay entradas para este día', 'planner.addPlace': 'Añadir lugar/actividad', 'planner.addPlaceShort': '+ Añadir lugar/actividad', 'planner.resPending': 'Reserva pendiente · ', 'planner.resConfirmed': 'Reserva confirmada · ', 'planner.notePlaceholder': 'Nota…', 'planner.noteTimePlaceholder': 'Hora (opcional)', 'planner.noteExamplePlaceholder': 'p. ej. S3 a las 14:30 desde la estación central, ferry desde el muelle 7, pausa para comer…', 'planner.totalCost': 'Coste total', 'planner.searchPlaces': 'Buscar lugares…', 'planner.allCategories': 'Todas las categorías', 'planner.noPlacesFound': 'No se encontraron lugares', 'planner.addFirstPlace': 'Añadir el primer lugar', 'planner.noReservations': 'Sin reservas', 'planner.addFirstReservation': 'Añadir la primera reserva', 'planner.new': 'Nuevo', 'planner.addToDay': '+ Día', 'planner.calculating': 'Calculando…', 'planner.route': 'Ruta', 'planner.optimize': 'Optimizar', 'planner.openGoogleMaps': 'Abrir en Google Maps', 'planner.selectDayHint': 'Selecciona un día de la lista izquierda para ver su plan', 'planner.noPlacesForDay': 'Aún no hay lugares para este día', 'planner.addPlacesLink': 'Añadir lugares →', 'planner.minTotal': 'min en total', 'planner.noReservation': 'Sin reserva', 'planner.removeFromDay': 'Quitar del día', 'planner.addToThisDay': 'Añadir al día', 'planner.overview': 'Vista general', 'planner.noDays': 'No hay días todavía', 'planner.editTripToAddDays': 'Edita el viaje para añadir días', 'planner.dayCount': '{n} días', 'planner.clickToUnlock': 'Haz clic para desbloquear', 'planner.keepPosition': 'Mantener posición durante la optimización de ruta', 'planner.dayDetails': 'Detalles del día', 'planner.dayN': 'Día {n}', // Dashboard Stats 'stats.countries': 'Países', 'stats.cities': 'Ciudades', 'stats.trips': 'Viajes', 'stats.places': 'Lugares', 'stats.worldProgress': 'Progreso mundial', 'stats.visited': 'visitados', 'stats.remaining': 'restantes', 'stats.visitedCountries': 'Países visitados', // Day Detail Panel 'day.precipProb': 'Probabilidad de lluvia', 'day.precipitation': 'Precipitación', 'day.wind': 'Viento', 'day.sunrise': 'Amanecer', 'day.sunset': 'Atardecer', 'day.hourlyForecast': 'Pronóstico por horas', 'day.climateHint': 'Promedios históricos: el pronóstico real está disponible dentro de los 16 días previos a la fecha.', 'day.noWeather': 'No hay datos meteorológicos disponibles. Añade un lugar con coordenadas.', 'day.overview': 'Resumen diario', 'day.accommodation': 'Alojamiento', 'day.addAccommodation': 'Añadir alojamiento', 'day.hotelDayRange': 'Aplicar a los días', 'day.noPlacesForHotel': 'Añade primero lugares al viaje', 'day.allDays': 'Todos', 'day.checkIn': 'Check-in', 'day.checkOut': 'Check-out', 'day.confirmation': 'Confirmación', 'day.editAccommodation': 'Editar alojamiento', 'day.reservations': 'Reservas', // Memories / Immich 'memories.title': 'Fotos', 'memories.notConnected': 'Immich no conectado', 'memories.notConnectedHint': 'Conecta tu instancia de Immich en Ajustes para ver tus fotos de viaje aquí.', 'memories.noDates': 'Añade fechas a tu viaje para cargar fotos.', 'memories.noPhotos': 'No se encontraron fotos', 'memories.noPhotosHint': 'No se encontraron fotos en Immich para el rango de fechas de este viaje.', 'memories.photosFound': 'fotos', 'memories.fromOthers': 'de otros', 'memories.sharePhotos': 'Compartir fotos', 'memories.sharing': 'Compartiendo', 'memories.reviewTitle': 'Revisar tus fotos', 'memories.reviewHint': 'Haz clic en las fotos para excluirlas de compartir.', 'memories.shareCount': 'Compartir {count} fotos', 'memories.immichUrl': 'URL del servidor Immich', 'memories.immichApiKey': 'Clave API', 'memories.testConnection': 'Probar conexión', 'memories.testFirst': 'Probar conexión primero', 'memories.connected': 'Conectado', 'memories.disconnected': 'No conectado', 'memories.connectionSuccess': 'Conectado a Immich', 'memories.connectionError': 'No se pudo conectar a Immich', 'memories.saved': 'Configuración de Immich guardada', 'memories.oldest': 'Más antiguas', 'memories.newest': 'Más recientes', 'memories.allLocations': 'Todas las ubicaciones', 'memories.addPhotos': 'Añadir fotos', 'memories.linkAlbum': 'Vincular álbum', 'memories.selectAlbum': 'Seleccionar álbum de Immich', 'memories.noAlbums': 'No se encontraron álbumes', 'memories.syncAlbum': 'Sincronizar álbum', 'memories.unlinkAlbum': 'Desvincular', 'memories.photos': 'fotos', 'memories.selectPhotos': 'Seleccionar fotos de Immich', 'memories.selectHint': 'Toca las fotos para seleccionarlas.', 'memories.selected': 'seleccionado(s)', 'memories.addSelected': 'Añadir {count} fotos', 'memories.alreadyAdded': 'Añadido', 'memories.private': 'Privado', 'memories.stopSharing': 'Dejar de compartir', 'memories.tripDates': 'Fechas del viaje', 'memories.allPhotos': 'Todas las fotos', 'memories.confirmShareTitle': '¿Compartir con los miembros del viaje?', 'memories.confirmShareHint': '{count} fotos serán visibles para todos los miembros de este viaje. Puedes hacer fotos individuales privadas más tarde.', 'memories.confirmShareButton': 'Compartir fotos', // Collab Addon 'collab.tabs.chat': 'Mensajes', 'collab.tabs.notes': 'Notas', 'collab.tabs.polls': 'Encuestas', 'collab.whatsNext.title': 'Qué viene ahora', 'collab.whatsNext.today': 'Hoy', 'collab.whatsNext.tomorrow': 'Mañana', 'collab.whatsNext.empty': 'No hay actividades próximas', 'collab.whatsNext.until': 'hasta', 'collab.whatsNext.emptyHint': 'Las actividades con hora aparecerán aquí', 'collab.chat.send': 'Enviar', 'collab.chat.placeholder': 'Escribe un mensaje...', 'collab.chat.empty': 'Empieza la conversación', 'collab.chat.emptyHint': 'Los mensajes se comparten con todos los miembros del viaje', 'collab.chat.emptyDesc': 'Comparte ideas, planes y novedades con tu grupo de viaje', 'collab.chat.today': 'Hoy', 'collab.chat.yesterday': 'Ayer', 'collab.chat.deletedMessage': 'eliminó un mensaje', 'collab.chat.reply': 'Responder', 'collab.chat.loadMore': 'Cargar mensajes anteriores', 'collab.chat.justNow': 'justo ahora', 'collab.chat.minutesAgo': 'hace {n} min', 'collab.chat.hoursAgo': 'hace {n} h', 'collab.notes.title': 'Notas', 'collab.notes.new': 'Nueva nota', 'collab.notes.empty': 'Aún no hay notas', 'collab.notes.emptyHint': 'Empieza a capturar ideas y planes', 'collab.notes.all': 'Todas', 'collab.notes.titlePlaceholder': 'Título de la nota', 'collab.notes.contentPlaceholder': 'Escribe algo...', 'collab.notes.categoryPlaceholder': 'Categoría', 'collab.notes.newCategory': 'Nueva categoría...', 'collab.notes.category': 'Categoría', 'collab.notes.noCategory': 'Sin categoría', 'collab.notes.color': 'Color', 'collab.notes.save': 'Guardar', 'collab.notes.cancel': 'Cancelar', 'collab.notes.edit': 'Editar', 'collab.notes.delete': 'Eliminar', 'collab.notes.pin': 'Fijar', 'collab.notes.unpin': 'Desfijar', 'collab.notes.daysAgo': 'hace {n} d', 'collab.notes.categorySettings': 'Gestionar categorías', 'collab.notes.create': 'Crear', 'collab.notes.website': 'Sitio web', 'collab.notes.websitePlaceholder': 'https://...', 'collab.notes.attachFiles': 'Adjuntar archivos', 'collab.notes.noCategoriesYet': 'Aún no hay categorías', 'collab.notes.emptyDesc': 'Crea una nota para empezar', 'collab.polls.title': 'Encuestas', 'collab.polls.new': 'Nueva encuesta', 'collab.polls.empty': 'Aún no hay encuestas', 'collab.polls.emptyHint': 'Pregunta al grupo y votad juntos', 'collab.polls.question': 'Pregunta', 'collab.polls.questionPlaceholder': '¿Qué deberíamos hacer?', 'collab.polls.addOption': '+ Añadir opción', 'collab.polls.optionPlaceholder': 'Opción {n}', 'collab.polls.create': 'Crear encuesta', 'collab.polls.close': 'Cerrar', 'collab.polls.closed': 'Cerrada', 'collab.polls.votes': '{n} votos', 'collab.polls.vote': '{n} voto', 'collab.polls.multipleChoice': 'Selección múltiple', 'collab.polls.multiChoice': 'Selección múltiple', 'collab.polls.deadline': 'Fecha límite', 'collab.polls.option': 'Opción', 'collab.polls.options': 'Opciones', 'collab.polls.delete': 'Eliminar', 'collab.polls.closedSection': 'Cerradas', // Files management (2.6.2) 'files.trash': 'Papelera', 'files.trashEmpty': 'La papelera está vacía', 'files.emptyTrash': 'Vaciar papelera', 'files.restore': 'Restaurar', 'files.star': 'Destacar', 'files.unstar': 'Quitar destacado', 'files.assign': 'Asignar', 'files.assignTitle': 'Asignar archivo', 'files.assignPlace': 'Lugar', 'files.assignBooking': 'Reserva', 'files.unassigned': 'Sin asignar', 'files.unlink': 'Eliminar vínculo', 'files.noteLabel': 'Nota', 'files.notePlaceholder': 'Añadir una nota...', 'files.toast.trashed': 'Movido a la papelera', 'files.toast.restored': 'Archivo restaurado', 'files.toast.trashEmptied': 'Papelera vaciada', 'files.toast.assigned': 'Archivo asignado', 'files.toast.assignError': 'Error al asignar', 'files.toast.restoreError': 'Error al restaurar', 'files.confirm.permanentDelete': 'Eliminar este archivo permanentemente? No se puede deshacer.', 'files.confirm.emptyTrash': 'Eliminar todos los archivos de la papelera? No se puede deshacer.', // Reservation metadata (2.6.2) 'reservations.meta.airline': 'Aerolínea', 'reservations.meta.flightNumber': 'N° de vuelo', 'reservations.meta.from': 'Desde', 'reservations.meta.to': 'Hasta', 'reservations.meta.trainNumber': 'N° de tren', 'reservations.meta.platform': 'Andén', 'reservations.meta.seat': 'Asiento', 'reservations.meta.checkIn': 'Check-in', 'reservations.meta.checkOut': 'Check-out', 'reservations.meta.linkAccommodation': 'Alojamiento', 'reservations.meta.pickAccommodation': 'Vincular con alojamiento', 'reservations.meta.noAccommodation': 'Ninguno', 'reservations.meta.hotelPlace': 'Alojamiento', 'reservations.meta.pickHotel': 'Seleccionar alojamiento', 'reservations.meta.fromDay': 'Desde', 'reservations.meta.toDay': 'Hasta', 'reservations.meta.selectDay': 'Seleccionar día', // OIDC-only mode (2.6.2) 'admin.oidcOnlyMode': 'Desactivar autenticación por contraseña', 'admin.oidcOnlyModeHint': 'Si está activado, solo se permite el inicio de sesión con SSO. El inicio de sesión y registro con contraseña se bloquean.', 'login.oidcOnly': 'La autenticación por contraseña está desactivada. Por favor, inicia sesión con tu proveedor SSO.', // Settings (2.6.2) 'settings.currentPasswordRequired': 'La contraseña actual es obligatoria', 'settings.passwordWeak': 'La contraseña debe contener mayúsculas, minúsculas, números y un carácter especial', // Permissions 'admin.tabs.permissions': 'Permisos', 'perm.title': 'Configuración de permisos', 'perm.subtitle': 'Controla quién puede realizar acciones en la aplicación', 'perm.saved': 'Configuración de permisos guardada', 'perm.resetDefaults': 'Restablecer valores predeterminados', 'perm.customized': 'personalizado', 'perm.level.admin': 'Solo administrador', 'perm.level.tripOwner': 'Propietario del viaje', 'perm.level.tripMember': 'Miembros del viaje', 'perm.level.everybody': 'Todos', 'perm.cat.trip': 'Gestión de viajes', 'perm.cat.members': 'Gestión de miembros', 'perm.cat.files': 'Archivos', 'perm.cat.content': 'Contenido y horario', 'perm.cat.extras': 'Presupuesto, equipaje y colaboración', 'perm.action.trip_create': 'Crear viajes', 'perm.action.trip_edit': 'Editar detalles del viaje', 'perm.action.trip_delete': 'Eliminar viajes', 'perm.action.trip_archive': 'Archivar / desarchivar viajes', 'perm.action.trip_cover_upload': 'Subir imagen de portada', 'perm.action.member_manage': 'Añadir / eliminar miembros', 'perm.action.file_upload': 'Subir archivos', 'perm.action.file_edit': 'Editar metadatos del archivo', 'perm.action.file_delete': 'Eliminar archivos', 'perm.action.place_edit': 'Añadir / editar / eliminar lugares', 'perm.action.day_edit': 'Editar días, notas y asignaciones', 'perm.action.reservation_edit': 'Gestionar reservas', 'perm.action.budget_edit': 'Gestionar presupuesto', 'perm.action.packing_edit': 'Gestionar listas de equipaje', 'perm.action.collab_edit': 'Colaboración (notas, encuestas, chat)', 'perm.action.share_manage': 'Gestionar enlaces compartidos', 'perm.actionHint.trip_create': 'Quién puede crear nuevos viajes', 'perm.actionHint.trip_edit': 'Quién puede cambiar el nombre, fechas, descripción y moneda del viaje', 'perm.actionHint.trip_delete': 'Quién puede eliminar permanentemente un viaje', 'perm.actionHint.trip_archive': 'Quién puede archivar o desarchivar un viaje', 'perm.actionHint.trip_cover_upload': 'Quién puede subir o cambiar la imagen de portada', 'perm.actionHint.member_manage': 'Quién puede invitar o eliminar miembros del viaje', 'perm.actionHint.file_upload': 'Quién puede subir archivos a un viaje', 'perm.actionHint.file_edit': 'Quién puede editar descripciones y enlaces de archivos', 'perm.actionHint.file_delete': 'Quién puede mover archivos a la papelera o eliminarlos permanentemente', 'perm.actionHint.place_edit': 'Quién puede añadir, editar o eliminar lugares', 'perm.actionHint.day_edit': 'Quién puede editar días, notas de días y asignaciones de lugares', 'perm.actionHint.reservation_edit': 'Quién puede crear, editar o eliminar reservas', 'perm.actionHint.budget_edit': 'Quién puede crear, editar o eliminar partidas del presupuesto', 'perm.actionHint.packing_edit': 'Quién puede gestionar artículos de equipaje y bolsas', 'perm.actionHint.collab_edit': 'Quién puede crear notas, encuestas y enviar mensajes', 'perm.actionHint.share_manage': 'Quién puede crear o eliminar enlaces compartidos públicos', // Undo 'undo.button': 'Deshacer', 'undo.tooltip': 'Deshacer: {action}', 'undo.assignPlace': 'Lugar asignado al día', 'undo.removeAssignment': 'Lugar eliminado del día', 'undo.reorder': 'Lugares reordenados', 'undo.optimize': 'Ruta optimizada', 'undo.deletePlace': 'Lugar eliminado', 'undo.moveDay': 'Lugar movido a otro día', 'undo.lock': 'Bloqueo de lugar activado/desactivado', 'undo.importGpx': 'Importación GPX', 'undo.importGoogleList': 'Importación de Google Maps', // Notifications 'notifications.title': 'Notificaciones', 'notifications.markAllRead': 'Marcar todo como leído', 'notifications.deleteAll': 'Eliminar todo', 'notifications.showAll': 'Ver todas las notificaciones', 'notifications.empty': 'Sin notificaciones', 'notifications.emptyDescription': '¡Estás al día!', 'notifications.all': 'Todas', 'notifications.unreadOnly': 'No leídas', 'notifications.markRead': 'Marcar como leída', 'notifications.markUnread': 'Marcar como no leída', 'notifications.delete': 'Eliminar', 'notifications.system': 'Sistema', 'memories.error.loadAlbums': 'Error al cargar los álbumes', 'memories.error.linkAlbum': 'Error al vincular el álbum', 'memories.error.unlinkAlbum': 'Error al desvincular el álbum', 'memories.error.syncAlbum': 'Error al sincronizar el álbum', 'memories.error.loadPhotos': 'Error al cargar las fotos', 'memories.error.addPhotos': 'Error al agregar las fotos', 'memories.error.removePhoto': 'Error al eliminar la foto', 'memories.error.toggleSharing': 'Error al actualizar el uso compartido', 'undo.addPlace': 'Lugar agregado', 'undo.done': 'Deshecho: {action}', 'notifications.test.title': 'Notificación de prueba de {actor}', 'notifications.test.text': 'Esta es una notificación de prueba simple.', 'notifications.test.booleanTitle': '{actor} solicita tu aprobación', 'notifications.test.booleanText': 'Notificación de prueba booleana.', 'notifications.test.accept': 'Aprobar', 'notifications.test.decline': 'Rechazar', 'notifications.test.navigateTitle': 'Mira esto', 'notifications.test.navigateText': 'Notificación de prueba de navegación.', 'notifications.test.goThere': 'Ir allí', 'notifications.test.adminTitle': 'Difusión de administrador', 'notifications.test.adminText': '{actor} envió una notificación de prueba a todos los administradores.', 'notifications.test.tripTitle': '{actor} publicó en tu viaje', 'notifications.test.tripText': 'Notificación de prueba para el viaje "{trip}".', // Todo 'todo.subtab.packing': 'Lista de equipaje', 'todo.subtab.todo': 'Por hacer', 'todo.completed': 'completado(s)', 'todo.filter.all': 'Todo', 'todo.filter.open': 'Abierto', 'todo.filter.done': 'Hecho', 'todo.uncategorized': 'Sin categoría', 'todo.namePlaceholder': 'Nombre de la tarea', 'todo.descriptionPlaceholder': 'Descripción (opcional)', 'todo.unassigned': 'Sin asignar', 'todo.noCategory': 'Sin categoría', 'todo.hasDescription': 'Con descripción', 'todo.addItem': 'Añadir nueva tarea...', 'todo.newCategory': 'Nombre de la categoría', 'todo.addCategory': 'Añadir categoría', 'todo.newItem': 'Nueva tarea', 'todo.empty': 'Aún no hay tareas. ¡Añade una tarea para empezar!', 'todo.filter.my': 'Mis tareas', 'todo.filter.overdue': 'Vencida', 'todo.sidebar.tasks': 'Tareas', 'todo.sidebar.categories': 'Categorías', 'todo.detail.title': 'Tarea', 'todo.detail.description': 'Descripción', 'todo.detail.category': 'Categoría', 'todo.detail.dueDate': 'Fecha límite', 'todo.detail.assignedTo': 'Asignado a', 'todo.detail.delete': 'Eliminar', 'todo.detail.save': 'Guardar cambios', 'todo.detail.create': 'Crear tarea', 'todo.detail.priority': 'Prioridad', 'todo.detail.noPriority': 'Ninguna', 'todo.sortByPrio': 'Prioridad', // Notification system (added from feat/notification-system) 'settings.notifyVersionAvailable': 'Nueva versión disponible', 'settings.notificationPreferences.noChannels': 'No hay canales de notificación configurados. Pide a un administrador que configure notificaciones por correo o webhook.', 'settings.webhookUrl.label': 'URL del webhook', 'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', 'settings.webhookUrl.hint': 'Introduce tu URL de webhook de Discord, Slack o personalizada para recibir notificaciones.', 'settings.webhookUrl.save': 'Guardar', 'settings.webhookUrl.saved': 'URL del webhook guardada', 'settings.webhookUrl.test': 'Probar', 'settings.webhookUrl.testSuccess': 'Webhook de prueba enviado correctamente', 'settings.webhookUrl.testFailed': 'Error al enviar el webhook de prueba', 'settings.notificationPreferences.inapp': 'In-App', 'settings.notificationPreferences.webhook': 'Webhook', 'settings.notificationPreferences.email': 'Email', 'admin.notifications.emailPanel.title': 'Email (SMTP)', 'admin.notifications.webhookPanel.title': 'Webhook', 'admin.notifications.inappPanel.title': 'In-App', 'admin.notifications.inappPanel.hint': 'Las notificaciones in-app siempre están activas y no se pueden desactivar globalmente.', 'admin.notifications.adminWebhookPanel.title': 'Webhook de admin', 'admin.notifications.adminWebhookPanel.hint': 'Este webhook se usa exclusivamente para notificaciones de admin (ej. alertas de versión). Es independiente de los webhooks de usuario y se activa automáticamente si hay una URL configurada.', 'admin.notifications.adminWebhookPanel.saved': 'URL del webhook de admin guardada', 'admin.notifications.adminWebhookPanel.testSuccess': 'Webhook de prueba enviado correctamente', 'admin.notifications.adminWebhookPanel.testFailed': 'Error al enviar el webhook de prueba', 'admin.notifications.adminWebhookPanel.alwaysOnHint': 'El webhook de admin se activa automáticamente si hay una URL configurada', 'admin.notifications.adminNotificationsHint': 'Configura qué canales entregan notificaciones de admin (ej. alertas de versión). El webhook se activa automáticamente si hay una URL de webhook de admin configurada.', 'admin.tabs.notifications': 'Notificaciones', 'notifications.versionAvailable.title': 'Actualización disponible', 'notifications.versionAvailable.text': 'TREK {version} ya está disponible.', 'notifications.versionAvailable.button': 'Ver detalles', 'notif.test.title': '[Test] Notificación', 'notif.test.simple.text': 'Esta es una notificación de prueba simple.', 'notif.test.boolean.text': '¿Aceptas esta notificación de prueba?', 'notif.test.navigate.text': 'Haz clic abajo para ir al panel de control.', // Notifications 'notif.trip_invite.title': 'Invitación al viaje', 'notif.trip_invite.text': '{actor} te invitó a {trip}', 'notif.booking_change.title': 'Reserva actualizada', 'notif.booking_change.text': '{actor} actualizó una reserva en {trip}', 'notif.trip_reminder.title': 'Recordatorio de viaje', 'notif.trip_reminder.text': '¡Tu viaje {trip} se acerca!', 'notif.vacay_invite.title': 'Invitación Vacay Fusion', 'notif.vacay_invite.text': '{actor} te invitó a fusionar planes de vacaciones', 'notif.photos_shared.title': 'Fotos compartidas', 'notif.photos_shared.text': '{actor} compartió {count} foto(s) en {trip}', 'notif.collab_message.title': 'Nuevo mensaje', 'notif.collab_message.text': '{actor} envió un mensaje en {trip}', 'notif.packing_tagged.title': 'Asignación de equipaje', 'notif.packing_tagged.text': '{actor} te asignó a {category} en {trip}', 'notif.version_available.title': 'Nueva versión disponible', 'notif.version_available.text': 'TREK {version} ya está disponible', 'notif.action.view_trip': 'Ver viaje', 'notif.action.view_collab': 'Ver mensajes', 'notif.action.view_packing': 'Ver equipaje', 'notif.action.view_photos': 'Ver fotos', 'notif.action.view_vacay': 'Ver Vacay', 'notif.action.view_admin': 'Ir al admin', 'notif.action.view': 'Ver', 'notif.action.accept': 'Aceptar', 'notif.action.decline': 'Rechazar', 'notif.generic.title': 'Notificación', 'notif.generic.text': 'Tienes una nueva notificación', 'notif.dev.unknown_event.title': '[DEV] Evento desconocido', 'notif.dev.unknown_event.text': 'El tipo de evento "{event}" no está registrado en EVENT_NOTIFICATION_CONFIG', } export default es