const es: Record<string, string> = {
  // Common
  'common.save': 'Guardar',
  'common.cancel': 'Cancelar',
  'common.delete': 'Eliminar',
  'common.edit': 'Editar',
  'common.add': 'Añadir',
  'common.loading': 'Cargando...',
  '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.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.archive': 'Archivar',
  '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.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.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.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',
  'admin.smtp.title': 'Correo y notificaciones',
  'admin.smtp.hint': 'Configuración SMTP para notificaciones por correo. Opcional: URL webhook para Discord, Slack, etc.',
  'admin.smtp.testButton': 'Enviar correo de prueba',
  '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 <your_token> 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.username': 'Usuario',
  'settings.email': 'Correo',
  'settings.role': 'Rol',
  'settings.roleAdmin': 'Administrador',
  'settings.oidcLinked': 'Vinculado con',
  'settings.changePassword': 'Cambiar contraseña',
  '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 NOMAD.',
  '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 6 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': 'Registro de auditoría',
  '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': 'Configuració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 NOMAD.',
  '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': 'NOMAD 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': 'NOMAD {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': 'NOMAD 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 NOMAD 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',
  '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 NOMAD',
  'vacay.owner': 'Propietario',
  'vacay.shareEmailPlaceholder': 'Correo electrónico del usuario de NOMAD',
  '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 NOMAD 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.markVisited': 'Marcar como visitado',
  'atlas.markVisitedHint': 'Añadir este país a tu lista de visitados',
  'atlas.addToBucket': 'Añadir a lista de deseos',
  'atlas.addPoi': 'Añadir lugar',
  'atlas.bucketNamePlaceholder': 'Nombre (país, ciudad, lugar…)',
  'atlas.month': 'Mes',
  'atlas.year': 'Año',
  '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.budget': 'Presupuesto',
  'trip.tabs.files': 'Archivos',
  'trip.loading': 'Cargando viaje...',
  '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': 'Importar GPX',
  'places.gpxImported': '{count} lugares importados desde GPX',
  'places.gpxError': 'Error al importar GPX',
  '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',

  // 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)',

  // Budget
  'budget.title': 'Presupuesto',
  '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.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': 'Equipaje',
  'admin.addons.catalog.packing.description': 'Prepara tu equipaje con listas de comprobación para cada viaje',
  '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.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.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.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 y números',
}

export default es
