Files
TREK/client/src/i18n/translations/es.ts
2026-03-30 18:36:18 -03:00

1395 lines
68 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.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 128 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