/** * Spanish translations (Spain / Castellano) * Note: Skateboarding trick names and terminology stay in English * (kickflip, ollie, grind, etc. are universal in skate culture) */ const es = { // Common common: { loading: 'Cargando...', error: 'Error', save: 'Guardar', cancel: 'Cancelar', delete: 'Eliminar', edit: 'Editar', create: 'Crear', submit: 'Enviar', close: 'Cerrar', back: 'Atrás', next: 'Siguiente', done: 'Listo', search: 'Buscar', filter: 'Filtrar', sort: 'Ordenar', share: 'Compartir', copy: 'Copiar', copied: '¡Copiado!', viewAll: 'Ver Todo', seeMore: 'Ver Más', showMore: 'Mostrar Más', showLess: 'Mostrar Menos', noResults: 'No se encontraron resultados', tryAgain: 'Intentar de Nuevo', learnMore: 'Saber Más', getStarted: 'Comenzar', yes: 'Sí', no: 'No', or: 'o', and: 'y', free: 'Gratis', new: 'Nuevo', popular: 'Popular', featured: 'Destacado', verified: 'Verificado', sats: 'sats', clear: 'Limpiar', clearFilters: 'Limpiar Filtros', clearAll: 'Limpiar Todo', }, // Navigation nav: { home: 'Inicio', map: 'Spots', lab: 'El Lab', events: 'Eventos', crews: 'Cuadrillas', wallet: 'Billetera', settings: 'Ajustes', more: 'Más', rewards: 'Recompensas', stats: 'Estadísticas', about: 'Acerca de', food: 'Comida', marketplace: 'Mercado', mints: 'Mints', appShop: 'Tienda de la App', trades: 'Mercado', stash: 'Alijo', collections: 'Colecciones', contacts: 'Contactos', messages: 'Mensajes', skaters: 'Skaters', glossary: 'Glosario', riderCard: 'Carné de Rider', supporters: 'Colaboradores ⚡', newsletter: 'Boletín', viewProfile: 'Ver perfil', leaderboards: 'Clasificaciones', }, // Authentication auth: { login: 'Iniciar Sesión', logout: 'Cerrar Sesión', signUp: 'Registrarse', signUpTitle: '¿Nuevo en Nostr?', signUpDesc: 'Crea una cuenta nueva para empezar. Es gratis y abierto.', orLogIn: 'O inicia sesión', loginWithExtension: 'Iniciar con Extensión', loginWithAmber: 'Iniciar con Amber (Android)', loginWithKey: 'Clave Secreta (nsec) o Frase de Recuperación', loginWithBunker: 'Iniciar con Nostr Connect', bunkerUri: 'Cadena de Conexión del Bunker', openAmber: 'Abrir Amber', connectToBunker: 'Conectar al Bunker', noExtension: 'No se detectó ninguna extensión.', extensionHelp: 'Intenta usar el botón Registrarse arriba para crear una cuenta nueva, o usa las pestañas Amber, Clave o Bunker si tienes credenciales existentes.', amberDesc: 'Amber es una app segura de firma Nostr para dispositivos Android. Haz clic en el botón para abrir Amber y autorizar el acceso.', bunkerDesc: 'Accede a tu cuenta desde cualquier dispositivo usando un firmador remoto (bunker). Tus claves se mantienen seguras en el servidor, nunca expuestas a sitios web.', keyPlaceholder: 'nsec1... o tu frase de recuperación de 12 palabras', keyHint: 'Puedes pegar tu clave nsec o tu frase de recuperación de 12 palabras', uploadKeyFile: 'Subir Archivo de Clave', loggingIn: 'Iniciando sesión...', connecting: 'Conectando...', verifying: 'Verificando...', }, // Backup Reminder backup: { title: 'Guarda tu acceso', subtitle: 'Toma 10 segundos — hazlo una vez', message: 'Tu código de recuperación es la única forma de volver a tu cuenta. Guárdalo y podrás iniciar sesión en cualquier dispositivo.', warning: 'Si lo pierdes no hay reinicio — sin correo ni recuperación de contraseña.', backupNow: 'Guardar ahora', confirmed: 'Ya lo guardé', remindLater: 'Después', }, // PWA Install pwa: { installTitle: 'Instalar SkateSpots', installSubtitle: 'Obtén la experiencia completa de la app', addToHomeScreen: 'Añadir a Pantalla de Inicio', installApp: 'Instalar App', maybeLater: 'Quizás después', gotIt: '¡Entendido!', benefits: { fast: 'Súper Rápido', offline: 'Funciona Sin Internet', fullAccess: 'Acceso Completo', }, iosStep1: 'Toca el botón Compartir', iosStep1Hint: 'en la parte inferior de Safari', iosStep2: 'Desplázate y toca "Añadir a pantalla de inicio"', iosStep2Hint: 'en el menú de compartir', iosStep3: 'Toca "Añadir" para instalar', iosStep3Hint: 'La app aparecerá en tu pantalla de inicio', androidStep1: 'Toca el botón de menú', androidStep1Hint: '(tres puntos) en tu navegador', androidStep2: 'Selecciona "Añadir a pantalla de inicio"', androidStep2Hint: 'o "Instalar aplicación"', androidStep3: 'Confirma para instalar', androidStep3Hint: 'La app aparecerá en tu pantalla de inicio', tagline: 'Gratis • Funciona sin conexión • Rápido y confiable', }, // Home/Index Page home: { tagline: 'Impulsado por la Comunidad • Basado en Relays', title: 'SKATE SPOTS', subtitle: 'Descubre Spots • Reúnete • Aprende Trucos • Apoya Locales', description: 'El skate real pasa offline - esta herramienta te ayuda a encontrarlo.', betaWarning: 'BETA - En Construcción • Usa Bajo Tu Propio Riesgo', pwaHint: 'App Web Progresiva - Instala en Tu Dispositivo', exploreMap: 'Explorar Mapa', addSpot: 'Añadir Spot', globalSpots: 'Spots Globales', openCommunity: 'Comunidad Abierta', lightningZaps: 'Zaps Lightning', featuredSpots: 'Spots Destacados', featuredSpotsDesc: 'Spots de skate verificados por la comunidad de todo el mundo', upcomingEvents: 'Próximos Eventos', upcomingEventsDesc: 'Competiciones, quedadas y sessions que vienen pronto', noSpotsYet: 'Aún no hay spots', noSpotsHint: '¡Sé el primero en añadir un spot de skate!', noEventsYet: 'No hay próximos eventos', noEventsHint: '¡Vuelve más tarde o crea uno!', theLab: 'El Lab', theLabDesc: 'Aprende trucos, encuentra coaches y mejora tu skate', coaches: 'Coaches', coachesDesc: 'Aprende de skaters experimentados que pueden ayudarte a progresar', filmers: 'Filmers', filmersDesc: 'Conecta con filmers para capturar tus mejores clips', findCoach: 'Buscar Coach', becomeCoach: 'Ser Coach', findFilmer: 'Buscar Filmer', becomeFilmer: 'Ser Filmer', viewAllSpots: 'Ver Todos los Spots', viewAllEvents: 'Ver Todos los Eventos', createEvent: 'Crear Evento', readyToShare: '¿Listo para Compartir?', readyToShareDesc: 'Ayuda a crecer la comunidad de skateboarding añadiendo tus spots favoritos. Cada ubicación que compartas ayuda a otros skaters a descubrir nuevos lugares para patinar.', }, // Map Page mapPage: { title: 'Tiendas y Spots', spots: 'Spots', shops: 'Tiendas', filters: 'Filtros', listView: 'Lista', mapView: 'Mapa', nearMe: 'Cerca de Mí', searchPlaceholder: 'Buscar spots...', noSpotsInArea: 'No hay spots en esta área', zoomIn: 'Acercar', zoomOut: 'Alejar', myLocation: 'Mi Ubicación', locationsFound: '{{count}} ubicaciones encontradas', spotsOnly: 'Solo Spots', shopsOnly: 'Solo Tiendas', spotsAndShops: 'Spots y Tiendas', noSpotsMatch: 'Ningún spot coincide con tus filtros.', noSpotsYet: 'Aún no se han añadido spots.', addFirstSpot: 'Añadir Primer Spot', }, // Spots spots: { addSpot: 'Añadir Spot', editSpot: 'Editar Spot', spotDetails: 'Detalles del Spot', spotName: 'Nombre del Spot', spotType: 'Tipo de Spot', description: 'Descripción', location: 'Ubicación', address: 'Dirección', photos: 'Fotos', addPhotos: 'Añadir Fotos', obstacles: 'Obstáculos', features: 'Características', bustLevel: 'Nivel de Riesgo', bestTime: 'Mejor Horario', tips: 'Consejos', reviews: 'Reseñas', addReview: 'Añadir Reseña', reportSpot: 'Reportar Spot', directions: 'Cómo Llegar', shareSpot: 'Compartir Spot', createdBy: 'Creado por', lastUpdated: 'Última actualización', // Spot types (keeping English skate terms) types: { park: 'Skatepark', street: 'Street Spot', diy: 'Spot DIY', plaza: 'Plaza', indoor: 'Indoor', bowl: 'Bowl', vert: 'Vert', miniramp: 'Mini Ramp', }, // Bust levels bustLevels: { chill: 'Tranqui', moderate: 'Moderado', sketchy: 'Arriesgado', heavy: 'Peligroso', }, }, // Events events: { title: 'Eventos de Skate', createEvent: 'Crear Evento', editEvent: 'Editar Evento', eventDetails: 'Detalles del Evento', eventName: 'Nombre del Evento', eventType: 'Tipo de Evento', date: 'Fecha', time: 'Hora', startDate: 'Fecha de Inicio', endDate: 'Fecha de Fin', venue: 'Lugar', organizer: 'Organizador', attendees: 'Asistentes', going: 'Voy', interested: 'Interesado', rsvp: 'Confirmar', ticketPrice: 'Precio de Entrada', freeEntry: 'Entrada Gratis', register: 'Registrarse', moreInfo: 'Más Info', upcomingEvents: 'Próximos', pastEvents: 'Pasados', noEvents: 'No se encontraron eventos', findEvents: 'Encuentra competencias, demos, sessions y más', searchPlaceholder: 'Buscar eventos...', loginToCreate: 'Inicia sesión para crear eventos', noEventsMatch: 'Ningún evento próximo coincide con tus filtros.', noUpcoming: 'No se encontraron próximos eventos.', noPast: 'No se encontraron eventos pasados.', // Event types (keeping some English skate terms) types: { contest: 'Competencia', session: 'Session', meetup: 'Encuentro', premiere: 'Premiere de Video', workshop: 'Taller', demo: 'Demo', jam: 'Jam', }, }, // Shops shops: { title: 'Tiendas de Skate', addShop: 'Añadir Tienda', editShop: 'Editar Tienda', shopDetails: 'Detalles de la Tienda', shopName: 'Nombre de la Tienda', hours: 'Horario', phone: 'Teléfono', website: 'Sitio Web', services: 'Servicios', brands: 'Marcas', supportLocal: 'Apoya lo Local', }, // Wallet wallet: { title: 'Billetera', balance: 'Saldo', send: 'Enviar', receive: 'Recibir', transactions: 'Transacciones', history: 'Historial', noTransactions: 'Aún no hay transacciones', sendSats: 'Enviar Sats', receiveSats: 'Recibir Sats', amount: 'Cantidad', recipient: 'Destinatario', lightning: 'Lightning', onChain: 'On-chain', invoice: 'Factura', address: 'Dirección', scanQR: 'Escanear QR', paste: 'Pegar', payInvoice: 'Pagar Factura', createInvoice: 'Crear Factura', copied: '¡Copiado al portapapeles!', insufficientFunds: 'Fondos insuficientes', paymentSent: '¡Pago enviado!', paymentReceived: '¡Pago recibido!', cashu: { title: 'Billetera Cashu', tokens: 'Tokens', mint: 'Mint', mints: 'Mints', manageMints: 'Administrar Mints', addMint: 'Añadir Mint', removeMint: 'Eliminar Mint', defaultMint: 'Mint Predeterminado', backup: 'Respaldar', restore: 'Restaurar', recoveryPhrase: 'Frase de Recuperación', viewRecoveryPhrase: 'Ver Frase de Recuperación', seedWarning: '¡Esto es como tu nsec de Nostr - mantenlo secreto y respaldado!', }, }, // Settings settings: { title: 'Ajustes', profile: 'Perfil', editProfile: 'Editar Perfil', account: 'Cuenta', security: 'Seguridad', relays: 'Relays', appearance: 'Apariencia', language: 'Idioma', notifications: 'Notificaciones', privacy: 'Privacidad', about: 'Acerca de', help: 'Ayuda', feedback: 'Comentarios', version: 'Versión', // Profile fields displayName: 'Nombre para Mostrar', username: 'Nombre de Usuario', bio: 'Biografía', website: 'Sitio Web', lightningAddress: 'Dirección Lightning', profilePicture: 'Foto de Perfil', banner: 'Banner', saveProfile: 'Guardar Perfil', // Security backupKeys: 'Respaldar Claves', exportKeys: 'Exportar Claves', secretKey: 'Clave Secreta', publicKey: 'Clave Pública', showSecretKey: 'Mostrar Clave Secreta', hideSecretKey: 'Ocultar Clave Secreta', copyKey: 'Copiar Clave', keysBackedUp: 'Has confirmado que tus claves están respaldadas de forma segura.', keysNotBackedUp: '¡Asegúrate de respaldar tu frase de recuperación o clave secreta!', // Language selectLanguage: 'Seleccionar Idioma', english: 'Inglés', spanish: 'Español', }, // Lab / Coaches lab: { title: 'El Lab', subtitle: 'Mejora tu skate', coaches: 'Coaches', filmers: 'Filmers', findCoach: 'Buscar Coach', becomeCoach: 'Ser Coach', findFilmer: 'Buscar Filmer', becomeFilmer: 'Ser Filmer', hourlyRate: 'Tarifa por Hora', experience: 'Experiencia', specialties: 'Especialidades', availability: 'Disponibilidad', bookSession: 'Reservar Sesión', contactCoach: 'Contactar Coach', noCoaches: 'No se encontraron coaches en tu área', noFilmers: 'No se encontraron filmers en tu área', }, // Rewards rewards: { title: 'Recompensas', yourPoints: 'Tus Puntos', earnPoints: 'Ganar Puntos', redeemPoints: 'Canjear Puntos', leaderboard: 'Tabla de Líderes', achievements: 'Logros', dailyTasks: 'Tareas Diarias', weeklyTasks: 'Tareas Semanales', }, // Zaps zaps: { zapButton: 'Zap', sendZap: 'Enviar Zap', zapAmount: 'Cantidad del Zap', customAmount: 'Cantidad Personalizada', addMessage: 'Añadir mensaje (opcional)', sending: 'Enviando...', sent: '¡Zap enviado!', failed: 'Zap falló', received: '¡Recibiste un zap!', }, // Errors errors: { somethingWentWrong: 'Algo salió mal', tryAgainLater: 'Por favor intenta de nuevo más tarde', notFound: 'No encontrado', pageNotFound: 'Página no encontrada', unauthorized: 'No autorizado', loginRequired: 'Por favor inicia sesión para continuar', networkError: 'Error de red', checkConnection: 'Por favor verifica tu conexión a internet', invalidInput: 'Entrada inválida', requiredField: 'Este campo es obligatorio', }, // Time/Date time: { today: 'Hoy', yesterday: 'Ayer', tomorrow: 'Mañana', thisWeek: 'Esta semana', nextWeek: 'Próxima semana', thisMonth: 'Este mes', justNow: 'Ahora mismo', minutesAgo: 'hace {{count}} minutos', hoursAgo: 'hace {{count}} horas', daysAgo: 'hace {{count}} días', }, // Footer footer: { vibedWith: 'Creado con', poweredBy: 'Impulsado por', openSource: 'Código Abierto', contribute: 'Contribuir', decentralized: 'Descentralizado', communityOwned: 'Propiedad de la Comunidad', }, // Create Spot Page createSpot: { title: 'Añadir un Spot de Skate', subtitle: 'Comparte un spot de skate con la comunidad', backToMap: 'Volver al Mapa', namePlaceholder: 'ej., Hollywood High School', descriptionPlaceholder: 'Describe el spot, obstáculos, mejores horarios, info de seguridad, etc.', addressPlaceholder: 'ej., 1521 N Highland Ave, Los Angeles, CA', selectType: 'Selecciona el tipo de spot', selectBustLevel: 'Selecciona el nivel de riesgo', uploadPhotos: 'Subir', dragDrop: 'Arrastra y suelta o haz clic para subir', maxPhotos: 'Máximo 5 fotos', publishing: 'Publicando...', success: '¡Spot publicado exitosamente!', error: 'Error al publicar el spot', locationRequired: 'Por favor selecciona una ubicación en el mapa', useCurrentLocation: 'Usar mi ubicación actual', pickOnMap: 'Elegir Ubicación en el Mapa', loginToAdd: 'Necesitas iniciar sesión para añadir un spot de skate.', requiredFields: 'Cuéntanos sobre este spot. Los campos con * son obligatorios.', coordinates: 'Coordenadas', latitudePlaceholder: 'Latitud (ej., 34.1012)', longitudePlaceholder: 'Longitud (ej., -118.3389)', gettingLocation: 'Obteniendo ubicación...', accessType: 'Tipo de Acceso', publicTitle: 'Público - Abierto a Todos', publicDesc: 'Skateparks, plazas públicas, spots callejeros', privateTitle: 'Propiedad Privada - Se Necesita Permiso', privateDesc: 'Rampas en patios, terrenos privados, spots cerrados', localsTitle: 'Pregunta a los Locales Primero', localsDesc: 'Respeta el spot, no lo quemes', contactInfo: 'Información de Contacto', contactPlaceholder: 'ej., Teléfono, Instagram, email...', contactHintPrivate: '¿Cómo deben contactarte para pedir permiso?', contactHintLocals: '¿Cómo deben preguntar sobre el spot?', }, // Create Event Page createEvent: { title: 'Crear un Evento', subtitle: 'Organiza un evento de skate para la comunidad', backToEvents: 'Volver a Eventos', namePlaceholder: 'ej., Session de Verano', descriptionPlaceholder: 'Describe el evento, qué esperar, reglas, premios, etc.', selectType: 'Selecciona el tipo de evento', venuePlaceholder: 'ej., Venice Beach Skatepark, CA', selectDate: 'Selecciona la fecha', selectTime: 'Selecciona la hora', ticketPricePlaceholder: 'Deja vacío para eventos gratis', publishing: 'Publicando...', success: '¡Evento publicado exitosamente!', error: 'Error al publicar el evento', loginToCreate: 'Necesitas iniciar sesión para crear un evento.', requiredFields: 'Cuéntanos sobre este evento. Los campos con * son obligatorios.', startDateTime: 'Fecha y Hora de Inicio', endDateTime: 'Fecha y Hora de Fin (opcional)', coordinatesOptional: 'Coordenadas (opcional)', coverImage: 'Imagen de Portada', uploadCover: 'Subir imagen de portada', nip05Recommended: 'Se Recomienda Verificación NIP-05', nip05Desc: 'Añade un identificador NIP-05 a tu perfil para verificar tu identidad y generar confianza con los asistentes.', addNip05: 'Añadir NIP-05 en Ajustes', }, // Spot Detail Page spotDetail: { postedBy: 'Publicado por', getDirections: 'Cómo Llegar', reviews: 'Reseñas', noReviews: 'Aún no hay reseñas', beFirstReview: '¡Sé el primero en reseñar este spot!', writeReview: 'Escribir una Reseña', submitReview: 'Enviar Reseña', rating: 'Calificación', reviewPlaceholder: 'Comparte tu experiencia en este spot...', relatedSpots: 'Spots Cercanos', }, // Event Detail Page eventDetail: { organizedBy: 'Organizado por', eventInfo: 'Info del Evento', location: 'Ubicación', dateTime: 'Fecha y Hora', price: 'Precio', attendeeCount: '{{count}} asistirán', interested: 'Interesado', going: 'Voy', notGoing: 'No Voy', share: 'Compartir Evento', }, // Profile Page profile: { posts: 'Publicaciones', spots: 'Spots', events: 'Eventos', following: 'Siguiendo', followers: 'Seguidores', editProfile: 'Editar Perfil', follow: 'Seguir', unfollow: 'Dejar de Seguir', noPostsYet: 'Aún no hay publicaciones', noBio: 'Sin biografía aún', zapProfile: 'Enviar Zap a este skater', }, // About Page about: { title: 'Acerca de SkateSpots', subtitle: 'Una comunidad de skateboarding descentralizada', whatIs: '¿Qué es SkateSpots?', whatIsDesc: 'SkateSpots es una plataforma impulsada por la comunidad para descubrir lugares de skateboarding en todo el mundo. Construida en Nostr, da a los skaters verdadera propiedad de sus datos.', features: 'Características', featuresDesc: 'Encuentra spots, crea eventos, conecta con coaches y apoya a tus tiendas de skate locales—todo en un solo lugar.', nostr: 'Construido en Nostr', nostrDesc: 'Nostr es un protocolo simple y abierto que permite comunicación global verdaderamente resistente a la censura. Tu cuenta y datos te pertenecen.', openSource: 'Código Abierto', openSourceDesc: 'SkateSpots es completamente de código abierto. Contribuye, haz fork o corre tu propia instancia.', lightning: 'Pagos Lightning', lightningDesc: 'Envía Zaps a tus skaters, coaches y creadores de contenido favoritos con pagos Bitcoin Lightning.', }, // FAQ Page faq: { title: 'Preguntas Frecuentes', subtitle: 'Todo lo que necesitas saber sobre SkateSpots', whatIsNostr: '¿Qué es Nostr?', whatIsNostrAnswer: 'Nostr es un protocolo abierto para redes sociales descentralizadas. A diferencia de plataformas tradicionales, tú eres dueño de tus datos e identidad.', howToStart: '¿Cómo empiezo?', howToStartAnswer: 'Haz clic en "Registrarse" para crear una nueva cuenta Nostr, o "Iniciar Sesión" si ya tienes una. Puedes usar una extensión de navegador, app móvil o clave secreta.', whatAreZaps: '¿Qué son los Zaps?', whatAreZapsAnswer: 'Los Zaps son propinas de Bitcoin Lightning que puedes enviar a otros usuarios. Son una forma de mostrar aprecio por buen contenido o apoyar a creadores.', howToAddSpot: '¿Cómo añado un spot?', howToAddSpotAnswer: 'Inicia sesión en tu cuenta, haz clic en "Añadir Spot" y completa los detalles incluyendo ubicación, fotos y descripción.', isItFree: '¿SkateSpots es gratis?', isItFreeAnswer: '¡Sí! SkateSpots es completamente gratis de usar. Opcionalmente puedes enviar Zaps (propinas de Bitcoin) a otros usuarios.', canIEditSpot: '¿Puedo editar o eliminar mis spots?', canIEditSpotAnswer: 'Sí, puedes editar spots que hayas creado. Debido a la naturaleza descentralizada de Nostr, las solicitudes de eliminación se envían pero algunos relays pueden retener los datos.', }, // Onboarding onboarding: { welcome: '¡Bienvenido a SkateSpots!', welcomeDesc: 'Vamos a configurarte en solo unos pasos.', step1Title: 'Crea Tu Cuenta', step1Desc: 'Tus claves Nostr están siendo generadas. Es como una contraseña que tú controlas.', step2Title: 'Respalda Tus Claves', step2Desc: '¡Guarda tu frase de recuperación en un lugar seguro. Es la única forma de recuperar tu cuenta!', step3Title: 'Configura Tu Perfil', step3Desc: 'Cuéntale a la comunidad sobre ti.', step4Title: '¡Estás Listo!', step4Desc: 'Empieza a explorar spots, eventos y conectar con skaters.', skipForNow: 'Saltar por ahora', continueToApp: 'Continuar a la App', }, // Lab Page labPage: { title: 'El Lab', subtitle: 'Aprende trucos. Captura momentos. Conecta con otros Skaters', coachesTab: 'Coaching', filmersTab: 'Filmación', offerCoaching: 'OFRECER COACHING', offerFilming: 'OFRECER FILMACIÓN', loginToOffer: 'Inicia sesión para ofrecer servicios', whatToLearn: '¿QUÉ QUIERES APRENDER?', whatContent: '¿QUÉ TIPO DE CONTENIDO?', selectSkillsDesc: 'Selecciona habilidades y te conectaremos con coaches', selectFilmingDesc: 'Selecciona los servicios de filmación que buscas', searchPlaceholder: 'Buscar por nombre, ubicación o habilidades...', noServicesYet: 'AÚN NO HAY SERVICIOS', beFirstToOffer: '¡Sé el primero en ofrecer servicios de coaching o filmación a la comunidad!', skills: 'Habilidades', rate: 'Tarifa', perHour: '/hora', contact: 'Contactar', viewProfile: 'Ver Perfil', noProfilesYet: 'Aún no hay perfiles', beFirstCoach: '¡Sé el primero en registrarte como coach!', beFirstFilmer: '¡Sé el primero en registrarte como filmer!', yearsExperience: 'años de experiencia', }, // Become Coach/Filmer Forms becomeCoach: { title: 'Conviértete en Coach', subtitle: 'Comparte tus habilidades y ayuda a otros skaters a progresar', bioPlaceholder: 'Cuéntanos sobre tu experiencia en skate y estilo de enseñanza...', skillsPlaceholder: 'ej., kickflip, heelflip, grinds, bowls', selectSkills: 'Selecciona las habilidades que puedes enseñar', hourlyRate: 'Tarifa por Hora (sats)', ratePlaceholder: 'ej., 5000', locationPlaceholder: 'Tu ciudad o área', publishing: 'Publicando perfil...', success: '¡Perfil de coach creado!', error: 'Error al crear el perfil', }, becomeFilmer: { title: 'Conviértete en Filmer', subtitle: 'Captura los mejores clips para la comunidad', bioPlaceholder: 'Cuéntanos sobre tu experiencia filmando y tu equipo...', specialtiesPlaceholder: 'ej., fisheye, teleobjetivo, drone, edición', selectSpecialties: 'Selecciona tus especialidades', hourlyRate: 'Tarifa por Hora (sats)', ratePlaceholder: 'ej., 5000', locationPlaceholder: 'Tu ciudad o área', portfolioUrl: 'URL del Portafolio', portfolioPlaceholder: 'Enlace a tu trabajo (YouTube, Instagram, etc.)', publishing: 'Publicando perfil...', success: '¡Perfil de filmer creado!', error: 'Error al crear el perfil', }, // Skills (mantener en inglés como terminología de skate) skills: { kickflip: 'Kickflip', heelflip: 'Heelflip', ollie: 'Ollie', treflip: '360 Flip', shuvit: 'Shuvit', hardflip: 'Hardflip', varial: 'Varial', nollie: 'Nollie', fakie: 'Fakie', switch: 'Switch', grind: 'Grind', slide: 'Slide', manual: 'Manual', transition: 'Transition', bowl: 'Bowl', vert: 'Vert', street: 'Street', flatground: 'Flatground', }, // Food Spots food: { title: 'Spots de Comida', subtitle: 'Recarga energía antes o después de tu session', addFood: 'Añadir Spot de Comida', categories: { all: 'Todos', burgers: 'Hamburguesas', pizza: 'Pizza', tacos: 'Tacos', coffee: 'Café', drinks: 'Bebidas', snacks: 'Snacks', }, skaterFriendly: 'Amigable para Skaters', nearSpots: 'Cerca de Spots de Skate', }, // Marketplace marketplace: { title: 'Mercado', subtitle: 'Compra, vende e intercambia equipo de skate', addListing: 'Añadir Anuncio', condition: 'Condición', conditions: { new: 'Nuevo', likeNew: 'Como Nuevo', good: 'Bueno', fair: 'Regular', poor: 'Malo', }, categories: { all: 'Todos', decks: 'Tablas', trucks: 'Trucks', wheels: 'Ruedas', bearings: 'Rodamientos', shoes: 'Zapatos', clothing: 'Ropa', protection: 'Protección', other: 'Otros', }, priceRange: 'Rango de Precio', location: 'Ubicación', seller: 'Vendedor', contact: 'Contactar Vendedor', makeOffer: 'Hacer Oferta', sold: 'Vendido', available: 'Disponible', gear: 'Equipo', sellGear: 'Vender Equipo', wantToBuy: 'Busco Comprar', }, // Weather weather: { title: 'Clima', current: 'Condiciones Actuales', forecast: 'Pronóstico', humidity: 'Humedad', wind: 'Viento', feelsLike: 'Sensación térmica', goodForSkating: '¡Buen clima para patinar!', notIdeal: 'Condiciones no ideales', allWeather: 'Todo Clima', goodWeather: 'Buen Clima', perfectWeather: 'Clima Perfecto', }, mapUi: { // Map chrome findingSpots: 'Buscando spots', loadingSpots: 'Cargando spots', loadingMap: 'Cargando mapa...', mapViewAria: 'Vista de mapa', listViewAria: 'Vista de lista', layers: 'Capas', mapLayers: 'Capas del mapa', showOnMap: 'Mostrar en el mapa', showResults: 'Mostrar resultados', quickActions: 'Acciones rápidas', spots: 'Spots', shops: 'Tiendas', gear: 'Equipo', tours: 'Rutas', events: 'Eventos', crews: 'Crews', spotType: 'Tipo de spot', sortBy: 'Ordenar por', trustLevel: 'Nivel de confianza', weather: 'Clima', buySellGear: 'Comprar/Vender equipo', stash: 'Alijo', more: 'Más', // Welcome banner newHere: '¿Nuevo por aquí?', welcomeDesc: 'Descubre spots, eventos y la comunidad.', getOnZapstore: 'Consíguelo en Zapstore', dismiss: 'Descartar', // Spot sheet / popups addedBy: 'Añadido por', directions: 'Cómo llegar', viewDetails: 'Ver detalles', viewDetailsArrow: 'Ver detalles →', spotDetails: 'Detalles del spot', skateShop: 'Tienda de skate', skateSpot: 'Spot de skate', youAreHere: 'Estás aquí', conditions: 'Condiciones', weatherScoreSuffix: '{{score}}/100 clima', wind: 'Viento', humidity: 'Humedad', airQuality: 'Calidad del aire', threeDayForecast: 'Previsión a 3 días', gearForSale: 'Equipo en venta ({{count}})', viewItems: 'Ver artículos →', viewAllItems: 'Ver los {{count}} artículos →', viewGear: 'Ver equipo →', localTour: 'Ruta local', meetAt: 'Quedamos en: {{place}}', hours: '{{count}} horas', level: 'Nivel {{level}}', viewTour: 'Ver ruta →', upcomingEvent: 'Próximo evento', viewEvent: 'Ver evento →', skateCrew: 'Crew de skate', members: '{{count}} miembros', since: 'Desde {{year}}', viewCrew: 'Ver crew →', acceptsBitcoin: 'Acepta Bitcoin', boosted: 'Destacado', website: 'Sitio web', // Offline / empty states offlineSavedSpots: 'Sin conexión · mostrando spots guardados', cantReachRelays: 'No se puede conectar a los relays', relayOnlineNoAnswer: 'Estás en línea, pero el relay de la comunidad no responde ahora mismo.', youreOffline: 'Estás sin conexión.', savedOnDevice: 'Los spots que ya has visto están guardados en este dispositivo y aparecerán aquí.', noSpotsMatchTitle: 'Ningún spot coincide', noSpotsMatchDesc: 'Prueba otra búsqueda o borra los filtros.', noSpotsMappedYet: 'Aún no hay spots en el mapa', noSpotsMappedDesc: 'Sé el primero en mapear tu parque: se tarda un minuto, es tuyo, y el próximo skater que pase te lo agradecerá.', addFirstSpot: 'Añade el primer spot', findSpotsNearMe: 'Buscar spots cerca de mí', locating: 'Localizando…', // Near Me toasts refiningLocation: 'Afinando tu ubicación…', refiningLocationDesc: 'Centrado en tu última posición; ajustando una nueva señal GPS.', locatingYou: 'Localizándote…', locatingDesc: 'Obteniendo señal GPS. La primera vez puede tardar hasta un minuto.', foundYou: 'Te encontramos', foundYouDesc: 'El mapa se ha centrado en tu ubicación.', locationPermissionNeeded: 'Se necesita permiso de ubicación', permissionNeededDesc: 'Permite la ubicación para SkateSpots en Ajustes del dispositivo → Aplicaciones → SkateSpots → Permisos y vuelve a tocar Cerca de mí.', locationTimedOut: 'Se agotó el tiempo de ubicación', timeoutNativeDesc: 'No se pudo obtener la ubicación a tiempo. Si estás bajo techo, el GPS no ve los satélites: activa la Ubicación por red (Ajustes → Ubicación) o sal al exterior e inténtalo de nuevo.', timeoutWebDesc: 'No se pudo obtener tu ubicación a tiempo. Comprueba la señal e inténtalo de nuevo.', noLocationProvider: 'Sin proveedor de ubicación', noProviderNativeDesc: 'Tu teléfono no está proporcionando ubicación. En ROMs centradas en la privacidad (p. ej. GrapheneOS), activa la Ubicación por red en Ajustes → Ubicación, o comprueba que el GPS esté activado y pruébalo al aire libre.', noProviderWebDesc: 'No hay ningún proveedor de ubicación disponible. Activa los servicios de ubicación e inténtalo de nuevo.', locationUnavailable: 'Ubicación no disponible', unavailableNativeDesc: 'Activa la Ubicación/GPS en los ajustes del teléfono, permite la ubicación para SkateSpots (Ajustes → Aplicaciones → SkateSpots → Permisos) e inténtalo de nuevo.', unavailableWebDesc: 'No se pudo determinar tu ubicación. Asegúrate de que los servicios de ubicación estén activados.', // Location help dialog locationBlocked: 'Ubicación bloqueada', locationBlockedDesc: 'Tu navegador ha bloqueado el acceso a la ubicación para este sitio. Así puedes volver a activarlo:', locationPlatformAndroid: 'Android Chrome', locationPlatformIos: 'iOS Safari', locationPlatformDesktop: 'Chrome de escritorio', locationPlatformFirefox: 'Firefox', locationStepsAndroid: 'Toca el icono del candado en la barra de direcciones → Configuración del sitio → Ubicación → Permitir', locationStepsIos: 'App Ajustes → Safari → Ubicación → Permitir (o toca el botón «AA» en la barra de direcciones de Safari)', locationStepsDesktop: 'Haz clic en el icono del candado → Configuración del sitio → Ubicación → Permitir', locationStepsFirefox: 'Haz clic en el icono del candado → Conexión segura → Más información → Permisos → Acceder a tu ubicación → Permitir', gotIt: 'Entendido', // Add speed-dial / FAB addSpot: 'Añadir spot', addShop: 'Añadir tienda', addEvent: 'Añadir evento', sellGear: 'Vender equipo', offerTour: 'Ofrecer ruta', closeAddMenu: 'Cerrar menú de añadir', addMenuAria: 'Añadir spot, tienda, evento, equipo o ruta', // Local chat localChat: 'Chat local', localChatDesc: 'Chat en directo para la zona donde está centrado el mapa. Elige el alcance del canal.', // BTC Map btcMapShowing: 'Mostrando {{count}} lugares donde puedes gastar tus sats cerca', btcMapShow: 'Muestra lugares donde puedes gastar tus sats (vía BTC Map)', // Stash drawer yourPrivateStash: 'Tu alijo privado', stashIntro: 'Controla tu equipo, pon precios y encuentra intercambios con otros skaters.', encryptionRequired: 'Se requiere cifrado', encryptionRequiredDesc: 'Usa un firmante compatible con NIP-44 (Alby, nos2x, Amber).', myStash: 'Mi alijo', encrypted: 'Cifrado', itemsCount: '{{count}} artículos', items: 'Artículos', wishlist: 'Deseos', types: 'Tipos', stashEmpty: 'Tu alijo está vacío', addFirstItem: 'Añadir primer artículo', wishlistCount: 'Deseos ({{count}})', myGearCount: 'Mi equipo ({{count}})', openFullStash: 'Abrir alijo completo', addItem: 'Añadir artículo', // Spot picker searchSpotsPlaceholder: 'Buscar spots...', selected: 'Seleccionado', noSpotsFound: 'No se han encontrado spots. Prueba con otra búsqueda.', addingSpotsHint: 'Añadir spots ayuda a que otros te encuentren al explorar ubicaciones concretas', // Spot card report: 'Reportar', // Spot collections spotSingular: '1 spot', spotPlural: '{{count}} spots', view: 'Ver', myCollections: 'Mis colecciones', collectionsSubtitle: 'Organiza tus spots favoritos en listas personalizadas', newCollection: 'Nueva colección', loginToCreate: 'Inicia sesión para crear colecciones', loginToCreateDesc: 'Guarda tus spots favoritos en listas personalizadas como «Viaje a Barcelona 2024» o «Los mejores rails de Madrid»', noCollections: 'Aún no hay colecciones', noCollectionsDesc: 'Crea tu primera colección para empezar a organizar spots', createFirstCollection: 'Crea tu primera colección', createNewCollection: 'Crear nueva colección', createCollectionDesc: 'Ponle un nombre a tu colección y una descripción opcional', collectionName: 'Nombre de la colección', collectionNamePlaceholder: 'Viaje a Barcelona 2024', descriptionOptional: 'Descripción (opcional)', descriptionPlaceholder: 'Mis spots favoritos de mi viaje a Barcelona...', creating: 'Creando...', createCollection: 'Crear colección', editCollection: 'Editar colección', saving: 'Guardando...', saveChanges: 'Guardar cambios', deleteCollectionTitle: '¿Eliminar colección?', deleteCollectionDesc: 'Esto eliminará «{{title}}» de forma permanente. Los spots en sí no se verán afectados.', deleting: 'Eliminando...', collectionCreated: '¡Colección creada!', collectionCreatedDesc: '«{{title}}» ya está lista para añadir spots', collectionCreateFailed: 'No se pudo crear la colección', collectionUpdated: '¡Colección actualizada!', changesSaved: 'Tus cambios se han guardado', collectionUpdateFailed: 'No se pudo actualizar la colección', collectionDeleted: 'Colección eliminada', collectionDeletedDesc: '«{{title}}» se ha eliminado', collectionDeleteFailed: 'No se pudo eliminar la colección', somethingWentWrong: 'Algo salió mal', }, spotUi: { claim: { areYouOwner: '¿Es este tu spot?', privateDesc: 'Este spot está marcado como privado. Si es tuyo o lo gestionas, reclámalo: un moderador de SkateSpots confirma la propiedad y después asumes el anuncio.', claimSpot: 'Reclamar este spot', nip05Required: 'Necesitas un identificador NIP-05 verificado para reclamar un spot privado (prueba de que controlas una identidad Nostr). Añádelo en tu perfil y vuelve.', addNip05: 'Añadir NIP-05 en Ajustes', pendingTitle: 'Reclamación pendiente de revisión', pendingDesc: 'Tu reclamación se ha enviado. Un moderador de SkateSpots la revisará; podrás completarla cuando se apruebe.', approvedTitle: 'Reclamación aprobada', approvedDesc: 'Un moderador aprobó tu reclamación. Complétala para convertirte en el dueño de este spot.', complete: 'Completar reclamación', submitted: 'Reclamación enviada', submittedDesc: 'Un moderador revisará tu reclamación. Asumirás el spot cuando se apruebe.', submitFailed: 'No se pudo enviar la reclamación', submit: 'Enviar reclamación', submitting: 'Enviando…', confirmTitle: '¿Reclamar "{{title}}"?', confirmIntro: 'Estás pidiendo convertirte en el dueño de este spot privado.', confirmBullet1: 'Un moderador de SkateSpots revisa la solicitud (no podemos verificar la propiedad, solo claves Nostr)', confirmBullet2: 'Si se aprueba, completas la reclamación y puedes editar el spot', confirmBullet3: 'El spot original permanece en Nostr: la red es descentralizada', adminTitle: 'Reclamaciones pendientes', adminApprove: 'Aprobar', adminApproved: 'Aprobada', adminApprovedDesc: 'Ya puede completar la reclamación del spot.', adminApproveFailed: 'No se pudo aprobar la reclamación', loginRequired: 'Inicia sesión para reclamar este spot privado o solicitar su propiedad.', }, abandonedDesc: 'Actualizado por última vez {{time}}. Si el dueño original está inactivo, puedes reclamar este spot para mantenerlo y mejorarlo.', abandonedLoginDesc: 'Actualizado por última vez {{time}}. Inicia sesión para reclamar y mantener este spot.', accessDeniedDesc: 'Solo puedes editar los spots que has creado.', accessDeniedTitle: 'Acceso denegado', addAtLeastOneTag: 'Añade al menos una etiqueta.', additionalDetails: 'Detalles adicionales (opcional)', additionalDetailsPlaceholder: 'Añade cualquier contexto adicional que pueda ayudar...', addNewTags: 'Añadir etiquetas nuevas:', addNip05InSettings: 'Añadir NIP-05 en Ajustes', addPhoto: 'Añadir foto', addPhotoDesc: 'Comparte una foto para ayudar a otros a descubrir este spot.', addPhotoOrDescription: 'Añade una foto o una descripción', addPhotoOrDescriptionDesc: 'Da algo con lo que orientarse a los skaters: una foto o una línea sobre el lugar.', addPhotos: 'Añadir fotos', addPhotoToSpot: 'Añadir foto al spot', adminDeleteDialogDesc: 'Como admin de SkateSpots estás retirando "{{title}}". Se ocultará en toda la app para todos y se enviará una solicitud de eliminación a los relays.', adminDeleteReason: 'Un admin de SkateSpots eliminó el spot "{{title}}"', airQuality: 'Calidad del aire', altSkateSpot: 'Spot de skate: {{title}}', areYouShopOwner: '¿Eres el dueño de la tienda?', askBeforeSkating: 'Pregunta antes de patinar', backToSpot: 'Volver al spot', beFirstToListGear: '¡Sé el primero en publicar material en este spot!', beFirstToSay: 'Sé el primero en decir algo.', byAuthor: 'por {{name}}', captionPlaceholder: 'Añade un pie de foto (opcional): describe qué sale en la foto, cuándo se tomó, etc.', chatPublicNote: 'Cualquiera puede leer esto: los mensajes son públicos y efímeros. Para chats privados, usa los Mensajes directos.', checkPinBelow: 'Revisa el pin de abajo antes de añadir un duplicado.', claimBullet1: 'Te conviertes en el dueño y puedes editar el spot', claimBullet2: 'El spot original permanece (Nostr es descentralizado)', claimBullet3: 'Tu versión puede aparecer junto al original', claimFailed: 'No se pudo reclamar', claiming: 'Reclamando...', claimIntro: 'Vas a reclamar la propiedad de este spot. Se creará tu propia versión del spot, que podrás editar y mantener.', claimSpot: 'Reclamar spot', claimThisSpot: 'Reclamar este spot', claimTitle: '¿Reclamar "{{title}}"?', claimWhatHappens: 'Qué pasa cuando lo reclamas:', coachesAndFilmersAvailable: 'Coaches y filmers disponibles en este spot', coachesCount: 'Coaches ({{count}})', coachHere: 'Dar clases aquí', community: 'Comunidad', communityVerified: 'Verificado por la comunidad', communityVerifiedTitle: 'Otro skater ha contribuido aquí (foto o reporte de estado).', conditions: 'Condiciones', contactForPermission: 'Contacta para pedir permiso', contactInfo: 'Info de contacto', contributePhoto: 'Compartir foto', contributing: 'Compartiendo...', couldNotSendMessage: 'No se pudo enviar el mensaje.', couldNotSubmit: 'No se pudo enviar', couldNotUploadPhoto: 'No se pudo subir la foto. Puedes añadir una abajo.', crewsThatSkateHere: 'Crews que patinan aquí', current: 'Actual:', currentTags: 'Etiquetas actuales de este spot:', daysAgo: 'hace {{count}} día', daysAgoPlural: 'hace {{count}} días', deleteDialogDesc: 'Esto eliminará permanentemente "{{title}}" de todos los relays. Esta acción no se puede deshacer.', deletedSpotReason: 'Spot eliminado', deleteFailed: 'No se pudo eliminar', deleteSpot: 'Eliminar spot', deleteSpotTitle: '¿Eliminar spot?', differentSpotPublishAnyway: 'Es un spot diferente: publicar de todos modos', dragDropOrClick: 'Arrastra y suelta o haz clic', dropPhotos: 'Suelta las fotos', duplicateOne: 'Hay un spot a menos de 60 m de tu pin. Si es el mismo sitio, añade tu foto o un reporte de estado allí en vez de crear un duplicado.', duplicateOther: 'Hay spots a menos de 60 m de tu pin. Si es el mismo sitio, añade tu foto o un reporte de estado allí en vez de crear un duplicado.', editSpotSeoDesc: 'Edita tu spot de skate.', failedToContribute: 'No se pudo compartir', failedToPublish: 'No se pudo publicar', failedToPublishDesc: 'Algo salió mal. Revisa la consola para más detalles.', failedToSubmitReport: 'No se pudo enviar el reporte', failedToSuggestTags: 'No se pudieron sugerir las etiquetas', failedToUpdate: 'No se pudo actualizar', failedToUploadImage: 'No se pudo subir la imagen', failedToUploadPhoto: 'No se pudo subir la foto', feelsLikeTemp: 'Sensación de {{temp}}°C', filmersCount: 'Filmers ({{count}})', filmHere: 'Grabar aquí', gearSwap: 'Intercambio de material', geolocationNotSupported: 'Geolocalización no compatible', geolocationNotSupportedDesc: 'Tu navegador no admite geolocalización.', getDirections: 'Cómo llegar', hangTight: 'Espera un momento', hangTightDesc: 'Tu foto todavía se está subiendo. Se adjuntará en un segundo.', helpImproveSpot: 'Ayuda a mejorar este spot añadiendo fotos o sugiriendo etiquetas', hiddenByModerator: 'Oculto por un moderador', hiddenByModeratorDesc: 'Este spot no aparece en el mapa ni en las búsquedas. Aún puedes verlo porque es tuyo. Editarlo no lo volverá a mostrar: seguirá oculto hasta que un moderador retire la decisión.', humidity: 'Humedad', imageUploaded: 'Imagen subida', imageUploadedDesc: 'Tu imagen se ha subido correctamente.', imHere: 'Estoy aquí', invalidCoordinates: 'Coordenadas no válidas', invalidCoordinatesDesc: 'Introduce una latitud (-90 a 90) y longitud (-180 a 180) válidas.', invalidNpub: 'npub no válido', invalidNpubDesc: 'Introduce una dirección npub válida.', lastReported: 'último: {{time}}', listGear: 'Publicar material', listYourGearHere: 'Publica tu material aquí', loadingChat: 'Cargando chat…', locationError: 'Error de ubicación', locationFound: 'Ubicación encontrada', locationFoundDesc: 'Se ha establecido tu ubicación actual.', locationRequired: 'Ubicación obligatoria', locationRequiredDesc: 'Introduce coordenadas o usa tu ubicación actual.', loginRequiredTitle: 'Inicio de sesión obligatorio', logInToChat: 'Inicia sesión para unirte al chat local.', logInToContributePhotos: 'Inicia sesión para compartir fotos', loginToEditSpot: 'Tienes que iniciar sesión para editar este spot.', logInToReport: 'Tienes que iniciar sesión para reportar contenido.', logInToReportStatus: 'Inicia sesión para reportar el estado de este spot.', logInToSuggestTags: 'Inicia sesión para sugerir etiquetas', manageNip05ToClaim: 'Gestionar NIP-05 para reclamar', meetAtSpotForPickup: '💡 Quedad en este spot para una entrega segura', memberOne: '{{count}} miembro', memberOther: '{{count}} miembros', messageFailed: 'No se pudo enviar el mensaje', messageMapper: 'Escribir al autor', messagePlaceholder: 'Escribe en este spot… (prueba /me o /who)', messagesHiddenOne: '{{count}} mensaje oculto por tu filtro de confianza. Baja el filtro para ver más.', messagesHiddenOther: '{{count}} mensajes ocultos por tu filtro de confianza. Baja el filtro para ver más.', messagesHiddenShortOne: '{{count}} mensaje oculto por tu filtro de confianza', messagesHiddenShortOther: '{{count}} mensajes ocultos por tu filtro de confianza', metresAway: 'a {{distance}} m', moderatorVouchedDesc: 'Un moderador revisó este spot y lo avaló. ¡Bien!', monthsAgo: 'hace {{count}} mes', monthsAgoPlural: 'hace {{count}} meses', newOwnerNpub: 'npub del nuevo dueño', newOwnerNpubHint: 'Introduce el npub del usuario al que quieres transferir este spot.', nip05RequiredToClaim: '⚠️ Se requiere verificación NIP-05 para reclamar tiendas', noCommunitySignalTitle: 'Aún no hay foto de la comunidad ni reporte de estado: nadie ha confirmado este lugar.', noGearListedYet: 'Aún no hay material publicado', noMessagesYet: 'Aún no hay mensajes en este canal local. Saluda: "¿alguien patina esta noche?"', noPhoto: 'Sin foto', noReportsYet: 'Aún no hay reportes', noTags: 'Sin etiquetas', notASkateSpot: 'No es un spot de skate', offerServicesHere: '💡 Ofrece tus servicios en este spot', photoCaptured: '¡Foto capturada!', photoCapturedDesc: 'Tu foto se ha subido correctamente.', photoContributed: '¡Foto compartida!', photoContributedDesc: 'Tu foto se ha añadido a este spot.', photosAdded: 'Tus fotos se han añadido.', photosRecommended: 'muy recomendable: los spots sin foto se quedan como No verificados', photosUploaded: '{{count}} fotos subidas', photoUploaded: 'Foto subida', photoUploadedDesc: '¡Añade un pie de foto y envíalo para compartirla!', photoUploadFailed: 'No se pudo subir la foto', pleaseTryAgain: 'Inténtalo de nuevo', public: 'Público', publicChatTitle: 'Cualquiera puede leer los mensajes de este canal: es público y sin cifrar.', recentReports: 'Reportes recientes', recipientRequired: 'Destinatario obligatorio', recipientRequiredDesc: 'Introduce el npub del nuevo dueño.', removeAdmin: 'Retirar (admin)', removeSpot: 'Retirar spot', removeSpotAdminTitle: '¿Retirar este spot? (admin)', reportOne: 'reporte', reportContent: 'Reportar contenido', reportContentDesc: 'Ayuda a mantener la comunidad segura reportando contenido inapropiado.', reportedBySkaters: ' por {{count}} skaters: en revisión. Si es un spot real, añade una foto o un reporte de estado para confirmarlo.', reportedNotASpot: 'Reportado como no es un spot de skate', reportingType: 'Reportando {{type}}', reports: 'reportes', reportShop: 'Reportar tienda', reportSpot: 'Reportar spot', reportStatus: 'Reportar estado', reportSubmitted: 'Reporte enviado', reportSubmittedDesc: 'Gracias por ayudar a mantener SkateSpots seguro.', reportSubmittedLong: 'Gracias por ayudar a mantener SkateSpots seguro y preciso. Miembros de confianza de la comunidad revisarán tu reporte.', reportSubmittedTitle: 'Reporte enviado', report: { notASkateSpot: { label: 'No es un spot de skate', description: 'Una entrada de prueba, o un lugar que no es para patinar en absoluto' }, fakeSpot: { label: 'Spot falso o inexistente', description: 'El spot no existe o la ubicación es incorrecta' }, stolenPhotos: { label: 'Fotos robadas o falsas', description: 'Las fotos son de banco de imágenes o están robadas de otro sitio' }, spamAd: { label: 'Spam o publicidad', description: 'Contenido promocional o anuncios duplicados' }, dangerousLocation: { label: 'Ubicación peligrosa', description: 'Propiedad privada, insegura o de acceso ilegal' }, inappropriateContent: { label: 'Contenido inapropiado', description: 'Contiene contenido ofensivo o para adultos' }, impersonation: { label: 'Suplantación de identidad', description: 'Alguien haciéndose pasar por otra persona' }, other: { label: 'Otro', description: 'Algo más que no aparece arriba' }, }, targetType: { spot: 'Spot', event: 'Evento', tour: 'Ruta', shop: 'Tienda', user: 'Usuario', listing: 'Anuncio', coach: 'Coach', filmer: 'Filmer', }, sameOwner: 'Mismo dueño', sameOwnerDesc: 'No puedes transferirlo al dueño actual.', saveChanges: 'Guardar cambios', saving: 'Guardando...', services: 'Servicios', shareSpotText: 'Mira este spot de skate: {{title}}', shelter: 'Refugio', shelterHint: '¿Está este spot expuesto al tiempo? Ayuda a los skaters a encontrar sitios secos cuando llueve.', shopClaimDesc: 'Si eres dueño o gestionas esta tienda, puedes reclamarla para verificar la propiedad y gestionar el anuncio.', shopClaimNip05Hint: 'Para reclamar esta tienda, añade un identificador NIP-05 que coincida con el dominio de la web de la tienda.', skatersActiveDesc: 'Personas que han publicado en este canal en las últimas 24 h.', skatersActiveOne: '{{count}} skater activo aquí', skatersActiveOther: '{{count}} skaters activos aquí', skatersSellingGear: 'Los skaters de este spot venden material', skateSpot: 'Spot de skate', somethingWentWrong: 'Algo salió mal', spot: 'Spot', spotAdded: '¡Spot añadido!', spotAddedDesc: 'Tu spot de skate se ha publicado en la red.', spotAddedNoPhoto: 'Publicado y marcado como No verificado hasta que alguien añada una foto. Una foto del spot ayuda mucho.', spotChat: 'Chat del spot', spotClaimed: '¡Spot reclamado!', spotClaimedDesc: 'Ahora eres el dueño de este spot. Puedes editarlo desde tu perfil.', spotDeleted: 'Spot eliminado', spotDeletedDesc: 'Solicitud de eliminación enviada a los relays. La mayoría eliminará este contenido.', spotMayAlreadyBeOnMap: 'Puede que ese spot ya esté en el mapa', spotMayAlreadyExist: 'Puede que este spot ya exista', spotMayBeAbandoned: 'El spot puede estar abandonado', spotPhotoAlt: 'Spot', spotRemoved: 'Spot retirado', spotRemovedDesc: 'Este spot se ha retirado y se ocultará en todo SkateSpots.', spotSeoDesc: 'Mira este spot de skate en SkateSpots.', spotStatus: 'Estado del spot', spotStatusDesc: '¿Sigue siendo patinable "{{title}}"? Cuéntale a la comunidad su estado actual.', spotTypeRequired: 'Tipo de spot obligatorio', spotTypeRequiredDesc: 'Elige un tipo de spot para que los skaters sepan a qué se enfrentan.', spotUpdated: '¡Spot actualizado!', spotUpdatedDesc: 'Tus cambios se han publicado en la red.', staffVerifiedTitle: 'Un admin de SkateSpots revisó este spot y lo avaló.', statusNotePlaceholder: 'Opcional: añade detalles (p. ej. "bordes nuevos en el bordillo", "el guarda echa a partir de las 18:00")', statusReported: 'Estado reportado', statusReportedDesc: 'Gracias por mantener el mapa al día. Tu reporte ya está publicado.', submitReport: 'Enviar reporte', submitting: 'Enviando...', suggestedByUser: 'Sugerido por {{count}} usuario', suggestedByUsers: 'Sugerido por {{count}} usuarios', suggestedTagsContent: 'Etiquetas sugeridas para {{title}}: {{tags}}', suggestNTags: 'Sugerir {{count}} etiquetas', suggestOneTag: 'Sugerir 1 etiqueta', suggestTags: 'Sugerir etiquetas', suggestTagsDesc: 'Ayuda a clasificar este spot sugiriendo etiquetas relevantes.', tags: 'Etiquetas', tagsHint: 'Añade etiquetas para características, superficies, rollos (máx. {{max}})', tagsSuggested: '¡Etiquetas sugeridas!', tagsSuggestedDesc: 'Tus sugerencias de etiquetas se han enviado.', takePhoto: 'Hacer foto', threeDayForecast: 'Previsión a 3 días', tipTheMapper: 'Invita al autor', tipTheMapperDesc: '¿Te ha servido este spot? ¡Envía un zap para agradecer al autor!', titleRequired: 'Título obligatorio', titleRequiredDesc: 'Introduce un nombre para este spot.', today: 'Hoy', tomorrow: 'Mañana', transferDesc: 'Transfiere "{{title}}" a otro usuario. Esta acción no se puede deshacer.', transferFailed: 'No se pudo transferir', transferOwnership: 'Transferir propiedad', transferRequestContent: 'Solicitud de transferencia de propiedad del spot "{{title}}"', transferRequested: 'Transferencia solicitada', transferRequestedDesc: 'El nuevo dueño tendrá que reclamar el spot para completar la transferencia.', transferring: 'Transfiriendo...', transferSpotOwnership: 'Transferir la propiedad del spot', transferWarningDesc: 'Después de la transferencia, ya no podrás editar ni eliminar este spot.', typeToSearchTags: 'Escribe para buscar o añadir etiquetas...', underReview: ' — en revisión. Si es un spot real, añade una foto o un reporte de estado para confirmarlo.', untitledSpot: 'Spot sin título', unverified: 'No verificado', updateDetailsFor: 'Actualiza los detalles de {{title}}', updateSpotDesc: 'Actualiza la información de este spot. Los campos con * son obligatorios.', uploadAPhoto: 'Sube una foto', uploadAPhotoHint: 'Arrastra y suelta o haz clic · JPG, PNG, WebP', uploadedAlt: 'Subida', uploadFailed: 'Error al subir', uploadingPhoto: 'Subiendo foto…', uploadPhotoFirst: 'Primero sube una foto.', uvIndex: 'Índice UV', verifiedBySkateSpots: 'Verificado por SkateSpots', viewPhotoFullScreen: 'Ver foto a pantalla completa', viewPhotoOf: 'Ver foto {{n}} de {{total}}', warning: 'Atención', weatherConditions: 'Condiciones meteorológicas', weatherOnly: 'solo clima', weatherOnlyUnconfirmed: 'Solo clima. Nadie ha confirmado todavía que esto sea un spot de skate, así que no hay puntuación de condiciones: añade una foto o un reporte de estado para confirmarlo.', whyReporting: '¿Por qué lo reportas?', wind: 'Viento', yearsAgo: 'hace {{count}} año', yearsAgoPlural: 'hace {{count}} años', }, marketUi: { gearSwap: { title: 'Intercambio de Equipo', subtitle: 'Compra y vende equipo de skate usado con otros skaters', listGear: 'Publicar Equipo', searchPlaceholder: 'Buscar equipo...', allCategories: 'Todas las categorías', forSale: 'En venta', wtb: 'Busco', trust: 'Confianza', filterByTrust: 'Filtrar por confianza', allSellers: 'Todos los vendedores', verifiedOnly: 'Solo verificados', trustedPlus: 'De confianza+', followingOnly: 'Solo seguidos', pickupOrShip: 'Recogida o envío', localPickup: 'Recogida local', ships: 'Envío', sortBy: 'Ordenar por', newest: 'Más recientes', priceLowHigh: 'Precio: menor → mayor', priceHighLow: 'Precio: mayor → menor', trustScore: 'Puntuación de confianza', nearest: 'Más cercanos (local)', listingFound: '{{count}} anuncio encontrado', listingsFound: '{{count}} anuncios encontrados', loadFailed: 'No se pudieron cargar los anuncios', tryLater: 'Inténtalo de nuevo más tarde.', noneTitle: 'No hay anuncios', noneFiltered: 'Ningún equipo coincide con tus filtros actuales. Prueba a borrarlos o busca otra cosa.', noneFirst: 'Sé el primero en publicar tu equipo: tablas, trucks, ruedas, zapatos, ¡lo que sea de skate!', listYourGear: 'Publica tu equipo', faqLink: '¿Tienes dudas? Consulta las preguntas frecuentes →', }, hub: { browse: 'Explorar', selling: 'Vender', myTrades: 'Mis tratos', reputation: 'Reputación', loginListings: 'Inicia sesión para gestionar tus anuncios.', loginReputation: 'Inicia sesión para ver tu reputación y tus reseñas.', }, marketplace: { heroTitle: 'Tiendas y Mercado', heroBefore: 'Nuestro mercado funciona con', heroAfter: '- un mercado descentralizado en Nostr. Las tiendas de skate pueden publicar sus productos, y tú puedes comprar/vender equipo usado directamente con Bitcoin.', whatIsTitle: '¿Qué es Plebeian Market?', whatIsBody: 'Plebeian Market es un mercado descentralizado construido sobre Nostr. Compra y vende equipo de skate directamente con otros skaters usando Bitcoin. Sin intermediarios, sin comisiones, libertad total.', noFeesTitle: 'Sin Comisiones', noFeesBody: 'Ninguna plataforma se lleva el 30%. Ventas directas entre particulares.', bitcoinTitle: 'Pagos en Bitcoin', bitcoinBody: 'Paga con Bitcoin. Rápido, seguro y global.', decentralizedTitle: 'Descentralizado', decentralizedBody: 'Construido sobre Nostr. Ninguna empresa lo controla.', visit: 'Visitar Plebeian Market', buySellTitle: 'Qué puedes comprar y vender', catCompletes: 'Tablas Completas', preBuilt: 'Completas premontadas', customSetups: 'Montajes a medida', beginnerBoards: 'Tablas para principiantes', catParts: 'Piezas de Tabla', decks: 'Tablas', trucks: 'Trucks', wheels: 'Ruedas', bearings: 'Rodamientos', gripTape: 'Lija', hardware: 'Tornillería', catApparel: 'Ropa y Protección', skateShoes: 'Zapatillas de skate', clothing: 'Ropa', helmets: 'Cascos', pads: 'Protecciones', backpacks: 'Mochilas', catAccessories: 'Accesorios', tools: 'Herramientas', wax: 'Cera', rails: 'Rails', stickers: 'Pegatinas', videos: 'Vídeos', magazines: 'Revistas', howItWorks: 'Cómo funciona', step1Title: 'Explora los productos', step1Body: 'Visita Plebeian Market y explora equipo de skate de tiendas y particulares de todo el mundo.', step2Title: 'Contacta con los vendedores', step2Body: 'Escribe a los vendedores directamente por Nostr. Negocia precios, resuelve dudas y acuerda el envío.', step3Title: 'Paga con Bitcoin', step3Body: 'Completa tu compra con Bitcoin Lightning para pagos instantáneos y con comisiones bajas.', step4Title: 'Deja tu opinión', step4Body: 'Valora tu experiencia y construye la reputación del vendedor en Nostr. Tus reseñas ayudan a la comunidad.', needBitcoinTitle: '¿Necesitas Bitcoin?', needBitcoinBefore: 'Necesitarás una cartera Lightning con algunos sats para comprar. Consulta la', onboardingGuide: 'guía de inicio', needBitcoinAfter: 'para recomendaciones de carteras.', ownShopTitle: '¿Tienes una tienda de skate?', ownShopBody: 'Publica tu tienda en SkateSpots y vende tus productos en Plebeian Market. Llega a clientes de todo el mundo con cero comisiones.', addShop: 'Añade tu tienda', startSelling: 'Empieza a vender', }, listingDetail: { notFound: 'Anuncio no encontrado', notFoundBody: 'Puede que se haya eliminado o que el enlace sea incorrecto.', backToGearSwap: 'Volver a Intercambio de Equipo', gearSwap: 'Intercambio de Equipo', viewPhoto: 'Ver foto {{n}}', photoAlt: '{{title}} — foto {{n}}', wantToBuy: 'BUSCO COMPRAR', sold: 'VENDIDO', description: 'Descripción', usuallyHere: 'Normalmente por aquí {{availability}}', listed: 'Publicado el {{date}}', listingCountOne: '{{count}} anuncio · {{age}} d de antigüedad', listingCountMany: '{{count}} anuncios · {{age}} d de antigüedad', relistActive: 'Reactivar como activo', markSold: 'Marcar como vendido', deleteListing: 'Eliminar anuncio', makeOffer: 'Hacer una oferta', shareListing: 'Compartir anuncio', unknown: 'Desconocido', linkCopied: 'Enlace copiado', linkCopiedBody: 'Compártelo con un skater.', copyFailed: 'No se pudo copiar el enlace', relisted: 'Reactivado', relistedBody: 'Tu anuncio vuelve a estar activo.', couldNotUpdate: 'No se pudo actualizar', somethingWrong: 'Algo salió mal', }, create: { imageUploaded: 'Imagen subida', uploadFailed: 'Error al subir', failed: 'Falló', cooldownActive: 'Espera activa', cooldownWait: 'Espera {{time}} antes de crear otro anuncio', limitReached: 'Límite de anuncios alcanzado', limitReachedBody: 'Has alcanzado tu límite mensual de {{limit}} anuncios', feeRequired: 'Se requiere pago', feeRequiredBody: 'Paga la tarifa antispam para continuar', titleRequired: 'Título obligatorio', categoryRequired: 'Categoría obligatoria', photoRequired: 'Foto obligatoria', photoRequiredBody: 'Se requiere al menos una foto para vender equipo', nip05Required: 'Se requiere verificación NIP-05', nip05RequiredBody: 'Necesitas una dirección Nostr verificada para publicar equipo', priceRequired: 'Precio obligatorio para anuncios de precio fijo', sizeRequired: 'Talla obligatoria', sizeRequiredBody: 'Selecciona una talla para {{category}}', conditionRequired: 'Estado obligatorio', conditionRequiredBody: 'Selecciona el estado de tu {{category}}', wtbPosted: '¡Solicitud publicada!', wtbPostedBody: 'Los vendedores podrán encontrar tu solicitud.', listingCreated: '¡Anuncio creado!', listingCreatedBody: 'Tu equipo ya está publicado.', publishFailed: 'No se pudo publicar', loginRequired: 'Inicio de sesión obligatorio', loginRequiredBody: 'Necesitas iniciar sesión para publicar equipo.', backToStash: 'Volver al Alijo', backToSpot: 'Volver a {{title}}', backToMarketplace: 'Volver al Mercado', backToMap: 'Volver al Mapa', wantToBuy: 'Busco Comprar', listYourGear: 'Publica tu Equipo', wtbSubtitle: 'Cuéntale a la comunidad qué equipo buscas', sellSubtitle: 'Vende equipo de skate a la comunidad', fromStashTitle: 'Anuncio desde tu Alijo', fromStashBody: 'Rellenado con los datos de tu objeto del alijo. ¡Revisa y elige un punto de encuentro!', nip05Banner: 'Para evitar spam y proteger a los compradores, necesitas una dirección Nostr verificada (NIP-05) para publicar equipo.', verifiedLabel: 'Verificado:', checkingTrust: 'Comprobando tu nivel de confianza...', trustLevel: 'Nivel de confianza:', trusted: 'De confianza', active: 'Activo', newcomer: 'Novato', newUser: 'Usuario nuevo', remaining: '{{remaining}} de {{limit}} anuncios disponibles este mes', cooldownBody: 'Los usuarios nuevos tienen un tiempo de espera de 24 horas entre anuncios.', timeRemaining: 'Tiempo restante: {{time}}', monthlyLimitTitle: 'Límite mensual alcanzado', monthlyLimitBody: 'Has alcanzado tu límite de {{limit}} anuncios este mes. Crea spots o completa ventas para aumentar tu límite.', powAccepted: '¡Prueba de trabajo aceptada!', feePaid: '¡Pago realizado!', canCreateNow: 'Ya puedes crear tu anuncio.', whatDoTitle: '¿Qué quieres hacer?', sellGear: 'VENDER EQUIPO', categoryTitle: 'Categoría *', categoryHint: '¿Qué tipo de equipo?', detailsTitle: 'Detalles del equipo', detailsWtbHint: 'Describe lo que buscas', detailsSellHint: 'Cuéntales a los compradores sobre tu artículo', titleLabel: 'Título *', titlePlaceholderWtb: 'Busco tabla 8.0"', titlePlaceholderSell: 'Tabla Palace casi nueva 8.25"', summaryLabel: 'Resumen corto', summaryPlaceholderWtb: 'Cualquier marca, prefiero gráficos minimalistas', summaryPlaceholderSell: 'En muy buen estado, apenas usada', descriptionLabel: 'Descripción', descriptionPlaceholderWtb: 'Describe exactamente lo que buscas: marcas preferidas, estado requerido, etc.', descriptionPlaceholderSell: 'Me regalaron esta tabla por Navidad pero prefiero una talla más pequeña. ¡Te dejo probarla antes de comprar!', fulfilmentLabel: '¿Cómo se entrega?', pickup: 'Recogida', pickupHint: 'Quedamos en persona', ships: 'Envío', shipsHint: 'Lo mando por correo', both: 'Ambos', bothHint: 'Cualquiera', addressNote: 'Nunca recogemos tu dirección — para envíos, compártela en privado en el chat del trato.', postageLabel: '¿Quién paga el envío?', postageBuyer: 'Paga el comprador', postageSeller: 'Pago yo', postageSplit: 'A medias', sizeLabel: 'Talla', selectSize: 'Selecciona talla', truckHeight: 'Altura de trucks', selectHeight: 'Selecciona altura', wheelHardness: 'Dureza de ruedas', selectHardness: 'Selecciona dureza', pricingTitle: 'Precio', pricingWtbHint: '¿Cómo quieres pagar?', pricingSellHint: '¿Cómo quieres vender?', priceLabel: 'Precio *', currencyLabel: 'Moneda', photosTitle: 'Fotos', photosSellHint: 'Se requiere al menos una foto', photosWtbHint: 'Opcional: añade imágenes de referencia', productPhoto: 'Producto {{n}}', upload: 'Subir', photosNote: 'Añade hasta 5 fotos. La primera imagen será la principal.', pickupLocationTitle: 'Punto de recogida', pickupLocationHint: 'Vincula un spot de skate para quedar fácilmente', searchSpots: 'Buscar spots...', noSpotsFound: 'No se encontraron spots. Prueba otra búsqueda.', availabilityLabel: '¿Cuándo sueles estar disponible?', availabilityPlaceholder: 'Fines de semana 10-14h, martes/jueves por la tarde', availabilityHint: 'Ayuda a los compradores a coordinar quedadas contigo', durationTitle: 'Duración del anuncio', durationHint: '¿Cuánto tiempo debe estar activo este anuncio?', publishing: 'Publicando...', checkingEligibility: 'Comprobando elegibilidad...', cooldownButton: 'ESPERA: {{time}}', limitReachedButton: 'LÍMITE ALCANZADO', payFeeButton: 'PAGA LA TARIFA PARA CONTINUAR', postWtbButton: 'PUBLICAR SOLICITUD', listForSaleButton: 'PUBLICAR EQUIPO EN VENTA', }, trades: { title: 'Mis Tratos', loginBody: 'Inicia sesión para gestionar tus tratos y tu reputación en el mercado.', subtitle: 'Confirmaciones, solicitudes y la reputación que construyen. El pago se acuerda con el otro skater; la app solo registra el trato.', actionNeeded: 'Acción necesaria', askedToConfirmSale: 'te pidió que confirmaras una venta', recordedSale: 'registró una venta — confirma tu parte', confirmSale: 'Confirmar venta', confirm: 'Confirmar', nothingWaiting: 'No hay nada pendiente por tu parte. 🛹', yourRecords: 'Tus registros de tratos', noTrades: 'Aún no hay tratos. Cierra un trato y confírmalo para empezar a construir reputación.', browseGearSwap: 'Explorar Intercambio de Equipo', roleSold: 'Vendido', roleBought: 'Comprado', roleTrade: 'Trato', with: 'con', viewListing: 'Ver anuncio', revoke: 'Revocar', revokeTitle: '¿Revocar este registro de trato?', revokeBody: 'Dejará de contar para tu reputación. La otra parte conserva su propia atestación. Úsalo para un trato disputado o por error.', revokeNote: 'Retirado por el autor.', revoked: 'Registro de trato revocado', revokedBody: 'Ya no cuenta para la reputación.', revokeFailed: 'No se pudo revocar el trato', saleConfirmed: 'Venta confirmada', saleConfirmedBody: 'Ahora pueden confirmar su parte.', saleConfirmFailed: 'No se pudo confirmar la venta', tradeConfirmed: 'Trato confirmado', tradeConfirmedBody: 'Reputación actualizada para ambos.', tradeConfirmFailed: 'No se pudo confirmar el trato', somethingWrong: 'Algo salió mal.', }, card: { listingDeleted: 'Anuncio eliminado', listingRemoved: 'Anuncio retirado', listingDeletedBody: 'Tu anuncio se ha eliminado. Los relays que respetan las eliminaciones dejarán de servirlo.', listingRemovedBody: 'Este anuncio se ha retirado y se ocultará en todo SkateSpots.', removeFailed: 'Error al retirar', somethingWrong: 'Algo salió mal', markedSold: 'Marcado como vendido', markedSoldBody: 'Tu anuncio ahora aparece como vendido.', couldNotUpdate: 'No se pudo actualizar', relisted: 'Reactivado', relistedBody: 'Tu anuncio vuelve a estar activo.', listingOptions: 'Opciones del anuncio', report: 'Denunciar', removeAdmin: 'Retirar (admin)', postage: 'envío', newSeller: 'Vendedor nuevo', saleOne: '{{count}} venta', saleMany: '{{count}} ventas', iHaveThis: '¡Lo tengo!', deleteTitle: '¿Eliminar "{{title}}"?', adminRemoveTitle: '¿Retirar este anuncio? (admin)', deleteBody: 'Esto pide a los relays que eliminen tu anuncio "{{title}}". No se puede deshacer desde aquí: tendrías que crear uno nuevo.', adminRemoveBody: 'Como admin de SkateSpots estás retirando "{{title}}". Se ocultará en toda la app para todos y se enviará una solicitud de eliminación a los relays.', deleting: 'Eliminando…', removing: 'Retirando…', deleteListing: 'Eliminar anuncio', removeListing: 'Retirar anuncio', reportCount: '{{count}} denuncia', reports: '{{count}} denuncias', viewTitle: 'Ver {{title}}', reportListing: 'Denunciar anuncio', manageListing: 'Gestionar anuncio', trusted: 'De confianza', daysOld: '{{n}} d de antigüedad', monthsOld: '{{n}} meses de antigüedad', yearsOld: '{{n}} años de antigüedad', listingsCount: '{{count}} anuncios', postageBuyer: 'envío: comprador', postageSeller: 'envío: vendedor', postageSplit: 'envío: a medias', powTitle: 'Prueba de trabajo NIP-13 — antispam gratuito', verifiedTradeOne: '{{count}} trato verificado', verifiedTrades: '{{count}} tratos verificados', reportSubmitted: 'Denuncia enviada', reportSubmittedBody: 'Gracias por ayudar a mantener seguro el mercado.', reportFailed: 'No se pudo enviar la denuncia', selectReason: 'Selecciona un motivo', reportDialogBody: 'Ayuda a mantener seguro el mercado denunciando anuncios inapropiados o engañosos.', reasonLabel: 'Motivo de la denuncia *', detailsLabel: 'Detalles adicionales (opcional)', detailsPlaceholder: 'Aporta cualquier contexto adicional que pueda ayudar...', reportNote: 'Las denuncias se publican en Nostr y ayudan a la comunidad a identificar anuncios problemáticos. Los anuncios con varias denuncias pueden ocultarse automáticamente.', submitting: 'Enviando...', submitReport: 'Enviar denuncia', }, tradeActions: { tradeConfirmed: 'Trato confirmado', tradeConfirmedWithProof: 'Se adjuntó un recibo verificable: cuenta para los tratos verificados.', tradeConfirmedBody: 'Reputación actualizada para ambos.', tradeConfirmFailed: 'No se pudo confirmar el trato', somethingWrong: 'Algo salió mal.', requestNote: 'Confirma nuestro trato de "{{title}}", por favor.', requestSent: 'Confirmación solicitada', requestSentBody: 'El vendedor ya puede confirmar la venta y construir la reputación de ambos.', requestFailed: 'No se pudo enviar la solicitud', escrowRefunded: 'Depósito en garantía reembolsado', escrowRefundedBody: 'Los fondos están de vuelta en tu cartera Cashu.', escrowRefundFailed: 'No se pudo reembolsar el depósito', confirmThisTrade: 'Confirmar este trato', escrowAndRequest: 'Depósito y solicitud', shipsEscrowHint: 'Trato con envío: usa el depósito en garantía para que nadie envíe al vacío. Comparte tu dirección en privado en el chat del trato, nunca aquí.', shipsHint: 'Trato con envío: prefiere el depósito en garantía si el vendedor lo ofrece, y comparte tu dirección solo en el chat.', askSeller: 'Pide al vendedor que confirme', waitingSeller: 'Confirmación solicitada: esperando al vendedor.', refundEscrow: 'Reembolsar depósito', buyWithSats: 'Comprar con sats', depositTitle: 'Depósito de buena fe (opcional)', payDeposit: 'Pagar depósito', depositBefore: 'Un intercambio no tiene factura, así que esta es la forma de darle un', verifiableCost: 'coste verificable', depositAfter: '. Reembolsable al entregarse (o usa el depósito en garantía Cashu para un reembolso automático). ⚠️ Demuestra compromiso, no entrega.', depositPaid: 'Depósito pagado', depositPaidBody: 'Guardado: se adjuntará cuando se confirme el trato.', paid: 'Pagado ⚡', paidWithProof: 'Se guardó un recibo verificable: confirma el trato para que cuente.', paidBody: 'Pide al vendedor que confirme el trato para que cuente para ambos.', }, offers: { accepted: 'Aceptada', declined: 'Rechazada', withdrawn: 'Retirada', open: 'Abierta', noAmount: 'sin importe', titleOwner: 'Ofertas ({{count}})', titleBuyer: 'Tus negociaciones', you: 'Tú', them: 'Ellos', paidAskConfirm: 'Pagado: pide al vendedor que confirme el trato.', payWithSats: 'Pagar con sats', accept: 'Aceptar', decline: 'Rechazar', counter: 'Contraoferta', counterPlaceholder: 'Tu contraoferta (sats)', send: 'Enviar', counterItemPlaceholder: '…o contraoferta con un artículo a cambio (opcional)', waitingOn: 'Esperando a', waitingOnSuffix: '— volverá a ser tu turno si hacen una contraoferta.', withdraw: 'Retirar', dmAccepted: '✅ ¡Tu oferta fue aceptada! Escríbeles para acordar la entrega.', dmDeclined: '❌ Tu oferta fue rechazada.', offerAccepted: 'Oferta aceptada', offerDeclined: 'Oferta rechazada', respondFailed: 'No se pudo responder', somethingWrong: 'Algo salió mal.', offerWithdrawn: 'Oferta retirada', withdrawFailed: 'No se pudo retirar', enterAmountOrItem: 'Introduce un importe o un artículo a cambio', counterDm: 'Contraoferta', counterSent: 'Contraoferta enviada', counterSentBody: 'Ahora es su turno.', counterFailed: 'No se pudo enviar la contraoferta', }, offer: { validAmount: 'Introduce un importe válido', describeOffer: 'Describe tu oferta', describeOfferBody: 'Añade un importe, un artículo a cambio o un mensaje.', dmAmount: ' por {{amount}} sats', dmItem: ' (ofreciendo: {{item}})', dmBody: '🛹 Nueva oferta en tu anuncio "{{title}}"{{amount}}{{item}}.{{note}}', sent: 'Oferta enviada', sentBody: '{{sellerName}} puede aceptarla o rechazarla.', sendFailed: 'No se pudo enviar la oferta', somethingWrong: 'Algo salió mal.', title: 'Hacer una oferta', description: 'Ofrece sats o cambia algo: {{sellerName}} puede aceptar, rechazar o hacer una contraoferta. La entrega la acordáis entre vosotros.', amountLabel: 'Importe (sats, opcional)', amountPlaceholder: 'p. ej. 45000', itemLabel: 'O cambiar algo (opcional)', itemPlaceholder: 'p. ej. mi tabla 8.25 + ruedas de repuesto', itemHint: '¿Intercambio? Pon aquí lo que ofreces: puedes combinarlo con sats.', messageLabel: 'Mensaje (opcional)', messagePlaceholder: 'Algo que el vendedor deba saber…', send: 'Enviar oferta', }, markSold: { enterBuyer: 'Introduce el npub del comprador', dealClosed: 'Trato cerrado 🎉', dealClosedBody: 'Anuncio marcado como vendido y el trato se publicó para la reputación.', closeFailed: 'No se pudo cerrar el trato', somethingWrong: 'Algo salió mal.', title: 'Cerrar el trato', description: 'Marca este anuncio como vendido y registra una atestación de trato firmada para ti y el comprador.', buyerLabel: 'npub del comprador', methodLabel: '¿Cómo se pagó? (autodeclarado)', amountLabel: 'Importe en sats (opcional)', submit: 'Marcar vendido', }, handoff: { title: 'Acordar la entrega', suggest: 'Propón hora y lugar', suggestDm: '¡Hola! Me gustaría comprar "{{title}}". Propón una hora y un lugar para quedar; me viene bien quedar en un spot de skate público.', orMeetAt: 'O quedamos en un spot público cercano:', spotDm: '¡Hola! Me gustaría comprar "{{title}}". ¿Quedamos en {{spot}}? {{url}}', shareDelivery: 'Compartir datos de envío', deliveryDm: '¡Hola! Me gustaría comprar "{{title}}". Estos son mis datos de envío:\n\nNombre:\nDirección:\n\n(Solo comparte lo que necesite el mensajero.)', useLocker: 'Usar taquilla / punto de recogida', lockerDm: '¡Hola! Me gustaría comprar "{{title}}". ¿Podemos usar una taquilla / punto de recogida en vez de una dirección particular?', noteBefore: 'Estos datos se quedan en el chat privado: SkateSpots nunca los ve. Para envíos, prefiere', escrow: 'el depósito en garantía', noteMiddle: ', y', neverPay: 'nunca pagues fuera de los canales de la app', noteAfter: '. Quedad en un sitio público.', }, shipping: { noCounterparty: 'Aún no hay contraparte', noCounterpartyBody: 'El vendedor debería registrar la venta (nombrando al comprador) primero.', markedShipped: 'Marcado como enviado', markedReceived: 'Marcado como recibido', issueReported: 'Incidencia reportada', receivedBody: 'Gracias: esto no libera el depósito en garantía; resuélvelo directamente con el vendedor.', notifiedBody: 'Se ha avisado a la otra parte.', updateFailed: 'No se pudo actualizar', somethingWrong: 'Algo salió mal.', title: 'Envío', shipped: 'enviado', received: 'recibido', issue: 'incidencia', trackingPlaceholder: 'Número de seguimiento (opcional)', iShipped: 'Lo he enviado', iReceived: 'Lo he recibido', reportIssue: 'Reportar una incidencia', noteBefore: 'Autodeclarado: una nota logística,', notProof: 'no una prueba', noteAfter: '. Marcar "recibido" no libera el depósito en garantía. ⚠️ No fotografíes un paquete con la dirección visible, y comparte un número de seguimiento solo si te parece bien que sea público.', }, pay: { sent: 'Pago enviado ⚡', sentWithProof: 'Se guardó un recibo de pago verificable: contará como pago verificado.', sentBody: 'Avisa al vendedor: puede confirmar el trato para que cuente para ambos.', failed: 'El pago falló', title: 'Pagar con sats', descSendPrefix: 'Envía', descSendSuffix: 'a {{sellerName}} para cerrar este trato.', descSettle: 'Cierra este trato directamente con {{sellerName}}.', paid: '¡Pagado!', paidBody: 'Pide al vendedor que confirme el trato: dos confirmaciones construyen la reputación de ambos.', noMethod: '{{sellerName}} no ha configurado un método de pago (ni factura ni dirección Lightning). Escríbele para acordar el pago.', ownListing: 'Este es tu propio anuncio.', paying: 'Pagando…', pay: 'Pagar', payAmount: 'Pagar {{amount}} sats', footnote: 'Paga desde tu cartera conectada (NWC, WebLN o Cashu) directamente a {{sellerName}}: SkateSpots nunca retiene los fondos.', }, spamFee: { invoiceComment: 'Tarifa de anuncio de SkateSpots', generateFailed: 'No se pudo generar la factura', paymentSuccess: '¡Pago realizado!', satsSent: '{{amount}} sats enviados a {{name}}', autoPayFailed: 'Falló el pago automático', autoPayFailedBody: 'Paga manualmente con el código QR o la factura', invoiceCopied: '¡Factura copiada!', copyFailed: 'No se pudo copiar', received: '¡Pago recibido!', receivedBody: 'Se ha pagado tu tarifa de {{amount}} sats. Ya puedes crear tu anuncio.', title: 'Tarifa única de anuncio', subtitle: 'Como miembro nuevo, se requiere una pequeña tarifa para tu primer anuncio.', whyTitle: '¿Por qué tengo que pagar?', spamLabel: 'Prevención de spam:', spamBody: 'Esta tarifa frena a bots y estafadores que inundan el mercado con anuncios falsos.', trustLabel: 'Construcción de confianza:', trustBody: 'Las cuentas nuevas deben demostrar compromiso antes de publicar. Tras unos cuantos anuncios con éxito, esta tarifa se exime.', supportsLabel: 'Apoya a la comunidad:', supportsPrefix: 'La tarifa va a', supportsSpotOwner: ' — ¡la persona que creó este spot!', supportsPlatform: ' — ayuda a mantener SkateSpots en marcha.', oneTimeFee: '~{{usd}} USD • Tarifa única', payToContinue: 'Paga {{amount}} sats para continuar', proveWork: 'Demuestra trabajo en su lugar — gratis', proveWorkBody: 'Gasta unos segundos de CPU en vez de {{amount}} sats. Sin dinero, sin cartera: un impuesto antispam, no un pago.', generating: 'Generando factura...', processing: 'Procesando el pago...', qrAlt: 'Código QR de pago', copyInvoice: 'Copiar factura', openWallet: 'Abrir cartera', payWithWallet: 'Pagar con la cartera conectada', scanHint: 'Escanea el código QR con una cartera Lightning o usa los botones de arriba', skipTitle: 'Cómo evitar esta tarifa en el futuro:', skip1: 'Añade un spot de skate al mapa', skip2: 'Completa 2-3 anuncios con éxito', skip3: 'Construye tu reputación en la comunidad', skipNote: '¡Los miembros de confianza obtienen anuncios gratis ilimitados!', }, reputation: { highlyTrusted: 'Comerciante muy fiable', building: 'Construyendo reputación', newTrader: 'Comerciante nuevo', title: 'Tratos', verified: 'Verificados', sales: 'Ventas', purchases: 'Compras', tradeConfirmedOne: 'trato confirmado mutuamente', tradeConfirmedMany: 'tratos confirmados mutuamente', with: 'con', personOne: 'persona', personMany: 'personas', awaiting: 'Esperando confirmación mutua', withPaymentProof: 'con una prueba de pago adjunta', selfReported: '(autodeclarado — no verificado)', paymentVerified: 'pago verificado', zapReceipt: '(recibo de zap)', singlePartnerWarning: 'Todas las confirmaciones son con la misma cuenta. La confirmación mutua es autodeclarada, así que trata este registro con cuidado.', lowDiversityWarning: 'La mayoría de las confirmaciones vienen de muy pocas cuentas. Un grupo pequeño que se avala entre sí puede parecer muy activo: trata este registro con cuidado.', ringWarning: 'Estas cuentas comercian sobre todo entre ellas: un grupo cerrado. La confirmación mutua dentro de un círculo es una prueba débil.', weighted: 'Ponderado por confianza y actividad', footnote: 'Autodeclarado y firmado mutuamente: una señal, no una prueba de pago.', }, reputationPanel: { reviewOfYou: 'Reseña sobre ti', yourRecord: 'tu registro', listing: 'Anuncio', averageOne: 'media de {{count}} valoración', averageMany: 'media de {{count}} valoraciones', reviewsTitle: 'Reseñas y registros de tratos', fromOthers: '{{count}} de otros', emptyBefore: 'Aún no hay registros de tratos. Cierra un trato y confírmalo en', emptyAfter: ': cada confirmación se convierte en una reseña en ambos perfiles.', }, recommendations: { published: 'Recomendación publicada', publishedBody: 'Gracias por avalar.', failed: 'No se pudo recomendar', somethingWrong: 'Algo salió mal.', title: 'Comerciante de confianza', recommendedBy: 'Recomendado por', skaterOne: 'skater', skaterMany: 'skaters', none: 'Aún no hay recomendaciones.', youRecommend: 'Recomiendas a este comerciante ✓', recommend: 'Recomendar como comerciante de confianza', }, notification: { newOffer: 'Nueva oferta', counterOffer: 'Contraoferta', offerAccepted: 'Oferta aceptada', offerDeclined: 'Oferta rechazada', offerWithdrawn: 'Oferta retirada', confirmTrade: 'Confirma un trato', tradeConfirmed: 'Trato confirmado', reviewOffer: 'Revisar la oferta', openListing: 'Abrir anuncio', }, confirmRow: { rateTrade: 'Valora el trato:', }, deckRating: { title: '{{value}}/10 tablas', aria: '{{n}} de 10', }, clink: { tip: 'Dar propina en Bitcoin', copiedBody: 'Código CLINK copiado al portapapeles.', copyFailed: 'No se pudo copiar', copyFailedBody: 'No se pudo acceder al portapapeles.', whatIs: '¿Qué es CLINK?', tooltipTitle: 'Paga directamente con Bitcoin por Nostr', tooltipBody: 'CLINK es un código de pago autocustodial: sin cuenta en una app, sin intermediarios. Escanéalo con una cartera Lightning compatible y la propina va directamente a ellos.', descRecipient: 'Envía un pago de Bitcoin (Lightning) autocustodial a {{recipientName}} — sin intermediarios.', descGeneric: 'Envía un pago de Bitcoin (Lightning) autocustodial por Nostr — sin intermediarios.', qrAlt: 'Código QR de oferta CLINK', copyCode: 'Copiar código CLINK', openWallet: 'Abrir en cartera CLINK', footnote: 'Escanea con una cartera compatible con CLINK (p. ej. ShockWallet). Si no se abre nada, copia el código de arriba: puede que no tengas una cartera compatible con CLINK instalada. Sin custodio, sin servidor web: la factura se solicita directamente por Nostr.', }, paymentReadiness: { ready: 'Puedes recibir pagos', notReady: 'Configura los pagos para recibir dinero', readyBefore: 'Tu dirección Lightning', readyAfter: ' está en tu perfil — la gente puede zapearte y pagarte directamente.', silentSet: ' También hay configurada una dirección de pago silencioso de Bitcoin.', notReadyBefore: 'Añade una dirección Lightning (y, opcionalmente, una dirección de pago silencioso de Bitcoin) a tu', nostrProfile: 'perfil de Nostr', notReadyAfter: 'para que los skaters puedan pagarte. Se configura una vez y funciona en todos tus perfiles aquí.', }, seller: { trade: 'Intercambio', active: 'Activo', markSold: 'Marcar vendido', yourListings: 'Tus anuncios', activeCount: '{{count}} activos', listItem: 'Publicar un artículo', loading: 'Cargando tus anuncios…', empty: 'Aún no tienes anuncios.', listFirst: 'Publica tu primer artículo', }, noffer: { label: 'Código de oferta CLINK', optional: '(opcional, avanzado)', invalidBefore: 'Eso no parece un código', invalidAfter: 'válido.', valid: 'Código CLINK válido — aparecerá un botón "Pagar vía CLINK" en tu perfil.', help: 'Pega un código de pago CLINK autocustodial (p. ej. de ShockWallet / Lightning.Pub) para aceptar pagos Lightning nativos de Nostr — sin servidor web ni custodio.', learnSpecs: 'Ver la especificación', }, escrowPanel: { escrowed: 'En depósito {{amount}} sats', mint: 'Casa de moneda', refundSinceBefore: 'El comprador puede reembolsar desde', redeemBefore: 'El vendedor puede canjear ahora · el comprador reembolsa después de', noExpiry: 'Este token no tiene caducidad.', }, escrowRequest: { enterAmount: 'Introduce un importe en depósito', minLock: 'Bloquea durante al menos {{days}} día', requestNote: 'En depósito {{amount}} sats para nuestro trato: confirma la venta, por favor.', created: 'Depósito creado 🎉', createdBody: '{{amount}} sats bloqueados durante {{days}} días. {{sellerName}} puede canjearlos al entregar.', createFailed: 'No se pudo crear el depósito', somethingWrong: 'Algo salió mal.', title: 'Poner este trato en depósito', description: 'Los fondos quedan bloqueados a favor de {{sellerName}} y tú puedes reembolsarlos si el trato se cae tras la fecha límite. Requiere una cartera Lightning conectada.', amountLabel: 'Importe (sats)', daysLabel: 'Reembolso del comprador tras (días)', daysHint: 'Tras estos días puedes recuperar los fondos si el vendedor no ha entregado.', nativeOnly: 'El depósito en garantía Cashu solo está disponible en la app de SkateSpots (no en la versión web).', lockAndRequest: 'Bloquear y solicitar', }, }, labUi: { activeCount: '{{count}} activos', addMusicProfile: 'Añadir perfil musical', all: 'Todos', clearAll: 'Borrar todo', collective: 'Colectivo', filters: 'Filtros', following: 'Siguiendo', getRiderCard: 'Consigue tu carnet de rider', judgeEvents: 'Juzgar eventos', justASkater: 'Solo un', labForServices: 'The Lab es para servicios. Explora y únete a toda la comunidad skater', loginToOffer: 'Inicia sesión para ofrecer servicios', newest: 'Más recientes', noResults: 'Sin resultados', offer: 'Ofrecer', offerBuilding: 'Ofrecer construcción', offerCoaching: 'Ofrecer clases', offerCuts: 'Ofrecer cortes', offerDesignArt: 'Ofrecer diseño / arte', offerEditing: 'Ofrecer edición', offerFilming: 'Ofrecer grabación', offerGraffiti: 'Ofrecer graffiti', offerPhotography: 'Ofrecer fotografía', offerServices: 'Ofrecer servicios', offerTattoo: 'Ofrecer tatuajes', offerTraining: 'Ofrecer entrenamiento / fisio', organizeEvents: 'Organizar eventos', resultsMany: '{{count}} resultados', resultsOne: '{{count}} resultado', searchCityPlaceholder: 'Ciudad…', searchNamePlaceholder: 'Nombre, bio…', showResults: 'Ver resultados', showResultsActive: 'Ver resultados · {{count}} activos', skaterWord: 'skater', sortBy: 'Ordenar por', theCrew: 'El Crew', topRated: 'Mejor valorados', trusted: 'De confianza', trustLevel: 'Nivel de confianza', yearsExp: '{{count}} años exp', tabCoaches: 'Entrenadores', tabFilmers: 'Filmers', tabPhoto: 'Foto', tabEditors: 'Editores', tabBuilders: 'Constructores', tabArtists: 'Artistas', tabGraffiti: 'Graffiti', tabTattoo: 'Tatuaje', tabTrainers: 'Entrenadores personales', tabMusic: 'Música', tabJudges: 'Jueces', tabOrganizers: 'Organizadores', tabBarbers: 'Barberos', filterSkillsToLearn: 'Trucos que enseñar', filterContentType: 'Tipo de contenido', filterEquipmentStyle: 'Equipo y estilo', filterServices: 'Servicios', filterCamera: 'Cámara', filterLenses: 'Objetivos', filterLighting: 'Iluminación', filterSupportRig: 'Soporte y equipo', filterStyle: 'Estilo', filterWhatTheyBuild: 'Qué construyen', filterMaterialsTrade: 'Materiales y oficio', filterProjectScale: 'Escala del proyecto', filterWhatTheyMake: 'Qué crean', filterMedium: 'Técnica', filterSoftwareTools: 'Software y herramientas', filterWorkContext: 'Contexto de trabajo', filterMethod: 'Método', filterFocus: 'Enfoque', filterInjuriesTreated: 'Lesiones tratadas', filterCredentialsSetting: 'Credenciales y entorno', filterGenre: 'Género', filterInstrumentsRole: 'Instrumentos y rol', filterEventFormats: 'Formatos de evento', filterSpecialty: 'Especialidad', filterLevelCircuit: 'Nivel / circuito', filterEventTypes: 'Tipos de evento', filterWhatYouHandle: 'Qué gestionas', filterScale: 'Escala', filterWhatTheyOffer: 'Qué ofrecen', filterSignatureStyles: 'Estilos característicos', filterSetting: 'Entorno', filterEditType: 'Tipo de edición', role: { coach: 'Entrenador', filmer: 'Filmer', builder: 'Constructor', editor: 'Editor de vídeo', photographer: 'Fotógrafo', skater: 'Skaters', }, empty: { footer: '¿Tienes dudas? Consulta las FAQ →', loginSuffix: 'para crear un perfil.', coachesTitle: 'Aún no hay entrenadores', coachesBody: 'Sé el primero en ofrecer clases de skate en tu zona.', filmersTitle: 'Aún no hay filmers', filmersBody: 'Sé el primero en ofrecer grabación de skate — clips, partes completas, cobertura de concursos y más.', photographersTitle: 'Aún no hay fotógrafos', photographersBody: 'Sé el primero en ofrecer fotografía de skate en tu zona — acción, secuencias, editorial y más.', editorsTitle: 'Aún no hay editores de vídeo', editorsBody: 'Sé el primero en ofrecer servicios de edición de vídeo de skate.', buildersTitle: 'Aún no hay constructores', buildersBody: 'Sé el primero en anunciar tus rampas, parques o construcciones DIY — hormigón, madera, barandillas y más.', artistsTitle: 'Aún no hay artistas', artistsBody: 'Sé el primero en ofrecer gráficos de tabla, logos, pósteres y merch para la escena.', graffitiTitle: 'Aún no hay artistas de graffiti', graffitiBody: 'Sé el primero en ofrecer piezas, murales y arte para skateparks en tu zona.', tattooTitle: 'Aún no hay tatuadores', tattooBody: 'Sé el primer tatuador de cultura skate en anunciarte — flash, personalizado, línea fina y más.', trainersTitle: 'Aún no hay entrenadores personales', trainersBody: 'Sé el primer entrenador o fisio que ayuda a los skaters a ponerse fuertes y mantenerse sanos.', musiciansTitle: 'Aún no hay músicos', musiciansBody: '¿Patinas y haces música? Añade tu banda o proyecto en solitario — géneros, instrumentos y enlaces.', judgesTitle: 'Aún no hay jueces', judgesBody: '¿Organizas concursos justos? Apúntate para juzgar Game of S.K.A.T.E., quedadas de mejor truco, concursos y paradas de gira.', organizersTitle: 'Aún no hay organizadores', organizersBody: '¿Organizas quedadas, competiciones, encuentros o demos? Apúntate para que los skaters puedan encontrarte y contratarte.', barbersTitle: 'Aún no hay barberos', barbersBody: '¿Cortas el pelo a skaters? Añade tu silla o servicio móvil para que la escena se dé un retoque.', }, become: { addNip05: 'Añade NIP-05 en Ajustes', backToLab: 'Volver al Lab', bioWorkLabel: 'Bio / Sobre tu trabajo', checkContact: 'Revisa tus datos de contacto', cityArea: 'Ciudad / zona', cityCountry: 'Ciudad, país', connectWallet: 'Conectar cartera', connectWalletNwc: 'Conectar cartera con NWC', contactInfo: 'Información de contacto', contactInfoDesc: 'Cómo pueden contactarte los clientes (todo opcional, pero recomendado)', coordinatesOptional: 'Coordenadas (opcional)', email: 'Correo electrónico', failedToPublish: 'No se pudo publicar', fromNostrProfile: 'Desde tu perfil de Nostr', geolocationUnsupported: 'Geolocalización no compatible', getting: 'Obteniendo…', headline: 'Titular', headlineHint: 'Se muestra como el título de tu tarjeta del Lab — p. ej. “{{example}}”. Por defecto, tu nombre.', imageUploaded: 'Imagen subida', instagram: 'Instagram', invalidEmail: 'Introduce una dirección de correo válida.', invalidPortfolio: 'Introduce una URL de portafolio válida.', invalidWebsite: 'Introduce una URL de sitio web válida.', latitude: 'Latitud', learnHow: 'Cómo funciona', locationError: 'Error de ubicación', locationFound: 'Ubicación encontrada', loginRequired: 'Inicio de sesión obligatorio', loginRequiredDesc: 'Debes iniciar sesión para crear un perfil de {{role}}.', loginRequiredDescCraft: 'Debes iniciar sesión para crear un perfil de {{noun}}.', longitude: 'Longitud', nip05Recommended: 'Se recomienda verificación NIP-05', nip05RecommendedDesc: 'Verifica tu identidad para generar confianza con los clientes.', noWallet: 'Sin cartera conectada', otherSocial: 'Otras redes sociales', paymentSetup: '⚡ Configuración de pago necesaria', phoneNumber: 'Número de teléfono', profilePhoto: 'Foto de perfil', profilePublished: 'Tu perfil se ha publicado.', publishing: 'Publicando...', socialMedia: 'Redes sociales', tip: '💡 Consejo: la mayoría de carteras Lightning admiten NWC (Alby, Minibits, Zeus, Coinos).', tipWithTime: '💡 Consejo: la mayoría de carteras Lightning admiten NWC (Alby, Minibits, Zeus, Coinos). Se configura en 30 segundos.', upload: 'Subir', uploadFailed: 'Error al subir', uploadImage: 'Subir imagen', uploading: 'Subiendo…', useCurrentLocation: 'Usar ubicación actual', useMyLocation: 'Usar mi ubicación', usingNwc: 'Usando Nostr Wallet Connect', usingWebln: 'Usando extensión WebLN del navegador', walletConnected: 'Cartera conectada — ¡lista para recibir pagos!', website: 'Sitio web', yearsExperience: 'Años de experiencia', }, coachForm: { anonymous: 'Entrenador anónimo', bioLabel: 'Bio / Filosofía de clases', bioPlaceholder: 'Tu trayectoria, estilo de enseñanza...', create: 'CREAR PERFIL DE ENTRENADOR', created: '¡Perfil de entrenador creado!', createPro: 'CREAR PERFIL DE ENTRENADOR PRO', dmNote: '💬 Los alumnos pueden escribirte directamente por la mensajería cifrada de SkateSpots', heading: 'Conviértete en entrenador', headlineExample: 'Skate Coach Berlín', hourlyRate: 'Tarifa por hora', identity: 'Tu identidad de entrenador', nip05Reason: 'Añade un identificador NIP-05 para verificar tu identidad y generar confianza con los alumnos — les demuestra que eres un entrenador legítimo.', paymentDesc: 'Para cobrar las clases de los alumnos, debes conectar una cartera Lightning. Los alumnos te enviarán zaps directamente por las sesiones.', profileDesc: 'Cuéntales a los alumnos tu experiencia', profileTitle: 'Perfil de entrenador', ratePlaceholder: '5000 sats/h', selectSkill: 'Selecciona al menos un truco.', skillsLabel: 'Trucos que enseño * (selecciona al menos uno)', skillsRequired: 'Trucos obligatorios', spotsDesc: 'Selecciona los spots donde ofreces clases', spotsLabel: 'Spots donde entrenas', tagline: 'Comparte tus conocimientos de skate', update: 'ACTUALIZAR PERFIL DE ENTRENADOR', updated: '¡Perfil de entrenador actualizado!', }, filmerForm: { anonymous: 'Filmer anónimo', bioPlaceholder: 'Tu trayectoria, estilo, equipo...', camerasLabel: 'Cámaras y equipo * (selecciona al menos uno)', create: 'CREAR PERFIL DE FILMER', created: '¡Perfil de filmer creado!', createPro: 'CREAR PERFIL DE FILMER PRO', dmNote: '💬 Los clientes pueden escribirte directamente por la mensajería cifrada de SkateSpots', gearHelper: 'Enumera tus cámaras, objetivos y rigs exactos — a los skaters les importa el equipo.', gearLabel: 'Qué llevas en la mochila (opcional)', gearPlaceholder: 'p. ej. Sony VX1000 + ojo de pez MK1, Panasonic HVX200, estabilizador DJI RS3, GoPro Hero 12, micrófono Sennheiser...', heading: 'Conviértete en filmer', headlineExample: 'Skate Filmer Berlín', identity: 'Tu identidad de filmer', nip05Reason: 'Añade un identificador NIP-05 para verificar tu identidad y generar confianza con los clientes — les demuestra que eres un filmer legítimo.', paymentDesc: 'Para cobrar de los clientes por tus servicios de grabación, debes conectar una cartera Lightning. Los clientes te enviarán zaps directamente por tu trabajo.', profileDesc: 'Cuéntales a los clientes tu experiencia grabando', profileTitle: 'Perfil de filmer', rate: 'Tarifa', ratePlaceholder: '10000 sats/vídeo', reelLabel: 'Reel / portafolio', selectService: 'Selecciona al menos un servicio.', selectSkill: 'Selecciona al menos una habilidad de grabación.', servicesLabel: 'Servicios ofrecidos * (selecciona al menos uno)', servicesRequired: 'Servicios obligatorios', skillsRequired: 'Habilidades obligatorias', spotsDesc: 'Selecciona los spots donde ofreces servicios de grabación', spotsLabel: 'Spots donde grabas', tagline: 'Ofrece tu grabación de vídeo de skate — clips, líneas, partes completas y cobertura de concursos', update: 'ACTUALIZAR PERFIL DE FILMER', updated: '¡Perfil de filmer actualizado!', }, editorForm: { anonymous: 'Editor anónimo', bioPlaceholder: 'Tu estilo de edición, trayectoria, proyectos destacados…', contactPortfolio: 'Contacto y portafolio', create: 'Publicar perfil de editor', created: '¡Perfil de editor creado!', createPro: 'Publicar perfil de editor Pro', editTypes: 'Tipos de edición ofrecidos * (selecciona al menos uno)', hardware: 'Hardware', hardwarePlaceholder: 'p. ej. MacBook Pro M3, Sony FX3', heading: 'Conviértete en editor de vídeo', headlineExample: 'Editor de vídeo de skate', identity: 'Tu identidad', locationOptional: 'Ubicación (opcional)', loginDesc: 'Inicia sesión para crear tu perfil de editor de vídeo.', phoneTelegram: 'Teléfono / Telegram', portfolioPlaceholder: 'Portafolio (Vimeo, YouTube…)', profileDesc: 'Cuéntale a la comunidad tu estilo de edición y tus habilidades', profileTitle: 'Perfil de editor', published: 'Tu perfil se ha publicado en SkateSpots.', rate: 'Tarifa / precios', ratePlaceholder: 'p. ej. 50k sats/min, DM para presupuesto', selectService: 'Selecciona al menos un tipo de edición.', servicesRequired: 'Servicios obligatorios', socialPlaceholder: 'Instagram / usuario social', software: 'Software', softwareHardware: 'Habilidades de software y hardware', softwarePlaceholder: 'p. ej. DaVinci Resolve, Premiere', tagline: 'Ofrece tus servicios de edición de vídeo a la comunidad skater', thumbnail: 'Miniatura de perfil / showreel', update: 'Actualizar perfil de editor', updated: '¡Perfil de editor actualizado!', walletConnected: 'Cartera conectada ✓', walletDesc: 'Recibe pagos en Bitcoin ⚡ directamente de los clientes por tu trabajo de edición.', walletTitle: '⚡ Cartera Lightning para pagos', yearsExperience: 'Años de experiencia', yearsPlaceholder: 'p. ej. 5 años', }, photoForm: { anonymous: 'Fotógrafo anónimo', bioPlaceholder: 'Tu trayectoria, estilo, lo que te encanta fotografiar...', cameraLabel: 'Cámaras * (selecciona al menos una)', cameraRequired: 'Cámara obligatoria', contactDesc: 'Cómo pueden los riders ver tu trabajo y contactarte (todo opcional, pero recomendado)', create: 'CREAR PERFIL DE FOTÓGRAFO', created: '¡Perfil de fotógrafo creado!', createPro: 'CREAR PERFIL DE FOTÓGRAFO PRO', dmNote: '💬 Los riders pueden escribirte directamente por la mensajería cifrada de SkateSpots', gearHelper: 'Enumera cámaras, objetivos e iluminación exactos — a los riders les encanta conocer el equipo.', gearPlaceholder: 'p. ej. Canon R6 II, ojo de pez 8-15 mm, 70-200 mm f/2.8, 2× Godox AD200, disparadores remotos, trípode Manfrotto...', heading: 'Conviértete en fotógrafo', headlineExample: 'Fotografía de skate', identity: 'Tu identidad de fotógrafo', lensesLabel: 'Objetivos', lightingLabel: 'Equipo de iluminación', nip05Reason: 'Añade un identificador NIP-05 para verificar tu identidad y generar confianza con los clientes.', paymentDesc: 'Para cobrar por las sesiones, conecta una cartera Lightning. Los clientes te envían zaps directamente por tu trabajo.', portfolioLabel: 'Portafolio / Instagram', profileDesc: 'Cuéntales a los riders tu mirada, tu equipo y tus servicios', profileTitle: 'Perfil de fotógrafo', ratePlaceholder: '20000 sats/sesión', selectCamera: 'Selecciona al menos un tipo de cámara con el que disparas.', selectService: 'Selecciona al menos un servicio que ofrezcas.', servicesLabel: 'Servicios ofrecidos * (selecciona al menos uno)', servicesRequired: 'Servicios obligatorios', spotsDesc: 'Selecciona los spots donde ofreces fotografía', spotsLabel: 'Spots donde disparas', styleLabel: 'Estilo de disparo', supportLabel: 'Soporte y equipo', tagline: 'Dispara las sesiones — ofrece tu fotografía de skate', update: 'ACTUALIZAR PERFIL DE FOTÓGRAFO', updated: '¡Perfil de fotógrafo actualizado!', }, builderForm: { anonymous: 'Constructor anónimo', bioLabel: 'Bio / Sobre tus construcciones', bioPlaceholder: 'Tu crew, construcciones destacadas, cómo abordas un proyecto...', buildTypesLabel: 'Qué construyes * (selecciona al menos uno)', buildTypesRequired: 'Tipos de construcción obligatorios', cityBase: 'Ciudad / base', contactPortfolio: 'Contacto y portafolio', contactPortfolioDesc: 'Cómo puede la escena ver tus construcciones y contactarte (todo opcional, pero recomendado)', create: 'CREAR PERFIL DE CONSTRUCTOR', created: '¡Perfil de constructor creado!', createPro: 'CREAR PERFIL DE CONSTRUCTOR PRO', dmNote: '💬 Los clientes pueden escribirte directamente por la mensajería cifrada de SkateSpots', gearHelper: 'A los crews y clientes les encanta conocer tu equipo y tu proceso.', gearLabel: 'Cómo trabajas / equipo (opcional)', gearPlaceholder: 'p. ej. cuadrilla de hormigón completa, hormigonera + equipo de gunita propios, soldadura móvil, nos encargamos de permisos y drenaje...', heading: 'Conviértete en constructor', headlineExample: 'Constructor de rampas y parques', identity: 'Tu identidad de constructor', insured: 'Con licencia / asegurado', insuredHelper: 'Relevante para parques públicos y trabajo con ayuntamientos', logoPhoto: 'Logo / foto', materialsLabel: 'Materiales y oficio', nip05Reason: 'Añade un identificador NIP-05 para verificar tu identidad y generar confianza con los clientes.', pastBuilds: 'Construcciones anteriores / Instagram', paymentDesc: 'Para cobrar por tus construcciones, conecta una cartera Lightning. Los clientes te envían zaps directamente por tu trabajo.', profileDesc: 'Cuéntale a la escena qué construyes y cómo trabajas', profileTitle: 'Perfil de constructor', rateLabel: 'Tarifa / base del presupuesto', ratePlaceholder: 'por m² / por proyecto', scaleLabel: 'Escala del proyecto', selectBuild: 'Selecciona al menos una cosa que construyas.', serviceArea: 'Zona de servicio', serviceAreaPlaceholder: 'p. ej. Cataluña, desplazamiento por la UE', spotsDesc: 'Vincula spots y parques que hayas construido para que la gente vea tu trabajo en el mapa', spotsLabel: 'Spots que has construido', tagline: 'Hormigón, soldadura, construcción — anuncia tus rampas y parques', update: 'ACTUALIZAR PERFIL DE CONSTRUCTOR', updated: '¡Perfil de constructor actualizado!', yearsBuilding: 'Años construyendo', }, skaterForm: { backToSkaters: 'Volver a Skaters', bioHelperPulled: 'Tomado de tu perfil — ajústalo para tu tarjeta de skater o déjalo tal cual.', bioHelperShort: 'Una breve presentación para tu tarjeta de skater.', bioPlaceholder: 'Cuánto tiempo llevas patinando, qué te gusta, en qué estás trabajando…', browseSpots: 'Explorar spots', changePhoto: 'Cambiar foto de perfil', chipBio: 'Bio', chipPhoto: 'Foto', cityArea: 'Ciudad / zona', created: '¡Ya estás en el mapa! 🛹', custom: 'Personalizado', customHelper: 'Tu propia etiqueta — se muestra en tu tarjeta de skater en lugar de un preajuste.', customPlaceholder: 'p. ej. OG, de fin de semana, retirado…', discoverable: 'Otros skaters ya pueden encontrarte.', editFullProfile: 'edita tu perfil completo', fromProfile: 'Desde tu perfil', heroEditPrefix: 'Edita tu Directorio de', heroJoinPrefix: 'Únete al Directorio de', heroSuffix: '', homeHelper: 'Escríbelo libremente o vincula un spot real del mapa para que la gente pueda ir.', homePlaceholder: 'Parque / plaza local — o toca “Explorar spots”', homeSpot: 'Spot habitual', layerEnd: 'para cambiarlos en todas partes.', layerIntro: 'Esta es tu', layerMid: ', construida sobre tu perfil de Nostr. Tu nombre, foto, bio, lightning y verificación vienen de ahí —', layerWord: 'capa skater', level: 'Nivel', linked: 'Vinculado a un spot del mapa', loadingProfile: 'Cargando tu perfil…', loadingSpots: 'Cargando spots…', locationHelper: 'Ayuda a otros a encontrar skaters cerca. Solo se comparte una zona aproximada.', loginToJoin: 'Inicia sesión para unirte', loginToJoinDesc: 'Crea tu perfil de skater para que la comunidad pueda encontrarte.', mappedSpot: 'Spot del mapa', noSpots: 'Aún no se han encontrado spots.', noSpotsMatch: 'Ningún spot coincide con tu búsqueda.', openMap: 'Abrir el mapa', pickEverything: 'Elige todo lo que encaje con tu estilo.', pickHomeSpot: 'Elige tu spot habitual', pickStyles: 'Elige tus estilos', pickStylesDesc: 'Elige al menos una cosa que patines.', profilePic: 'Foto de perfil', profilePicHelper: 'Tu tarjeta de skater usa tu foto de perfil de Nostr — la misma imagen en todas partes.', publishingAs: 'Publicando como', putOnMap: 'Ponme en el mapa', searchSpots: 'Busca spots por nombre o ciudad…', skateStory: 'Tu historia skater', stance: 'Postura', unlinkSpot: 'Desvincular spot', updateButton: 'Actualizar mi perfil', updated: '¡Perfil actualizado!', whatYouSkate: 'Lo que patinas *', yearsPlaceholder: 'p. ej. 8', yearsSkating: 'Años patinando', yourProfilePic: 'Tu foto de perfil', zapsOn: 'Zaps activados', }, skaters: { clearSearch: 'Borrar búsqueda', community: 'La comunidad', countMany: 'skaters', countOne: 'skater', editProfile: 'Editar mi perfil de skater', heroDesc: 'Encuentra a tu gente. Explora a los skaters que representan a SkateSpots — por estilo, postura, nivel y ciudad.', nip05Verified: 'Verificado con NIP-05', noMatches: 'Sin coincidencias', noneDesc: 'Sé el primero en unirte al directorio y poner SkateSpots en el mapa.', noneTitle: 'Aún no hay skaters', noVerifiedMatch: 'Ningún skater verificado coincide', searchPlaceholder: 'Busca por nombre, ciudad o npub…', tryDifferentSearch: 'Prueba otra búsqueda o borra los filtros.', tryTurnOffVerified: 'Prueba a desactivar el filtro “Verificado” para ver a todos.', verifiedFilterTitle: 'Mostrar solo skaters con una identidad NIP-05 verificada', }, skaterCard: { inDirectory: 'Estás en el Directorio de Skaters', joinDesc: 'Añade tu postura, estilos y nivel para que los skaters puedan encontrarte.', joinTitle: 'Únete al Directorio de Skaters', }, crewsStrip: { allCrews: 'Todos los crews', memberMany: '{{count}} miembros', memberOne: '{{count}} miembro', title: 'Crews en esta escena', }, labLink: { coach: 'Entrenador', filmer: 'Filmer', editor: 'Editor', photographer: 'Fotógrafo', builder: 'Constructor', artist: 'Artista', graffiti: 'Graffiti', tattoo: 'Tatuaje', trainer: 'Entrenador personal', musician: 'Músico', judge: 'Juez', barber: 'Barbero', organizer: 'Organizador', lab: 'Lab', linkedProfiles: 'Perfiles del Lab vinculados', desc: '¿También tienes un estudio, clases o un servicio de construcción? Vincula tus perfiles del Lab para que la gente pueda contratar a tu crew. Opcional. Cuando el perfil del Lab también enlaza de vuelta a este crew, ambos muestran una insignia', descEnd: 'verde.', empty: 'Aún no tienes perfiles del Lab. Crea uno en The Lab para vincularlo aquí.', }, proUpgrade: { goPro: 'Hazte Pro', optional: '· opcional', freeTo: 'Gratis publicar. Pro añade una', proBadge: 'insignia Pro', featuredPlacement: 'colocación destacada', atTop: 'en la parte superior del Lab.', active: 'Activo', benefit1: 'Insignia "Pro" dorada en tu perfil y tarjetas', benefit2: 'Aparece primero cuando los skaters exploran The Lab', benefit3: 'Apoya a SkateSpots — sin anuncios, sin intermediarios', platformOwner: 'Propietario de la plataforma — Pro siempre está activo.', proActiveOne: 'Pro activo · queda {{count}} día. Tu perfil aparecerá destacado.', proActiveMany: 'Pro activo · quedan {{count}} días. Tu perfil aparecerá destacado.', context: 'Tu perfil sigue publicado gratis cuando caduque Pro — solo pierdes la insignia y el impulso.', }, profilePreview: { viewPublic: 'Ver público', unnamed: 'Skater sin nombre', noHandle: 'Aún sin identificador', }, pyramid: { pyramidWord: 'PIRÁMIDE', rankingsWord: 'RANKINGS', subtitle: 'Principales contribuidores de tu ciudad', yourRank: 'Tu puesto', keepContributing: '¡Sigue contribuyendo para subir más alto!', topContributors: 'Principales contribuidores', noContributors: 'Aún no hay contribuidores. ¡Sé el primero en añadir un spot o crear un evento!', spots: 'Spots', events: 'Eventos', total: 'Total', trust: 'Confianza', }, detail: { joined: 'Se unió', about: 'Sobre', howWeWork: 'Cómo trabajamos', inTheBag: 'En la mochila', hardware: 'Hardware', software: 'Software', eventsJudged: 'Eventos juzgados', eventsOrganized: 'Eventos organizados', spots: 'Spots', viewSpot: 'Ver spot', serviceArea: 'Zona de servicio', licensedInsured: 'Con licencia / asegurado', studio: 'Estudio', shopStudio: 'Tienda / estudio', booksOpen: 'Agenda abierta', credentials: 'Credenciales', remoteOnline: 'Disponible en remoto / en línea', graffitiCrew: 'Crew de graffiti', act: 'Formato', listen: 'Escuchar', upcomingGigs: 'Próximos bolos', past: 'Pasado', experience: 'Experiencia', yearsCount: '{{count}} años', rate: 'Tarifa', contact: 'Contacto', sendMessage: 'Enviar mensaje', bookGig: 'Reservar para un bolo', portfolioDomain: 'Portafolio · {{domain}}', manage: 'Gestionar', admin: 'Admin', manageRemove: 'Elimina tu perfil de {{noun}} de The Lab.', adminTakeDown: 'Retira este perfil de {{noun}}. Quedará oculto en todo SkateSpots.', entityLabel: 'perfil de {{noun}}', deleteProfile: 'Eliminar perfil', location: 'Ubicación', servicesSkills: 'Servicios y habilidades', noun: { coach: 'entrenador', filmer: 'filmer', editor: 'editor de vídeo', photographer: 'fotógrafo', builder: 'constructor', artist: 'artista', graffiti: 'artista de graffiti', tattoo: 'tatuador', trainer: 'entrenador personal', musician: 'músico', judge: 'juez de eventos', organizer: 'organizador de eventos', barber: 'barbero', profile: 'perfil', }, skillsTitle: { skills: 'Trucos', servicesGear: 'Servicios y equipo', whatWeBuild: 'Qué construimos', whatTheyMake: 'Qué crean', stylesWork: 'Estilos y obra', styles: 'Estilos', focusSpecialties: 'Enfoque y especialidades', genresInstruments: 'Géneros e instrumentos', formatsSpecialties: 'Formatos y especialidades', servicesStyles: 'Servicios y estilos', eventTypesServices: 'Tipos de evento y servicios', }, }, rider: { heroDesc: 'Tu identidad skater verificable. Firmada con Nostr, lista para imprimir, imposible de falsificar.', heroDesc2: 'Gana insignias de habilidad presenciadas por otros skaters. Consigue pases de acceso a parks. Comparte tu carnet donde quieras.', headerTagline: 'Firmado con Nostr · listo para imprimir · verificado por QR', tabCard: 'Mi carnet', tabBadges: 'Insignias', tabAward: 'Otorgar', rendering: 'Generando…', shareCard: 'Compartir carnet', savePng: 'Guardar PNG', print: 'Imprimir', copyId: 'Copiar ID', cardType: 'Tipo de carnet', licenseLabel: 'Licencia de skater', licenseSub: 'Tu identidad personal de rider', parkLabel: 'Acceso al park', parkSub: 'Emite pases como propietario de un park', theme: 'Tema', holoTitle: 'Brillo holográfico', holoDesc: 'Efecto de lámina animado', cardDetails: 'Detalles del carnet', skateStyle: 'Estilo de skate', ridesFor: 'Patrocina a', ridesForPlaceholder: 'Tienda local…', sponsors: 'Patrocinadores', sponsorsPlaceholder: 'Marcas…', showOnCard: 'Mostrar en el carnet', zaps: 'Zaps ⚡', skills: 'Habilidades', selected: '{{count}}/6 seleccionados', goldBadgesHint1: 'Las insignias doradas de tu carnet vienen de otros skaters que te presenciaron — consulta la pestaña', goldBadgesHint2: '.', parkOwnersOnly: 'Solo propietarios de parks.', parkOwnersDesc: 'Emítelo con la misma clave de Nostr que publicó tu anuncio del park. Cualquiera puede escanear el QR y verificar la firma en la cadena — sin autoridad central.', parkDetails: 'Detalles del park', parkName: 'Nombre del park', parkNamePlaceholder: 'The Berrics…', riderName: 'Nombre del rider', riderNamePlaceholder: 'Nombre en el carnet', riderNpub: 'ID de Nostr del rider (npub)', accessLevel: 'Nivel de acceso', validThru: 'Válido hasta', publishToNostr: 'Publicar en Nostr', badgesIntro: 'Otras personas presenciaron y firmaron estas insignias en Nostr. Aparecen como chips dorados ⭐ en tu carnet.', earnMore: '¿Quieres ganar más? Patina delante de alguien y pídele que presencie tu truco.', awardSomeone: 'Otorgar una insignia a otra persona', youSawIt: 'Lo viste ocurrir', youSawItDesc: 'Firma la prueba en Nostr. Pasa a formar parte de su historial permanente — vinculada criptográficamente a tu clave.', skillsWitnessed: 'Habilidades que presenciaste', whereSeen: '¿Dónde lo viste?', optional: '(opcional)', signingOnNostr: 'Firmando en Nostr…', awardBadge: 'Otorgar insignia', addRiderSkill: 'Añade el npub del rider + al menos una habilidad', invalidNpub: 'npub no válido', badgeAwarded: '🏅 ¡Insignia otorgada!', badgeSent: '{{skills}} enviados.', failed: 'Error', couldNotRender: 'No se pudo generar el carnet', popupBlocked: 'Ventana emergente bloqueada', popupBlockedDesc: 'Permite las ventanas emergentes en este sitio.', linkCopied: '🔗 ¡Enlace copiado!', enterRiderNpub: 'Introduce el npub del rider', parkPublished: '✅ ¡Carnet de acceso al park publicado!', publishFailed: 'Error al publicar', noBadges: 'Aún no hay insignias. ¡Patina delante de alguien y pídele que presencie tus trucos!', showMore: 'Mostrar {{count}} más', witnessedBy: 'Presenciado por', at: 'en', previewLicense: 'Licencia de skater', previewSince: 'Desde {{year}}', previewEvts: 'Evts', previewScan: 'Escanea para verificar', previewSkatepark: 'Skatepark', previewAccessPass: 'Pase de acceso', previewMemberName: 'Nombre del socio', previewIssuedBy: 'Emitido por el propietario del park · firmado con Nostr', previewValidThru: 'Válido hasta', previewNostrVerified: 'Verificado con Nostr', }, craftForm: { profileImage: 'Imagen de perfil', nameHeadline: 'Nombre / titular', about: 'Sobre ti', aboutPlaceholder: 'Cuéntales a los skaters sobre tu trabajo como {{noun}}…', required: 'obligatorio', nip05Title: 'Añade NIP-05 para generar confianza', nip05Desc: 'Un identificador NIP-05 ayuda a los skaters a verificar que eres quien dices ser. Muy recomendado antes de publicar.', editingNote: 'Editando tu perfil de {{noun}} existente — al publicar se reemplaza.', location: 'Ubicación', pinned: '📍 Fijado en el mapa ({{lat}}, {{lng}})', experienceYears: 'Experiencia (años)', expPlaceholder: 'p. ej. 5', ratePlaceholder: 'p. ej. 20k sats / por proyecto', contactLinks: 'Contacto y enlaces', phoneOptional: 'Teléfono (opcional)', emailOptional: 'Correo (opcional)', socialPlaceholder: 'Redes (Instagram, etc.)', gettingPaid: 'Cobrar', updateProfile: 'Actualizar perfil', publishProfile: 'Publicar perfil', sectionRequired: '{{section}} obligatorio', sectionRequiredDesc: 'Selecciona al menos una opción en "{{section}}".', updated: '¡Perfil actualizado!', created: '¡Perfil creado!', headlineExample: 'Skate Coach Berlín', }, }, chromeUi: { skipToContent: 'Saltar al contenido', menu: 'Menú', inBadge: 'Dentro', loggedIn: 'Sesión iniciada', profile: 'Perfil', logIn: 'Iniciar sesión', logOut: 'Cerrar sesión', notLoggedIn: 'Sin sesión', loggedOutPrompt: 'Inicia sesión para añadir spots, enviar zaps a otros skaters y guardar tus favoritos', accounts: 'Cuentas', addAnotherAccount: 'Añadir otra cuenta', setStatus: 'Definir estado', setYourStatus: 'Define tu estado', status: 'Estado', addSpot: 'Añadir spot', myData: 'Mis datos', myStash: 'Mi alijo', myCollections: 'Mis colecciones', viewMyProfile: 'Ver mi perfil', customizeNavBar: 'Personalizar barra de navegación', ecash: 'Ecash', madeWith: 'Hecho con', forSkateCommunity: 'para la comunidad de skateboarding', beta: 'Beta', license: 'Licencia', privacy: 'Privacidad', collaborators: 'Colaboradores y amigos', notSponsoredBy: 'Sin patrocinio de', errorTitle: 'No se pudo cargar', errorDescription: 'La solicitud de red falló. Comprueba tu conexión e inténtalo de nuevo.', tryAgain: 'Intentar de nuevo', weatherOn: 'Tiempo activado', weatherOff: 'Tiempo desactivado', trustFilter: 'Filtro de confianza', filterByTrustLevel: 'Filtrar por nivel de confianza', trust: { all: 'Todos los usuarios', allDesc: 'Mostrar contenido de todo el mundo', verified: 'Verificado', verifiedDesc: 'Los sigues o están verificados (confianza ≥90)', trusted: 'De confianza', trustedDesc: 'Amigos de amigos o verificados por NIP-05 (confianza ≥60)', following: 'Solo a quienes sigo', followingDesc: 'Mostrar solo contenido de las personas que sigues', followingShort: 'Siguiendo', }, sort: { recent: 'Más recientes', recentDesc: 'Los más nuevos primero', trust: 'Mayor confianza', trustDesc: 'Creadores de más confianza', proximity: 'Más cercanos', proximityDesc: 'Ubicaciones más cercanas', popular: 'Más populares', popularDesc: 'Más comentarios/reacciones', zaps: 'Más zapados', zapsDesc: 'Mayor valor recibido', }, spotType: { street: 'Calle', transition: 'Transición', park: 'Parque', plaza: 'Plaza', diy: 'DIY', bowl: 'Bowl', vert: 'Vert', indoor: 'Indoor', skatepark: 'Skatepark', miniramp: 'Mini Rampa', }, }, placesUi: { addToCalendar: { add: 'Añadir al calendario', appleOutlook: 'Apple / Outlook (.ics)', google: 'Google Calendar', }, attendees: { goingCount: 'van', goingTab: 'Van ({{count}})', interestedTab: 'Interesados ({{count}})', nobodyGoing: 'Nadie ha confirmado todavía.', nobodyInterested: 'Nadie se ha marcado como interesado todavía.', noRsvps: 'Aún no hay confirmaciones — sé el primero en decir que vas.', trusted: 'De confianza', trustedTitle: 'Alguien a quien sigues o un mapeador de confianza', youTrust: 'de confianza', }, bounty: { addressCoords: 'Dirección y coordenadas', basic: 'Básico', contactInfo: 'Datos de contacto', description: 'Descripción', earningPotential: 'Potencial de ganancias', excellent: '¡Excelente!', gettingStarted: 'Empezando', good: 'Bien', onePhoto: 'Al menos 1 foto', openingHours: 'Horario de apertura', shopName: 'Nombre de la tienda', threePhotos: '3+ fotos', tip: '💡 ¡Más calidad = más zaps de la comunidad!', }, calendar: { allDay: 'Todo el día', eventDay: 'Día de evento', eventsOnDay: '{{count}} eventos', eventsThisMonth: 'eventos este mes', going: 'van', months: { january: 'enero', february: 'febrero', march: 'marzo', april: 'abril', may: 'mayo', june: 'junio', july: 'julio', august: 'agosto', september: 'septiembre', october: 'octubre', november: 'noviembre', december: 'diciembre', }, nextMonth: 'Mes siguiente', nothingOnDay: 'No hay nada este día.', prevMonth: 'Mes anterior', tapHighlighted: 'Toca un día resaltado para ver qué hay.', today: 'Hoy', tourDay: 'Día de tour', toursOnDay: '{{count}} tours', toursThisMonth: 'tours este mes', weekdays: { sun: 'dom', mon: 'lun', tue: 'mar', wed: 'mié', thu: 'jue', fri: 'vie', sat: 'sáb' }, weekdaysShort: { sun: 'D', mon: 'L', tue: 'M', wed: 'X', thu: 'J', fri: 'V', sat: 'S' }, }, countdown: { ended: 'Finalizado', happeningNow: 'Sucediendo ahora', inDays: 'En {{count}} días', inHoursMins: 'En {{hours}}h {{mins}}m', inMins: 'En {{count}} min', startingNow: 'Empieza ya', tomorrow: 'Mañana', }, createEvent: { add: 'Añadir', addNewSpot: 'Añadir un spot nuevo →', changeSpot: 'Cambiar spot', created: '¡Evento creado!', createdDesc: 'Tu evento se ha publicado en la red.', entryFee: 'Precio de entrada', entryFeeHint: '(opcional — p. ej. "500 sats" o "10 €")', entryFeePlaceholder: 'Déjalo en blanco para eventos gratis', featuring: 'Con {{name}}', featuringDesc: 'Este grupo se etiquetará como música en directo y aparecerá en su lista de conciertos.', fundingGoal: 'Objetivo de financiación', fundingGoalHint: '(opcional — sats para financiar con zaps)', fundingGoalPlaceholder: 'p. ej. 50000', geoNotSupported: 'Geolocalización no compatible', geoNotSupportedDesc: 'Tu navegador no admite geolocalización.', hideSpots: 'Ocultar spots', hostingAs: 'Organizando como {{name}}', hostingAsDesc: 'Este evento aparecerá en la página de tu crew y se etiquetará como organizado por la crew.', imageUploaded: 'Imagen subida', imageUploadedDesc: 'Tu imagen se ha subido correctamente.', invalidDate: 'Fecha no válida', invalidDateDesc: 'Introduce una fecha y hora de inicio válidas.', invalidEnd: 'Hora de fin no válida', invalidEndDesc: 'La hora de fin debe ser posterior a la de inicio.', linkedTo: 'Vinculado a: {{title}}', linkToSpot: 'Vincular a un spot', linkToTour: 'Vincular a un tour (opcional)', linkTourDesc: 'Vincula este evento a un tour para mostrar que forma parte de una serie más amplia. Ideal para tours nacionales, aventuras internacionales o días de retos del World Destruction Tour.', loadingSpots: 'Cargando spots...', loadingTours: 'Cargando tours...', locationError: 'Error de ubicación', locationFound: 'Ubicación encontrada', locationFoundDesc: 'Se ha establecido tu ubicación actual.', logoUrl: 'URL del logo (opcional)', noSpotsAvailable: 'No hay spots disponibles', noSpotsMatch: 'Ningún spot coincide con tu búsqueda', noTourLinked: 'Ningún tour vinculado', optional: '(opcional)', pastDesc: 'Elige una fecha y hora futuras para que los skaters puedan confirmar y asistir.', pastTitle: 'Esa hora de inicio ya ha pasado', publishFailed: 'No se pudo publicar', publishFeatured: 'Publicar evento destacado', removeSponsor: 'Eliminar patrocinador', searchSpots: 'Busca spots por nombre, ubicación o categoría...', selectedSpot: 'Seleccionado: {{name}}', selectSpot: 'Seleccionar spot', selectSpotHint: 'Selecciona en el mapa el spot donde se celebra este evento', selectTour: 'Seleccionar tour', somethingWrong: 'Algo ha salido mal', sponsorName: 'Nombre del patrocinador', sponsors: 'Patrocinadores', sponsorsHint: '¿Tienes una tienda o marca que lo respalde? Añade su logo — se muestra como una franja "Presentado por" en el evento.', startRequired: 'Hora de inicio obligatoria', startRequiredDesc: 'Introduce cuándo empieza el evento.', titleRequired: 'Título obligatorio', titleRequiredDesc: 'Introduce un nombre para este evento.', uploadFailed: 'Error al subir', uploadFailedDesc: 'No se pudo subir la imagen', websiteUrl: 'URL del sitio web (opcional)', }, createShop: { address: 'Dirección de la tienda', addressPlaceholder: 'p. ej., Calle Mayor 1, Madrid', addressRequired: 'Dirección obligatoria', addressRequiredDesc: 'Introduce la dirección de tu tienda.', contactHint: 'Ayuda a los clientes a contactarte (se recomienda al menos un método de contacto)', contactInfo: 'Información de contacto', created: '🎉 ¡Tienda añadida!', createdDesc: 'Tu tienda de skate ya está en el mapa. ¡Los skaters pueden enviarte zaps para agradecerlo!', descriptionPlaceholder: 'Cuenta a la gente sobre tu tienda, qué vendes, tu especialidad...', detailsDesc: 'Habla a la comunidad sobre tu tienda. Todos los campos marcados con * son obligatorios.', email: 'Correo electrónico', hoursOfOperation: 'Horario de apertura', hoursPlaceholder: 'p. ej., Lun-Sáb 10:00-20:00, Dom 12:00-18:00', instagram: 'Instagram', invalidCoords: 'Coordenadas no válidas', invalidCoordsDesc: 'Introduce una latitud (-90 a 90) y longitud (-180 a 180) válidas.', latPlaceholder: 'Latitud (p. ej., 40.4168)', lngPlaceholder: 'Longitud (p. ej., -3.7038)', locationRequired: 'Ubicación obligatoria', locationRequiredDesc: 'Introduce coordenadas o usa tu ubicación actual.', loginToAdd: 'Debes iniciar sesión para añadir una tienda de skate.', namePlaceholder: 'p. ej., Supreme Madrid', nameRequired: 'Nombre de la tienda obligatorio', nameRequiredDesc: 'Introduce un nombre para tu tienda.', phoneNumber: 'Número de teléfono', publishFailedDesc: 'Algo ha salido mal. Consulta la consola para más detalles.', shopPhotoAlt: 'Tienda', shopPhotos: 'Fotos de la tienda', subtitle: 'Publica tu tienda en el mapa y conecta con la comunidad', upload: 'Subir', }, createTour: { acceptedClipSources: 'Fuentes de clips aceptadas', acceptedClipSourcesDesc: '¿Qué formatos aceptarás para enviar clips?', accommodationInfo: 'Información de alojamiento', accommodationPlaceholder: "Recomendaciones o arreglos de alojamiento, p. ej., 'Hostales económicos por la ruta', 'Se necesita equipo de acampada', 'Airbnbs incluidos'", addChallenge: 'Añadir reto', addCity: 'Añadir una ciudad...', addCountry: 'Añadir un país...', addShopFirst: 'Añade una tienda primero', alsoSelected: 'También seleccionados:', availabilityPlaceholder: 'p. ej., Fines de semana, Solo mañanas, Con cita', availabilityQuestion: '¿Cuándo sueles estar disponible?', availableShops: 'Tiendas de skate disponibles ({{count}})', challengeDescPlaceholder: 'Descripción opcional...', challenges: 'Retos', challengesRequired: 'Retos obligatorios', challengesRequiredDesc: 'Añade al menos un reto para que los equipos lo completen.', challengesSecret: 'Todos los retos son SECRETOS hasta la fecha de inicio de la competición. ¡Los equipos no los verán hasta entonces!', challengeTitlePlaceholder: "Título del reto, p. ej., 'Kickflip a un 10 escalones'", citiesLabel: 'Ciudades', citiesOnTour: 'Ciudades del tour', cityPlaceholder: 'p. ej., Madrid, España', cityRegion: 'Ciudad / Región', cityRequired: 'Ciudad/región obligatoria', cityRequiredDesc: 'Introduce tu ciudad o región.', clipAnyUrl: '🔗 Cualquier URL', clipBlossom: '📦 Subida a Blossom', clipInstagram: '📸 Instagram', clipYouTube: '▶️ YouTube', competitionDates: 'Fechas de la competición', competitionDatesWarning: '⚠️ ¡Todos los retos son SECRETOS hasta la fecha de inicio! Los equipos no verán los retos hasta que empiece la competición.', competitionLocations: 'Ubicaciones de la competición', competitionLocationsDesc: '¿Dónde competirán los equipos? Añade todas las ciudades y países implicados.', coordsHint: 'Las coordenadas son opcionales. Añádelas para marcar tu punto de encuentro en el mapa.', countriesLabel: 'Países', countriesRequired: 'Países obligatorios', countriesRequiredDesc: 'Añade al menos un país para tu tour internacional.', createdDestruction: '💀 ¡WORLD DESTRUCTION TOUR CREADO!', createdDestructionDesc: 'Los equipos pueden inscribirse. ¡Los retos se revelan en la fecha de inicio!', createDestructionTour: 'Crear World Destruction Tour', createdInternational: '✈️ ¡Tour internacional creado!', createdInternationalDesc: '¡Tu aventura global está publicada! Conecta con skaters de todo el mundo.', createdLocal: '🏠 ¡Tour local creado!', createdLocalDesc: 'Tu tour ya es visible. ¡Los skaters pueden reservar por MD!', createdNational: '🚐 ¡Tour nacional creado!', createdNationalDesc: '¡Tu road trip está activo! Empieza a coordinar con los skaters interesados.', departure: 'Salida *', departureRequired: 'Fecha de salida obligatoria', departureRequiredDesc: 'Indica cuándo sale el viaje para que los skaters puedan planificarse y reservar.', descriptionPlaceholder: 'Describe lo que vivirán los skaters: spots que visitaréis, el ambiente, qué hace único tu tour...', destructionDesc: 'Configura tu competición global estilo KOTR — ¡tú lo defines TODO!', discountHint: 'Los participantes del tour pueden mostrar su confirmación de reserva en la tienda para recibir este descuento', discountPercentage: 'Porcentaje de descuento', dropTour: 'Lanza un tour', duration: 'Duración', durationHintDestruction: '¿Cuánto dura la competición? (1-12 meses)', durationHintInternational: '¿Cuántas semanas dura la aventura? (hasta 2 meses)', durationHintLocal: '¿Cuánto suele durar tu tour?', durationHintNational: '¿Cuántos días dura el road trip?', durationWeeksMonths: '{{weeks}} semanas (~{{months}} meses)', editTour: 'Editar tour', enable: 'Activar', enabled: 'Activado', endBeforeStart: 'Fin antes del inicio', endBeforeStartDesc: 'La fecha de fin de la competición debe ser igual o posterior a la de inicio.', endDate: 'Fecha de fin', entryFeeHint: 'Te quedas el 95% • La plataforma se lleva el 5% • Déjalo vacío para entrada gratis', entryFeePerTeam: 'Entrada por equipo (sats)', entryFeePlaceholder: 'p. ej., 100000', entryPrizes: 'Entrada y premios', filmPremieres: 'Estrenos de películas de equipos', filmPremieresDesc: 'Tras la competición, los clips de cada equipo se convierten en una película que puede estrenarse en tiendas de skate locales de todo el mundo.', filmPremieresInfo: '🎥 Los equipos recopilan sus clips de retos en una película final. Las tiendas pueden acoger estrenos, conectando la competición global con las comunidades locales.', filmReleaseDate: 'Fecha de estreno (opcional)', filmReleaseDateHint: 'Cuándo estarán disponibles las películas. Déjalo vacío para estrenarlas justo después de que acabe la competición.', fixedSession: 'Sesión fija', fixedSessionDesc: 'Una fecha y hora concretas', flexible: 'Flexible', flexibleDesc: 'Reserva cuando quieras por MD', hide: 'Ocultar', howDestruction1: '• Competición global por equipos — de hasta 12 meses de duración', howDestruction2: '• TÚ defines retos, puntos y premios — nosotros solo ponemos la plataforma', howDestruction3: '• Todos los retos son SECRETOS hasta la fecha de inicio de la competición', howDestruction4: '• Clips vía subida a Blossom O enlaces externos (YouTube, Instagram, cualquier URL)', howDestruction5: '• Solo nivel avanzado — todos los tipos de spot incluidos automáticamente', howDestruction6: '• La plataforma se lleva solo el 5% de las inscripciones (NO del bote de premios)', howDestructionTitle: '💀 WORLD DESTRUCTION TOUR - Estilo KOTR', howInternational1: '• Aventuras transfronterizas por varios países', howInternational2: '• Tú pones el precio — la plataforma se lleva solo el 5%', howInternational3: '• Fija las fechas de salida y regreso para que el equipo pueda reservar vuelos', howInternational4: '• Conecta skaters de todo el mundo', howInternational5: '• ¡Crea experiencias globales inolvidables!', howInternationalTitle: 'Cómo funcionan los tours internacionales', howItWorks: 'Cómo funciona:', howLocal1: '• Tú pones el precio — la plataforma se lleva el 10%', howLocal2: '• Los spots ocultos siguen ocultos — tú los muestras en persona', howLocal3: '• Organiza una sesión programada o mantenlo flexible / con cita', howLocal4: '• Los skaters reservan por MD, pagan en Lightning y pueden añadirlo a su calendario', howLocal5: '• Construye tu reputación con reseñas y zaps', howLocalTitle: 'Cómo funcionan los tours locales', howNational1: '• Road trips por varias ciudades de tu país', howNational2: '• Tú pones el precio — la plataforma se lleva solo el 7%', howNational3: '• Fija las fechas del viaje para que los skaters puedan pedir días libres y viajar', howNational4: '• Incluye info de transporte / alojamiento para la crew', howNational5: '• ¡Construye aventuras de skate legendarias!', howNationalTitle: 'Cómo funcionan los tours nacionales', imageUploadedDesc: 'Tu imagen del tour se ha subido.', incompleteCoords: 'Coordenadas incompletas', incompleteCoordsDesc: 'Introduce latitud y longitud, o deja ambas vacías.', internationalDetails: 'Detalles de la aventura internacional', languagesSelected: '{{count}} seleccionados', languagesSpoken: 'Idiomas hablados', latOptional: 'Latitud (opcional)', lngOptional: 'Longitud (opcional)', loadingProfile: 'Cargando perfil...', loadingProfileDesc: 'Comprobando el estado de tu verificación NIP-05.', loadingShops: 'Cargando tiendas...', localShopPremieres: 'Estrenos en tiendas locales', localShopPremieresDesc: 'Las tiendas de skate de todo el mundo pueden acoger noches de cine', loginToCreate: 'Debes iniciar sesión para crear un tour.', maxGroupSize: 'Tamaño máximo del grupo', maxTeams: 'Equipos máximos', maxTeamSize: 'Tamaño máximo del equipo', meetingLocationSet: 'Tu ubicación actual se ha establecido como punto de encuentro.', meetingPointDesc: '¿Dónde te reunirás con los participantes del tour? Elige un sitio público y conocido.', meetingPointLabel: 'Punto de encuentro', meetingPointPlaceholder: 'p. ej., Estación de Atocha', meetingPointRequired: 'Punto de encuentro obligatorio', meetingPointRequiredDesc: 'Introduce dónde te reunirás con los participantes del tour.', minTeamSize: 'Tamaño mínimo del equipo', noChallenges: 'Aún no hay retos', noChallengesDesc: 'Añade retos para que los equipos los completen', noPartnerShop: 'Sin tienda asociada', noShopsFound: 'Aún no se han encontrado tiendas de skate en la red.', noShopsRegistered: 'Aún no hay tiendas de skate registradas', onlineRelease: 'Estreno online', onlineReleaseDesc: 'Estrena también las películas en YouTube/Nostr', organizerContact: 'Datos de contacto del organizador', organizerContactHint: 'Esto será visible para los equipos inscritos', organizerContactPlaceholder: '¿Cómo pueden contactarte los equipos? p. ej., npub de Nostr, correo, Telegram, etc.', partnerDiscountDesc: 'Ofrece a los participantes del tour un descuento en una tienda de skate local', partnerStep1: '1. Asóciate con una tienda de skate local de confianza', partnerStep2: '2. Fija un porcentaje de descuento para los participantes del tour', partnerStep3: '3. Tras el tour, da a los participantes una confirmación para mostrar en la tienda', partnerStep4: '4. La tienda respeta el descuento — ¡crea comunidad y atrae clientes!', percentOff: '{{percent}}% DE DESCUENTO', photoHint: 'Añade una foto tuya patinando o de un spot chulo de tu tour.', pickRide: 'Elige tu rollo', place1: '🥇 1.º', place2: '🥈 2.º', place3: '🥉 3.º', platformFee: 'Tú pones el precio • La plataforma se lleva {{percent}}', points: 'Puntos:', pricePerPerson: 'Precio por persona (sats)', pricePlaceholder: 'p. ej., 25000', prizeDistribution: 'Reparto de premios', prizePoolHint: 'Opcional — total de premios disponibles', prizePoolPlaceholder: 'p. ej., 2000000', proTipDesc: 'Antes de publicar un descuento de socio, contacta con el dueño de la tienda por MD para acordar el porcentaje. Así te aseguras de que está de acuerdo y respetará el descuento para los participantes de tu tour.', proTipTitle: '💡 Consejo: ¡coordina con la tienda primero!', return: 'Regreso', returnBeforeDeparture: 'Regreso antes de la salida', returnBeforeDepartureDesc: 'La fecha de regreso debe ser igual o posterior a la de salida.', roadTripDetails: 'Detalles del road trip', schedule: 'Horario', scheduleDesc: 'Organicémoslo como una sesión programada única, o mantenlo flexible y deja que los skaters reserven una hora por MD.', secretUntilStart: 'Secreto hasta el inicio', selectPartnerShop: 'Seleccionar tienda asociada', sessionDateRequired: 'Fecha de sesión obligatoria', sessionDateRequiredDesc: 'Elige la fecha y hora de tu sesión programada, o cambia a horario flexible.', sessionDateTime: 'Fecha y hora de la sesión', sessionDateTimeHint: 'Los skaters verán esta hora y podrán añadirla a su calendario desde la página del tour.', shopPremieresContact: 'Contacta directamente con estas tiendas para organizar noches de estreno. Todos los acuerdos son privados.', shopPremieresHow: '💡 Cómo funcionan los estrenos en tiendas: contacta directamente con las tiendas para organizar las noches de estreno. Todos los acuerdos son privados entre tú y las tiendas.', shopsCanRegister: 'Las tiendas pueden registrarse en /create-shop', show: 'Mostrar', showAllLanguages: 'Mostrar los {{count}} idiomas', somethingWrong: 'Algo ha salido mal.', spotTypes: 'Tipos de spots', spotTypesRequired: 'Tipos de spot obligatorios', spotTypesRequiredDesc: 'Selecciona al menos un tipo de spot que mostrarás.', startDate: 'Fecha de inicio', startDateRequired: 'Fecha de inicio obligatoria', startDateRequiredDesc: 'Indica cuándo empieza la competición (los retos se revelarán en esa fecha).', startingCity: 'Ciudad de salida', startingCityPlaceholder: 'p. ej., Madrid, España', teamSettings: 'Ajustes de equipos', teamsCount: '{{count}} equipos', titlePlaceholder: 'p. ej., Madrid Lavapiés — Tour de spots underground', titleRequired: 'Título del tour obligatorio', titleRequiredDesc: 'Introduce un nombre para tu tour.', totalPercent: 'Total: {{percent}}%', totalPrizePool: 'Bote total de premios (sats)', tourDesc: 'Cuenta a los skaters qué pueden esperar de tu tour', tourDetails: 'Detalles del tour', tourPhoto: 'Foto del tour', tourTitle: 'Título del tour', transportDestructionPlaceholder: '¿Cómo viajarán los equipos entre ubicaciones? ¿Hay transporte incluido o recomendado?', transportInfo: 'Información de transporte', transportPlaceholder: "¿Cómo viajarán los participantes? p. ej., 'Furgoneta incluida', 'Vuela a Barcelona, alquilamos una furgo', 'Tren entre ciudades'", tripDatesDesc: 'Fija las fechas para que los skaters puedan pedir días libres, reservar vuelos y planificar el viaje.', tripDatesTitle: 'Fechas del viaje', updated: '¡Tour actualizado!', updatedDesc: 'Tus cambios se han publicado.', upload: 'Subir', view: 'Ver →', worldDestruction: 'World Destruction Tour', youReceive: 'Recibes: {{amount}} sats por persona', }, editEvent: { accessDenied: 'Acceso denegado', accessDeniedDesc: 'Solo puedes editar eventos que hayas creado.', backToEvent: 'Volver al evento', detailsDesc: 'Actualiza la información de este evento. Todos los campos marcados con * son obligatorios.', eventCover: 'Portada del evento', locationUpdated: 'Ubicación actualizada.', loginToEdit: 'Debes iniciar sesión para editar este evento.', newSpot: 'Nuevo spot: {{location}}.', newTime: 'Nueva hora: {{date}} a las {{time}}.', saveChanges: 'Guardar cambios', saving: 'Guardando...', title: 'Editar evento', updated: '¡Evento actualizado!', updatedDesc: 'Tus cambios se han publicado en la red.', updateDetails: 'Actualiza los detalles de {{title}}', updatedNotified: 'Cambios publicados — {{count}} asistentes notificados.', updateFailed: 'No se pudo actualizar', updateMessage: '{{parts}} — consulta el evento para más detalles.', }, editShop: { accessDeniedDesc: 'Solo puedes editar tiendas que hayas creado.', backToShop: 'Volver a la tienda', detailsDesc: 'Actualiza la información de tu tienda. Todos los campos marcados con * son obligatorios.', loginToEdit: 'Debes iniciar sesión para editar esta tienda.', updated: '¡Tienda actualizada!', updateDetails: 'Actualiza los detalles de {{name}}', }, editTour: { accessDeniedDesc: 'Solo puedes editar tours que hayas creado.', loginToEdit: 'Debes iniciar sesión para editar este tour.', }, eventCard: { report: 'Denunciar', }, eventDetail: { aCrew: 'una crew', addToCalendar: 'Añadir al calendario', backToEvents: 'Volver a eventos', cancelled: 'Este evento se canceló', checkUpdate: '— consulta la actualización', copyFailed: 'Error al copiar', date: 'Fecha', editEvent: 'Editar evento', eventFallback: 'Evento', eventOrganizer: 'Organizador del evento', getDirections: 'Cómo llegar', linkCopied: 'Enlace copiado', linkCopiedDesc: 'Enlace del evento copiado al portapapeles — pégalo donde quieras.', live: 'En directo:', liveMusic: 'música en directo', location: 'Ubicación', newLocation: 'Nueva ubicación', noRsvps: 'No se registraron confirmaciones.', organizer: 'Organizador', rsvpsClosed: 'Las confirmaciones están cerradas — el organizador canceló este evento.', seeMap: 'Ver mapa', shareEvent: 'Compartir evento', shareText: '{{title}} — un evento de skate en SkateSpots', shareTextFallback: 'Mira este evento de skate en SkateSpots', time: 'Hora', timeChanged: 'Hora cambiada', updatesFromHost: 'Actualizaciones del organizador', where: 'Dónde', whoCame: 'Quién vino', whosGoing: 'Quién va', }, events: { calendar: 'Calendario', createTour: 'Crear tour', events: 'Eventos', faqFooter: '¿Tienes dudas? Consulta las FAQ →', hosting: 'Organizando', hostingSubtitle: 'Tus eventos — confirmaciones, actualizaciones y edición rápida', list: 'Lista', noEventsMatchFilters: 'Ningún evento coincide con tus filtros. Prueba a ajustarlos o borrarlos.', noPast: 'No hay eventos pasados', noPastBody: 'No se han encontrado eventos de skate pasados con tus filtros actuales.', noTours: 'No se han encontrado tours', noToursBody: 'Aún no hay tours de skate. ¡Crea el primero y lleva a los skaters a descubrir spots!', noToursMatchFilters: 'Ningún tour coincide con tus filtros. Prueba a ajustarlos o borrarlos.', noUpcoming: 'No hay eventos próximos', noUpcomingBody: 'No se han encontrado eventos de skate próximos. ¡Sé el primero en crear uno!', past: 'Pasados', resultsCount: '{{count}} resultados', searchCity: 'Ciudad…', searchEvent: 'Nombre del evento…', searchTour: 'Nombre del tour…', tours: 'Tours', toursSubtitle: 'Guías locales, road trips y competiciones de destrucción mundial', upcoming: 'Próximos', }, eventTypes: { contest: 'Concurso', demo: 'Demo', jam: 'Jam', meetup: 'Quedada', premiere: 'Estreno', session: 'Sesión', workshop: 'Taller', }, featured: { active: 'Activo', bodyEvent: 'Publicar es gratis. Los eventos destacados reciben una insignia y aparecen arriba del todo en la página de eventos.', bodyTour: 'Publicar es gratis. Los tours destacados reciben una insignia y aparecen arriba del todo en la lista de tours.', contextEvent: 'Tu evento se publica gratis de todas formas — destacarlo solo añade la insignia y el impulso.', contextTour: 'Tu tour se publica gratis de todas formas — destacarlo solo añade la insignia y el impulso.', daysRemaining: 'Destacado activo · {{count}} días restantes.', headingEvent: 'Destacar este evento', headingTour: 'Destacar este tour', optional: 'opcional', platformOwner: 'Propietario de la plataforma — el destacado está siempre activo.', }, filters: { activeCount: '{{count}} activos', all: 'Todos', allLevels: 'Todos los niveles', eventType: 'Tipo de evento', following: 'Siguiendo', newest: 'Más recientes', popular: 'Populares', showResults: 'Ver resultados', showResultsActive: 'Ver resultados · {{count}} activos', skillLevel: 'Nivel', sortBy: 'Ordenar por', topRated: 'Mejor valorados', tourCategory: 'Categoría de tour', trusted: 'De confianza', trustLevel: 'Nivel de confianza', verified: 'Verificados', }, food: { bar: 'Bar', cafe: 'Café', call: 'Llamar', chooseSpot: 'Elige un spot...', directions: 'Cómo llegar', fastFood: 'Comida rápida', foodCourt: 'Zona de restauración', locationLabel: 'Ubicación:', noneFound: 'No se han encontrado sitios de comida', noneFoundDesc: 'No hemos encontrado restaurantes ni cafeterías a menos de 1 km de este spot. Prueba a seleccionar otra ubicación.', placesFound: '{{count}} sitios encontrados a menos de 1 km de {{spot}}', pub: 'Pub', restaurant: 'Restaurante', selectSpot: 'Selecciona un spot de skate', selectSpotDesc: 'Elige un spot de skate en el desplegable de arriba para encontrar restaurantes, cafeterías y otras opciones de comida cercanas.', selectSpotTitle: 'Selecciona un spot de skate', subtitle: 'Encuentra dónde comer cerca de tus spots de skate favoritos', title: 'Comida cerca de spots', unknown: 'Desconocida', website: 'Sitio web', }, rsvp: { areYouGoing: '¿Vas a ir?', cant: 'No puedo', cantMakeIt: 'No puedo ir', going: 'Voy', goingCount: 'van', goingShort: 'Voy', hostNote: 'Tú organizas esto — pero aun así puedes poner tu estado.', interested: 'Me interesa', interestedCount: 'interesados', loginToRsvp: 'Inicia sesión para confirmar.', maybe: 'Quizá', toastError: 'No se pudo confirmar', toastGoing: '¡Vas! 🛹', toastInterested: 'Marcado como interesado.', toastNotGoing: 'Marcado como que no vas.', tryAgain: 'Inténtalo de nuevo.', }, shop: { addNip05Settings: 'Añadir NIP-05 en Ajustes', adminRemovedReason: 'Un administrador de SkateSpots retiró la tienda "{{name}}"', areYouOwner: '¿Eres el dueño de la tienda?', backToMap: 'Volver al mapa', claimDesc: 'Si eres dueño o gestionas esta tienda, puedes reclamarla para verificar la propiedad con NIP-05.', claimNip05Intro: 'Para reclamar esta tienda, añade un identificador NIP-05 que coincida con el dominio del sitio web de la tienda. Por ejemplo, si el sitio web de la tienda es', claimNip05Your: 'tu NIP-05 debería ser', contactShop: 'Contactar con la tienda', deleted: 'Tienda eliminada', deletedDesc: 'Solicitud de eliminación enviada a los relays. La mayoría eliminará este contenido.', deleteDialogDesc: 'Esto eliminará permanentemente "{{name}}" de todos los relays. Esta acción no se puede deshacer.', deleteDialogTitle: '¿Eliminar tienda?', deletedReason: 'Tienda eliminada', deleteFailed: 'Error al eliminar', deleteShop: 'Eliminar tienda', linkCopied: '¡Enlace copiado!', linkCopiedDesc: 'Enlace de la tienda copiado al portapapeles.', nip05Required: '⚠️ Se requiere verificación NIP-05 para reclamar tiendas', opens: 'Abre: {{domain}}', removeAdmin: 'Retirar (admin)', removed: 'Tienda retirada', removedDesc: 'Esta tienda se ha retirado y se ocultará en todo SkateSpots.', removeDialogDesc: 'Como administrador de SkateSpots estás retirando "{{name}}". Se ocultará en toda la app para todos y se enviará una solicitud de eliminación a los relays.', removeDialogTitle: '¿Retirar esta tienda? (admin)', removeShop: 'Retirar tienda', tipMapper: 'Invita al mapeador', tipMapperDesc: 'Esta tienda la añadió un miembro de la comunidad. ¡Envíale un zap para darle las gracias!', updateNip05: 'Actualizar NIP-05 para reclamar', viewPhotoFull: 'Ver foto a pantalla completa', viewPhotoOf: 'Ver foto {{index}} de {{total}}', }, sponsors: { presentedBy: 'Presentado por', }, tourCard: { active: 'Activo', completed: 'Completado', contactForPrice: 'Consulta el precio', durationDays: '{{count}} días', durationHours: '{{count}} horas', durationMonths: '{{count}} meses', durationWeeks: '{{count}} semanas', entry: 'Entrada: {{amount}} sats', happeningNow: 'Sucediendo ahora', inDays: 'En {{count}} días', inHours: 'En {{count}}h', inMonths: 'En {{count}} meses', inWeeks: 'En {{count}} semanas', maxGroup: 'Máx. {{count}}', price: '{{amount}} sats', prizePool: '{{amount}} sats', registrationOpen: 'Inscripción abierta', startingSoon: 'Empieza pronto', teamsMax: '{{count}} equipos máx.', tomorrow: 'Mañana', worldwide: 'Todo el mundo', }, tourDetail: { about: 'Sobre este tour', availability: 'Disponibilidad', competitionWindow: 'Ventana de competición', contactToBook: 'Contacta con el guía para reservar', discountAt: '{{percent}}% DE DESCUENTO en {{shop}}', duration: 'Duración', languages: 'Idiomas', loginToBook: 'Inicia sesión para reservar', loginToBookDesc: 'Inicia sesión para contactar con el guía y reservar este tour', maxGroup: 'Grupo máximo', meetingPoint: 'Punto de encuentro', notFound: 'Tour no encontrado', notFoundDesc: 'Puede que este tour se haya eliminado o no exista.', organizer: 'Organizador', partnerDiscount: 'Descuento en tienda asociada', partnerDiscountDesc: 'Reserva este tour para recibir un descuento en la tienda de skate asociada. Muestra tu confirmación de reserva al personal de la tienda.', people: '{{count}} personas', perPerson: 'por persona', price: 'Precio', runsAbout: 'Dura unos {{duration}}', scheduledSession: 'Sesión programada', shareText: 'Mira este tour de skate local: {{title}}', skillLevel: 'Nivel', spotTypes: 'Tipos de spots', tourGuide: 'Guía del tour', tourSponsors: 'Patrocinadores del tour', tripDates: 'Fechas del viaje', viewProfile: 'Ver perfil', }, updates: { admin: 'Admin', adminNote: 'Estás publicando como administrador de SkateSpots. Se etiquetará claramente como aviso de admin, no del organizador.', kindCancelled: 'Cancelado', kindNewSpot: 'Nuevo spot', kindNewTime: 'Nueva hora', kindUpdate: 'Actualización', loading: 'Cargando actualizaciones…', notifiedCount: '{{count}} personas notificadas.', notifiedEveryone: 'Todos lo verán en el evento.', notifiesRsvps: 'Notifica a {{count}} confirmaciones', noUpdates: 'Aún no hay actualizaciones del organizador. Confirma y te avisaremos si algo cambia.', placeholder: 'Lluvia — trasladado al domingo a las 14:00. Nos vemos en el bordillo de atrás…', post: 'Publicar', postAdminUpdate: 'Publicar un aviso de admin', posted: 'Actualización publicada', postError: 'No se pudo publicar la actualización', postUpdate: 'Publicar una actualización', tryAgain: 'Inténtalo de nuevo.', visibleToEveryone: 'Visible para todos en este evento', }, destination: { bitcoin: 'Bitcoin', closeSearch: 'Cerrar búsqueda', nothingMatches: 'Nada coincide con «{{query}}».', placeholder: 'Busca spots, tiendas, comercios Bitcoin…', shop: 'Tienda', spot: 'Spot', typeChars: 'Escribe al menos 2 caracteres. Busca spots de skate, tiendas de skate y comercios Bitcoin.', typeCharsNear: 'Escribe al menos 2 caracteres. Busca spots de skate, tiendas de skate y comercios Bitcoin cerca de aquí.', }, dateWindow: { any: 'Todos', anytime: 'Cualquier fecha', month: 'Este mes', monthShort: 'Mes', today: 'Hoy', todayShort: 'Hoy', week: 'Esta semana', weekend: 'Fin de semana', weekendShort: 'Finde', weekShort: 'Semana', }, }, socialUi: { agentPanel: { spot: 'Spot', event: 'Evento', labPro: 'Profesional del Lab', gear: 'Material', crew: 'Cuadrilla', description: 'Conoce esta cuadrilla — sus jams, plantilla y convocatoria — además de toda la escena con datos en vivo.', greeting: "¡Buenas! Soy Sasquatch, el guía de {{crew}}. Pregúntame por la cuadrilla — nuestra próxima jam, quién la lleva, qué buscamos — o por el resto de la escena.", suggestion1: '¿Cuál es nuestra próxima jam?', suggestion2: '¿Quién lleva esta cuadrilla?', suggestion3: '¿Qué estamos buscando?', suggestion4: '¿Los mejores spots cerca?', suggestion5: '¿Qué tiempo hace para patinar?', thinking: 'Sasquatch está pensando…', placeholder: 'Pregunta por tu escena local…', disclaimer: 'La IA puede equivocarse — los enlaces llevan a anuncios reales.', }, badge: { upcomingOne: '{{count}} evento próximo', upcomingMany: '{{count}} eventos próximos', comingOne: '{{count}} evento en camino', comingMany: '{{count}} eventos en camino', }, bell: { youAreIn: '¡Estás en {{crew}}! 🛹', membershipConfirmed: 'Membresía confirmada.', couldNotConfirm: 'No se pudo confirmar', addedYouTo: 'te añadió a', confirmToAppear: 'Confirma para aparecer como miembro.', notifications: 'Notificaciones', notificationsNew: 'Notificaciones ({{count}} nuevas)', unreadCount: '{{count}} notificaciones sin leer', markRead: 'Marcar leídas', allClear: 'Todo al día', tabAll: 'Todo', tabTrades: 'Tratos', tabSocial: 'Social', tabNews: 'Noticias', tabCrews: 'Cuadrillas', checkingUpdates: 'Buscando novedades…', checkingTrades: 'Revisando ofertas y tratos…', loadingDrops: 'Cargando las últimas entregas…', emptyAll: 'Ofertas, tratos, zaps, respuestas, entregas del boletín y actividad de cuadrillas aparecerán aquí.', emptyTrades: 'Las ofertas, contraofertas y confirmaciones de tratos llegan aquí — tanto si vendes, compras o intercambias.', emptySocial: 'Zaps, reacciones, reposts, menciones, respuestas, confirmaciones de asistencia y actualizaciones de anfitriones llegan aquí.', emptyNews: 'Las entregas del boletín de SkateSpots llegarán aquí. Suscríbete en la página del boletín.', emptyCrews: 'Las invitaciones a cuadrillas, solicitudes de colectivos y peticiones de membresía aparecerán aquí.', subscribeBanner: 'Suscríbete para recibir nuevas entregas en tu campana', read: 'Leer', allCaughtUp: 'Estás al día', }, chat: { hidden: 'Oculto', hideMessageAria: 'Ocultar este mensaje', hideMessageTitle: 'Ocultar mensaje (admin)', messageHidden: 'Mensaje oculto', messageHiddenDesc: 'Oculto del chat de la cuadrilla para todos.', messageHideFailed: 'No se pudo ocultar el mensaje', encryptionUnavailable: 'Cifrado no disponible', encryptionUnavailableDesc: 'Tu firmante no admite cifrado NIP-44. Actualiza tu extensión.', messageFailed: 'No se pudo enviar el mensaje', couldNotSend: 'No se pudo enviar el mensaje.', noOneToMessage: 'Aún no hay a quién escribir', noOneToMessageDesc: 'Esta cuadrilla no tiene otros miembros con quienes chatear.', subject: 'chat de la cuadrilla {{crew}}', title: 'Chat de la cuadrilla', cordnBadgeTitle: 'Enrutado por el coordinador Cordn de esta cuadrilla vía ContextVM. Cifrado de extremo a extremo.', private: 'Privado', privateBadgeTitle: 'Cifrado de extremo a extremo — solo los miembros de la cuadrilla pueden leer estos mensajes.', encryptedCordn: 'Cifrado y enrutado por el coordinador de la cuadrilla (Cordn) — ningún mensaje pasa por relés públicos.', encryptedNip17: 'Chat de grupo cifrado para el fundador y todos los miembros listados.', moderatorNote: ' Como moderador, puedes ocultar mensajes de la cuadrilla.', loginToSee: 'Inicia sesión para ver si puedes unirte al chat de la cuadrilla.', membersOnly: 'Este chat es privado para los miembros de la cuadrilla. Pídele al fundador que te añada para unirte a la conversación.', noMessages: 'Aún no hay mensajes. Arranca el chat de la cuadrilla — planea una sesión, comparte un spot, dale bombo a un clip.', newMessages: 'Mensajes nuevos', new: 'Nuevo', placeholder: 'Escribe a tu cuadrilla…', sendAria: 'Enviar mensaje', }, collectiveJoinRequest: { addedTitle: 'Añadido {{name}} a {{collective}} 🛹', addedDesc: 'Confirmará desde su lado para aparecer como miembro verificado.', couldNotAdd: 'No se pudo añadir al miembro', couldNotDismiss: 'No se pudo descartar', addedDone: 'Añadido', addedTo: 'a', dismissedDone: 'Solicitud de {{name}} descartada', wantsToJoin: 'quiere unirse a', alreadyOnRoster: 'Ya está en la plantilla', openCollective: 'Abrir colectivo', dismiss: 'Descartar', addToCollective: 'Añadir al colectivo', }, collectiveMembers: { confirmed: 'Confirmado', pending: 'Pendiente', pendingTooltip: 'Listado por el colectivo — esperando la confirmación de este miembro.', crewOnly: 'Solo cuadrilla', crewOnlyTooltip: 'Este miembro eligió ser visible solo para sus compañeros de cuadrilla. Puedes verlo porque estás en la cuadrilla.', hiddenMember: 'Miembro oculto', title: 'Miembros', verifiedOf: '{{confirmed}} de {{total}} verificados — cada miembro confirmado firmó con su propia clave de Nostr.', verifiedPerMember: 'La membresía se verifica por miembro. Cada miembro confirma con su propia clave de Nostr.', adminsOne: '{{count}} admin ayuda a llevar la cuadrilla.', adminsMany: '{{count}} admins ayudan a llevar la cuadrilla.', }, confirmMembership: { public: 'Público', crewOnly: 'Solo cuadrilla', confirmedTitle: '¡Membresía confirmada!', confirmedCrew: 'Estás verificado en {{name}} — visible solo para tus compañeros de cuadrilla.', confirmedPublic: 'Ahora apareces como miembro verificado de {{name}}.', failed: 'No se pudo confirmar', addedTo: 'Te han añadido a {{name}}', addedDesc: 'Confirma tu membresía para que aparezca como verificada en tu perfil y en el suyo.', yourVisibility: 'Tu visibilidad', confirming: 'Confirmando…', confirmButton: 'Confirmar membresía', }, contacts: { message: 'Mensaje', removePrivate: 'Quitar de contactos privados', savePrivate: 'Guardar en contactos privados', seoTitle: 'Contactos - SkateSpots', seoDescription: 'Tu escena — compañeros de cuadrilla, personas que sigues y conversaciones recientes, con contactos privados cifrados.', encryptionUnavailableDesc: 'Tu firmante no admite cifrado NIP-44.', removed: 'Quitado de contactos privados', saved: 'Guardado en contactos privados', savedDesc: 'Solo tú puedes ver esta lista.', updateFailed: 'No se pudieron actualizar los contactos', loginTitle: 'Tu escena, en un solo sitio', loginDesc: 'Inicia sesión para ver a tus compañeros de cuadrilla, a quien sigues y tus conversaciones recientes — y mantén una lista de contactos privada y cifrada.', title: 'Contactos', subtitle: 'Tu escena — compañeros de cuadrilla, seguidos y conversaciones', filterPlaceholder: 'Filtrar por npub…', tabCrew: 'Cuadrilla', tabFollows: 'Seguidos', tabDms: 'MD', tabSaved: 'Guardados', emptyCrewmates: 'Aún no hay compañeros de cuadrilla. Únete a una cuadrilla o crea una para construir tu red.', emptyFollowing: 'Todavía no sigues a nadie.', emptyDms: 'Aún no hay conversaciones. Escribe a un patinador para empezar una.', savedHint: 'Esta lista está cifrada con tu clave — solo tú puedes leerla. Toca la estrella de cualquiera para añadirlo.', emptySaved: 'Aún no hay contactos guardados. Marca con estrella desde cualquier pestaña para crear tu agenda privada.', }, conversation: { unknown: 'Desconocido', seoTitle: 'Chat con {{name}} - SkateSpots', seoDescription: 'Conversación privada cifrada', sendFailed: 'No se pudo enviar el mensaje', sendFailedDesc: 'Inténtalo de nuevo en un momento.', tradeConfirmed: 'Trato confirmado', tradeConfirmedDesc: 'Reputación actualizada para ambos.', tradeConfirmFailed: 'No se pudo confirmar el trato', somethingWrong: 'Algo salió mal.', soldNote: 'Vendido a {{name}}.', saleConfirmed: 'Venta confirmada', saleConfirmedDesc: '{{name}} ya puede confirmar su parte.', saleConfirmFailed: 'No se pudo confirmar la venta', escrowRedeemed: 'Depósito en garantía canjeado', escrowRedeemedDesc: 'Los fondos ya están en tu monedero Cashu.', escrowRedeemFailed: 'No se pudo canjear el depósito', loginTitle: 'Inicia sesión para ver los mensajes', secureLoginTitle: 'Inicio de sesión seguro obligatorio', secureLoginDesc: 'Los mensajes necesitan una app firmante segura.', encrypted: 'Cifrado', refresh: 'Actualizar', didCompleteTrade: '¿Completaste este trato?', recordedSale: '{{name}} registró la venta. Confirma para actualizar la reputación de ambos.', confirm: 'Confirmar', confirmSale: '¿Confirmar esta venta?', askedToRecord: '{{name}} te pidió registrarla. Al confirmar se construye reputación para ambos.', confirmSaleButton: 'Confirmar venta', redeemEscrow: 'Canjear depósito', escrowAppOnly: 'El depósito Cashu es solo en la app — abre SkateSpots en el móvil para canjearlo.', startThread: 'Envía un mensaje para empezar la conversación', placeholder: 'Escribe un mensaje...', e2eeNote: 'Los mensajes están cifrados de extremo a extremo con NIP-17', }, coordinator: { secondsAgo: 'hace {{count}} s', minutesAgo: 'hace {{count}} min', hoursAgo: 'hace {{count}} h', daysAgo: 'hace {{count}} d', statusIdle: 'Sin comprobar', statusChecking: 'Comprobando…', statusOnline: 'Conectado', statusStale: 'Silencioso', statusOffline: 'No visto', statusError: 'Inaccesible', notACoordinator: 'Eso no es un coordinador', notACoordinatorDesc: 'Pega un nprofile, un npub o un enlace de cordn.net.', added: 'Coordinador añadido', relayOne: '{{count}} relé', relayMany: '{{count}} relés', lastSeen: 'visto por última vez {{time}}', onlineDesc: 'Anunciándose. Los grupos que lo usan pueden entregar mensajes ahora.', staleDesc: 'Encontrado, pero no se ha anunciado hace poco — puede estar dormido.', offlineDesc: 'No se ha visto ningún anuncio. Puede ser privado (no pasa nada) o simplemente estar desconectado.', errorDesc: 'No se pudo contactar con los relés.', idleDesc: 'Comprobando…', checkingDesc: 'Buscando su anuncio…', eventFoundOne: '{{count}} evento encontrado.', eventFoundMany: '{{count}} eventos encontrados.', check: 'Comprobar', addLinkCopied: 'Enlace de añadir copiado', copyFailed: 'No se pudo copiar', copyManually: 'Cópialo manualmente.', addLink: 'Enlace de añadir', removeConfirm: '¿Eliminar este coordinador de este dispositivo?', scanToJoin: 'Escanea en Cordn para unirte a este coordinador.', noCoordinator: 'Aún no hay coordinador', noCoordinatorDescA: 'Un coordinador entrega los mensajes de grupo', encryptedWord: 'cifrados', noCoordinatorDescB: 'de tu cuadrilla en orden. Ve quién, cuándo y de qué grupo — nunca el contenido. Elige uno, o monta el tuyo.', change: 'Cambiar coordinador', addTitle: 'Añadir un coordinador', add: 'Añadir', scanQR: 'Escanear un QR de coordinador', inputPlaceholder: 'nprofile… o un enlace de cordn.net', runOwn: 'Monta el tuyo', runOwnDesc: 'Puede vivir en un móvil viejo, una Raspberry Pi o cualquier cacharro que dejes encendido. Tu grupo sigue funcionando mientras esté activo — y puedes mover el grupo cuando quieras.', onPhone: 'En un móvil', onPhoneDesc: 'Usa la app Cordn Coordinator y escanea su QR aquí para añadirlo.', openCordn: 'Abrir Cordn', scanItsQR: 'Escanear su QR', onServer: 'En un servidor', commandCopied: 'Comando copiado', copyCommand: 'Copiar comando', androidSleep: 'Android puede dormir un coordinador en móvil. Cuenta con mover el grupo de vez en cuando.', privacyNote: '🔒 Un coordinador solo ve texto cifrado y metadatos — nunca el contenido de los mensajes. Monta el tuyo para que hasta los metadatos sean tuyos.', customTitle: 'Coordinador de chat propio', customBadge: '· experimental · tu propio relé', customDescA: 'No lo necesitas.', customDescB: 'Tu cuadrilla ya tiene chat de grupo privado y cifrado de extremo a extremo integrado — sin configurar nada. Este campo es solo para cuadrillas que', customRunOwn: 'montan el suyo', cordnCoordinator: 'coordinador Cordn', customDescC: '— incluso en un móvil viejo. Pega su nprofile, un enlace de cordn.net o una URL de endpoint. Un endpoint wss:// se usa como relé de chat propio de la cuadrilla (apúntalo a uno privado para mantener hasta los metadatos fuera de los relés públicos); un coordinador https:// se direcciona por su pubkey a través del relé ContextVM compartido. Déjalo en blanco para usar el chat integrado.', invalid: 'Eso no parece un coordinador. Pega un nprofile, un enlace de cordn.net o una URL https/wss.', useMine: 'Usar mi coordinador', }, createCrew: { seoTitle: 'Crear una cuadrilla - SkateSpots', seoDescription: 'Crea tu cuadrilla — territorio, miembros y spots.', loginRequired: 'Inicio de sesión obligatorio', loginRequiredDesc: 'Tienes que iniciar sesión para crear una cuadrilla.', backToCrews: 'Volver a Cuadrillas', title: 'Crear una cuadrilla', intro: 'Tu familia patinadora — la gente con la que patinas. Con un nombre ya empiezas; todo lo demás es opcional.', }, crew: { seoTitleNamed: '{{name}} - Cuadrilla de SkateSpots', seoTitle: 'Cuadrilla - SkateSpots', seoDescription: 'Una cuadrilla de skate en SkateSpots.', postHidden: 'Publicación oculta', postHiddenDesc: 'Eliminada del feed de la cuadrilla para todos.', postHideFailed: 'No se pudo ocultar la publicación', backToCrews: 'Volver a Cuadrillas', disband: 'Disolver', youAreCaptain: 'Eres capitán', member: 'Miembro', askSasquatch: 'Pregúntale a Sasquatch', agent: 'Agente de la cuadrilla', agentDesc: 'El guía con IA de tu cuadrilla — spots, eventos, entrenadores y material cercanos, con datos en vivo.', eventsTab: 'Eventos', chatTab: 'Chat', newMessages: 'Mensajes nuevos', hostJam: 'Organiza una jam', noEvents: 'Aún no hay eventos de la cuadrilla. Organiza una jam, un concurso o una quedada como cuadrilla — la conecta al calendario de eventos y permite que la gente le mande zaps.', support: 'Apoyar', zapCrew: 'Zapear a la cuadrilla', bandTitle: 'Banda de la cuadrilla', bandTagline: 'Música en directo · skate y sonido', listenTitle: 'Escuchar: {{domain}}', listen: 'Escucha los temas', setUpGig: 'Organiza un concierto', bookGigMessage: 'Hola {{crew}} — me interesa contratar a {{band}} para un concierto. ¿Te va bien hablar de fechas?', messageAboutGig: 'Mensaje sobre un concierto', gigHintA: 'añade al calendario un evento musical organizado por esta cuadrilla.', messageShort: 'Mensaje', gigHintB: 'abre un MD cifrado con la cuadrilla para cuadrar fechas y detalles.', homeSpots: 'Spots habituales', viewSpot: 'Ver spot', seeOnMap: 'Ver en el mapa →', founderLinks: 'Fundador y enlaces', startedBy: 'Creada por {{name}}', opens: 'Abre: {{domain}}', }, crews: { seoTitle: 'Cuadrillas - SkateSpots', seoDescription: 'Encuentra a tu gente. Descubre cuadrillas, colectivos y comunidades de skate cerca de ti.', videoPartTooltip: 'Esta cuadrilla tiene una part de vídeo', part: 'Part', bandTooltip: 'Banda de la cuadrilla: {{name}}', band: 'Banda', focusAll: 'Todas', focusAllShort: 'Todas', focusDiy: 'DIY', focusPhoto: 'Foto', focusCoaching: 'Entreno', focusArt: 'Arte', focusMusic: 'Música', focusPhysio: 'Fisio', focusMixed: 'Mixta', title: 'Cuadrillas', heroLine: 'Tu familia patinadora anclada al mapa — la gente con la que patinas', heroWith: 'junto', heroRest: ', no a quien contratas (eso es The Lab).', crewCountOne: '{{count}} cuadrilla', crewCountMany: '{{count}} cuadrillas', cityCountOne: '{{count}} ciudad', cityCountMany: '{{count}} ciudades', createCrew: 'Crear cuadrilla', create: 'Crear', searchPlaceholder: 'Busca cuadrillas por nombre o ciudad…', filterTitle: 'Filtrar cuadrillas', filterDesc: 'Lo que le mola a la cuadrilla.', nearMe: 'Cerca de mí', emptySearchTitle: 'Ninguna cuadrilla coincide con tu búsqueda', emptySearchHint: 'No se encontró nada para «{{query}}». Prueba con otro nombre o ciudad.', clearSearch: 'Borrar búsqueda', emptyFocusTitle: 'Aún no hay cuadrillas de {{label}}', emptyFocusHint: 'Aquí nadie ha plantado todavía la bandera «{{label}}». Muestra todas las cuadrillas o empieza tú esta.', showAll: 'Ver todas las cuadrillas', claimTitle: 'Reclama tu escena local', claimHint: 'Aún no hay cuadrillas plantadas aquí. Sé el primero — crea tu cuadrilla, enlaza tus spots y pon tu escena en el mapa para que la encuentre todo el mundo.', }, crewCoordinator: { privateChat: 'Chat privado de la cuadrilla', on: 'Activado', defaultA: 'La', chatWord: 'Chat', defaultB: 'pestaña está', e2ee: 'cifrada de extremo a extremo', defaultC: 'para el fundador y todos los miembros listados — sin configurar nada. Los mensajes se sellan con la clave de cada miembro (NIP-17), así que solo tu cuadrilla puede leerlos.', advancedA: 'Avanzado: monta tu propio', cordnCoordinator: 'coordinador Cordn', routeThrough: 'Enrutar el chat por él', coordinator: 'Coordinador', deliveredOver: 'Entregado por', sharedRelay: '— el relé ContextVM compartido.', ownRelay: '— el relé propio de tu cuadrilla.', chatLive: 'El chat privado está activo', routesA: 'La', routesB: 'pestaña va por este coordinador: los mensajes están cifrados de extremo a extremo (NIP-44, sellados para cada miembro), así que solo maneja tráfico sellado.', publicWarning: 'Aviso: se direcciona por el relé ContextVM compartido, así que el texto cifrado y sus metadatos (qué cuadrilla y cuándo) son visibles públicamente — pero no legibles. Apunta la cuadrilla a un relé wss:// privado para mantenerlo todo privado.', ownRelaySafe: 'Nada específico de la cuadrilla sale del relé propio de tu cuadrilla.', manage: 'Gestionar coordinador', open: 'Abrir {{domain}}', runBy: 'Coordinador gestionado por', }, dms: { securityReminder: 'Recordatorio de seguridad', phishingStrong: 'SkateSpots nunca te enviará un MD', phishingRest: 'pidiéndote que verifiques tu cuenta, compartas tus claves o envíes pagos. Si alguien dice ser soporte de SkateSpots por MD — es una estafa.', dismissReminder: 'Descartar recordatorio de seguridad', peopleCount: '{{count}} personas', youPrefix: 'Tú: ', unreadMessages: 'Mensajes sin leer', seoTitle: 'Mensajes - SkateSpots', seoDescription: 'Mensajes privados cifrados con la comunidad skater', loginTitle: 'Inicia sesión para acceder a los mensajes', loginDesc: 'Mensajería privada y cifrada con patinadores de la comunidad', secureLoginTitle: 'Inicio de sesión seguro obligatorio', secureLoginDesc: 'Los mensajes privados necesitan una app firmante segura para cifrar tus conversaciones.', onAndroid: 'En Android:', useAmber: 'Usa la app Amber', getAmber: 'Consigue Amber →', onIOS: 'En iOS:', iosHint: 'Prueba a iniciar sesión con una conexión bunker (nsec.app) desde Ajustes', browserHint: 'Prueba a iniciar sesión con una extensión de navegador como Alby o nos2x que admita cifrado.', title: 'Mensajes', subtitleFull: 'Cifrado de extremo a extremo con NIP-17', subtitleShort: 'Cifrado', newMessage: 'Nuevo mensaje', groups: 'Grupos', loadFailed: 'No se pudieron cargar los mensajes', emptyTitle: 'Aún no hay mensajes', emptyDesc: 'Empieza una conversación con alguien de la comunidad', startConversation: 'Empezar una conversación', undecryptableOne: '{{count}} mensaje cifrado no se pudo abrir con tu firmante.', undecryptableMany: '{{count}} mensajes cifrados no se pudieron abrir con tu firmante.', }, editCrew: { seoTitleNamed: 'Editar {{name}} - SkateSpots', seoTitle: 'Editar cuadrilla - SkateSpots', seoDescription: 'Edita tu cuadrilla de skate.', loginRequired: 'Inicio de sesión obligatorio', notYours: 'No es tu cuadrilla', notYoursDesc: 'Solo el fundador de la cuadrilla puede editarla.', backToCrew: 'Volver a la cuadrilla', title: 'Editar cuadrilla', }, form: { add: 'Añadir', added: 'Añadido', addNameInBasicsA: 'Añade un nombre de cuadrilla de nuevo en', addNameInBasicsB: 'para terminar.', adminsDescA: 'Haz', adminsWord: 'admins', adminsDescB: 'a los miembros de confianza — pueden invitar a miembros y moderar el feed y el chat de la cuadrilla con sus propias claves. Tú (el fundador) siempre eres el dueño de la identidad de la cuadrilla.', agentDescA: 'Añade', agentDescB: ', un guía con IA que de verdad conoce tu cuadrilla. Los miembros pueden preguntar por', agentDescC: '— además de spots, eventos, entrenadores y material cercanos con datos en vivo de SkateSpots. Funciona en el navegador; sin claves ni configuración. Es pronto (IA gratuita, así que a veces va lento).', agentDescStrong: 'vuestra próxima jam, quién lleva la cuadrilla, qué buscáis y vuestro rollo', agentEnabledNote: 'Sasquatch aparecerá en la página de tu cuadrilla cuando guardes.', bandDesc: '¿Tienes banda? La escena del skate y la música local van de la mano — pon el nombre de tu banda y un enlace a los temas.', bandFooterA: 'Para un perfil de banda completo (géneros, instrumentos, conciertos), crea un', musicianWord: 'Músico', bandFooterB: 'en The Lab y luego enlázalo en la sección', linkedLabWord: 'Perfiles del Lab vinculados', bandFooterC: 'de arriba.', bandMusicWord: 'Banda y música', bandName: 'Nombre de la banda', bandNamePlaceholder: 'p. ej. The Bail Outs', bandNudgeA: 'Tienes banda — toca para poner tu', crewTypeWord: 'Tipo de cuadrilla', bandNudgeB: 'en', bandNudgeC: 'y aparecer también en la escena de Música de The Lab.', beta: 'Beta', bioLabel: 'Sobre la cuadrilla / Manifiesto', bioPlaceholder: 'Quiénes sois, qué patináis, vuestra historia...', continue: 'Continuar', crewCreated: '¡Cuadrilla creada!', crewUpdated: '¡Cuadrilla actualizada!', crewName: 'Nombre de la cuadrilla', crewOnlyWord: 'Solo cuadrilla', crewType: 'Tipo de cuadrilla', crewTypeDescA: '¿Tu cuadrilla se centra en un oficio? Elige uno para aparecer también en esa escena en', theLab: 'The Lab', crewTypeDescB: '. Las cuadrillas normales se quedan en', mixedWord: 'Mixta', crewTypeDescC: '.', customVibeHint: 'Añade tu propio rollo o enfoque con un #', customVibePlaceholder: 'p. ej. downhill, night-sessions, no-comply', editDesc: 'La identidad de tu cuadrilla, su territorio y sus miembros', enableAgent: 'Activar el agente de la cuadrilla', enableTreasury: 'Activar la tesorería de la cuadrilla', failed: 'Falló', founded: 'Fundada (año)', geolocationUnsupported: 'Geolocalización no compatible', gettingLocation: 'Obteniendo...', goalHint: 'Asegúrate de que tu perfil de Nostr tiene una dirección Lightning (lud16) para que lleguen las contribuciones.', goalPlaceholder: 'p. ej. Hormigonar el spot DIY', goalTarget: 'Objetivo (sats)', goalWhat: '¿Cuál es el objetivo?', homeSpots: 'Spots habituales', homeSpotsDesc: 'Enlaza los spots que frecuenta tu cuadrilla — se conectan a tu cuadrilla en el mapa', homeTurf: 'Territorio (ciudad / zona)', homeTurfPlaceholder: 'Bristol, Reino Unido', instagramDetected: 'Clip de Instagram detectado', invalidMember: 'Introduce un npub, nprofile o pubkey hex válido.', latitude: 'Latitud', leaveBlankLocation: 'Déjalo en blanco para mantener la ubicación actual del territorio.', links: 'Enlaces', locationError: 'Error de ubicación', locationFound: 'Ubicación encontrada', logoAlt: 'Cuadrilla', logoHint: 'Un logo hace que tu cuadrilla se reconozca al instante en el mapa y en los feeds. El cuadrado funciona mejor.', logoLabel: 'Logo / foto de la cuadrilla', logoUploaded: 'Logo subido', longitude: 'Longitud', looksGood: 'Buena pinta', makeAdmin: 'Hacer admin', mapPin: 'Punto en el mapa', mapPinHint: 'Pon tu cuadrilla en el mapa para que los locales os encuentren. Toca el botón — sin escribir nada.', memberAlreadyAdded: 'Ese miembro ya está añadido.', members: 'Miembros', membersDesc: 'Añade las cuentas de Nostr de tu cuadrilla. Cada miembro confirma desde su propia clave — hasta entonces aparecen como «pendientes».', musicLink: 'Enlace a la música', nameCrew: 'Ponle nombre a tu cuadrilla', nameCrewDesc: 'Una cuadrilla necesita un nombre antes de continuar.', nameCrewFirst: 'Ponle nombre a tu cuadrilla primero', nameHint: 'Lo único que de verdad necesitas. Puedes cambiarlo luego.', namePlaceholder: 'p. ej. Backyard Bandits', nameRequired: 'Nombre obligatorio', nameRequiredDesc: 'Ponle un nombre a tu cuadrilla.', nip05DescA: 'Un identificador verificable que controlas en cualquier dominio, p. ej.', nip05DescB: '. Se verifica contra la clave del fundador de esta cuadrilla — aparece un check verde cuando el dominio lo confirma.', nip05Label: 'NIP-05 de la cuadrilla', notAKeyA: 'Eso todavía no parece una clave de Nostr — pega un', notAKeyB: ',', notAKeyC: ', o una pubkey hex.', onlyYouTubeInstagram: 'Solo se admiten enlaces de YouTube e Instagram.', openCall: 'Convocatoria abierta', openCallDescA: '¿Buscas un filmer, editor o sangre nueva? Lanza una convocatoria — aparece en tu página de cuadrilla para que gente afín de', openCallDescB: 'pueda contactar.', optional: '· opcional', optionalParen: '(opcional)', otherSocials: 'Otras redes', otherSocialsDesc: 'Añade todas las que quieras — YouTube, TikTok, Discord, Telegram, etc.', ownVisibility: 'su propia visibilidad', progress: 'Progreso', publicWord: 'Público', publishedToScene: 'Publicada en la escena.', publishFailed: 'No se pudo publicar', publishing: 'Publicando...', ready: 'Listo', readyToRollA: 'Todo listo — pulsa', readyToRollB: 'cuando quieras.', removeAdminRole: 'Quitar rol de admin', removeMember: 'Quitar miembro', removeSocial: 'Quitar enlace social', removeVibe: 'Quitar {{vibe}}', roles: 'Roles:', sasquatch: 'Sasquatch', saveCrew: 'Guardar cuadrilla', skipToEnd: 'Saltar al final', socialPlaceholder: '@usuario o enlace', sponsorDesc: 'Si una tienda local respalda tu cuadrilla, elígela aquí para mostrar un banner «Patrocinado por» que enlaza a su tienda.', stepAria: 'Paso {{step}}: {{title}}', stepBasics: 'Lo básico', stepBasicsShort: 'Básico', stepBasicsHint: 'Solo lo esencial — puedes crear una cuadrilla con este paso únicamente.', stepVibe: 'Identidad y rollo', stepVibeShort: 'Rollo', stepVibeHint: 'Cómo aparece tu cuadrilla por la app. Todo opcional.', stepSquad: 'Peña y spots', stepSquadShort: 'Peña', stepSquadHint: 'Añade a tu gente y tu territorio. Siempre puedes hacerlo más tarde.', stepExtras: 'Extras', stepExtrasShort: 'Extras', stepExtrasHint: 'Mejoras para más adelante — sáltate lo que no tengas claro.', stepOf: 'Paso {{step}} de {{total}}', treasuryDescA: 'Recauda sats para un objetivo común — arreglar el spot DIY local, un viaje de la cuadrilla, un bote para un concurso. Es un objetivo Lightning transparente; los zaps van', treasuryDescStrong: 'directos a tu monedero', treasuryDescB: '(a través de la dirección Lightning de tu perfil). SkateSpots nunca custodia los fondos.', upload: 'Subir', uploadFailed: 'Error al subir', useCurrentLocation: 'Usar ubicación actual', vibeLabel: 'Rollo / enfoque', videoDescA: 'La part completa de tu cuadrilla, un montaje o el último clip. Pega un enlace de', videoDescB: '— se reproducirá en tu página de cuadrilla.', visibilityDescA: 'Cada miembro controla', visibilityDescB: '— cuando confirma desde su clave puede elegir', visibilityDescC: '— oculto para los de fuera). Tú no puedes decidirlo por ellos; es su elección.', website: 'Sitio web', yourRoles: 'Tus roles (líder del equipo)', youtubeDetected: 'Vídeo de YouTube detectado', }, groupConversation: { seoTitle: 'Chat de grupo - SkateSpots', invalidLink: 'Este enlace de chat de grupo no es válido.', loginTitle: 'Inicia sesión para ver este grupo', secureSignerTitle: 'Firmante seguro obligatorio', secureSignerDesc: 'Los mensajes de grupo necesitan un firmante compatible con NIP-44.', encryptedGroup: 'Grupo cifrado de extremo a extremo', empty: 'Aún no hay mensajes — saluda al grupo.', placeholder: 'Escribe al grupo...', }, hero: { established: 'Fundada en {{year}}', teamLeader: 'Líder del equipo: {{name}}', ledBy: 'Liderada por', }, inviteCard: { acceptedTitle: 'Invitación aceptada 🛹', acceptedDesc: 'El fundador de la cuadrilla confirma a los miembros en {{crew}}. Aparecerás en la plantilla cuando te apruebe.', couldNotAccept: 'No se pudo aceptar', couldNotDecline: 'No se pudo rechazar', acceptedDone: 'Aceptada —', confirmsMembers: 'confirma a los miembros', declinedDone: 'Invitación a {{crew}} rechazada', invitedYou: 'te ha invitado a unirte a', admin: 'Admin', accept: 'Aceptar', decline: 'Rechazar', }, inviteDialog: { messageIntro: '¡Eh! Únete a la cuadrilla {{crew}} en SkateSpots 🛹', messageBody: 'Inicia sesión con tu clave de Nostr y luego solicita unirte desde la página de la cuadrilla.', copyFailed: 'No se pudo copiar', shareTitle: 'Unirse a {{crew}}', sentTitle: '¡Invitación enviada! 🛹', sentDesc: 'Recibirá una notificación para aceptar o rechazar.', couldNotSend: 'No se pudo enviar la invitación', trigger: 'Invitar', title: 'Invitar a {{crew}}', description: 'Envía una invitación a la clave de Nostr de alguien, o comparte un enlace.', sendTab: 'Enviar invitación', shareTab: 'Compartir enlace', npubLabel: 'npub del patinador', invalidNpub: 'Eso no parece un npub válido.', noteLabel: 'Nota', optional: '(opcional)', notePlaceholder: 'Ven a patinar con nosotros…', inviteAsAdmin: 'Invitar como admin', inviteAsAdminDesc: 'Puede gestionar la cuadrilla e invitar a otros.', sendButton: 'Enviar invitación', sendFooter: 'Recibirá una notificación para aceptar o rechazar. La membresía solo cuenta cuando acepta.', inviteLink: 'Enlace de invitación', messageLabel: 'Mensaje', copyMessage: 'Copiar mensaje', founderHint: 'Como fundador también puedes añadir la clave de un miembro directamente; luego él confirma.', addMemberSettings: 'Añadir miembro en los ajustes de la cuadrilla', }, joinRequest: { moreCount: '+{{count}} más', addedTitle: 'Añadido {{name}} a {{crew}} 🛹', addedDesc: 'Confirmará desde su lado para aparecer como miembro.', vouchedTitle: 'Has avalado a {{name}} 🤝', vouchedDesc: 'El fundador de {{crew}} verá tu aval y podrá añadirlo.', couldNotEndorse: 'No se pudo avalar', endorsedDoneA: 'Has avalado a', endorsedDoneB: '— el fundador confirmará', vouchedBy: 'Avalado por', approveAndAdd: 'Aprobar y añadir', addToCrew: 'Añadir a la cuadrilla', vouchedWaiting: 'Avalado — esperando al fundador', vouchForThem: 'Avalar a esta persona', leadershipOnly: 'Solo para el liderazgo de la cuadrilla.', adminHelp: 'Los admins no pueden añadir miembros directamente — avalar le dice al fundador que respaldas a este patinador.', }, leadership: { teamLeader: 'Líder del equipo', captain: 'Capitán', verifiedMember: 'Miembro verificado', messageName: 'Escribir a {{name}}', title: 'Liderazgo', captainsOne: '{{count}} capitán', captainsMany: '{{count}} capitanes', footer: 'El líder del equipo lleva la plantilla; los capitanes ayudan a invitar, organizar jams y mantener la cuadrilla en orden.', }, linkField: { title: 'Cuadrilla vinculada', description: '¿También llevas una cuadrilla? Enlázala para que la gente salte entre tu estudio y tu cuadrilla. Opcional. Enlaza esta cuadrilla de vuelta al perfil desde el editor y aparecerá una insignia verde', descriptionRest: 'en ambos.', none: 'Aún no tienes cuadrillas. Crea una en la página de Cuadrillas para enlazarla aquí.', linkedCrew: 'Cuadrilla vinculada ({{id}})', }, lookingFor: { title: 'Convocatoria abierta', subtitle: 'Esta cuadrilla busca:', }, memberVisibility: { updatedTitle: 'Visibilidad actualizada', updatedCrew: 'Ahora solo apareces ante tus compañeros de cuadrilla.', updatedPublic: 'Ahora apareces públicamente en esta cuadrilla.', couldNotUpdate: 'No se pudo actualizar', title: 'Tu visibilidad en esta cuadrilla', save: 'Guardar visibilidad', }, newMessage: { inCrew: 'En tu cuadrilla: {{crews}}', crewmate: 'Compañero de cuadrilla', following: 'Siguiendo', invalidKey: 'Eso no parece un npub o una clave pública válidos.', description: 'Busca a tu gente por nombre o pega un npub para escribir a cualquiera. Selecciona dos o más para empezar un grupo.', searchPlaceholder: 'Busca un nombre o pega npub1...', messageThisKey: 'Escribir a esta clave', loadingPeople: 'Cargando tu gente...', noPeople: 'Aún no hay compañeros de cuadrilla ni seguidos.', noPeopleHint: 'Pega el npub de alguien arriba para empezar una conversación.', yourCrews: 'Tus cuadrillas', selected: '{{count}} seleccionados', startGroup: 'Iniciar grupo ({{count}})', message: 'Mensaje', }, nip05: { mismatch: 'Este dominio apunta el identificador a una clave de Nostr distinta a la del fundador de la cuadrilla. Sin verificar.', verified: 'Verificado — el dominio confirma que este identificador pertenece a la clave del fundador de la cuadrilla.', }, requestCollective: { sentTitle: 'Solicitud enviada 🤝', sentDesc: '{{name}} la verá en sus notificaciones y podrá añadirte.', couldNotSend: 'No se pudo enviar la solicitud', title: 'Únete a este colectivo', waiting: 'Solicitud enviada — esperando a {{name}}.', askA: 'Pídele a la cuadrilla detrás de', askB: 'que te añada a la plantilla. Recibirá una notificación y podrá añadirte con un toque.', placeholder: 'Opcional: di por qué encajarías bien…', sendButton: 'Enviar solicitud', }, requestToJoin: { sentTitle: '¡Solicitud enviada! 🛹', sentDesc: 'El liderazgo de {{crew}} la verá en sus notificaciones.', couldNotSend: 'No se pudo enviar la solicitud', trigger: 'Solicitar unirse', title: 'Unirse a {{crew}}', description: 'Notifica al fundador y a los admins de la cuadrilla para que puedan añadirte.', placeholder: 'Saluda — dónde patinas, a quién conoces, por qué quieres entrar…', sending: 'Enviando…', sendButton: 'Enviar solicitud', }, sponsorBanner: { loading: 'Cargando patrocinador…', sponsoredBy: 'Patrocinado por', }, sponsorPicker: { selected: 'Patrocinador seleccionado', setLoading: 'Patrocinador establecido (cargando tienda…)', set: 'Patrocinador establecido', clearAria: 'Quitar patrocinador', searchPlaceholder: 'Busca tiendas de skate por nombre o ciudad…', loading: 'Cargando tiendas…', noMatch: 'Ninguna tienda coincide — prueba otra búsqueda.', none: 'Aún no se han encontrado tiendas.', }, treasury: { title: 'Tesorería de la cuadrilla', ofGoal: 'de un objetivo de {{target}}', goalReached: '¡Objetivo alcanzado!', funded: '{{percent}}% financiado', contributionOne: '{{count}} contribución', contributionMany: '{{count}} contribuciones', daysLeft: '{{days}} d restantes', closed: 'cerrada', nonCustodial: 'No custodial · los zaps van directos al monedero Lightning de la cuadrilla', }, userStatus: { atSpot: '📍 En un spot', autoClears: '⏱️ Se borra en {{min}} min', }, video: { title: 'La Part', fullVideo: 'Vídeo completo · montaje', latestClip: 'Último clip', watch: 'Ver', iframeTitle: '{{crew}} — vídeo', playAria: 'Reproducir el vídeo de {{crew}}', thumbAlt: 'Miniatura del vídeo de {{crew}}', instagramTitle: 'Clip de Instagram', }, vouch: { removedTitle: 'Aval retirado', vouchedTitle: '¡Avalado!', removedDesc: 'Ya no avalas a {{name}}.', vouchedDesc: 'Has avalado a {{name}}. La escena confía en los suyos.', couldNotVouch: 'No se pudo avalar', title: 'Avales de la escena', sceneVerified: 'Verificado por la escena', vouched: 'Avalado', newUnvouched: 'Nuevo · sin avales', checking: 'Consultando la escena…', empty: 'Aún no hay avales. Los avales de patinadores de tus círculos son la mejor señal de que alguien es de fiar — no un desconocido que pasaba por ahí.', countOne: '{{count}} aval', countMany: '{{count}} avales', trusted: '{{count}} de patinadores de tu red de confianza', remove: 'Retirar aval', vouchFor: 'Avalar a {{name}}', ownerNote: 'Los patinadores que conocen tu trabajo pueden avalarte aquí.', }, }, settingsUi: { notFound: { seoTitle: '404 - Página no encontrada', seoDescription: 'La página que buscas no se pudo encontrar. Vuelve a la página de inicio para seguir navegando.', message: '¡Vaya! Página no encontrada', returnHome: 'Volver al inicio', }, loginArea: { signUp: 'Registrarse', logIn: 'Iniciar sesión', }, accountSwitcher: { switchAccount: 'Cambiar de cuenta', walletSettings: 'Ajustes de cartera', addAccount: 'Añadir otra cuenta', logout: 'Cerrar sesión', }, amberHint: { defaultAction: 'enviar', multiBefore: 'Tu firmador te pedirá que apruebes', multiTimes: '{{approvals}} veces', multiAfter: 'para {{action}} — es normal en los mensajes cifrados (una aprobación por destinatario). Aprueba cada una.', single: 'Tu firmador te pedirá que apruebes para {{action}}.', }, amberCallback: { processing: 'Procesando el inicio de sesión con Amber...', gotResult: 'Resultado recibido: {{result}}', noResultDebug: 'Sin resultado de Amber', noResultToast: 'No se recibió ningún resultado de Amber. Puede que se cancelara la operación.', validPubkey: '¡Clave pública válida! Iniciando sesión...', loginSuccessful: '¡Sesión iniciada!', loginErrorDebug: 'Error de inicio de sesión: {{error}}', invalidResultDebug: 'Formato de resultado no válido: {{result}}', loggedInTitle: 'Sesión iniciada', amberLoginDesc: '¡Has iniciado sesión con Amber!', loginFailedTitle: 'Error al iniciar sesión', loginFailedDesc: 'No se pudo completar el inicio de sesión con Amber. Inténtalo de nuevo.', invalidPubkeyDesc: 'Se recibió una clave pública no válida de Amber.', sessionLostToast: 'Se perdieron los datos de la sesión. Inténtalo de nuevo.', eventSignedTitle: 'Evento firmado', eventSignedDesc: 'Amber ha firmado tu evento.', signingFailedTitle: 'Error al firmar', signingFailedDesc: 'No se pudo procesar el evento firmado de Amber.', operationCompleteTitle: 'Operación completada', operationCompleteDesc: '{{op}} completado.', }, loginDialog: { loginWithAmber: 'Iniciar sesión con Amber (Android)', welcomeTitle: 'Bienvenido a SkateSpots', welcomeSubtitle: 'Regístrate o inicia sesión para continuar', newHere: '¿Nuevo por aquí?', createFree: 'Crea una cuenta gratis. Sin correo electrónico.', createAccount: 'Crear cuenta', orLogIn: 'O inicia sesión', loggedInTitle: '🛹 ¡Sesión iniciada!', loggedIn: '¡Sesión iniciada!', connectedAmber: '¡Conectado con Amber!', amberLoginFailed: 'Falló el inicio de sesión con Amber', amberCancelled: 'Inicio de sesión cancelado. Toca "Abrir Amber" para intentarlo de nuevo.', amberNotFound: 'Amber no encontrado. Asegúrate de tener Amber instalado desde ZapStore.', loginFailed: 'Error al iniciar sesión', pubkeyError: 'Pega tu clave pública en hex (64 caracteres) o npub de Amber', pairedSigner: 'Emparejado con tu firmador.', connectFailed: 'No se pudo conectar con tu firmador.', openedEncrypted: 'Se abrió tu clave cifrada.', openKeyFailed: 'No se pudo abrir esa clave.', bunkerPrefix: 'Debe empezar por bunker://', connectedBunker: '¡Conectado vía bunker!', bunkerFailed: 'Falló: {{error}}', checkBunkerUri: 'Comprueba tu URI de bunker', nsecPrefix: 'Debe empezar por nsec1', invalidNsec: 'nsec no válido: {{error}}', checkKey: 'Comprueba tu clave', noExtensionTitle: 'No se encontró ninguna extensión', noExtensionDesc: 'Instala Alby u otra extensión NIP-07.', amberIdleDesc: 'Tu clave se queda dentro de Amber. Un toque: apruebas en Amber y vuelves aquí con la sesión iniciada. Nada que copiar.', continueWithAmber: 'Continuar con Amber', noAmberGetIt: '¿No tienes Amber? Consíguelo →', waitingAmberTitle: 'Esperando a Amber…', waitingAmberDesc: 'Aprueba la solicitud en Amber. Se iniciará tu sesión automáticamente en cuanto vuelvas.', openAmberAgain: 'Abrir Amber de nuevo', havingTrouble: '¿Problemas? Introduce tu clave manualmente', enterPublicKey: 'Introduce tu clave pública', enterPublicKeyDescBefore: 'Solo si el flujo automático no funcionó. En Amber: toca tu perfil →', copyPublicKey: 'Copiar clave pública', enterPublicKeyDescAfter: 'y pégala aquí.', connect: 'Conectar', back: '← Atrás', signInWithPhone: 'Inicia sesión con tu teléfono', signInWithPhoneDesc: 'Escanea con una app firmadora (Amber, nsec.app). Tu clave nunca sale de tu teléfono.', showPairingCode: 'Mostrar código de emparejamiento', waitingSigner: 'Esperando a tu firmador…', copyLink: 'Copiar enlace', orPasteBunker: 'o pega una URL de bunker', bunkerTitle: 'Bunker (NIP-46)', bunkerPasteBefore: 'Pega tu URI', bunkerPasteAfter: '.', amberInstructions: 'Ajustes → NIP-46 Bunker → Crear → Copiar', nsecAppInstructions: 'Conectar app → Copiar URI del bunker', secretKeyTitle: 'Clave secreta', secretKeyRawDesc: 'Pega tu clave secreta de Nostr directamente.', secretKeyEncDesc: 'Abre una copia de seguridad de clave protegida con contraseña.', rawNsec: 'nsec en claro', encryptedNip49: 'Cifrada (NIP-49)', nsecWarning: '⚠️ Úsalo solo en un dispositivo de confianza. Nunca compartas tu nsec.', login: 'Iniciar sesión', encSaferDesc: 'Más seguro: la clave permanece cifrada hasta que introduzcas tu contraseña, así que la copia es segura para guardarla en la nube o en un gestor de contraseñas.', password: 'Contraseña', openEncryptedKey: 'Abrir clave cifrada', browserExtensionTitle: 'Extensión del navegador (NIP-07)', browserExtensionDesc: 'Ideal para escritorio. Funciona con Alby, nos2x, Flamingo.', loginWithExtension: 'Iniciar sesión con extensión', }, signupDialog: { download: 'Descargar', stepChoose: 'Elegir', stepProfile: 'Perfil', stepSaveKey: 'Guardar clave', somethingWrong: 'Algo salió mal', createFailed: 'No se pudo crear tu cuenta. Inténtalo de nuevo.', keySavedTitle: '¡Clave secreta guardada!', keySavedDesc: 'Tu clave se ha guardado de forma segura.', downloadFailedTitle: 'Error al descargar', downloadFailedDesc: 'No se pudo descargar el archivo de la clave. Cópialo manualmente.', encSavedTitle: 'Copia cifrada guardada 🔐', encSavedDesc: 'Guarda el archivo Y la contraseña: necesitas ambos para volver a iniciar sesión.', encFailed: 'No se pudo cifrar esa clave.', invalidFileTitle: 'Tipo de archivo no válido', invalidFileDesc: 'Selecciona un archivo de imagen para tu avatar.', fileTooLargeTitle: 'Archivo demasiado grande', fileTooLargeDesc: 'La imagen del avatar debe pesar menos de 5 MB.', avatarUploadedTitle: '¡Avatar subido!', avatarUploadedDesc: 'Tu avatar se ha subido correctamente.', uploadFailedTitle: 'Error al subir', uploadFailedDesc: 'No se pudo subir el avatar. Inténtalo de nuevo.', nameRequiredTitle: 'Nombre visible obligatorio', nameRequiredDesc: 'Elige un nombre visible para que otros skaters sepan quién eres. Puedes cambiarlo cuando quieras.', reserveFailedTitle: 'No se pudo reservar ese nombre', reserveFailedDesc: '{{error}} Puedes reclamar uno más tarde en Ajustes.', profileCreatedTitle: '¡Perfil creado!', profileCreatedDesc: 'Tu perfil se ha configurado.', profileFailedTitle: 'Error al configurar el perfil', profileFailedDesc: 'Tu cuenta se creó, pero la configuración del perfil falló. Puedes actualizarlo más tarde.', welcomeToastTitle: '¡Bienvenido!', welcomeToastDesc: 'Tu cuenta está lista.', titleWelcome: 'Únete a SkateSpots', titleProfile: 'Configura tu perfil', titleDone: '¡Bienvenido!', createFreeAccount: 'Crea tu cuenta gratis', createFreeAccountDesc: 'Sin correo, sin teléfono, sin contraseña. Tu cuenta es una clave de Nostr: elige dónde vive.', recommended: 'Recomendado', signUpWithAmber: 'Regístrate con Amber', signUpWithAmberDesc: 'Tu clave se crea y se guarda dentro de la app Amber; SkateSpots nunca la toca. Lo más seguro. Un toque para aprobar.', continueWithAmber: 'Continuar con Amber', orQuickWay: 'o la vía rápida', quickAccount: 'Cuenta rápida en este dispositivo', quickAccountDesc: 'Generamos una clave que vive en este dispositivo. El inicio más rápido; te ayudaremos a guardar una copia justo después.', createQuickAccount: 'Crear cuenta rápida', quickReassurance: 'Tarda 5 segundos · vive en este dispositivo · te ayudaremos a hacer copia después', preferAnotherSigner: '¿Prefieres otro firmador?', iosDesktopNudge: '¿Estás en iOS o escritorio? Una app firmadora o una extensión del navegador es la opción más segura —', seeAllOptions: 'Ver todas las opciones', youreInPickName: '¡Ya estás dentro! 🛹 Elige un nombre visible para que los skaters sepan quién eres', changeAnytime: 'Puedes cambiarlo cuando quieras. La bio y el avatar son opcionales.', publishingProfile: 'Publicando tu perfil...', displayName: 'Nombre visible', displayNamePlaceholder: 'p. ej. Tony, gnarlyGrind o el nombre de tu crew', displayNameHint: 'Obligatorio: así aparecerás en SkateSpots. Cámbialo cuando quieras.', skateName: 'Tu nombre de SkateSpots', skateNameHint: 'Gratis y opcional: un identificador verificado que muestra un ✓ en tu perfil.', bio: 'Bio', bioPlaceholder: 'Cuéntales algo sobre ti...', avatar: 'Avatar', uploadAvatar: 'Subir imagen de avatar', saving: 'Guardando...', saveAndStart: 'Guardar y empezar a patinar', addNameToContinue: 'Añade un nombre visible para continuar.', savingPublishesNote: 'Al guardar se publica tu perfil en Nostr; puede que tu firmador te pida aprobarlo una vez.', youreIn: '¡Ya estás dentro! 🛹', oneQuickThing: 'Una cosa rápida antes de empezar…', saveLoginKey: 'Guarda tu clave de acceso', saveLoginKeyBefore: 'Esta es la', only: 'única', saveLoginKeyAfter: 'forma de volver a tu cuenta: sin correo, sin restablecer contraseña. Guárdala ahora y podrás iniciar sesión en cualquier dispositivo, allí donde patines.', revealSaveKey: 'Mostrar y guardar mi clave', recoveryCopied: 'Código de recuperación copiado. Guárdalo en un lugar seguro.', saved: 'Guardado', treatLikeBoardKeys: 'Trátala como las llaves de tu tabla: quien tenga este código controla tu cuenta. No la compartas nunca.', hideEncBackup: 'Ocultar copia cifrada', saveEncBackup: 'Guardar una copia cifrada', encBackupBefore: 'Una copia protegida con contraseña, segura para guardar en la nube o en un gestor de contraseñas. Necesitarás el archivo', and: 'y', encBackupAfter: 'la contraseña.', choosePassword: 'Elige una contraseña', saveEncBackupCta: 'Guardar copia cifrada', savedCodeAria: 'He guardado mi código de recuperación', savedCodeLabel: 'He guardado mi código de recuperación en un lugar seguro: un gestor de contraseñas o apuntado en papel.', letsSkate: 'Vamos a patinar', saveLater: 'Lo guardaré más tarde desde Ajustes', advancedSigner: 'Avanzado: usar una app firmadora en su lugar', }, mnemonic: { generatedTitle: '¡Frase de recuperación generada! 🎉', generatedDesc: 'Apunta estas 12 palabras en orden. ¡Son la clave de tu cuenta!', savedTitle: '¡Frase de recuperación guardada!', savedDesc: 'Guarda este archivo en un lugar seguro.', downloadFailedTitle: 'Error al descargar', downloadFailedDesc: 'No se pudo descargar el archivo. Cópialo manualmente.', copiedTitle: '¡Copiado al portapapeles!', copiedDesc: 'Tu frase de recuperación se ha copiado.', qrWindowTitle: 'Código QR de la frase de recuperación', qrHeading: 'Tu código QR de la frase de recuperación', qrAlt: 'Código QR de la frase de recuperación', qrWarning: '¡Mantén este código QR privado y seguro!', qrPrint: 'Imprimir código QR', qrFailedTitle: 'Error con el código QR', qrFailedDesc: 'No se pudo generar el código QR.', accountCreatedTitle: '¡Cuenta creada! 🎉', accountCreatedDesc: '¡Todo listo! Tu frase de recuperación está a salvo.', loginFailedTitle: 'Error al iniciar sesión', loginFailedDesc: 'No se pudo crear la cuenta. Inténtalo de nuevo.', verifyFailedTitle: 'Verificación fallida', verifyFailedDesc: 'Las palabras no coinciden. Revísalas e inténtalo de nuevo.', titlePrefix: 'Crear cuenta con', titleSuffix: 'frase de recuperación', twelveWordTitle: 'Frase de recuperación de 12 palabras', twelveWordDesc: 'Tu frase de recuperación es como una contraseña maestra. Apúntala en papel y guárdala bien. La necesitarás para acceder a tu cuenta desde otros dispositivos o si borras los datos del navegador.', generate: 'Generar frase de recuperación', useNsecInstead: 'Usar una clave nsec avanzada en su lugar', yourPhrase: 'Tu frase de recuperación', copy: 'Copiar', download: 'Descargar', qrCode: 'Código QR', criticalWarning: 'Advertencia de seguridad crítica', warnWriteStrong: 'Apúntala', warnWrite: 'en papel y guárdala de forma segura', warnNeverShareStrong: 'No la compartas nunca', warnNeverShare: 'con nadie', warnBackupsStrong: 'Guarda varias copias', warnBackups: 'en distintos lugares seguros', warnAnyoneStrong: 'Quien tenga esta frase', warnAnyone: 'controla tu cuenta para siempre', warnLoseStrong: 'Si la pierdes', warnLose: 'pierdes tu cuenta de forma permanente', savedSecurely: 'La he guardado de forma segura', verifyTitle: 'Verifica tu frase de recuperación', verifyDesc: 'Para asegurarnos de que la has guardado bien, escribe estas palabras:', wordLabel: 'Palabra n.º {{n}}', wordPlaceholder: 'Escribe la palabra n.º {{n}}', goBack: 'Atrás', verifyCreate: 'Verificar y crear cuenta', completeTitle: '¡Cuenta creada!', completeDesc: '¡Tu cuenta de Nostr está lista!', signerTitle: 'Recomendado: configura una app firmadora', signerSubtitle: 'Mantén tus claves extra seguras', signerDesc: 'Para mayor seguridad, usa una app firmadora dedicada en lugar de pegar tu frase de recuperación por todas partes. Las apps firmadoras mantienen tus claves a salvo y te dejan usar cualquier app de Nostr.', signerCta: 'Conocer las apps firmadoras', skip: 'Omitir por ahora', }, signupMethod: { titlePrefix: 'Elige tu', titleSuffix: 'método de registro', subtitle: 'Ambos métodos son seguros. ¡Elige el que mejor te venga!', recommended: 'Recomendado', mnemonicTitle: 'Frase de recuperación', mnemonicDesc: '12 palabras fáciles de recordar. El estándar que usan Bitcoin, Ethereum y la mayoría de carteras cripto.', mnemonicF1: 'Fácil de apuntar en papel', mnemonicF2: 'Funciona con otras apps de Nostr (NIP-06)', mnemonicF3: 'Puede generar varias cuentas', mnemonicF4: 'Familiar para usuarios de cripto', useMnemonic: 'Usar frase de recuperación', advanced: 'Avanzado', nsecTitle: 'Clave secreta (nsec)', nsecDesc: 'Clave criptográfica en bruto. Más técnica, pero te da acceso directo a tu identidad de Nostr.', nsecF1: 'Control criptográfico directo', nsecF2: 'Compatible con todas las apps de Nostr', nsecF3: 'Una sola cadena para la copia', nsecF4: 'Sin capa de derivación', useNsec: 'Usar clave secreta', footer: '🔒 Ambos métodos son igual de seguros. ¡Elige según tu preferencia!', }, skateNip05: { placeholder: 'tunombre', claimedSuffix: 'es tuyo: guarda tu perfil para publicarlo.', checking: 'Comprobando disponibilidad…', available: '{{name}}@{{domain}} está disponible', claim: 'Reclamarlo', hint: 'Letras, números y guiones. Gratis, y se muestra como insignia ✓ en tu perfil.', }, nip05Required: { getFree: 'Consigue un NIP-05 gratis / barato', paid: 'De pago', requiredTitle: 'Verificación NIP-05 obligatoria', bannerReason: 'Para evitar spam y generar confianza, {{role}} necesitan una dirección Nostr verificada (NIP-05).', gateReason: 'Para evitar spam y generar confianza, {{role}} deben tener verificación NIP-05.', addInSettings: 'Añadir NIP-05 en Ajustes', explainer: 'NIP-05 demuestra tu identidad vinculando tu perfil de Nostr a un dominio, como', updateProfile: 'Actualiza tu perfil', }, editProfile: { uploadSuccessTitle: 'Correcto', uploadSuccessDesc: '{{field}} subido correctamente', uploadErrorDesc: 'No se pudo subir {{field}}. Inténtalo de nuevo.', mustBeLoggedIn: 'Debes iniciar sesión para actualizar tu perfil', invalidClinkTitle: 'Código CLINK no válido', invalidClinkDesc: 'Eso no parece un código noffer1… válido. Bórralo o pega uno válido.', invalidLightningTitle: 'Dirección Lightning no válida', invalidLightningDesc: 'Usa una dirección tipo correo, como you@walletofsatoshi.com.', invalidSpTitle: 'Dirección Silent Payment no válida', invalidSpDesc: 'Una dirección Silent Payment empieza por "sp1" y es bastante larga. Bórrala o pega una válida.', invalidCordnTitle: 'Enlace de Cordn no válido', invalidCordnDesc: 'Pega un enlace de contacto de Cordn completo https://…', updateSuccessTitle: 'Correcto', updateSuccessDesc: 'Tu perfil se ha actualizado', updateErrorDesc: 'No se pudo publicar el perfil. Comprueba tus conexiones de relay en Ajustes > Relays', identityTitle: 'Identidad', identityDesc: 'Cómo apareces en SkateSpots.', displayName: 'Nombre visible', displayNamePlaceholder: 'Tu nombre', bio: 'Bio', bioPlaceholder: 'Unas palabras sobre ti y tu patinaje…', profilePicture: 'Foto de perfil', pictureDesc: 'Sube o pega una imagen cuadrada.', bannerImage: 'Imagen de portada', bannerDesc: 'Una imagen ancha para la parte superior de tu perfil.', website: 'Sitio web', bitcoinTitle: 'Bitcoin y pagos', bitcoinDesc: 'Deja que te den zaps, propinas y pagos directamente, sin intermediarios.', lightningAddress: 'Dirección Lightning', lud16Invalid: 'Usa una dirección tipo correo, p. ej. you@yourdomain.com.', lud16Ok: 'Activa el botón “Zap” en tu perfil.', lud16Hint: 'Propinas instantáneas en Bitcoin. Activa el botón “Zap” en tu perfil.', silentPaymentAddress: 'Dirección Silent Payment', spInvalid: 'Debería empezar por “sp1” y ser bastante larga.', spOk: 'Válida: una dirección on-chain privada y reutilizable.', spHint: 'Dirección on-chain estática reutilizable (BIP-352). Compártela una vez; cada pago es imposible de vincular.', clinkTipCode: 'Código de propina CLINK', nofferInvalid: 'Eso no parece un código noffer1… válido.', nofferOk: 'Válido: aparecerá un botón “Propina en Bitcoin” en tu perfil.', nofferHint: 'Código CLINK autocustodiado para que cualquiera te dé propina por Nostr, sin intermediarios.', skateProfileTitle: 'Perfil de patinaje', skateProfileDesc: 'Presume de tus patrocinadores y de cómo te contacta tu crew.', badges: 'Insignias', badgesHint: '(etiqueta + enlace opcional)', badgeExample: 'p. ej. Independent Trucks', badgeLabelPlaceholder: 'Etiqueta de insignia…', badgeUrlPlaceholder: 'https://… (opcional)', removeBadge: 'Quitar insignia', addBadge: 'Añadir insignia', badgesDescBefore: 'Patrocinadores, tiendas o gente que apoya tu patinaje, y cualquier otra cosa que quieras mostrar. Cada una se convierte en una insignia clicable en tu perfil. Tu', badgesDescAfter: 'insignia de miembro se añade automáticamente.', coordinator: 'Coordinador', cordnInvalid: 'Eso no parece un coordinador. Pega un nprofile, un enlace de cordn.net o una URL https://.', cordnOk: 'Se muestra en tu perfil: los demás pueden añadirlo con un toque.', cordnHint: 'El coordinador de Cordn que otros usan para escribirte. Privado, cifrado, tuyo.', useMyCoordinator: 'Usar mi coordinador', accountTitle: 'Cuenta', accountDesc: 'Ajustes adicionales de la cuenta.', botAccount: 'Cuenta bot', botAccountDesc: 'Marca esta cuenta como automatizada o bot.', saving: 'Guardando…', saveProfile: 'Guardar perfil', nip05VerifiedHandle: 'Identificador verificado NIP-05', nip05How: '¿Cómo?', nip05HintEmpty: 'Un identificador verificado tipo you@yourdomain.com, la versión de Nostr del check azul. Muestra una insignia ✓ en tu perfil y desbloquea el filtro “Verificado” en el directorio de skaters.', nip05Invalid: 'Usa un identificador tipo correo, p. ej. you@yourdomain.com, sin “https://” ni espacios.', nip05Checking: 'Comprobando tu dominio…', nip05Verified: 'Verificado: tu dominio confirma que este identificador es tuyo. ✓', nip05Mismatch: 'Tu dominio vincula este identificador a una clave DISTINTA. Corrige tu .well-known/nostr.json para que apunte a esta cuenta.', nip05Unreachable: 'Aún no se pudo alcanzar el /.well-known/nostr.json de tu dominio. Los identificadores guardados funcionarán cuando tu dominio esté bien configurado.', nip05Enter: 'Introduce tu identificador NIP-05.', freeHandleBefore: '¿No tienes dominio propio? Reclama un identificador', freeHandleAfter: 'gratis de SkateSpots.', uploadLabel: 'Subir {{label}}', previewLabel: 'Vista previa de {{label}}', }, security: { recoveryCopied: 'Código de recuperación copiado. Guárdalo en un lugar seguro.', savedTitle: '¡Guardado!', recoveryDownloaded: 'Código de recuperación descargado. Guárdalo en un lugar seguro.', downloadFailedTitle: 'Error al descargar', downloadFailedDesc: 'Cópialo manualmente.', loginRequired: 'Inicio de sesión obligatorio', loginRequiredDesc: 'Inicia sesión para acceder a los ajustes de seguridad.', backupConfirmedTitle: '¡Copia confirmada! ✅', backupConfirmedDesc: '¡Genial! Tus claves están a salvo.', yourRecoveryCode: 'Tu código de recuperación', recoveryCodeDesc: '¿No lo guardaste al registrarte? Puedes obtenerlo aquí cuando quieras.', recoveryCodeBefore: 'Este código es la', only: 'única', recoveryCodeAfter: 'forma de volver a iniciar sesión en un dispositivo o navegador nuevo. Guárdalo en un lugar seguro (un gestor de contraseñas o en papel). Quien lo tenga controla tu cuenta: no lo compartas nunca.', revealRecovery: 'Mostrar mi código de recuperación', qrHint: 'Escanea con otra app de Nostr para iniciar sesión. Mantén esta pantalla en privado.', neverShareHide: '⚠️ No lo compartas nunca. Ocultalo cuando termines.', hide: 'Ocultar', amberNoteBefore: 'Has iniciado sesión con', amberNoteAfter: '. Tu código de recuperación vive dentro de Amber: abre la app Amber para guardarlo. SkateSpots nunca ve tu clave.', bunkerNoteBefore: 'Has iniciado sesión con un', remoteSigner: 'firmador remoto (bunker)', bunkerNoteAfter: '. Tu código de recuperación lo guarda tu servicio firmador, no SkateSpots. Haz la copia allí.', extensionNoteBefore: 'Has iniciado sesión con una', browserExtension: 'extensión del navegador', extensionNoteAfter: '. Tu código de recuperación vive en la extensión: usa su propia opción de copia/exportación. SkateSpots nunca ve tu clave.', otherNote: 'Tu código de recuperación lo gestiona tu app firmadora, no SkateSpots. Haz la copia allí.', backupWarningTitle: '⚠️ ¿Has hecho copia de tu frase de recuperación o clave secreta?', backupWarningBody: 'Tus claves son la ÚNICA forma de acceder a tu cuenta. Si las pierdes, lo pierdes todo: ¡no hay restablecimiento de contraseña!', iveBackedUp: 'He hecho copia de mis claves', backupConfirmed: '✅ Copia confirmada', backupNotConfirmed: '⚠️ Copia sin confirmar', backupConfirmedStatusDesc: 'Has confirmado que tus claves están a salvo.', backupNotConfirmedDesc: '¡Asegúrate de hacer copia de tu frase de recuperación o clave secreta!', notSavedYetBefore: '¿Aún no has guardado tu código de recuperación? No pasa nada: cópialo de la sección', notSavedYetAfter: 'de arriba, guárdalo en un lugar seguro y confírmalo abajo.', yesBackedUp: 'Sí, he hecho copia de mis claves', bestPracticesTitle: 'Buenas prácticas de seguridad de claves', bestPracticesDesc: 'Cómo mantener tu cuenta de Nostr a salvo', bp1Title: 'Apúntala en papel', bp1Desc: 'La copia física es lo más seguro. Guárdala en un lugar seguro, como una caja fuerte.', bp2Title: 'Varias copias', bp2Desc: 'Guarda copias en distintos lugares seguros (caja fuerte de casa, caja de seguridad del banco, etc.)', bp3Title: 'No compartas nunca tus claves', bp3Desc: 'Las apps de Nostr de verdad NUNCA piden tu nsec ni tu frase de recuperación después del primer inicio de sesión', bp4Title: 'No las guardes en la nube sin cifrar', bp4Desc: 'Evita Google Docs, borradores de correo o almacenamiento en la nube en texto plano', bp5Title: 'Plantéate usar una extensión del navegador', bp5Desc: 'Alby, nos2x o Flamingo mantienen tus claves seguras y nunca las exponen a los sitios web', importantReminders: '⚠️ Recordatorios importantes', rem1: 'Si pierdes tus claves, pierdes tu cuenta de forma permanente', rem2: 'Ninguna empresa ni persona puede restablecer tu contraseña, ni siquiera nosotros', rem3: 'Quien tenga tus claves tiene control total de tu cuenta', rem4: 'Tus claves controlan todos tus datos de Nostr en TODAS las apps', recommendedSigners: '🔌 Firmadores de Nostr recomendados', recommendedSignersDesc: 'Usa un firmador de Nostr para mayor seguridad y comodidad', recommended: 'Recomendado', amberDesc: 'Firmador de Nostr seguro para Android. Mantiene tus claves a salvo en tu teléfono y firma eventos sin exponerlas.', albyDesc: 'Extensión completa con cartera Lightning, WebLN y soporte NWC.', flamingoDesc: 'Interfaz sencilla y limpia. Se centra en firmar en Nostr sin funciones de cartera.', nos2xDesc: 'Extensión mínima y ligera para usuarios avanzados.', nostrConnectTitle: '☁️ Nostr Connect (firmadores remotos)', nostrConnectDesc: 'Usa un firmador remoto para acceder a tu cuenta desde cualquier dispositivo', nostrConnectBody: 'Nostr Connect (también llamado "bunkers") te permite guardar tus claves en un servidor seguro e iniciar sesión desde cualquier dispositivo. Tus claves nunca salen del servidor, ¡pero puedes usar tu cuenta donde quieras!', nsecAppDesc: 'Firmador remoto gratuito y seguro. Crea una URI bunker:// y pégala al iniciar sesión.', nostrumDesc: 'Otra opción de firmador remoto con soporte móvil.', howToUse: '💡 Cómo usarlo:', howToUseDesc: 'Crea una cuenta en uno de estos servicios, obtén tu cadena de conexión bunker:// y pégala en la pestaña "Nostr Connect" al iniciar sesión.', }, relayList: { connected: 'Conectado', connecting: 'Conectando…', offline: 'Sin conexión', removeUrl: 'Quitar {{url}}', add: 'Añadir', publishedTitle: 'Lista de relays publicada', publishedDesc: 'Sincronizada con Nostr (kind 10002).', publishFailedTitle: 'No se pudo publicar la lista de relays', invalidUrlTitle: 'URL de relay no válida', invalidUrlDesc: 'Prueba algo como wss://relay.example.com', alreadyInList: 'El relay ya está en tu lista', keepReadWriteTitle: 'Mantén lectura o escritura activada', keepReadWriteDesc: 'Un relay necesita al menos lectura o escritura.', alreadyInThisList: 'El relay ya está en esta lista', dmPublishedTitle: 'Relays de MD publicados', dmPublishedDesc: 'Bandeja NIP-17 actualizada.', dmPublishFailedTitle: 'No se pudieron publicar los relays de MD', nip65Title: 'Relays (NIP-65)', nip65DescUser: 'Toca Lectura / Escritura para alternar. Se publica en Nostr como tu lista kind 10002.', nip65DescLoggedOut: 'Toca Lectura / Escritura para alternar. Inicia sesión para publicar tu lista en Nostr.', noRelays: 'Aún no hay relays: añade uno abajo.', local: 'Local', read: 'Lectura', readHint: 'Obtener contenido de este relay', write: 'Escritura', writeHint: 'Publicar tus eventos en este relay', dmTitle: 'Relays de bandeja de MD', dmDesc: 'Donde recibes los mensajes directos NIP-17 (kind 10050). Si está vacío, usa tus relays de escritura.', localTitle: 'Relays locales', localDesc: 'Solo de la app (p. ej. un nodo de LAN). Se usan para lectura y escritura; nunca se publican.', blockedTitle: 'Relays bloqueados', blockedDesc: 'No te conectes nunca a estos: se excluyen de toda lectura y escritura.', }, relatr: { searchingTitle: 'Buscando el servicio Relatr...', searchingDesc: 'Consultando Nostr en busca de perfiles Relatr', foundTitle: '¡Servicio Relatr encontrado!', foundDesc: 'Servicio: {{name}}', unknown: 'Desconocido', notFoundTitle: 'No se encontró ningún servicio Relatr', notFoundDesc: 'Prueba a introducir la clave pública manualmente o mira https://www.relatr.xyz/', searchFailedTitle: 'Error en la búsqueda', searchFailedDesc: 'No se pudo consultar Nostr en busca de perfiles Relatr', invalidPubkeyTitle: 'Clave pública no válida', invalidPubkeyDesc: 'Introduce una clave pública hex válida de 64 caracteres', enabledTitle: '¡Relatr activado!', enabledDesc: 'Las puntuaciones de confianza globales ya están activas.', disabledTitle: 'Relatr desactivado', disabledDesc: 'Ya no se obtienen puntuaciones de confianza.', title: 'Puntuaciones de confianza de Relatr', desc: 'Las puntuaciones de confianza globales ayudan a identificar usuarios fiables y reducir el spam', status: 'Estado', active: 'Activo', disabled: 'Desactivado', activeStrong: 'Relatr está activo.', activeDesc: 'Las puntuaciones de confianza del análisis de red global de ContextVM ayudan a identificar skaters fiables y reducir el spam.', disabledStrong: 'Relatr está desactivado.', disabledHint: 'Actívalo para obtener puntuaciones de confianza de la red Nostr global.', disable: 'Desactivar Relatr', enable: 'Activar Relatr', advancedSettings: 'Ajustes avanzados', servicePubkey: 'Clave pública del servicio Relatr', pubkeyPlaceholder: 'Introduce la clave pública hex de 64 caracteres...', searching: 'Buscando...', autoDiscover: 'Autodescubrir', pubkeyDefault: 'Por defecto: servicio Relatr oficial de ContextVM (npub1dvmc...)', relayLabel: 'Relay (donde Relatr publica las puntuaciones)', relayDefault: 'Por defecto: wss://relay.contextvm.org (relay oficial de ContextVM)', applyChanges: 'Aplicar cambios', learnMore: 'Más información:', website: 'Sitio web de Relatr', github: 'GitHub de Relatr', nip85Spec: 'Especificación NIP-85', }, followList: { unfollow: 'Dejar de seguir', title: 'Tu red de Nostr', desc: 'Gestiona a quién sigues. Seguir a usuarios ayuda a construir tu red de confianza y determina qué spots muestran insignias de confianza.', following: 'Siguiendo ({{count}})', followers: 'Seguidores ({{count}})', follow: 'Seguir', followHint: '💡 Pega una clave pública de Nostr (npub1...), una dirección NIP-05 (usuario@dominio.com) o una clave pública hex', notFollowing: 'Aún no sigues a nadie', notFollowingHint: 'Sigue a skaters para ver sus spots con insignias ✅ VERIFICADO', trustActiveStrong: '✅ Insignias de confianza activas:', trustActive: 'Los spots creados por gente que sigues ahora mostrarán insignias VERIFICADO. Los de sus amigos mostrarán insignias DE CONFIANZA.', noFollowers: 'Aún no tienes seguidores', noFollowersHint: '¡Comparte tu perfil de Nostr para ganar seguidores!', howTitle: '💡 Cómo afecta seguir a las insignias de confianza', verifiedStrong: '✅ VERIFICADO (verde):', verifiedDesc: 'Spots creados por gente a la que sigues directamente', trustedStrong: '🟡 DE CONFIANZA (amarillo):', trustedDesc: 'Spots creados por gente a la que siguen tus amigos (2 saltos)', unverifiedStrong: '⚪ Sin verificar:', unverifiedDesc: 'Spots de usuarios sin conexión con tu red', tip: '💡 Consejo: ¡sigue a skaters activos para ver más spots verificados y construir tu red de confianza!', }, notify: { enableTitle: 'Activar notificaciones', enableDesc: 'Haz vibrar este dispositivo cuando algo te necesite.', checkingPermission: 'Comprobando permiso…', unsupported: 'Este dispositivo no admite notificaciones aquí. Recompila la app de Android para activarlas en tu teléfono.', denied: 'Las notificaciones están bloqueadas para este sitio. Permítelas en los ajustes de tu navegador/SO e inténtalo de nuevo.', backgroundTitle: 'Notificaciones en segundo plano', backgroundDesc: 'Recibe avisos de mensajes y operaciones aunque SkateSpots esté cerrado.', pushUnsupported: 'Este navegador no admite push en segundo plano. En móvil, añade SkateSpots a tu pantalla de inicio.', pushPrivacy: 'Para alcanzarte con la app cerrada, un servidor de notificaciones de SkateSpots recibe un aviso de tu relay cuando llega algo para tu clave y lo pasa al servicio push de tu teléfono. Solo ve que tu clave tiene algo, nunca quién lo envía ni qué dice, y no puede descifrar tus mensajes. Actívalo por dispositivo.', bgDeliveryTitle: 'Entrega en segundo plano (Android)', bgDeliveryDesc: 'Busca mensajes, ofertas y operaciones nuevos mientras la app está cerrada, sin servicios de Google.', off: 'Desactivado', standard: 'Estándar (~15 min)', fast: 'Rápido (~5 min)', bgDeliveryNote: 'El modo estándar es lo mejor posible: Android puede aplazarlo con Doze. El rápido muestra una notificación persistente y gasta más batería. Nada se descifra en nuestro servidor.', notifyMeAbout: 'Avisarme de', couldNotEnable: 'No se pudo activar', sendTest: 'Enviar una notificación de prueba', testTitle: 'Las notificaciones de SkateSpots están activadas 🛹', testBody: 'Así se verá un MD, un zap o una invitación de crew.', footerBefore: 'Los avisos se generan en tu dispositivo con datos que la app ya tiene, y los avisos de mensajes directos nunca descifran tus mensajes, así que nunca se le pide a Amber que abra uno. Con', footerAfter: 'desactivado, no se puede alcanzar una app totalmente cerrada, así que los avisos llegan la próxima vez que abras SkateSpots.', cat_dms_label: 'Mensajes directos', cat_dms_hint: 'Alguien te envía un mensaje privado', cat_crew_label: 'Crews', cat_crew_hint: 'Invitaciones, solicitudes de unión y confirmaciones de pertenencia', cat_social_label: 'Zaps, respuestas y menciones', cat_social_hint: 'Reacciones, reposts, zaps, respuestas y actualizaciones de eventos', cat_newsletter_label: 'Boletín', cat_newsletter_hint: 'Nuevas entregas de SkateSpots (solo suscriptores)', cat_trades_label: 'Ofertas y operaciones', cat_trades_hint: 'Ofertas, contraofertas y confirmaciones de operaciones', cat_reminders_label: 'Recordatorios de eventos', cat_reminders_hint: 'Un aviso una hora antes de los eventos a los que vas (app de Android)', }, regionBackfill: { taggedTitle: '{{count}} ubicación{{s}} etiquetada{{s}}', taggedSkipped: '{{count}} omitidas (sin coordenadas o sin coincidencia del geocodificador).', taggedOk: 'Etiquetas de región escritas en el relay comunitario.', nothingTitle: 'Nada que etiquetar', nothingDesc: 'No se pudo geocodificar ningún pin. Inténtalo más tarde.', failedTitle: 'Falló el relleno', title: 'Rellenar etiquetas de región', admin: 'Admin', descBefore: 'Los pines creados antes de que existiera la geocodificación tienen coordenadas pero ninguna etiqueta de ciudad/país, así que el mapa los dibuja mientras que las Estadísticas comunitarias solo pueden decir “Sin categoría”. Esto vuelve a derivar las etiquetas de cada pin y republica', descStrong: 'tus propios', descAfter: 'spots y tiendas sin etiquetar.', scanning: 'Analizando tus spots…', allTagged: 'Todos los spots y tiendas que posees ya tienen etiqueta de región. 🎉 Cualquier pin “Sin categoría” restante pertenece a otros mapeadores: solo sus propias claves pueden etiquetarlos.', countLine: '{{count}} de tus spot{{s}}/tiendas no tienen etiqueta de región. Puede que tu firmador pida aprobar cada uno.', tagging: 'Etiquetando {{done}}/{{total}}…', run: 'Rellenar etiquetas de región', summary: '{{updated}} actualizados · {{skipped}} omitidos · {{failed}} fallidos', }, adminReview: { title: 'Cola de revisión', flagged: '{{count}} spot{{s}} activan las señales de basura: ocúltalos o descártalos.', clean: 'Spots que parecen entradas de prueba o pines fuera de tema.', }, grantPro: { invalidNpub: 'Introduce un npub válido (o clave pública hex)', invalidDays: 'Los días deben ser un número positivo', grantedTitle: 'Pro concedido ⚡', grantedDesc: '{{npub}} hasta el {{date}}', failedTitle: 'Falló la concesión', title: 'Conceder Sasquatch Pro', owner: 'Propietario', desc: 'Alternativa manual por si el recibo de zap se pierde un pago verificado. Publica una concesión firmada por el propietario; el usuario no puede falsificarla.', targetPlaceholder: 'npub1… (o hex)', grant: 'Conceder', }, myData: { reactionTitle: '{{emoji}} reacción', deleting: 'Eliminando...', requestDeletion: 'Solicitar eliminación', selectContentTitle: 'Selecciona el contenido que eliminar', selectContentDesc: 'Selecciona los elementos concretos cuya eliminación quieres solicitar.', all: 'Todo', spots: 'Spots', events: 'Eventos', shops: 'Tiendas', listings: 'Anuncios', collections: 'Colecciones', lab: 'Lab', posts: 'Publicaciones', reactions: 'Reacciones', selectAll: 'Seleccionar todo', selectAllVisible: 'Seleccionar todo lo visible', selectedCount: '{{count}} seleccionados', noItemsCategory: 'No hay elementos en esta categoría', decentralizedStrong: 'Importante:', decentralizedNote: 'Nostr es descentralizado. Los relays deberían respetar las solicitudes de eliminación, pero algunos puede que no. No es una eliminación permanente garantizada.', deleteCount: 'Eliminar {{count}} elemento{{s}}', noDataTitle: 'No hay datos que exportar', noDataDesc: 'Aún no has publicado ningún evento.', exportedTitle: '¡Datos exportados!', exportedDesc: 'Se descargaron {{count}} eventos como JSON.', deletionRequestedTitle: 'Eliminación solicitada', deletionRequestedDesc: 'La solicitud de eliminación se ha publicado en los relays.', deletionRequestedMany: 'Se solicitó la eliminación de {{count}} elementos. Nota: puede que algunos relays no respeten esta solicitud.', deletionFailedTitle: 'Falló la eliminación', deletionFailedDesc: 'No se pudo publicar la solicitud de eliminación. Inténtalo de nuevo.', loginRequired: 'Inicio de sesión obligatorio', loginRequiredDesc: 'Inicia sesión para ver y gestionar tus datos.', title: 'Mis datos', desc: 'Tu contenido en la red Nostr. Estos datos son tuyos: expórtalos cuando quieras o solicita su eliminación.', coachFilmer: 'Coach/Filmer', zaps: 'Zaps', received: 'Recibidos', exportAll: 'Exportar todos los datos', recentActivity: 'Actividad reciente', viewAll: 'Ver todo ({{count}})', noDataPublished: 'Aún no hay datos publicados', startBy: 'Empieza', addingASpot: 'añadiendo un spot', aboutYourData: 'Sobre tus datos', ownDataStrong: 'Tus datos son tuyos.', ownData: 'Todo el contenido está firmado con tus claves criptográficas y guardado en relays de Nostr. Ninguna empresa lo controla.', exportAnytimeStrong: 'Exporta cuando quieras', exportAnytime: '- Descarga todos tus eventos como JSON', portableStrong: 'Portable', portable: '- Usa tus claves en cualquier app de Nostr', selectiveStrong: 'Eliminación selectiva', selective: '- Elige exactamente qué borrar', caveatStrong: 'Advertencia descentralizada', caveat: '- Puede que algunos relays conserven datos pese a las solicitudes de eliminación', }, settingsPage: { seoTitle: 'Ajustes - SkateSpots', seoDescription: 'Gestiona los ajustes de tu cuenta de SkateSpots.', heading: 'AJUSTES', subtitle: 'Cuenta y preferencias de la app', editProfile: 'Editar perfil', profileRefreshed: '¡Perfil actualizado!', found: 'Encontrado: {{name}}', unnamed: 'sin nombre', profileNotFound: 'Perfil no encontrado', notFoundOnRelay: 'No encontrado en ningún relay.', refreshFailed: 'Falló la actualización', refreshFailedDesc: 'No se pudo conectar a los relays.', loginToEdit: 'Inicia sesión para editar tu perfil', noProfileRelays: 'No encontramos un perfil en los relays. Si ya habías configurado uno, prueba a actualizar.', checkDisplayName: 'un nombre visible', checkPhoto: 'una foto de perfil', checkBio: 'una bio corta', checkLightning: 'una dirección Lightning para que te den zaps', checkHandle: 'un identificador @skate-spots.org gratis', finishProfile: 'Completa tu perfil', addItem: 'Añade {{item}}', nip05Title: 'Verificación NIP-05', nip05Desc: 'Consigue una dirección Nostr verificada (como nombre@dominio.com) para generar confianza. Obligatoria para crear eventos, perfiles de coach y tiendas.', freeFromSkateSpots: 'Gratis desde SkateSpots', claimHandleBefore: 'Reclama un identificador como', claimHandleAfter: '— sin registro, sin coste, sin dominio que mantener. Reclámalo en la pestaña Perfil y guarda.', claimInProfile: 'Reclamar en el perfil', nip05Footer: 'Cuando tengas tu NIP-05, añádelo en el campo Perfil y guarda.', localRelayOn: 'Relay local activado', localRelayOff: 'Relay local desactivado', lookingForCitrine: 'Buscando Citrine en este dispositivo…', noLongerUsing: 'Ya no se usa el relay del dispositivo.', localRelay: 'Relay local', citrineOff: 'Lecturas más rápidas y copia sin conexión en este dispositivo', citrineSearching: 'Buscando Citrine en este dispositivo…', citrineLive: 'Conectado: leyendo y guardando en local', citrineWaiting: 'Activado: inicia Citrine para conectar', toggleCitrine: 'Activar el relay local Citrine', citrineDetected: 'Relay Citrine detectado', citrineLooking: 'Buscando Citrine…', citrineNotDetected: 'Citrine no detectado', recheckCitrine: 'Volver a comprobar el relay Citrine', checking: 'Comprobando', recheck: 'Recomprobar', chipInstantReads: 'Lecturas instantáneas', chipWorksOffline: 'Funciona sin conexión', chipOnDeviceBackup: 'Copia en el dispositivo', cantReachStrong: 'No se puede alcanzar Citrine.', cantReachBefore: 'Asegúrate de que la app gratuita Citrine está instalada y su relay está', started: 'iniciado', cantReachAfter: ', y luego toca Recomprobar. Ejecuta un relay privado de Nostr en tu teléfono para lecturas instantáneas y una copia sin conexión.', citrineStep1Before: 'Abre Citrine → toca', start: 'Iniciar', citrineStep2Before: 'Vuelve aquí → toca', getCitrine: 'Consigue Citrine', citrinePrivacy: 'Tu Stash y tus mensajes siguen cifrados de extremo a extremo aquí, igual que en todas partes. El relay local solo acelera las cosas y guarda una copia en tu dispositivo; nunca sustituye el cifrado.', communityRelayDisabled: 'Relay comunitario desactivado', communityRelayEnabled: 'Relay comunitario activado', usingOnlyPersonal: 'Usando solo tus relays configurados.', skateRelayIncluded: 'Relay de SkateSpots incluido.', relays: 'Relays', relayPrivacyBefore: 'Los relays pueden ver tu', ipAddress: 'dirección IP', relayPrivacyAfter: 'cuando te conectas. Tor la oculta, y trata una VPN "gratis" como señal de alarma; normalmente monetizan tu tráfico.', communityRelay: 'Relay comunitario', syncingGlobal: 'Sincronizando con la comunidad global de skate', usingOnlyPersonalShort: 'Usando solo relays personales', appearance: 'Apariencia', language: 'Idioma', darkModeOnly: 'Solo modo oscuro', darkModeDesc: 'SkateSpots usa una estética neón oscura inspirada en la cultura del skate. Fondo negro, rosa neón, lima y naranja.', navigation: 'Navegación', sasquatchExpanded: '¡El Sasquatch se ha expandido! 🦧 Recarga la página para verlo.', advanced: 'Avanzado', sasquatchGuide: '🦧 Guía del Sasquatch', sasquatchResetDesc: 'Restablecer la guía de inicio a la vista expandida', expandSasquatch: 'Expandir el Sasquatch', wallet: 'Cartera', loginToWallet: 'Inicia sesión para gestionar tu cartera', openWallet: 'Abrir cartera', balanceSendReceive: 'Saldo, enviar, recibir', connectNwc: 'Conectar cartera NWC', account: 'Cuenta', security: 'Seguridad', securitySub: 'Claves, firma, Amber', nip05Sub: 'Consigue una dirección Nostr verificada', app: 'App', myStash: 'Mi Stash', myStashSub: 'Inventario privado de material', relaysSub: 'Conexiones a relays de Nostr', appearanceSub: 'Idioma y tema', notifications: 'Notificaciones', notificationsSub: 'Avisos de MD, crews y zaps', coordinator: 'Coordinador', coordinatorSub: 'Tu servidor de grupo Cordn', data: 'Datos', myData: 'Mis datos', myDataSub: 'Exportar, importar, gestionar', advancedSub: 'Relatr, Sasquatch, herramientas', notLoaded: 'Sin cargar', notLoggedIn: 'Sin sesión', }, onboarding: { seoTitle: 'Empezar — SkateSpots', seoDescription: 'Únete a la comunidad de skate descentralizada. Encuentra spots, conecta con coaches, envía zaps. Gratis para siempre.', homeSetTitle: 'Casa configurada 🛹', homeSetDesc: 'El mapa se abrirá ahora en tu zona.', locationFailedTitle: 'No se pudo obtener tu ubicación', locationFailedDesc: 'Comprueba los permisos de ubicación o elige tu zona desde el mapa.', niceTitle: '🎉 ¡Genial!', niceDesc: 'Ya entiendes cómo funciona Nostr. ¡Vamos a patinar!', npubCopied: 'npub copiado al portapapeles.', saveLoginNow: 'Guarda tu acceso — hazlo ahora', saveLoginNowDesc: 'Tu código de recuperación es la única forma de volver a tu cuenta. Sin correo, sin restablecer contraseña.', betaBadge: 'Beta — Abierto a skaters de todo el mundo', headline1: 'PATINA', headline2: 'TU MUNDO', heroBefore: 'Una comunidad de skate', decentralized: 'descentralizada', heroAfter: '. Ninguna empresa es dueña de ella. Ningún algoritmo entierra tus spots. Sin mazos de bloqueo. Solo skaters.', pillMap: 'Mapa de spots', pillCoaches: 'Coaches y filmers', pillEvents: 'Eventos', pillGear: 'Compra/venta de material', pillZaps: 'Zaps de Bitcoin', pillStash: 'Stash de material', pillCrews: 'Crews', createFreeAccount: 'Crea tu cuenta gratis', noEmailNoPassword: 'Sin correo. Sin contraseña. Tu identidad es tuya para siempre.', findSpots: 'Encuentra spots cerca de ti', addFirstSpot: 'Añade tu primer spot', accountCreated: '¡Ya estás dentro! Cuenta creada ✓', identityYours: 'Tu identidad es tuya: guardada en tu clave, no en nuestros servidores.', whereSkate: '¿Dónde patinas?', whereSkateDesc: 'Configura tu zona de casa una vez y el mapa se abrirá en tus spots siempre. Tu GPS nunca sale de tu dispositivo.', useMyLocation: 'Usar mi ubicación', pickOnMap: 'Elegir en el mapa', loginSaved: 'Acceso guardado: tu cuenta se puede recuperar.', whyBother: '¿Por qué molestarse?', why1Title: 'Cada spot, un mapa', why1Body: 'Bordillos, barandillas, DIY, parques — mapeados por skaters que realmente los patinan. Comprueba el estado antes de salir para no desperdiciar una sesión en un sitio prohibido.', why2Title: 'Hecho por skaters, no por trajes', why2Body: 'Sin anuncios, sin algoritmos que te metan basura por los ojos, sin recolección de datos. Código abierto. El mapa es de la comunidad, incluido tú.', why3Title: 'Te pagan por aportar', why3Body: 'Mapea una joya, graba un truco brutal, organiza una sesión, y recibe zaps de Bitcoin real directamente en tu cartera. Sin comisión de plataforma, sin intermediarios.', why4Title: 'Tu cuenta es de verdad tuya', why4Body: 'Una clave te da acceso a todas las apps de Nostr. Ninguna empresa puede bloquearte ni borrar tu cuenta cuando le apetezca. Llévate tu identidad a donde quieras.', everythingFree: 'Todo lo que puedes hacer — gratis', featSpots: 'Descubre spots', featSpotsDesc: 'Mapa interactivo con miles de spots en todo el mundo', featLab: 'El Lab', featLabDesc: 'Encuentra coaches, filmers y editores de vídeo cerca de ti', featEvents: 'Eventos', featEventsDesc: 'Competiciones, sesiones, quedadas', featGear: 'Compra / vende material', featGearDesc: 'Mercado entre particulares de material de skate usado', featStash: 'Mi Stash', featStashDesc: 'Inventario privado y cifrado de todo lo que tienes', featCrews: 'Crews', featCrewsDesc: 'Rueda con tu crew: spots compartidos, chat y sesiones', whatIsNostr: '¿Qué es Nostr?', whatIsNostrSub: 'El protocolo que impulsa SkateSpots', nostrBefore: 'Nostr es un protocolo abierto, como el correo, pero para apps sociales. Tu cuenta es un', cryptoKeyPair: 'par de claves criptográficas', nostrAfter: 'que te pertenece. Ninguna empresa controla tu cuenta ni tus datos: tú eliges qué relays los guardan, e incluso puedes ejecutar el tuyo. Tu identidad funciona en todas las apps de Nostr.', nostrPoint1: 'Tus datos y claves son tuyos', nostrPoint2: 'Ninguna empresa puede vetarte', nostrPoint3: 'La identidad funciona en todas partes', nostrPoint4: 'Propinas directas en Bitcoin', deepDive: 'En profundidad: cómo funciona Nostr', privacyTip: 'Consejo de privacidad: tu GPS nunca sale de tu dispositivo. Los servidores a los que te conectas (como las teselas del mapa) aún pueden ver tu IP; si quieres ocultarla también, sirve una VPN o Tor. Totalmente opcional.', readPrivacy: 'Lee nuestra página de privacidad', zapsWallet: '⚡ Zaps y cartera', optional: 'Opcional', walletDesc: 'Los zaps son propinas en Bitcoin que envías directamente a un skater que descubrió un spot genial, grabó un clip brutal o dirigió una gran sesión. Sin comisión de plataforma. Sin intermediarios. El 100 % va para él.', builtInWallet: 'Cartera Cashu integrada', builtInWalletDesc: 'Recibe pagos Lightning directamente en la app. Sin configuración.', balance: 'Saldo', connectExternal: 'Conectar cartera externa', connectExternalDesc: '¿Tienes Alby, Mutiny u otra cartera? Conéctala vía NWC.', connectViaNwc: 'Conectar vía NWC', loginToConnect: 'Inicia sesión para conectar tu propia cartera.', fiveDollars: '💡 5 $ en Bitcoin = cientos de zaps para repartir por la comunidad', commonQuestions: 'Preguntas frecuentes', faq1Q: '¿SkateSpots es gratis?', faq1A: '100 % gratis. Explorar spots, añadir ubicaciones, encontrar coaches, crear eventos, unirte a sesiones: todo gratis, para siempre. Bitcoin (zaps) es opcional si quieres dar propina a los creadores.', faq2Q: '¿Qué es Nostr y por qué lo usa SkateSpots?', faq2Before: 'Nostr es un protocolo abierto para apps descentralizadas: piensa en él como el propio internet, sin dueño. Tu cuenta de SkateSpots es un par de claves criptográficas que', faq2Strong: 'te pertenece', faq2After: '. Ninguna empresa puede vetar tu cuenta ni retener tus datos como rehenes: tú eliges qué relays los guardan, e incluso puedes ejecutar el tuyo. Tu identidad también funciona en otras apps de Nostr como Primal, Damus o Amethyst.', faq3Q: '¿Qué es un nsec y por qué es importante?', faq3Before: 'Tu', faq3Mid: 'es tu clave privada: es la única prueba de que la cuenta es tuya. A diferencia de las contraseñas, no existe', faq3Strong: 'ningún "he olvidado mi contraseña"', faq3After: '. Si pierdes tu nsec, tu cuenta desaparece para siempre. Al crear una cuenta, descarga tu copia inmediatamente y guárdala en un lugar seguro (un gestor de contraseñas o apuntada sin conexión).', faq4Q: '¿Qué firmadores / apps funcionan con SkateSpots?', faq4Desktop: 'En escritorio:', faq4Extensions: 'extensiones del navegador.', faq4Android: 'En Android:', faq4AndroidAfter: '(la mejor experiencia con la app nativa).', faq4Ios: 'En iOS:', faq4IosAfter: 'o pega tu nsec directamente (menos seguro).', faq4Note: 'También puedes iniciar sesión pegando tu nsec directamente, pero usar una extensión firmadora es más seguro.', faq5Q: '¿Puedo usar SkateSpots en mi teléfono?', faq5Before: '¡Sí! SkateSpots es una PWA (aplicación web progresiva). Visita', faq5Mid: 'en el navegador de tu teléfono y toca', faq5Em: '"Añadir a pantalla de inicio"', faq5After: 'para tener la experiencia completa. O descárgala desde', faq5End: ', una tienda de apps descentralizada.', faq6Q: '¿Qué es un zap?', faq6A: 'Un zap es una propina instantánea en Bitcoin enviada por la red Lightning. Cuando das un zap a un skater, los sats llegan a su cartera en segundos: sin PayPal, sin Venmo, sin comisiones. Quien grabó ese 4-stair cobra directamente de sus fans.', faq7Q: '¿Se borrarán mis spots si SkateSpots cierra?', faq7A: 'No. Tus spots se publican en relays de Nostr: servidores distribuidos que cualquiera puede ejecutar. Aunque SkateSpots como producto desapareciera mañana, tus datos seguirían existiendo en los relays y cualquier cliente de Nostr podría mostrarlos.', faq8Q: '¿Puedo añadir un spot que está en propiedad privada?', faq8A: 'Puedes, pero usa el sentido común. Los spots en propiedad privada deberían marcarse como tal para que los skaters sepan a qué atenerse. SkateSpots no se responsabiliza de allanamientos: respeta siempre a los propietarios y a los vecinos.', faq9Q: '¿Cómo informo de un error o doy mi opinión?', faq9Before: 'Envía un MD al equipo de SkateSpots directamente en Nostr, o contacta con nuestro coordinador beta:', faq9Link: 'Comentarios beta → cordn.net', readyToShred: '¿LISTO PARA DARLO TODO?', stopScrolling: 'Deja de hacer scroll. Consigue la app. Encuentra un spot. Patínalo.', exploreSpots: 'Explorar spots', betaFeedbackTitle: 'Beta — Queremos tu opinión', betaFeedbackDesc: 'SkateSpots está en desarrollo activo. Puede que te encuentres con asperezas: es culpa nuestra, no tuya. Informa de errores, sugiere funciones, dinos qué no te gusta.', betaCoordinator: 'Coordinador beta', betaCoordinatorDesc: 'cordn.net → escríbenos', dmOnNostr: 'MD en Nostr', fixSameDay: '¿Has encontrado un error? Lo arreglamos el mismo día. Tus informes mejoran la app para todos los skaters.', relaySetup: 'Configuración de relays', }, relayEdu: { understandingNostr: 'Entender Nostr', stepOf: 'Paso {{current}} de {{total}}', step1Title: 'Entender los relays', step1Desc: 'Piensa en los relays como tiendas de skate que comparten noticias sobre spots', you: 'Tú', relays: 'Relays', skaters: 'Skaters', s1Good1: 'Ninguna empresa es dueña de tu cuenta', s1Good1Desc: 'Tu identidad vive en varios servidores relay', s1Good2: 'Tú controlas dónde viven tus datos', s1Good2Desc: 'Tus publicaciones se sincronizan entre los relays que elijas: escoge los tuyos o ejecuta uno tú mismo', s1Warn: 'Los operadores de relays pueden ver las publicaciones públicas', s1WarnDesc: 'Piensa en ello como publicar en un tablón de anuncios', step2Title: 'Público vs privado', step2Desc: 'Sabe qué es visible y qué está cifrado', publicTitle: 'Público (cualquiera puede verlo)', pub1: 'Spots que añades al mapa', pub2: 'Reseñas y comentarios', pub3: 'La información de tu perfil (nombre, foto)', pub4: 'A quién sigues', privateTitle: 'Privado (cifrado)', priv1: 'Mensajes directos', priv2: 'Comunicaciones de la cartera', noteStrong: 'Nota:', note: 'Las publicaciones pueden almacenarse de forma permanente en los relays. ¡Piénsalo antes de publicar, como en la vida real!', step3Title: 'Tus claves = tu cuenta', step3Desc: 'Esto es lo más importante que debes entender', secretKeyTitle: 'Tu clave secreta (nsec)', secretKeyDesc: 'Piénsala como tu tabla: no se la prestes a nadie. Demuestra que la cuenta es tuya.', s3Bad1: 'Si la pierdes, tu cuenta no se puede recuperar', s3Bad2: 'Sin "he olvidado la contraseña": nadie puede restablecerla', s3Good: 'Haz una copia y guárdala de forma segura', publicKeyTitle: 'Tu clave pública (npub)', publicKeyDesc: 'Es como tu nombre de usuario: ¡compártela libremente para que otros te encuentren!', inControl: '🔐 Tú tienes el control: ¡ninguna empresa puede bloquearte!', skip: 'Omitir', gotIt: '¡Entendido!', }, about: { seoTitle: 'Acerca de - SkateSpots', seoDescription: 'Conoce SkateSpots y nuestra misión de construir una comunidad de skate descentralizada.', npubCopied: 'npub copiado al portapapeles. Pégalo en tu cliente de Nostr favorito para enviar un MD.', bugReport: '🐛 Informe de error', bugWhatHappened: 'Qué ocurrió:', bugExpected: 'Qué esperaba:', bugSteps: 'Pasos para reproducirlo:', aboutWord: 'ACERCA DE', heroBefore: 'Conecta con escenas de skate locales de todo el mundo.', skaterOwned: 'Datos propiedad de los skaters', heroAfter: ', relays gestionados por la comunidad.', viewStats: 'Ver estadísticas de la comunidad', missionTitle: 'Nuestra misión', mission1: 'SkateSpots ayuda a los skaters a descubrir spots, conectar con profesionales en El Lab y organizar sesiones, todo sin control corporativo. El skate real ocurre fuera de línea; esta herramienta solo te conecta con él.', mission2: 'El conocimiento del skate debería vivir con la comunidad, no encerrado en apps corporativas. Por eso SkateSpots funciona sobre Nostr: un sistema basado en relays donde los skaters controlan sus propios datos, eligen qué relays los guardan e incluso pueden ejecutar el suyo. Ninguna empresa es dueña del mapa.', whyNostr: '¿Por qué Nostr?', why1Title: 'Controlado por la comunidad', why1Desc: 'Tus spots viven en relays comunitarios. Los skaters ejecutan los servidores, no las corporaciones.', why2Title: 'Tus datos son tuyos', why2Desc: 'Tu identidad de Nostr es tuya. Llévala a cualquier app de Nostr, sin ataduras.', why3Title: 'Integración con Bitcoin', why3Desc: 'Da zaps a los creadores directamente con Bitcoin. Sin plataformas que se lleven el 30 %.', why4Title: 'Código abierto', why4Desc: 'Construido a la vista de todos. Cualquiera puede contribuir o bifurcar el código.', getInvolved: 'Participa', getInvolvedDesc: 'SkateSpots es código abierto y está impulsado por la comunidad. Contribuye con código, comparte spots o ayuda a otros a empezar.', betaTitle: 'Pruebas beta', betaDesc: '¡Querido usuario! Gracias por probar SkateSpots en beta. Ten en cuenta que la app sigue en beta y puede haber errores o problemas de seguridad. Si encuentras algún problema o quieres informar de un error, ¡escríbenos!', giveFeedback: 'Danos tu opinión:', copyNpub: 'Copiar npub', reportBug: 'Informar de un error', viewProfile: 'Ver perfil', downloadApp: 'Descarga la app', downloadAppDesc: 'Instala SkateSpots en Android vía Zapstore, la tienda de apps de código abierto y nativa de Bitcoin.', getOnZapstore: 'Consíguela en Zapstore', credits: 'Créditos', creditPoweredBy: 'Funciona con', creditNostr: 'Protocolo descentralizado', creditCrewChat: 'Chat de crew vía', creditCordn: 'Chat grupal cifrado de extremo a extremo', creditEcash: 'Ecash vía', creditCashu: 'Ecash chaumiano para Lightning', creditWalletConnect: 'Conexión de cartera vía', creditNwc: 'Nostr Wallet Connect (NIP-47)', creditSigning: 'Firma en Android con', creditAmber: 'Firmador de Nostr para Android', creditMapData: 'Datos de mapa de Bitcoin de', creditBtcmap: 'Lugares que aceptan Bitcoin', creditCrowdfunding: 'Financiación colectiva', creditAngor: 'Financiación colectiva descentralizada en Bitcoin', creditDistributed: 'Distribuido en', creditZapstore: 'Tienda de apps de código abierto', creditTrust: 'Confianza y chat de crew vía', creditContextvm: 'Puntuaciones de confianza de Relatr y coordinación de chat de crew cifrado', stillQuestions: '¿Aún tienes preguntas?', stillQuestionsDesc: 'El Sasquatch es nuestro guía de IA, con datos de SkateSpots en vivo. Pregúntale por spots, eventos, coaches, material o cómo funciona cualquier cosa.', askSasquatch: 'Pregunta al Sasquatch', poweredBy: 'Funciona con', decentralized: 'Descentralizado', communityOwned: 'Propiedad de la comunidad', }, faq: { seoTitle: 'FAQ - SkateSpots', seoDescription: 'Pregúntale al Sasquatch lo que quieras sobre SkateSpots.', greeting: '¡Hola! Soy el Sasquatch 🦧 — pregúntame lo que quieras sobre SkateSpots. Spots, eventos, material, carteras, privacidad, Nostr — estoy para ayudarte. ¿Qué quieres saber?', gotQuestions: '¿Tienes preguntas?', heroDesc: 'Pregúntale al Sasquatch: lo sabe todo sobre SkateSpots, Nostr, Bitcoin y el skate.', askTitle: 'Pregunta al Sasquatch', askDesc: 'El Sasquatch está abierto en la esquina inferior izquierda de tu pantalla: haz clic y escribe tu pregunta. Tiene acceso en vivo a spots, eventos, coaches y el tiempo.', askQuestion: '¿En qué me puedes ayudar en SkateSpots?', openSasquatch: 'Abrir el Sasquatch', commonQuestions: 'Preguntas frecuentes — toca para preguntar', quickAnswers: 'Respuestas rápidas', footerHint: 'El Sasquatch usa datos de Nostr en vivo del relay de SkateSpots e IA para responder tus preguntas. 🛹', chip1Label: '¿Qué es SkateSpots?', chip1Q: '¿Qué es SkateSpots y cómo funciona?', chip2Label: '¿Cómo añado un spot?', chip2Q: '¿Cómo añado un spot de skate al mapa?', chip3Label: '¿Qué son los zaps?', chip3Q: '¿Qué son los zaps?', chip4Label: '¿Es gratis?', chip4Q: '¿SkateSpots es gratis?', chip5Label: '¿Qué es Mi Stash?', chip5Q: '¿Qué es Mi Stash?', chip6Label: '¿Cómo inicio sesión?', chip6Q: '¿Cómo inicio sesión o creo una cuenta?', chip7Label: '¿Qué es Nostr?', chip7Q: '¿Qué es Nostr?', chip8Label: 'Privacidad y datos', chip8Q: '¿Qué datos son públicos y qué datos son privados en SkateSpots?', chip9Label: '¿Cómo vender material?', chip9Q: '¿Cómo vendo material en SkateSpots?', chip10Label: '¿Qué es El Lab?', chip10Q: '¿Qué es El Lab?', fact1Label: 'Spots de skate en todo el mundo', fact1Value: 'Descubre y añade', fact2Label: 'Zaps de Lightning en Bitcoin', fact2Value: '100 % gratis', fact3Label: 'Descentralizado en Nostr', fact3Value: 'Tus datos son tuyos', fact4Label: 'Inventario privado de material', fact4Value: 'Stash cifrado', s1Q: '¿Qué es SkateSpots?', s1A: 'Un mapa y una comunidad descentralizados para el skate, construidos sobre Nostr. Descubre spots, encuentra coaches y filmers, únete a crews, publica eventos y compra/vende material, sin ninguna empresa en medio.', s2Q: '¿Cómo añado un spot?', s2A: 'Toca el mapa o usa el botón + / "Añadir spot", coloca un pin y rellena los detalles. Necesitas una cuenta gratuita de Nostr (toca Iniciar sesión → Crear cuenta, sin correo).', s3Q: '¿Qué son los zaps?', s3A: 'Los zaps son propinas en Lightning de Bitcoin. Puedes dar zaps a spots, eventos, crews y personas que aprecias. Van directos al destinatario por Lightning: SkateSpots nunca retiene tus fondos.', s4Q: '¿Es gratis?', s4A: 'Sí. Crear una cuenta, añadir spots y navegar son gratis. Los extras opcionales de pago (como los anuncios destacados) y las propinas (zaps) se pagan directamente entre personas.', s5Q: '¿Qué datos son públicos?', s5A: 'Todo lo que publicas (spots, eventos, tu perfil) es público en los relays de Nostr. Tus mensajes privados y tu Stash están cifrados de extremo a extremo. Consulta la página de Privacidad para más detalles.', s6Q: '¿Qué es El Lab?', s6A: 'El Lab es donde encuentras gente a la que contratar o de la que aprender: coaches, entrenadores, filmers, editores de vídeo, fotógrafos, constructores, artistas y más.', }, privacy: { seoTitle: 'Privacidad — SkateSpots', seoDescription: 'Cómo trata SkateSpots tus datos: tu GPS se queda en tu dispositivo, los spots que publicas son públicos y cómo ocultar tu IP con una VPN o Tor si quieres.', heroBefore: 'Tu', heroHighlight: 'Privacidad', heroDesc: 'Sin rastreo, sin anuncios, sin venta de datos. Aquí tienes exactamente qué se queda en tu dispositivo, qué es público y cómo protegerlo más si quieres.', locationTitle: 'Tu ubicación se queda en tu dispositivo', locationBefore: 'Cuando tocas', nearMe: '"Cerca de mí",', locationAfter: 'tu ubicación GPS se lee en tu dispositivo y solo se usa para centrar el mapa y ordenar los spots cercanos.', locationGood1: 'Nunca se publica en Nostr.', locationGood2: 'Nunca se envía a SkateSpots: no hay ningún servidor de SkateSpots que la recopile.', locationGood3: 'Nunca se comparte con terceros.', locationGood4: 'En la app nativa usamos directamente el sistema de ubicación de tu teléfono y nos saltamos los Servicios de Google Play, así que funciona en teléfonos sin Google (GrapheneOS, /e/OS) y Google nunca la ve.', weatherBefore: 'El tiempo está desactivado por defecto. Cuando lo activas, consulta las condiciones de la ubicación pública del', weatherEm: 'spot', weatherAfter: ', no de la tuya.', publicTitle: 'Qué es público por diseño', publicDesc: 'SkateSpots es un mapa compartido, así que algunas cosas están pensadas para que las vea todo el mundo. Cuando eliges publicarlas, son públicas en la red Nostr:', public1Strong: 'Los spots que añades', public1: ', incluidas sus coordenadas. Si añades un spot en tu ubicación exacta, esa ubicación se vuelve pública. Piénsalo antes de poner un pin en tu propio garaje.', public2Strong: 'Reseñas, comentarios y tu perfil público', public2: '(nombre, foto).', public3: 'A quién sigues y las reacciones públicas.', public4Strong: 'Los zaps', public4: 'son públicos por defecto: un zap vincula tu cuenta (a menudo tu dirección Lightning) con la publicación que pagaste y con la propia propina. Tu cartera puede enviarlo de forma anónima si prefieres que no.', publicNoteBefore: 'Una VPN o Tor', notWord: 'no', publicNoteAfter: 'oculta el contenido de lo que publicas: las coordenadas de un spot son públicas igualmente. Las herramientas de privacidad ocultan tu identidad de red (tu IP), no las cosas que decides publicar.', encryptedTitle: 'Qué es privado y está cifrado', enc1Strong: 'Los mensajes directos', enc1Mid: 'y', enc1Strong2: 'los chats de crew', enc1: 'están cifrados de extremo a extremo (NIP-17). Solo los participantes pueden leerlos.', enc2Strong: 'Mi Stash', enc2: ', tu inventario privado de material, está cifrado con tu propia clave.', enc3Strong: 'Los miembros solo de crew', enc3: 'pueden elegir ser visibles solo para sus compañeros de crew.', ipTitle: 'Qué sale de tu dispositivo: tu IP', ipBefore: 'Como en cualquier sitio web, los servidores con los que habla SkateSpots pueden ver tu', ipAddress: 'dirección IP', ipAfter: '(un indicador aproximado de tu región). Es normal en cualquier app web o de mapas y no es exclusivo nuestro. Esos servidores son:', ipTileStrong: 'Teselas del mapa', ipTile: '(OpenStreetMap): ven tu IP y qué zona del mapa miras.', ipGeoStrong: 'Geocodificación de spots/tiendas', ipGeo: ': cuando creas o editas un spot o una tienda, sus coordenadas van a Nominatim de OpenStreetMap para rellenar la etiqueta de ciudad/país. Cuando abres las Estadísticas comunitarias, las coordenadas de los pines sin etiqueta de ubicación van a BigDataCloud para agruparlos por región (se cachea en tu dispositivo, como máximo una vez por pin). Ambos ven tu IP. Son las coordenadas del pin que colocaste / pines públicos, nunca el GPS en vivo de tu dispositivo.', ipPushStrong: 'Notificaciones en segundo plano', ipPush: '(opcional): si las activas, un servidor push de SkateSpots ve que tu clave ha recibido algo y cuándo (nunca quién lo envió ni qué dice; los mensajes siguen cifrados), y el servicio push de tu SO (Google/Mozilla/Apple) entrega el aviso.', ipBtcStrong: 'Lugares de Bitcoin', ipBtc: '(BTCMap, cuando activas esa capa): ven tu IP y la zona que estás viendo.', ipRelayStrong: 'Relays de Nostr', ipRelay: ': ven tu IP cuando la app lee o publica.', ipMintStrong: 'Cecas de Cashu', ipMint: ': ven tu IP siempre que tu cartera envía, recibe o funde.', ipRouteStrong: 'Indicaciones', ipRoute: '(OSRM y Transitous para transporte público): reciben el inicio y el final de cualquier ruta que pides, no solo tu IP. El enrutado se queda en la app: tu origen y destino nunca se entregan a Google o Apple Maps.', ipWeatherStrong: 'Tiempo', ipWeatherMid: '(Open-Meteo, opcional) y', ipUploadStrong: 'subida de imágenes', ipWeather: '(Blossom), cuando los usas.', ipAiStrong: 'IA del Sasquatch', ipAi: ': tu mensaje va a nuestro propio servidor y luego al proveedor del modelo.', ipLink1: 'Como envías tu clave pública (npub) en la misma conexión, un relay puede vincular tu IP contigo: no solo "alguien se conectó", sino "esta persona, desde esta dirección".', ipShieldBefore: 'Una cosa que sí protegemos: el', ipMintsStrong: 'directorio de cecas', ipShieldAfter: 'se obtiene a través de nuestro servidor, así que MintRadar nunca ve tu IP.', vpnTitle: '¿Quieres más privacidad? VPN o Tor (opcional)', vpnDesc: 'Para la mayoría de skaters no es necesario, pero si quieres ocultar tu IP y tu ubicación aproximada a los servidores de arriba, tienes dos opciones gratuitas:', vpnReputable: '🛡️ Una VPN de confianza', vpnReputableDesc: 'Oculta tu IP tras los servidores de la VPN. Fácil y rápida. Usa una de pago y de confianza; las VPN gratis suelen monetizar tu tráfico, así que trata "gratis" como señal de alarma.', torBrowser: '🧅 Navegador Tor', torDesc: 'Gratis, máxima privacidad de IP, enruta por varios relays. Más lento: los mapas y algunos relays de Nostr pueden ir lentos o bloquear los nodos de salida de Tor. Ideal para los más precavidos.', readThis: 'Lee esto para que no te engañen', caveat1Before: 'Una VPN/Tor oculta tu', ipWord: 'IP', caveat1: ', no los spots que publicas. Un pin en tu casa es público uses o no una VPN.', caveat2Before: 'No actives', nearMeGps: '"Cerca de mí" / el GPS del navegador', caveat2: 'si tu objetivo es mantenerte anónimo: un GPS preciso anula cualquier ocultación de IP.', caveat3: 'Ninguna herramienta te hace totalmente "anónimo". Estas reducen lo que los servidores pueden inferir sobre tu ubicación de red; eso es todo.', keysTitle: 'Tus claves, tu cuenta', keysBefore: 'Tu cuenta es un par de claves criptográficas que te pertenece. La forma más segura de iniciar sesión es un', signer: 'firmador', keysAfter: '(Alby, nos2x o Amber en Android), para que tu clave secreta nunca se pegue en la app.', keysCaveatBefore: 'Si pegas tu', keysCaveatAfter: 'directamente, se guarda en tu navegador. Usa mejor una extensión firmadora cuando puedas y guarda tu copia del nsec en un lugar seguro sin conexión.', footerBefore: '¿Preguntas? Pregúntale a', sasquatchName: 'el Sasquatch', footerMid: 'en la app, o lee la', gettingStarted: 'guía de inicio', about: 'Acerca de', }, license: { seoTitle: 'Licencia - SkateSpots', seoDescription: 'Licencia de SkateSpots. Eres libre de patinar.', tagline: 'Patina, gana, diviértete y gasta sats dondequiera que estés.', copyright: 'Colaboradores de SkateSpots y la comunidad', licenseLabel: 'Licencia', freeLine1: 'ERES LIBRE', freeLine2: 'DE PATINAR', body: 'Este proyecto es abierto. Compártelo, bifurcalo, constrúyelo encima, patínalo. Las calles son de todos. Y este código también. Sigue patinando, diviértete, aprende trucos, apoya a los creadores y vuelve a patinar.', builtBefore: 'Hecho con ❤️ sobre', builtMid: '· Impulsado por', lightning: 'Lightning de Bitcoin ⚡', viewSource: 'Ver código fuente', aboutSkateSpots: 'Acerca de SkateSpots', supporters: 'Colaboradores', }, glossary: { seoTitle: 'Glosario de trucos · SkateSpots', seoDescription: 'El glosario completo de skate: {{count}} entradas que cubren flips, grinds, slides, grabs, aéreos, trucos de lip, handplants, freestyle, términos de transición, postura y material, con nombres alternativos.', heading: 'GLOSARIO DE TRUCOS', subheading: '{{count}} entradas · trucos, transición, freestyle, postura y material', searchPlaceholder: 'Busca trucos o apodos — tre flip, crooks, method…', clearSearch: 'Borrar búsqueda', all: 'Todos', results: '{{count}} resultado{{s}} para', noMatch: 'Ningún truco coincide. Prueba un apodo como “tre flip”, “crooks” o “melon”.', tricksCount: '{{count}} trucos', footerBefore: '¿Conoces algún truco o apodo que nos falte? Los trucos reciben nombres distintos en cada escena: escribe a', sasquatch: 'el Sasquatch 🦧', footerAfter: 'y cuéntanoslo.', }, signers: { seoTitle: 'Apps firmadoras - Protege tus claves de Nostr | SkateSpots', seoDescription: 'Conoce las apps firmadoras que mantienen seguras tus claves de Nostr. Encuentra la mejor opción para Android, iOS o navegadores de escritorio.', securityGuide: 'Guía de seguridad', protect: 'Protege tus', nostrKeys: 'claves de Nostr', heroDesc: 'Las apps firmadoras mantienen tus claves privadas seguras firmando eventos sin exponerlas. En lugar de pegar tu clave en cada app, deja que un firmador lo haga de forma segura.', whySignerStrong: '¿Por qué usar un firmador?', whySigner: 'Tu clave privada de Nostr es como una contraseña que nunca se puede cambiar. Una app firmadora la mantiene a salvo y te deja usar cualquier app de Nostr.', androidTitle: 'Firmadores para Android', androidDesc: 'Apps firmadoras nativas para dispositivos Android, incluido GrapheneOS.', iosTitle: 'Firmadores para iOS', iosDesc: 'Opciones de firmador para usuarios de iPhone y iPad.', browserTitle: 'Extensiones del navegador', browserDesc: 'Extensiones de navegador de escritorio para firmar en apps web.', recommended: 'Recomendado', yourPlatform: 'Tu plataforma', get: 'Obtener {{name}}', protocolsTitle: 'Entender los protocolos', nip07Desc: 'Estándar de extensión del navegador. La extensión inyecta capacidades de firma en las apps web. Lo usan Alby, nos2x, Flamingo y extensiones similares.', nip46Desc: 'Protocolo de firma remota ("bunker"). Tu app firmadora aprueba las solicitudes de otras apps sin compartir tus claves. Lo usan Nsec.app, Nostria y Nowser.', nip55Desc: 'Protocolo de firmador específico de Android. Las apps nativas pueden solicitar firmas a Amber sin exponer las claves. La experiencia Android más fluida.', whichChoose: '¿Cuál elegir?', chooseAndroid: 'Android:', chooseAndroidDesc: 'Amber (NIP-55) para apps nativas', chooseIos: 'iOS:', chooseIosDesc: 'Nsec.app (NIP-46) para mayor compatibilidad', chooseDesktop: 'Escritorio:', chooseDesktopDesc: 'Alby, nos2x o Flamingo (NIP-07)', amberDesc: 'Firmador nativo de Android centrado en la seguridad y la facilidad de uso. La mejor opción para usuarios de Android.', nsecAppDesc: 'Firmador remoto multiplataforma que actúa como caja fuerte segura para tus claves.', nostriaDesc: 'App firmadora remota con claves guardadas en el almacenamiento seguro del dispositivo.', nowserDesc: 'Firmador multiautenticación compatible con extensión del navegador y protocolos de firma remota.', nsecAppIosDesc: 'La mejor opción para iOS. Úsala como firmador remoto con cualquier cliente de Nostr.', nowserTfDesc: 'Firmador para iOS disponible vía TestFlight con capacidades de firma similares a Android.', nostriaIosDesc: 'Firmador remoto con almacenamiento seguro de claves en tu dispositivo.', nos2xDesc: 'Extensión del navegador sencilla y fiable para firmar eventos de Nostr.', albyDesc: 'Cartera Lightning de Bitcoin con gestión de claves de Nostr y WebLN integrados.', flamingoDesc: 'Extensión del navegador centrada en Nostr con interfaz limpia.', kiwiDesc: 'En Android/GrapheneOS, usa Kiwi Browser para cargar las extensiones nos2x o Alby.', fNativeApp: 'App nativa', fMultiKey: 'Soporte de varias claves', fEventSigning: 'Firma de eventos', fSecureStorage: 'Almacenamiento seguro de claves', fRemoteSigning: 'Firma remota', fAnyClient: 'Funciona con cualquier cliente', fCrossDevice: 'Sincronización entre dispositivos', fMultiKeySupport: 'Soporte multiusuario', fNip07: 'Soporte NIP-07', fNip46: 'Soporte NIP-46', fFlexibleSigning: 'Firma flexible', fNativeIos: 'App nativa para iOS', fLightweight: 'Ligera', fEasyToUse: 'Fácil de usar', fChromeSupport: 'Compatible con Chrome/Brave/Edge', fLightningPayments: 'Pagos Lightning', fNostrSigning: 'Firma en Nostr', fWebln: 'Soporte WebLN', fNwc: 'Soporte NWC', fCleanUi: 'Interfaz limpia', fPrivacyFocused: 'Centrada en la privacidad', fExtensionMobile: 'Soporte de extensiones en móvil', fFullBrowser: 'Experiencia de navegador completa', fGraphene: 'Funciona en GrapheneOS', }, betaDisclaimer: { title: 'Atención: esto es beta', subtitle: 'Unas palabras antes de empezar.', ossTitle: 'Código abierto y experimental', ossBody: 'Construido en abierto por la comunidad. Curiosea, bifurcalo, rómpelo.', betaTitle: 'En beta — sin auditar', betaBody: 'El código aún no ha pasado una auditoría de seguridad formal. Los errores ocurren.', moneyTitle: 'Maneja Bitcoin y Lightning reales', moneyBody: 'Usa dinero con él bajo tu propio riesgo. Carga solo lo que puedas permitirte perder.', finePrint: 'Sin garantía de ningún tipo. Eres el único responsable de tus fondos y claves.', viewCode: 'Ver el código', accept: 'Entendido, déjame entrar', }, }, walletUi: { page: { title: 'Cartera', subtitle: 'Bitcoin Lightning + Cashu', manage: 'Gestionar', getAWallet: 'Consigue una cartera', learnPlanB: 'Aprende más en Plan B Academy', walletMinibits: 'Cashu móvil · NWC', walletAlby: 'Extensión del navegador · WebLN + NWC', walletZeus: 'Lightning autocustodiado', walletCoinos: 'Web · funciona en todas partes', whatAreZaps: '¿Qué son los zaps?', whatAreZapsShort: '¿Qué son los zaps?', zapsDesc: 'Pagos instantáneos por Bitcoin Lightning. Envía sats a cualquier patinador, creador de spots o entrenador — sin intermediarios, sin comisión de plataforma.', instant: 'Instantáneo', instantDesc: 'Se liquida en segundos', flexible: 'Flexible', flexibleDesc: 'Tu cartera, tus claves', private: 'Privado', privateDesc: 'Cashu oculta quién paga', direct: 'Directo', directDesc: 'El valor va al creador', loginRequired: 'Inicia sesión', loginRequiredDesc: 'Inicia sesión con tu cuenta de Nostr para conectar tu cartera Lightning y empezar a enviar zaps.', browseMints: 'Explorar mints de Cashu', }, modal: { walletName: 'Nombre de la cartera (opcional)', walletNamePlaceholder: 'Mi cartera Lightning', connectionUri: 'URI de conexión', spendLimitTitle: 'Primero pon un límite de gasto', spendLimitBody1: 'Esta cadena permite que SkateSpots pague facturas Lightning desde tu cartera. En tu app de cartera, dale a esta conexión un pequeño', dailyBudget: 'presupuesto diario', spendLimitBody2: '(por ejemplo, unos miles de sats) y habilita solo', spendLimitBody3: 'Nunca pegues una conexión con presupuesto ilimitado. Puedes revocarla en tu cartera cuando quieras.', addWallet: 'Añadir cartera', nwcConnection: 'Conexión NWC', lightningWallet: 'Cartera Lightning', pasteNwc: 'Pega tu cadena de conexión NWC para enviar zaps', connectWallet: 'Conectar cartera', browserExtension: 'Extensión del navegador (WebLN)', autoDetected: 'Se detecta automáticamente si está instalada', ready: 'Lista', notFound: 'No encontrada', getNwcFrom: 'Consigue NWC en:', connectionRequired: 'URI de conexión obligatoria', connectionRequiredDesc: 'Introduce una URI de conexión NWC válida.', activeChanged: 'Cartera activa cambiada', activeChangedDesc: 'La cartera seleccionada ya está activa para los zaps.', connectNwc: 'Conectar cartera NWC', connectNwcDesc: 'Introduce tu cadena de conexión desde una cartera compatible.', connect: 'Conectar', connecting: 'Conectando...', walletSettings: 'Ajustes de cartera', connectDesc: 'Conecta tu cartera Lightning para enviar zaps al instante.', }, cashu: { title: 'Cartera Cashu', desc: 'Cartera ecash integrada — sin configuración externa', initializing: 'Iniciando cartera...', walletError: 'Error de cartera', balance: 'Saldo', balanceAria: 'Saldo de la cartera {{amount}} sats', activeMint: 'Mint activo', selectMint: 'Elige un mint', receive: 'Recibir', send: 'Enviar', receiveViaLightning: '⚡ Recibir por Lightning', amountSats: 'Cantidad en sats', generateInvoice: 'Generar factura', generating: 'Generando…', or: 'O', receiveCashu: '🥜 Recibir token Cashu', scanQr: 'Escanear QR', pasteCashu: 'Pega un token Cashu (cashu...)', receiveToken: 'Recibir token', receiving: 'Recibiendo…', createCashu: '🥜 Crear token Cashu', createToken: 'Crear token', creating: 'Creando…', payInvoice: '⚡ Pagar factura Lightning', pasteInvoice: 'Pega una factura Lightning (lnbc...)', payInvoiceBtn: 'Pagar factura', processing: 'Procesando...', payAddress: '📧 Pagar dirección Lightning', sendToAddress: 'Enviar a la dirección', sending: 'Enviando…', recentActivity: 'Actividad reciente', receivedLightning: 'Recibido ⚡ Lightning', sentLightning: 'Enviado ⚡ Lightning', sentToken: 'Enviado 🥜 token', receivedToken: 'Recibido 🥜 token', whatIsCashu: '¿Qué es Cashu?', whatIsCashuDesc: 'Cashu es dinero digital respaldado por Bitcoin Lightning. Piénsalo como tokens de Bitcoin que guardas en tu navegador.', benefitOffline: 'Funciona sin conexión en los spots', benefitInstant: 'Pagos entre iguales instantáneos', benefitPrivacy: 'Centrado en la privacidad (los mints no pueden rastrearte)', benefitRedeemable: 'Siempre canjeable por sats de Lightning', findMints: 'Encuentra mints en mintradar.pedani.eu', backupTitle: 'Haz copia de tu cartera', backupDesc: 'Tu cartera está protegida con una frase de recuperación de 12 palabras. Guárdala a salvo — la necesitarás para restaurar tu saldo si borras los datos del navegador.', viewRecovery: 'Ver frase de recuperación', backupNote: 'Es como tu nsec de Nostr — ¡mantenlo en secreto y con copia de seguridad!', tokenReceived: 'Token recibido', tokenReceivedDesc: '¡Token Cashu canjeado correctamente!', receiveFailed: 'Error al recibir', unknownError: 'Error desconocido', requestUnsupported: 'Solicitud Cashu aún no compatible', requestUnsupportedDesc: 'Esta cartera aún no puede pagar una solicitud Cashu (creq) — pide una factura o dirección Lightning.', onchainUnsupported: 'On-chain no compatible aquí', onchainUnsupportedDesc: 'Eso es una dirección de Bitcoin. Esta cartera solo envía tokens Cashu y pagos Lightning.', nostrProfile: 'Eso es un perfil de Nostr', nostrProfileDesc: 'Escanea un token Cashu, una factura Lightning o una dirección Lightning para pagar.', clinkUnsupported: 'Código de pago aún no compatible', clinkUnsupportedDesc: 'Esta cartera aún no puede pagar códigos CLINK. Usa una factura o dirección Lightning.', unrecognizedQr: 'Código QR no reconocido', unrecognizedQrDesc: 'Escanea un token Cashu, una factura Lightning o una dirección Lightning.', invalidAmount: 'Cantidad no válida', invalidAmountDesc: 'Introduce una cantidad válida', paymentSent: 'Pago enviado', paymentSentDesc: 'Enviados {{amount}} sats a {{address}}', paymentFailed: 'Pago fallido', copied: 'Copiado', copiedDesc: '{{label}} copiado al portapapeles', receiveSats: 'Recibir {{amount}} sats', payInvoiceHint: 'Paga esta factura desde cualquier cartera Lightning', invoiceQrAlt: 'Código QR de la factura', lightningInvoice: 'Factura Lightning', invoiceLabel: 'Factura', waiting: '⏳ Esperando el pago...', tokenReady: 'Token listo para enviar', shareToken: 'Comparte este token con el destinatario', tokenQrAlt: 'Código QR del token', cashuToken: 'Token Cashu', tokenLabel: 'Token', copyToken: 'Copiar token', tokenWarning: 'Cualquiera con este token puede reclamarlo — ¡trátalo como efectivo!', browser: { title: 'Cartera ecash integrada', appOnly: 'Solo app', desc: 'Ecash Cashu autocustodiado, impulsado por Bitcoin Lightning', unlockTitle: 'Desbloquea la cartera completa en la app de SkateSpots', unlockDesc: 'La cartera ecash integrada te permite emitir, enviar y canjear tokens Cashu justo en el spot. Vive en la app nativa, donde puede hablar directamente con los mints — los navegadores aíslan esas conexiones por tu seguridad.', zapTipTitle: 'Zap y propina — ya funciona en tu navegador', zapTipDesc: 'Enviar sats a spots, eventos, entrenadores y crews funciona aquí mismo. Solo conecta una cartera Lightning abajo — Nostr Wallet Connect o una extensión como Alby. No hace falta ningún mint de Cashu.', }, }, escrow: { title: 'Escrow', desc: 'Anuncia una clave pública para que los compradores puedan bloquearte fondos en un intercambio. Los fondos son reembolsables al comprador si el trato no sale.', active: 'Clave de escrow activa', publish: 'Publicar clave de escrow', published: 'Clave de escrow publicada', publishedDesc: 'Los compradores ya pueden bloquearte fondos en escrow.', failed: 'No se pudo publicar la clave', }, privacy: { title: 'Consejos de privacidad', subtitle: 'Aprende a proteger tu privacidad financiera', cashuRecommended: 'CASHU (Recomendado)', anon: 'Transacciones anónimas', blind: 'Las firmas ciegas ocultan la actividad', noIp: 'Sin exposición de IP', trustMint: 'Confía en el mint con fondos', lightningAddress: 'DIRECCIÓN LIGHTNING', linked: 'Se puede vincular a tu identidad', traceable: 'Historial de pagos rastreable', ipVisible: 'IP visible al facturar', selfCustody: 'Autocustodia posible', bestPractices: 'Buenas prácticas', tip1Title: 'Usa Cashu para recibir propinas', tip1Desc: 'La cartera Cashu integrada es la forma más privada de recibir zaps', tip2Title: 'Usa una cartera aparte para SkateSpots', tip2Desc: 'No uses tu cartera principal de ahorros — mantén los fondos de la app separados', tip3Title: 'Considera usar VPN o Tor', tip3Desc: 'Oculta tu dirección IP al hacer transacciones', tip4Title: 'Evita direcciones Lightning vinculadas a tu identidad', tip4Desc: 'Usa direcciones seudónimas no ligadas a tu nombre real', proTip: 'Consejo pro:', proTipDesc: 'Recibe los pagos primero en tu cartera Cashu y luego mueve periódicamente cantidades mayores a tu cartera personal usando una VPN para la transferencia.', warnTitle: 'Nota de privacidad', warnDesc: 'Las direcciones Lightning pueden vincular tu actividad en SkateSpots con tu identidad real.', betterPrivacy: 'Para mejor privacidad:', bullet1: 'Usa una cartera dedicada para esta app', bullet2: 'Considera usar la cartera Cashu en su lugar', bullet3: 'Usa VPN/Tor para las transacciones', useCashu: 'Usar Cashu en su lugar', understand: 'Lo entiendo', }, mintPrivacy: { title: 'Privacidad de mints', desc: 'Usar varios mints mejora la privacidad al impedir que un solo mint vea todas tus transacciones', distribution: 'Distribución de fondos', singleWarning: 'Usar un solo mint significa que ese mint puede ver todos los importes y momentos de tus transacciones. Considera añadir más mints para mejor privacidad.', yourMints: 'Tus mints ({{count}})', default: 'Predeterminado', addMint: 'Añadir mint', addMintDesc: 'Añade un nuevo mint Cashu a tu cartera', mintUrl: 'URL del mint', add: 'Añadir', adding: 'Añadiendo...', orChoose: 'O elige de la lista', recommended: 'Mints recomendados', added: 'Añadido', soon: 'Pronto', autoDistribute: 'Distribuir fondos automáticamente', autoDesc: 'Reparte los fondos recibidos entre varios mints', autoAria: 'Distribuir fondos automáticamente (próximamente)', tip1: 'Usa un mínimo de 2-3 mints distintos para mejor privacidad', tip2: 'No guardes todos los fondos en un solo mint — repártelos', tip3: 'Ten en cuenta la jurisdicción del mint (distintos países = distinto acceso legal)', tip4: 'Los mints ven el momento de las transacciones pero NO a quién pagas (firmas ciegas)', future: 'Próximas funciones: rotación de mints y puntuación de privacidad — ¡atento!', findMore: 'Encuentra más mints en mintradar.pedani.eu', trustWarning: 'Aviso de confianza:', trustWarningDesc: 'Los mints son custodiales — guardan tus fondos. Usa solo mints en los que confíes. Si un mint desaparece, tus fondos pueden perderse. Repartir los fondos entre varios mints reduce el riesgo.', removeTitle: '¿Quitar el mint?', removeDesc: '¿Seguro que quieres quitar {{name}}?', removeMint: 'Quitar mint', warning: 'Aviso:', withdrawWarning: 'Este mint tiene {{amount}} sats. ¡Retira tus fondos antes de quitarlo!', invalidUrl: 'URL no válida', invalidUrlDesc: 'La URL del mint debe empezar por https://', mintAdded: 'Mint añadido', mintAddedDesc: 'Nuevo mint añadido correctamente', mintAddedNamed: '{{name}} añadido correctamente', failedAdd: 'No se pudo añadir el mint', failed: 'Falló', noMints: 'Sin mints', singleMint: 'Un solo mint', concentrated: 'Concentrado', moderate: 'Moderado', wellDistributed: 'Bien distribuido', mintCoinosWebDesc: 'Mint compatible con la web (recomendado para navegadores)', mintMinibitsWebDesc: '⚠ Solo app nativa — no accesible desde navegadores', mintMinibitsNativeDesc: 'Mint de SkateSpots — recomendado', mintCoinosDesc: 'Mint compatible con la web', mintLnbitsDesc: 'Mint comunitario en LNbits', }, nwc: { title: 'Cartera Lightning', noConnection: 'Cartera NWC', refresh: 'Actualizar saldo', createInvoice: 'Crear factura', copyInvoice: 'Copiar factura', pasteInvoice: 'Pega una factura Lightning (lnbc…)', amount: 'Importe: {{amount}} sats', pasteToSee: 'Pega una factura para ver el importe', pay: 'Pagar', invoiceQrAlt: 'Código QR de la factura Lightning', enterAmount: 'Introduce una cantidad en sats', readBalanceFailed: 'No se pudo leer el saldo', readBalanceFailedDesc: 'Tu cartera no respondió.', createInvoiceFailed: 'No se pudo crear la factura', createInvoiceFailedDesc: 'Inténtalo de nuevo en un momento.', paymentSent: 'Pago enviado', paidAmount: 'Pagados {{amount}} sats.', paid: 'Pagado.', paymentRejected: 'La cartera rechazó el pago.', }, qr: { title: 'Escanear código QR', desc: 'Coloca el código QR dentro de la vista de la cámara para escanear', paste: 'Pegar del portapapeles', hint: 'Escanea un token Cashu, una factura Lightning o una dirección Lightning', clipboardEmpty: 'Portapapeles vacío', clipboardEmptyDesc: 'No se encontró texto en el portapapeles', pasteFailed: 'Error al pegar', pasteFailedDesc: 'No se pudo leer del portapapeles', }, recovery: { title: 'Frase de recuperación', desc: 'Estas 12 palabras son la única forma de restaurar tu saldo ecash. Escríbelas en orden y guárdalas sin conexión — nunca las compartas con nadie.', tapReveal: 'Toca para mostrar', noWatching: 'Asegúrate de que nadie esté mirando', hide: 'Ocultar', reveal: 'Mostrar', paperHint: 'Lo más seguro es escribirlo en papel — copiarlo al portapapeles puede filtrarse a otras apps.', written: 'Ya lo he anotado', revealFirst: 'Primero muestra las palabras', copiedDesc: 'Frase de recuperación copiada — pégala en un lugar seguro y luego vacía el portapapeles.', copyFailed: 'Error al copiar', copyFailedDesc: 'Mejor escribe las palabras a mano.', }, guide: { quickGuide: 'Guía rápida', fullGuide: 'Guía de carteras (edición patinador)', cashuSummary: 'Privacidad + comodidad', mintHoldsFunds: '(el mint guarda los fondos)', lightningSummary: 'Control + seguridad', youHoldKeys: '(tú tienes las claves)', useBoth: 'Usa las dos: Cashu para propinas, Lightning para ahorros', cashuTitle: 'CARTERA CASHU', cashuTagline: 'Como efectivo en el bolsillo en el skatepark', cashuBullet1: 'Rápida de sacar para una propina', cashuBullet2: 'No lleves aquí todos tus ahorros', cashuBullet3: 'Si el mint desaparece, los fondos podrían perderse', cashuBullet4: 'Nadie sabe cuánto tienes (¡privacidad!)', cashuPerfectFor: 'Aperitivos de sesión, zapear clips, propinas pequeñas', lightningTitle: 'CARTERA LIGHTNING', lightningTagline: 'Como tu cuenta bancaria — tú tienes el control', lightningBullet1: 'Segura, tú controlas las claves', lightningBullet2: 'Tarda un momento en configurarse', lightningBullet3: 'Historial completo de transacciones', lightningBullet4: 'Mejor para cantidades mayores', lightningPerfectFor: 'Compras de material, ahorros, zaps grandes', perfectFor: 'Perfecta para:', proTips: 'CONSEJOS PRO', tip1Title: 'Usa las dos carteras', tip1Desc: 'Guarda el dinero de la sesión en Cashu y los ahorros en Lightning', tip2Title: 'Prueba distintas carteras', tip2Desc: 'Experimenta para encontrar la que te funcione. Cada una tiene funciones y ventajas distintas', tip3Title: 'Mejor privacidad', tip3Desc: 'Usar varias carteras significa que ninguna app ve toda tu actividad', tip4Title: 'Gana experiencia', tip4Desc: 'Cuantas más herramientas conozcas, más opciones tendrás. Empieza poco a poco y aprende sobre la marcha', tldr: 'En resumen:', tldrDesc: 'No hay una cartera "mejor" — depende de lo que necesites. Prueba las dos, usa la que te convenza y ¡no guardes todos tus sats en un solo sitio!', }, zap: { count: '{{count}} zaps', connectFirst: 'Conecta primero tu cartera', connectFirstDesc: 'Para enviar zaps (propinas en Bitcoin) necesitas conectar una cartera Lightning.', quickSetup: 'Configuración rápida (30 segundos)', quickSetupDesc: 'Conecta tu cartera Lightning actual con Nostr Wallet Connect (NWC). No hacen falta cuentas adicionales.', connectNwc: 'Conectar cartera con NWC', noWallet: '¿No tienes cartera? Aprende cómo', skip: 'Omitir por ahora (factura manual)', note: 'ℹ️ Nota:', noteDesc: 'Aún puedes crear una factura sin conectar una cartera, pero tendrás que copiarla manualmente para pagar.', payWithWebln: 'Pagar con WebLN', processing: 'Procesando...', openInWallet: 'Abrir en la cartera Lightning', scanHint: 'Escanea el código QR o copia la factura para pagar con cualquier cartera Lightning.', cashuInstant: 'Paga al instante con tu cartera integrada', satsAvailable: 'sats disponibles', or: 'O', customAmount: 'Cantidad personalizada', addComment: 'Añade un comentario (opcional)', insufficientBanner: '⚠️ Saldo Cashu insuficiente. Te faltan {{amount}} sats. Cambia a Lightning o recarga tu cartera Cashu.', creatingInvoice: 'Creando factura...', zapAmount: 'Zap de {{amount}} sats', zapAmountCashu: 'Zap de {{amount}} sats con Cashu', lightningInvoice: 'Factura Lightning', qrAlt: 'Código QR de la factura Lightning', enterAmount: 'Introduce una cantidad', enterAmountDesc: 'Elige un valor predefinido o escribe un número válido de sats.', cashuUnavailable: 'Cartera Cashu no disponible', cashuUnavailableDesc: 'Tu cartera Cashu no está lista. Cambia a Lightning o abre primero tu cartera.', insufficientCashu: 'Saldo Cashu insuficiente', insufficientCashuDesc: 'Te faltan {{amount}} sats. Cambia a Lightning o recarga.', zapSentCashu: '¡Zap enviado! 🥜', zapSentCashuDesc: 'Zapeados {{amount}} sats desde tu cartera Cashu.', cashuFailed: 'Pago con Cashu fallido', cashuFailedDesc: 'No se pudo pagar con tu cartera Cashu.', invoiceCopied: 'Factura copiada', invoiceCopiedDesc: 'Factura Lightning copiada al portapapeles', defaultComment: '¡Zapeado en SkateSpots! 🛹', titleConnect: 'Conectar cartera', titlePayment: 'Pago Lightning', titleZap: 'Enviar un zap', descConnect: 'Conecta tu cartera Lightning para enviar zaps', descPayment: 'Paga con la red Bitcoin Lightning', descZap: 'Los zaps son pequeños pagos en Bitcoin que apoyan al creador de este contenido. Si te ha gustado, ¡considera enviar un zap!', descZapShort: 'Los zaps son pequeños pagos en Bitcoin que apoyan a los creadores. ¡Considera enviar un zap!', }, zapCrew: { title: 'Zapear al crew', desc: 'Reparte un zap a partes iguales entre {{count}} miembros del crew con dirección Lightning.', noMembers: 'No hay otros miembros del crew a los que zapear ahora mismo.', totalAmount: 'Cantidad total', customTotal: 'Total personalizado', each: 'sats cada uno', rounded: '(redondeado)', noWallet: 'No hay cartera conectada — recibirás una factura por miembro para pagar a mano. Conecta una cartera para repartir con un toque.', zapAcross: 'Zap de {{amount}} sats entre {{count}}', sentTo: '⚡ Enviado a {{done}}/{{total}}', none: 'No se completó ningún pago automático', copyPending: 'Copia las facturas pendientes para terminar de pagar a mano.', thanks: '¡Gracias por apoyar al crew!', payingCrew: 'Pagando al crew…', defaultComment: '¡Zapeé al crew {{crew}}! 🤘', sent: 'Enviado', paying: 'Pagando', resolving: 'Resolviendo', skipped: 'Omitido', failed: 'Falló', waiting: 'En espera', copyInvoice: 'Copiar factura', invoiceCopied: 'Factura copiada', invoiceCopiedDesc: 'Pégala en cualquier cartera Lightning', }, zapBadges: { title: 'Insignias de zaps', zaps: 'zaps', satsSent: 'sats enviados', rank: 'puesto', footnote: 'Basado en los últimos 30 días de zaps.', first: 'Primer zap', firstHint: 'Envía tu primer zap', regular: 'Habitual', regularHint: 'Envía 10 zaps', generous: 'Generoso', generousHint: 'Envía 10.000 sats', patron: 'Mecenas', patronHint: 'Envía 100.000 sats', top10: 'Top 10', top10Hint: 'Entra en el top 10 de patrocinadores', }, trust: { unavailable: 'Puntuación de confianza no disponible', yourContent: 'Esto es tu contenido', following: 'Sigues a este usuario', friendOfFriend: 'Amigo de un amigo (2 saltos)', nip05: 'Usuario verificado con NIP-05', unknown: 'Usuario desconocido', help: 'Las puntuaciones de confianza ayudan a identificar colaboradores fiables en la comunidad de skate.', }, share: { title: 'Compartir perfil', desc: 'Apunta con la cámara del móvil al código para abrir el perfil de {{name}}.', qrAlt: 'Código QR del perfil', copyLink: 'Copiar enlace', copyFailed: 'Error al copiar', copyFailedDesc: 'No se pudo copiar el enlace.', shareEllipsis: 'Compartir…', }, addToCollection: { title: 'Guardar en colección', desc: 'Guarda "{{spot}}" en una de tus colecciones', loginRequired: 'Inicia sesión para guardar spots en colecciones', noCollections: 'Aún no tienes ninguna colección', createFirst: '¡Crea la primera abajo!', spotCount: '{{count}} spots', alreadySavedTag: 'Ya guardado', alreadySaved: 'Ya guardado', alreadySavedDesc: '“{{spot}}” ya está en “{{collection}}”', saved: '¡Spot guardado!', savedDesc: 'Añadido "{{spot}}" a "{{collection}}"', saveFailed: 'No se pudo guardar', somethingWrong: 'Algo salió mal', created: '¡Colección creada!', createdDesc: 'Añadido "{{spot}}" a tu nueva colección "{{collection}}"', createFailed: 'No se pudo crear la colección', name: 'Nombre de la colección', descriptionOptional: 'Descripción (opcional)', creating: 'Creando...', createAndSave: 'Crear y guardar', createNew: 'Crear nueva colección', }, collection: { back: 'Volver a colecciones', created: 'Creada {{date}}', deleteTitle: '¿Eliminar la colección?', deleteDesc: 'Esto eliminará permanentemente "{{title}}". Los spots en sí no se verán afectados.', deleting: 'Eliminando...', deleteFailed: 'No se pudo eliminar la colección', deleted: 'Colección eliminada', deletedDesc: '"{{title}}" se ha eliminado', empty: 'No hay spots en esta colección', emptyOwner: 'Añade spots a tu colección pulsando "Guardar en colección" en cualquier spot', emptyOther: 'Esta colección está vacía', browseSpots: 'Explorar spots', linkCopied: '¡Enlace copiado!', linkCopiedDesc: 'El enlace de la colección se ha copiado al portapapeles', map: 'Mapa de la colección', removeFailed: 'No se pudo quitar el spot', shareText: 'Mira esta colección de spots: {{title}}', spotRemoved: 'Spot quitado', spotRemovedDesc: '"{{title}}" se ha quitado de esta colección', }, mints: { title: 'Mints', subtitle: 'Explora mints de Cashu y su estado. Las operaciones de la cartera Cashu se ejecutan en la app de SkateSpots.', searchPlaceholder: 'Busca mints por nombre o URL…', onlineOnly: 'Solo en línea', count: '{{filtered}} de {{total}} mints', directoryError: 'No se pudo cargar el directorio de mints.', directoryHint: 'El directorio lo mantiene la comunidad y tiene límite de peticiones — puede no estar disponible un momento.', goToWallet: 'Ir a la cartera', appOnly: 'Añadir un mint se hace en la app de SkateSpots (Cashu es solo para la app).', noMatch: 'Ningún mint coincide con “{{query}}”.', footer: 'Datos de estado del proyecto comunitario MintRadar — no oficiales y pueden estar desactualizados. Revisa siempre los términos de un mint antes de confiarle fondos.', archived: 'Archivado', degraded: 'Degradado', offline: 'Sin conexión', online: 'En línea', terms: 'Términos', reliability: 'fiabilidad', add: 'Añadir', addToWallet: 'Añadir a la cartera', copyUrl: 'Copiar URL', openMint: 'Abrir mint', inWallet: 'En tu cartera', addedBadge: 'Añadido', urlCopied: 'URL del mint copiada', added: 'Mint añadido', addedDesc: '{{host}} ya está en tu cartera.', couldNotAdd: 'No se pudo añadir el mint', communityRating: 'Valoración de la comunidad', reliabilityLabel: 'Fiabilidad', uptime: 'Tiempo activo 24 h / 7 d', location: 'Ubicación', latency: 'Latencia', nuts: 'NUTs compatibles', units: 'Unidades', version: 'Versión', ratedBy: 'Valorado {{rating}}/5 por {{count}} personas en MintRadar.', noRating: 'Aún no hay valoración de la comunidad en MintRadar.', reviewsNote1: 'Las reseñas escritas no forman parte del directorio —', openMintRadar: 'abre MintRadar', reviewsNote2: 'para leer o dejar una.', liveness: 'Auditoría de actividad: {{mints}} mints y {{melts}} melts probados', livenessErrors: ' · {{errors}}/{{total}} errores recientes', whatsAMint: '¿Qué es un mint?', whatsAMintDesc: 'Un mint de Cashu emite y canjea el ecash de tu cartera. Guarda el Bitcoin que respalda tus tokens — así que un mint que no gestionas tú es uno en el que tienes que confiar.', mintWarning: 'Los mints pueden caerse, cambiar sus términos o desaparecer con los fondos. Mantén solo saldos pequeños salvo que confíes en el operador.', healthDisclaimer: 'Los datos de estado los mantiene la comunidad (MintRadar) — no oficiales y posiblemente desactualizados.', }, appShop: { title: 'Tienda de la app', subtitle: 'Merch de SkateSpots para quien mantiene la escena en marcha.', comingSoon: 'Muy pronto', wearThe: 'Viste la', scene: 'Escena', heroDesc1: 'Merch para quien mantiene esto rodando — se vende', locally: 'en local, bajo pedido', heroDesc2: '. Me escribes, concretamos los detalles y pagas en', heroDesc3: '— Lightning o Cashu — cuando lo recojas. Sin tarjetas, sin cuentas, sin robot de pago, sin intermediarios que se lleven tajada.', requestItem: 'Pide un artículo', dmHint: 'Abre un DM privado y cifrado conmigo.', lightning: 'Lightning', cashu: 'Cashu', localHandover: 'Entrega en local', inTheWorks: 'En preparación', notForSale: 'aún no a la venta', soon: 'pronto', tees: 'Camisetas y sudaderas', decks: 'Tablas', shopTools: 'Herramientas de tienda', stickerPacks: 'Packs de pegatinas', stickerPacksDesc: 'Los packs están en camino. Los diseños no — imprime estos dos ahora mismo, gratis.', sticker: 'Pegatina', stickerTip: 'Troquelada en negro. Imprime en papel de pegatina y recorta por el borde negro.', poster: 'Póster', posterTip: 'Se imprime en A3; reduce a A4 (50%) y sigue escaneándose bien.', printableAlt: 'SkateSpots {{title}} — imprimible', print: 'Imprimir', printNote1: 'Imprime al', actualSize: '100% / “Tamaño real”', printNote2: 'para que el tamaño sea exacto y el QR siga nítido — apunta a skate-spots.org. Son archivos vectoriales, así que escalan sin pixelarse.', howBuying: 'Cómo funciona la compra', dmNotCart: 'es un DM, no un carrito', step1Title: 'Escríbeme', step1Desc: 'Manda un DM con lo que quieres — artículo, talla, color, lo que sea.', step2Title: 'Lo concretamos', step2Desc: 'Precio en sats y dónde y cuándo quedar. Es una conversación, no un pago automático.', step3Title: 'Paga en sats', step3Desc: 'Lightning o Cashu en la entrega, y ya es tuyo. Sin envíos, sin salas de espera.', }, newsletter: { newIssue: 'Nuevo número', composerTitle: 'Publicar un número del boletín', composerDesc: 'Se publica como artículo NIP-23 (kind 30023) en el relé comunitario. Los suscriptores lo reciben en su campana de notificaciones. El cuerpo admite Markdown.', fieldTitle: 'Título', identifier: 'Identificador (slug)', leaveBlank: 'déjalo en blanco para generarlo solo', reusingSlug: 'Reutilizar un slug existente edita ese número en vez de crear uno nuevo.', summary: 'Resumen', optional: 'opcional', coverImage: 'URL de la imagen de portada', bodyMarkdown: 'Cuerpo (Markdown)', characters: '{{count}} caracteres', publishIssue: 'Publicar número', issuePublished: '¡Número publicado! 🛹', issuePublishedDesc: 'Los suscriptores lo verán en su campana de notificaciones.', publishFailed: 'Error al publicar', couldNotReachRelay: 'No se pudo alcanzar ningún relé — revisa tu conexión e inténtalo de nuevo.', tryAgain: 'Inténtalo de nuevo.', publishedToNostr: 'Publicado en Nostr', publishedToast: '¡Publicado!', postedToNostr: 'Drop {{number}} publicado en Nostr.', postToNostr: 'Publicar en Nostr', previewLabel: 'Vista previa', editFirst: 'Editar primero', previewNoteDesc: 'Así se verá la nota en la mayoría de clientes de Nostr. El formato varía según el cliente.', editNoteDesc: 'Edita el texto de la nota abajo. Los cambios solo afectan a esta publicación — el archivo original no cambia.', dropNumber: 'Drop {{number}}', publish: 'Publicar', publishing: 'Publicando...', dropIsOut: 'Ha salido el drop {{number}}', daysAgo: 'hace {{count}} d', dismiss: 'Descartar', itsMonday: 'Es lunes', mondayDesc: 'Hora de lanzar el boletín semanal. Un clic y la IA lo escribe desde el git log.', writeDrop: 'Escribir el drop {{number}}', dismissReminder: 'Descartar recordatorio', loginPrompt: 'Inicia sesión con Nostr para recibir los nuevos drops en tu buzón.', subscribedToast: '¡Estás suscrito! 🛹', subscribedToastDesc: 'Los nuevos drops llegarán a tu campana de notificaciones en "News".', unsubscribed: 'Suscripción cancelada', unsubscribedDesc: 'Aún puedes leer todos los números aquí cuando quieras.', checking: 'Comprobando…', subscribed: 'Suscrito', unsubscribe: 'Cancelar suscripción', subscribeCta: 'Suscríbete al boletín', archiveSynced: 'Archivo sincronizado con Nostr', missingCount: '{{count}} números del archivo aún no están en Nostr', backfillDesc: 'Publica {{list}} como artículos NIP-23 para que suscriptores y lectores de formato largo vean el archivo completo. La página conserva su diseño enriquecido igualmente.', backfill: 'Sincronizar {{count}} en Nostr', publishing2: 'Publicando…', publishingLabel: 'Publicando…', backfilled: 'Sincronizados {{count}} números 🛹', backfilledDesc: 'El archivo ya vive en Nostr para suscriptores y lectores.', partialBackfill: 'Publicados {{published}}, {{failed}} fallidos', retryFinish: 'Reintenta para terminar: {{list}}.', notLoggedIn: 'No has iniciado sesión', allIssues: 'Todos los números', brand: 'Boletín de SkateSpots', digTheDrop: '¿Te mola el drop? Zapea y no te pierdas el siguiente.', sectionStats: 'La comunidad en cifras', sectionWhatsNew: 'Novedades', sectionSpotOfWeek: 'Spot de la semana', sectionCommunity: 'Comunidad', sectionSupport: 'Apoya el proyecto', sectionLatestDrops: 'Últimos drops · En directo desde Nostr', mappedBy: 'Mapeado por', viewOnMap: 'Ver en el mapa', noSpotPicked: 'Esta semana no hay spot elegido. ¡Manda el tuyo y puede salir en el próximo drop!', browseMap: 'Explorar el mapa', spotMap: 'Mapa de spots', statsBadge: 'Estadísticas', supportDesc: '100% código abierto, financiado por la comunidad, sin anuncios, sin inversores. Si te resulta útil, zapea o apóyalo en Angor.', readFull: 'Leer el número completo', joinSkaters: 'Únete a {{count}} patinadores que reciben los drops', weeklyDrops: 'Drops semanales', tagline: 'Un boletín semanal · publicado cuando nos dé la gana', freeNote: 'Gratis. Con la tecnología de Nostr — tu suscripción vive en tus claves y te sigue entre dispositivos. Los nuevos drops llegan a tu campana de notificaciones.', live: 'En directo', builtOn: 'Hecho con', openSource: 'Código abierto', supportUs: 'Apóyanos', freeToSkate: 'Eres libre de patinar', }, stats: { subtitle: 'Métricas en directo sacadas directamente de la red Nostr. Transparentes, descentralizadas y verificables por cualquiera.', dataSource: 'Fuente de datos:', updated: 'actualizado {{age}}', refresh: 'Actualizar', partial: 'No se pudo alcanzar todos los relés — estas cifras pueden estar incompletas.', error: 'No se pudo alcanzar el relé ahora mismo. Las estadísticas se cargarán cuando vuelva la conexión.', atAGlance: 'La comunidad de un vistazo', skateSpots: 'Skate spots', listedShops: 'Tiendas listadas', events: 'Eventos', mappers: 'Mapeadores', uniqueContributors: 'colaboradores únicos', labHeader: 'The Lab · Creadores y servicios', total: '{{count}} en total', coaches: 'Entrenadores', filmers: 'Filmers', editors: 'Editores', photographers: 'Fotógrafos', builders: 'Constructores', artists: 'Artistas', graffiti: 'Graffiti', tattoo: 'Tatuaje', trainers: 'Preparadores', musicians: 'Músicos', judges: 'Jueces', organizers: 'Organizadores', barbers: 'Barberos', showFewer: 'Mostrar menos', showAllCrafts: 'Mostrar los 13 oficios', community: 'Comunidad', tours: 'Rutas', crews: 'Crews', marketplace: 'Mercado', liveListings: 'Anuncios activos', tradesRecorded: 'Intercambios registrados', satsTraded: 'Sats intercambiados', zapsToMappers: 'Zaps a mapeadores', tradesNote1: 'intercambios mutuos entre', tradesNote2: 'personas. Los sats los declaran los propios comerciantes — la app no puede observar un pago fuera de ella — así que el titular solo cuenta intercambios', mutual: 'mutuos', tradesNote3: 'con un tope por pareja; la cifra declarada en bruto es', tradesNote4: 'sats. "Zaps a mapeadores" solo cuenta recibos dirigidos a nuestros principales colaboradores —', not: 'no', tradesNote5: 'es el volumen global de zaps.', byRegion: 'Spots y tiendas por región', resolving: 'Resolviendo {{count}} ubicaciones sin etiqueta a partir de sus coordenadas… una vez, luego se guarda en caché en este dispositivo.', topCountries: 'Países principales', topCities: 'Ciudades principales', other: 'Otros', otherCountriesTitle: 'Países fuera del top 6', otherCitiesTitle: 'Ciudades fuera del top 6', uncategorised: 'Sin categoría', uncategorisedTitle: 'Sin etiqueta de ciudad/país', regionNote1: 'Cuenta', spotsAndShops: 'spots y tiendas', regionNote2: ', no patinadores — desde la propia etiqueta de ciudad/país de cada uno, o deducida de las coordenadas de su pin cuando no la tiene (en caché en tu dispositivo; países agrupados por código ISO si existe), solo el relé comunitario, con el contenido oculto por moderación excluido.', ofTotal: '{{count}} de {{total}}', regionNote3: 'ubicaciones no tienen etiqueta de ubicación y aparecen como "Sin categoría".', growth: 'Crecimiento en el tiempo', chartCumulativeTitle: 'Spots mapeados (acumulado)', chartCumulativeDesc: 'Total de spots añadidos al mapa a lo largo del tiempo', chartMonthlyTitle: 'Actividad mensual', chartMonthlyDesc: 'Contenido nuevo publicado cada mes', chartMappersTitle: 'Mapeadores activos / mes', chartMappersDesc: 'Colaboradores únicos que publican cada mes', chartMixTitle: 'Mezcla de contenido', chartMixDesc: 'Desglose por tipo de contenido (histórico)', noData: 'Aún no hay datos', topMappers: 'Mejores mapeadores', mostSpots: '— más spots añadidos', noMapperData: 'Aún no hay datos de mapeadores', supporters: 'Patrocinadores de la comunidad', fundedTitle: 'Financiado por la comunidad', fundedDesc1: 'Crowdfunding descentralizado en Bitcoin vía Angor.', fundedDesc2: 'Sin anuncios, sin inversores, sin venta de datos.', backAngor: 'Apóyanos en Angor', communityLink: 'Comunidad →', footer1: 'Todos los datos se obtienen en directo de', footer2: '— un relé público de Nostr.', footer3: 'Cada evento está firmado por su creador y es verificable criptográficamente.', footer4: 'No se pueden falsificar las cifras.', spots: 'Spots', shops: 'Tiendas', lab: 'Lab', thisMonth: '+{{count}} este mes', fromActive: '{{count}} de cuentas activas', viewAll: 'Ver todo', spotCount: '{{count}} spots', }, leaderboard: { mapEarn: 'Mapea y gana', helpMap: 'AYUDA A MAPEAR EL MUNDO', intro: 'Añade spots y tiendas, y deja que patinadores agradecidos te zapeen. ¡Los principales colaboradores pueden recibir recompensas extra!', howItWorks: 'Cómo funciona', step1Title: '1. Mapea', step1Desc: 'Añade spots y tiendas con fotos y detalles', step2Title: '2. Gana zaps', step2Desc: 'Los patinadores que encuentren útiles tus spots te darán propina', step3Title: '3. Recompensas extra', step3Desc: 'Los mejores mapeadores pueden recibir recompensas extra de nuestro fondo', proTips: '💡 Consejos pro para más zaps:', tipPhotos: 'Añade 3+ fotos', tipDescriptions: 'Escribe descripciones detalladas', tipLocation: 'Ubicación precisa', mapShop: 'Mapear una tienda', mapShopDesc: 'Skateshops, tiendas de tablas', mapSpot: 'Mapear un spot', mapSpotDesc: 'Parques, spots de calle, DIY', shops: 'Tiendas', spotsLower: 'spots', shopsLower: 'tiendas', contributions: 'aportaciones', yourRanking: 'Tu puesto', spotsShops: '{{spots}} spots • {{shops}} tiendas', totalLower: 'total', overall: 'General', noContributions: 'Aún no hay aportaciones. ¡Sé el primero!', addFirstSpot: 'Añadir el primer spot', noShops: 'Aún no hay tiendas mapeadas', addFirstShop: 'Añadir la primera tienda', noSpots: 'Aún no hay spots mapeados', poweredBy: 'Impulsado por los zaps de la comunidad', poweredByDesc: 'Cuando un spot te resulte útil, ¡zapea al mapeador! Es la mejor forma de dar las gracias y animar a más aportaciones.', you: 'Tú', zapTitle: 'Clasificación de zaps', zapSubtitle: 'Los spots que más cariño reciben — y los patinadores que lo dan.', thisWeek: 'Esta semana', thisMonth: 'Este mes', allTime: 'Histórico', topZappedSpots: 'Spots más zapeados', noZaps: 'Aún no hay zaps en este periodo. Sé el primero — pulsa el ⚡ en un spot que te guste.', topSupporters: 'Principales patrocinadores', noZapsSent: 'Aún no se han enviado zaps en este periodo.', fromTop10: '⚡ {{amount}} sats del top 10', supporter: 'Patrocinador', skateShop: 'Skate shop', skateSpot: 'Skate spot', }, supporters: { our: 'NUESTRA', community: 'COMUNIDAD', heroDesc: 'SkateSpots lo construye y lo mantiene la comunidad. Patrocinadores, colaboradores, socios y amigos que lo mantienen libre y descentralizado.', backAngor: 'Apóyanos en Angor', support: 'Apoyo', supportDesc: 'Financia SkateSpots en Angor — crowdfunding descentralizado on-chain en Bitcoin. Sin intermediarios, sin KYC.', collaborators: 'Colaboradores', collaboratorsDesc: 'Personas que construyen SkateSpots activamente — desarrolladores, diseñadores, operadores de relés.', partners: 'Socios', partnersDesc: 'Organizaciones y proyectos con los que trabajamos de cerca.', friends: 'Amigos', friendsDesc: 'Gente con buena onda.', backTitle: 'Apoya el proyecto en Angor', backDesc: 'Angor es una plataforma descentralizada de crowdfunding en Bitcoin construida sobre Nostr — tus fondos siguen bajo tu control, se liberan por etapas y ningún custodio retiene el bote. Cada sat va a desarrollo, alojamiento de relés y mantener SkateSpots gratis para cada patinador del mundo.', openAngor: 'Abrir Angor', orZap: 'o ⚡ zapea cualquier spot, crew o creador directamente en la app', wantCollaborate: '¿Quieres colaborar?', wantCollaborateDesc: 'Desarrolladores, diseñadores, patinadores con habilidades — escríbenos.', viewNostrHub: 'Ver en NostrHub', wantPartner: '¿Quieres ser socio de SkateSpots? Escríbenos en Nostr.', comingSoon: 'Muy pronto', wantListed: '¿Quieres aparecer aquí?', wantListedDesc: 'Mándanos un logo (PNG/WebP, fondo transparente, mín. 200×200px) y tu URL por DM en Nostr, solo si tienes buena onda.', whyTitle1: 'Por qué necesitamos', whyTitle2: 'apoyo', whyDesc: 'SkateSpots es 100% gratis, de código abierto y está construido sobre Nostr — un protocolo descentralizado sin servidor central que lo pueda cerrar. Sin anuncios, sin venta de datos, sin inversores. Cada sat va directamente a desarrollo, alojamiento de relés y mantener esto gratis para cada patinador del mundo.', why1Title: 'Nativo de Nostr', why1Desc: 'Sin servidor central. Tus datos viven en los relés que elijas.', why2Title: 'Impulsado por Bitcoin', why2Desc: 'Gana sats por mapear spots. Gástalos en tiendas locales.', why3Title: 'Gratis para siempre', why3Desc: 'Código abierto, sin muros de pago, sin rastreo, sin capital riesgo.', thankYou: 'Gracias. Cada sat mantiene los spots en el mapa. 🛹⚡', license: 'Licencia', faq: 'FAQ', }, admin: { confirmed: 'Confirmado', title: 'Cola de revisión', subtitle: 'Spots, tiendas, eventos, rutas y material que activan las señales de basura. Ocultar y Confirmar son etiquetas suaves y reversibles; los informes van primero. No se borra nada.', tabReports: 'Informes', tabSpots: 'Spots', tabShops: 'Tiendas', tabEvents: 'Eventos', tabTours: 'Rutas', tabGear: 'Material', tabCrews: 'Crews', tabLab: 'Lab', tabClaims: 'Reclamaciones', nothingToReview: 'Nada que revisar — nada de este tipo activa las señales de basura.', hideActioned: 'Ocultar gestionados', showActioned: 'Mostrar gestionados ({{count}})', undoAll: 'Deshacer los {{count}}', undoAllTitle: '¿Deshacer todos los veredictos de esta pestaña?', undoAllDesc: 'Esto devuelve cada elemento a neutro — ni oculto ni avalado. Publica una etiqueta pública por elemento, así que con Amber verás {{count}} pantallas de aprobación.', undoCount: 'Deshacer {{count}}', undo: 'Deshacer', confirm: 'Confirmar', hide: 'Ocultar', hideIt: 'Ocultarlo', hideForEveryone: '¿Ocultar esto para todos?', hideForEveryoneDesc: 'Esto quita el elemento de la navegación y la búsqueda para todos los usuarios de SkateSpots. Es una etiqueta pública y reversible — puedes deshacerlo desde esta cola.', hidden: 'Oculto', hiddenDesc: 'Quitado de la app mediante una etiqueta pública. Reversible.', couldNotHide: 'No se pudo ocultar', notASpot: 'No es un skate spot', lookAtIt: 'Verlo', }, profile: { nip05Verified: 'NIP-05 verificado', nip05NotVerified: 'NIP-05 no verificado con esta clave', message: 'Mensaje', zapsReceived: 'zaps recibidos', memberSince: 'Miembro desde', badges: 'Insignias', sponsorsSupport: 'Patrocinadores y apoyo', skater: 'Patinador', stance: 'Postura', skating: 'Patinando', homeSpot: 'Spot habitual', basedIn: 'Con base en', addSkateDetails: 'Añade tus datos de skate', addSkateDetailsDesc: 'Configura tu postura, estilos y nivel para aparecer en el directorio de patinadores.', spotsAdded: 'Spots añadidos', shopsAdded: 'Tiendas añadidas', noSpots: 'Aún no has añadido ningún spot', noSpotsDesc: 'Pon tu spot local en el mapa →', stash: 'Stash', gear: 'Material', crews: 'Crews', info: 'Info', lightning: 'Lightning', silentPayment: 'Pago silencioso', coordinator: 'Coordinador', coordinatorAdded: 'Coordinador añadido', add: 'Añadir', messagePrivately: 'Mensaje privado', founder: 'Fundador', member: 'Miembro', supportSkater: 'Apoya a este patinador', supportSkaterDesc: 'Envía una propina para agradecer sus aportaciones', }, index: { joinCommunity: 'Únete a la comunidad para añadir spots, crear eventos y más', topZapped: 'MÁS ZAPEADOS', topZappedDesc: 'Spots más apoyados este mes', leaderboard: 'Clasificación', newHere: '¿NUEVO POR AQUÍ?', newHereDesc: 'Crea una cuenta gratis para añadir spots, unirte a eventos, conectar con patinadores y formar parte de la comunidad. No hace falta email.', followFounder: 'Sigue al fundador', followFounderDesc: '¡Mantén pulsado el avatar 3 segundos para seguirlo y estar al día de nuevas funciones y eventos!', createAccount: 'Crear cuenta', accountWorks: 'Tu cuenta funciona en todas las apps de la red', footerTagline: 'Código abierto • De la comunidad • Sin anuncios', }, stash: { title: 'Mi stash', loginDesc: 'Tu inventario privado de material. Controla lo que tienes, pon precios y comparte de forma selectiva con quien intercambies.', encrypted: 'Cifrado', syncsEverywhere: 'Se sincroniza en todas partes', p2pTrading: 'Intercambio P2P', encryptionRequired: 'Se requiere cifrado', encryptionRequiredDesc: 'Tu stash está cifrado por privacidad. Usa un firmante que admita cifrado NIP-44 (como Alby, nos2x o Amber).', learnSigners: 'Conoce los firmantes', select: 'Seleccionar', stash: 'Stash', wishlist: 'Lista de deseos', allCategories: 'Todas las categorías', sortNewest: 'Más recientes', sortValue: 'Valor', sortCondition: 'Estado', sortAz: 'A–Z', wishlistEmpty: 'Lista de deseos vacía', wishlistEmptyDesc: 'Añade el material que buscas — te emparejaremos con los stashes de tus amigos.', stashEmpty: 'Tu stash está vacío', stashEmptyDesc: 'Empieza a registrar tu material. Tablas, ejes, zapatillas — añádelo una vez y accede desde cualquier sitio vía Nostr.', noMatch: 'Ningún artículo coincide', noMatchDesc: 'Prueba a ajustar los filtros.', backupTransfer: 'Copia y transferencia', backupDesc: 'Tu stash está cifrado en Nostr. Guarda una copia que controles — así un relé caído o una cuenta nueva no te harán perder tu lista de material.', export: 'Exportar', import: 'Importar', exported: 'Stash exportado', exportedDesc: '{{count}} artículos guardados en un archivo.', noItemsInFile: 'No se encontraron artículos en ese archivo.', noValidItems: 'No se encontraron artículos válidos en ese archivo.', imported: 'Importados {{count}} artículos', importSkipped: '{{count}} omitidos (ya estaban en tu stash).', importAdded: 'Añadidos a tu stash.', importFailed: 'Error al importar', couldNotRead: 'No se pudo leer ese archivo.', updateFailed: 'No se pudo actualizar tu stash', updatedCount: 'Actualizados {{count}} artículos', markedForSale: 'Marcados {{count}} en venta', unmarkedCount: 'Desmarcados {{count}}', removedCount: 'Quitados {{count}} artículos', selectedCount: '{{count}} seleccionados', selectAll: 'Seleccionar todo', visibilityPublic: 'Público', visibilityPrivate: 'Privado', forSale: 'En venta', remove: 'Quitar', bulkDeleteTitle: '¿Quitar {{count}} artículos?', bulkDeleteDesc: 'Esto reescribe tu stash cifrado en una firma y no se puede deshacer aquí. Exporta una copia antes si no estás seguro.', deleteTitle: '¿Quitar de tu stash?', deleteDesc: '“{{title}}” se quitará de tu stash', deleteDescPublic: ' y se retirará de tu escaparate público', deleteUndone: '. Esto no se puede deshacer.', deleteDescGeneric: 'Este artículo se quitará de tu stash. Esto no se puede deshacer.', }, }, cardUi: { save: 'Guardar carné en Nostr', saved: 'Carné guardado', savedDesc: 'Tu carné está firmado y se puede verificar.', saveFailed: 'No se pudo guardar el carné', notPublished: 'Sin publicar', expired: 'CADUCADO', logoUploaded: 'Logo subido', logoUploadFailed: 'No se pudo subir el logo', venue: 'Sede vinculada (opcional)', venueNone: 'Sin sede', venueHint: 'Elige uno de tus propios spots para vincular este pase a una sede. Un verificador confirmará que es tuya.', facets: { title: 'Mostrar facetas de identidad', crews: 'Cuadrillas', local: 'Local', roles: 'Roles del Lab', }, roles: { coach: 'Entrenador', filmer: 'Filmer', editor: 'Editor', photographer: 'Fotógrafo', builder: 'Constructor', artist: 'Artista', graffiti: 'Graffiti', tattoo: 'Tatuador', trainer: 'Entrenador personal', musician: 'Músico', judge: 'Juez', organizer: 'Organizador', barber: 'Barbero', }, crew: { crewCard: 'CARNÉ DE CUADRILLA', crewSub: 'Tu cuadrilla, en un carné', pick: 'Elige una cuadrilla', none: 'Aún no estás en ninguna cuadrilla — únete a una o crea la tuya.', hint: 'El carné se construye con los datos firmados de la cuadrilla. Edita la cuadrilla en su página para cambiarlo.', members: 'MIEMBROS', spots: 'SPOTS', est: 'Desde {{year}}', openCall: 'Convocatoria abierta', verifiedCrew: 'Cuadrilla verificada', viewCrew: 'Ver la cuadrilla', }, event: { pass: 'PASE DE EVENTO', passSub: 'Un pase para un evento al que vas', pick: 'Elige un evento', none: 'Aún no hay eventos — crea uno o confirma tu asistencia a uno primero.', hint: 'El pase se construye con los datos firmados del evento. Solo el organizador puede cambiarlo.', admits: 'ADMITE A', going: '{{count}} van', verifiedEvent: 'Evento verificado', viewEvent: 'Ver el evento', }, studio: { unsaved: 'Cambios sin guardar', saved: 'Guardado', saveChanges: 'Guardar cambios', allSaved: 'Guardado — al día', showOnCard: 'Mostrar en el carné', derived: 'Desde tu perfil de skater', noSkaterProfile: 'Aún no tienes perfil de skater —', editSkaterProfile: 'añade tus estilos y nivel', noPhoto: 'Aún no tienes foto de perfil —', addPhoto: 'añádela en tu perfil', finishTitle: 'Completa tu carné', finishDesc: 'Una foto y un perfil de skater lo hacen parecer real.', checkPhoto: 'Foto de perfil', checkName: 'Nombre visible', checkProfile: 'Estilos y nivel', checkCrew: 'Únete a una cuadrilla', accent: 'Color de acento', accentHint: 'Sustituye el acento del tema', accentClear: 'Usar color del tema', logo: 'Logo / escudo propio', logoAdd: 'Subir', logoChange: 'Cambiar', logoClear: 'Quitar', }, back: { title: 'Reverso imprimible', desc: 'Cuadrillas, roles, patrocinadores y enlaces en el reverso', showBack: 'Ver reverso', showFront: 'Ver anverso', empty: 'Aquí no hay nada aún — añade cuadrillas, roles o patrocinadores.', }, verify: { checking: 'Comprobando el carné…', notFound: 'Carné no encontrado', notFoundDesc: 'No se ha encontrado ningún evento en los relés. Puede que se haya eliminado o que el enlace sea incorrecto.', invalid: 'Firma no válida', invalidDesc: 'Este evento existe pero su firma no se verifica. No te fíes.', authentic: 'Auténtico', authenticDesc: 'La firma del emisor es válida.', kind: 'Tipo', kindPark: 'Pase de acceso a parque', kindRider: 'Carné de rider', kindCrew: 'Carné de cuadrilla', kindEvent: 'Pase de evento', expired: 'Caducado', valid: 'Válido', issuedBy: 'Emitido por', accessLevel: 'Nivel de acceso', validThru: 'Válido hasta', selfIssued: 'Estado', selfIssuedDesc: 'Carné de identidad autoemitido', venue: 'Sede', venueVerified: 'Verificado — la clave del dueño de esta sede coincide con el emisor.', venueMismatch: 'Este pase nombra una sede que no pertenece a la clave del emisor.', venueNone: 'Sin vincular a ninguna sede.', viewCard: 'Ver el carné', disclaimer: 'Una firma válida demuestra quién firmó este carné — no es prueba de habilidad ni de derechos de acceso más allá de lo que emitió la sede.', }, public: { invalid: 'Eso no parece un enlace de carné válido.', createYourOwn: 'Crea tu propio carné', editYourCard: 'Edita tu carné', backToEditor: 'Volver al editor', backHome: 'Volver al inicio', notCustomised: 'Este skater aún no ha personalizado su carné — esta es la apariencia por defecto.', verifyNote: 'Escanea el QR del carné para verificarlo.', }, }, }; export default es;