const batch2 = { socialUi: { agentPanel: { spot: "Spot", event: "Evento", labPro: "Lab Pro", gear: "Equipamento", crew: "Crew", description: "Coñece esta crew — as súas jams, a aliñación e a convocatoria aberta — ademais da escena máis ampla con datos en directo.", greeting: "Ei! Son Sasquatch, o guía de {{crew}}. Pregúntame pola crew — a próxima jam, quen a leva, que buscamos — ou pola escena en xeral.", suggestion1: "Cal é a nosa próxima jam?", suggestion2: "Quen leva esta crew?", suggestion3: "Que estamos a buscar?", suggestion4: "Os mellores spots preto de nós?", suggestion5: "Que tempo fai para patinar?", thinking: "Sasquatch está a pensar…", placeholder: "Pregunta pola escena da túa zona…", disclaimer: "A IA pode equivocarse — as ligazóns van a anuncios reais." }, badge: { upcomingOne: "{{count}} evento próximo", upcomingMany: "{{count}} eventos próximos", comingOne: "{{count}} evento en camiño", comingMany: "{{count}} eventos en camiño" }, bell: { youAreIn: "Xa estás en {{crew}}! 🛹", membershipConfirmed: "Membresía confirmada.", couldNotConfirm: "Non se puido confirmar", addedYouTo: "engadiute a", confirmToAppear: "Confirma para aparecer como membro.", notifications: "Notificacións", notificationsNew: "Notificacións ({{count}} novas)", unreadCount: "{{count}} notificacións sen ler", markRead: "Marcar como lidas", allClear: "Todo ao día", tabAll: "Todo", tabTrades: "Intercambios", tabSocial: "Social", tabNews: "Novidades", tabCrews: "Crews", dmsUnread: "{{count}} mensaxe(s) cifrado(s) novo(s)", messagesAndCrews: "Mensaxes e chats de crew", checkingUpdates: "Buscando actualizacións…", checkingTrades: "Comprobando ofertas e intercambios…", loadingDrops: "Cargando as últimas novidades…", emptyAll: "As ofertas, os intercambios, os zaps, as respostas, as novidades do boletín e a actividade das crews aparecerán aquí.", emptyTrades: "As ofertas, as contraofertas e as confirmacións de intercambio chegan aquí — tanto se vendes, compras ou cambias.", emptySocial: "Os zaps, as reaccións, os reposts, as mencións, as respostas, as confirmacións de asistencia a eventos e as actualizacións dos anfitrións chegan aquí.", emptyNews: "As novidades do boletín de SkateSpots chegarán aquí. Subscríbete na páxina do boletín.", emptyCrews: "Os convites de crews, as solicitudes de colectivo e as solicitudes de membresía aparecerán aquí.", subscribeBanner: "Subscríbete para recibir as novas no teu aviso", read: "Lida", allCaughtUp: "Estás ao día" }, chat: { hidden: "Agochada", hideMessageAria: "Agochar esta mensaxe", hideMessageTitle: "Agochar mensaxe (admin)", messageHidden: "Mensaxe agochada", messageHiddenDesc: "Agochada do chat da crew para todos.", messageHideFailed: "Non se puido agochar a mensaxe", encryptionUnavailable: "Cifrado non dispoñible", encryptionUnavailableDesc: "O teu firmante non admite o cifrado NIP-44. Actualiza a extensión.", messageFailed: "Mensaxe fallida", couldNotSend: "Non se puido enviar a mensaxe.", noOneToMessage: "Aínda non hai ninguén a quen escribir", noOneToMessageDesc: "Esta crew non ten outros membros cos que falar.", subject: "Chat da crew {{crew}}", title: "Chat da crew", cordnBadgeTitle: "Encamiñado polo coordinador Cordn desta crew mediante ContextVM. Cifrado de extremo a extremo.", private: "Privado", privateBadgeTitle: "Cifrado de extremo a extremo — só os membros da crew poden ler estas mensaxes.", encryptedCordn: "Cifrado e encamiñado polo coordinador da crew (Cordn) — ningunha mensaxe pasa por relays públicos.", encryptedNip17: "Chat de grupo cifrado para o fundador e todos os membros listados da crew.", moderatorNote: " Como moderador, podes agochar mensaxes da crew.", loginToSee: "Inicia sesión para ver se podes unirte ao chat da crew.", membersOnly: "Este chat é privado para os membros da crew. Pídele ao fundador que te engada á crew para unirte á conversa.", noMessages: "Aínda non hai mensaxes. Arranca o chat da crew — organiza unha sesión, comparte un spot, presume dun clip.", newMessages: "Mensaxes novas", new: "Nova", placeholder: "Escribe á túa crew…", sendAria: "Enviar mensaxe" }, collectiveJoinRequest: { addedTitle: "Engadiches {{name}} a {{collective}} 🛹", addedDesc: "Confirmará desde o seu lado para aparecer como membro verificado.", couldNotAdd: "Non se puido engadir o membro", couldNotDismiss: "Non se puido descartar", addedDone: "Engadido", addedTo: "a", dismissedDone: "Solicitude de {{name}} descartada", wantsToJoin: "quere unirse", alreadyOnRoster: "Xa está na lista", openCollective: "Abrir colectivo", dismiss: "Descartar", addToCollective: "Engadir ao colectivo" }, collectiveMembers: { confirmed: "Confirmado", pending: "Pendente", pendingTooltip: "Listado polo colectivo — á espera da confirmación deste membro.", crewOnly: "Só crew", crewOnlyTooltip: "Este membro escolleu ser visible só para os compañeiros de crew. Podes velo porque estás na crew.", hiddenMember: "Membro agochado", title: "Membros", verifiedOf: "{{confirmed}} de {{total}} verificados — cada membro confirmado asinou coa súa propia chave de Nostr.", verifiedPerMember: "A membresía verifícase por membro. Cada membro confirma coa súa propia chave de Nostr.", adminsOne: "{{count}} admin axuda a levar a crew.", adminsMany: "{{count}} admins axudan a levar a crew." }, confirmMembership: { public: "Público", crewOnly: "Só crew", confirmedTitle: "Membresía confirmada!", confirmedCrew: "Estás verificado en {{name}} — visible só para os compañeiros de crew.", confirmedPublic: "Agora apareces como membro verificado de {{name}}.", failed: "Non se puido confirmar", addedTo: "Engadíronte a {{name}}", addedDesc: "Confirma a túa membresía para que apareza como verificada no teu perfil e no seu.", yourVisibility: "A túa visibilidade", confirming: "Confirmando…", confirmButton: "Confirmar membresía" }, contacts: { message: "Mensaxe", removePrivate: "Quitar dos contactos privados", savePrivate: "Gardar nos contactos privados", seoTitle: "Contactos - SkateSpots", seoDescription: "A túa escena — compañeiros de crew, persoas que segues e conversas recentes, con contactos privados cifrados.", encryptionUnavailableDesc: "O teu firmante non admite o cifrado NIP-44.", removed: "Quitado dos contactos privados", saved: "Gardado nos contactos privados", savedDesc: "Só ti podes ver esta lista.", updateFailed: "Non se puideron actualizar os contactos", loginTitle: "A túa escena, nun só lugar", loginDesc: "Inicia sesión para ver os teus compañeiros de crew, as persoas que segues e as conversas recentes — e manter unha lista de contactos privada e cifrada.", title: "Contactos", subtitle: "A túa escena — compañeiros de crew, seguidores e conversas", filterPlaceholder: "Filtrar por npub…", tabCrew: "Crew", tabFollows: "Seguindo", tabDms: "MD", tabSaved: "Gardados", emptyCrewmates: "Aínda non hai compañeiros de crew. Únete ou crea unha crew para construír a túa rede da escena.", emptyFollowing: "Aínda non segues a ninguén.", emptyDms: "Aínda non hai conversas. Escribe a un skater para comezar unha.", savedHint: "Esta lista está cifrada coa túa chave — só ti podes lela. Toca a estrela en calquera persoa para engadila.", emptySaved: "Aínda non hai contactos gardados. Marca persoas desde calquera pestana para construír a túa axenda privada." }, conversation: { unknown: "Descoñecido", seoTitle: "Chat con {{name}} - SkateSpots", seoDescription: "Conversa privada cifrada", sendFailed: "Non se puido enviar a mensaxe", sendFailedDesc: "Téntao de novo nun intre.", tradeConfirmed: "Intercambio confirmado", tradeConfirmedDesc: "Reputación actualizada para ambos.", tradeConfirmFailed: "Non se puido confirmar o intercambio", somethingWrong: "Algo saíu mal.", soldNote: "Vendido a {{name}}.", saleConfirmed: "Venda confirmada", saleConfirmedDesc: "{{name}} xa pode confirmar a súa parte.", saleConfirmFailed: "Non se puido confirmar a venda", escrowRedeemed: "Depósito en garantía canxeado", escrowRedeemedDesc: "Os fondos xa están na túa carteira Cashu.", escrowRedeemFailed: "Non se puido canxear o depósito", loginTitle: "Inicia sesión para ver as mensaxes", secureLoginTitle: "Cómpre un inicio de sesión seguro", secureLoginDesc: "As mensaxes requiren unha aplicación de firma segura.", encrypted: "Cifrado", refresh: "Actualizar", didCompleteTrade: "Completaches este intercambio?", recordedSale: "{{name}} rexistrou a venda. Confirma para actualizar a reputación de ambos.", confirm: "Confirmar", confirmSale: "Confirmar esta venda?", askedToRecord: "{{name}} pediuche que o rexistres. Ao confirmar, mellora a reputación de ambos.", confirmSaleButton: "Confirmar venda", redeemEscrow: "Canxear depósito", escrowAppOnly: "O depósito Cashu só está na app — abre SkateSpots no teu teléfono para canxealo.", startThread: "Envia unha mensaxe para comezar a conversa", placeholder: "Escribe unha mensaxe...", e2eeNote: "As mensaxes están cifradas de extremo a extremo con NIP-17" }, coordinator: { secondsAgo: "hai {{count}} s", minutesAgo: "hai {{count}} min", hoursAgo: "hai {{count}} h", daysAgo: "hai {{count}} d", statusIdle: "Sen comprobar", statusChecking: "Comprobando…", statusOnline: "Conectado", statusStale: "Silencioso", statusOffline: "Non visto", statusError: "Inaccesible", notACoordinator: "Iso non é un coordinador", notACoordinatorDesc: "Pega un nprofile, un npub ou unha ligazón de cordn.net.", added: "Coordinador engadido", relayOne: "{{count}} relay", relayMany: "{{count}} relays", lastSeen: "visto por última vez {{time}}", onlineDesc: "Anunciándose. Os grupos que o usan poden entregar mensaxes agora.", staleDesc: "Atopado, pero non se anunciou recentemente — pode estar durmido.", offlineDesc: "Non se viu ningún anuncio. Pode ser privado (non pasa nada) ou simplemente estar fóra de liña.", errorDesc: "Non se puido acceder aos relays.", idleDesc: "Comprobando…", checkingDesc: "Buscando o seu anuncio…", eventFoundOne: "{{count}} evento atopado.", eventFoundMany: "{{count}} eventos atopados.", check: "Comprobar", addLinkCopied: "Ligazón para engadir copiada", copyFailed: "Erro ao copiar", copyManually: "Copia a ligazón manualmente.", addLink: "Engadir ligazón", removeConfirm: "Quitar este coordinador deste dispositivo?", scanToJoin: "Escanea en Cordn para unirte a este coordinador.", noCoordinator: "Aínda non hai coordinador", noCoordinatorDescA: "Un coordinador entrega en orde as mensaxes", encryptedWord: "cifradas", noCoordinatorDescB: "de grupo da túa crew. Ve quen, cando e que grupo — nunca o contido. Escolle un ou monta o teu.", change: "Cambiar coordinador", addTitle: "Engadir un coordinador", add: "Engadir", scanQR: "Escanea o QR dun coordinador", inputPlaceholder: "nprofile… ou unha ligazón de cordn.net", runOwn: "Monta o teu", runOwnDesc: "Pode vivir nun teléfono vello, nunha Raspberry Pi ou en calquera caixa pequena que deixes acendida. O teu grupo segue funcionando mentres estea activo — e podes mover o grupo cando queiras.", onPhone: "Nun teléfono", onPhoneDesc: "Usa a app Cordn Coordinator e despois escanea aquí o seu QR para engadilo.", ourDefaultTitle: "Coordinador de SkateSpots", ourDefaultDesc: "SkateSpots ten un coordinador en relay.skate-spots.org. Úsao por defecto ou monta o teu — un coordinador só ve texto cifrado e metadatos, nunca as túas mensaxes.", useOurs: "Usar o coordinador de SkateSpots", openCordn: "Abrir Cordn", scanItsQR: "Escanea o seu QR", onServer: "Nun servidor", commandCopied: "Comando copiado", copyCommand: "Copiar comando", androidSleep: "Android pode suspender un coordinador nun teléfono. Conta con mover o grupo de cando en vez.", privacyNote: "🔒 Un coordinador só ve texto cifrado e metadatos — nunca o contido das mensaxes. Monta o teu para que ata os metadatos sexan teus.", customTitle: "Coordinador de chat personalizado", customBadge: "· experimental · o teu propio relay", customDescShort: "Opcional — a túa crew xa ten chat cifrado de extremo a extremo integrado, así que non o necesitas. Só o configuras se montas o teu propio", remove: "Quitar", pointerNote: "Só un ponteiro por agora: un endpoint wss:// úsase como relay de chat da crew; un https:// a través do relay ContextVM compartido. O MLS real de Cordn aínda non está conectado.", cordnCoordinator: "Coordinador Cordn", invalid: "Iso non parece un coordinador. Pega un nprofile, unha ligazón de cordn.net ou unha URL https/wss.", useMine: "Usar o meu coordinador" }, createCrew: { seoTitle: "Crear unha crew - SkateSpots", seoDescription: "Crea a túa crew de skate — zona de casa, membros e spots.", loginRequired: "Cómpre iniciar sesión", loginRequiredDesc: "Tes que iniciar sesión para crear unha crew.", backToCrews: "Volver ás crews", title: "Crear unha crew", intro: "A túa familia do skate — a xente coa que patinas. Abonda cun nome para comezar; todo o demais é opcional." }, crew: { seoTitleNamed: "{{name}} - Crew de SkateSpots", seoTitle: "Crew - SkateSpots", seoDescription: "Unha crew de skate en SkateSpots.", postHidden: "Publicación agochada", postHiddenDesc: "Retirada do feed da crew para todos.", postHideFailed: "Non se puido agochar a publicación", backToCrews: "Volver ás crews", disband: "Disolver", youAreCaptain: "Es capitán", member: "Membro", askSasquatch: "Pregunta a Sasquatch", agent: "Axente da crew", agentDesc: "O guía de IA da túa crew — spots próximos, eventos, adestradores e equipamento, con datos en directo.", eventsTab: "Eventos", chatTab: "Chat", newMessages: "Mensaxes novas", hostJam: "Organizar unha jam", noEvents: "Aínda non hai eventos da crew. Organiza unha jam, unha competición ou un encontro como crew — conecta a túa crew co calendario de eventos e permítelle á xente facer zap.", support: "Apoiar", zapCrew: "Facer zap á crew", bandTitle: "Banda da crew", bandTagline: "Música en directo · skate e son", listenTitle: "Escoitar: {{domain}}", listen: "Escoita os temas", setUpGig: "Organizar un concerto", bookGigMessage: "Ola {{crew}} — interésanos contratar a {{band}} para un concerto. Podemos falar de datas?", messageAboutGig: "Escribir sobre un concerto", gigHintA: "engade un evento musical ao calendario organizado por esta crew.", messageShort: "Mensaxe", gigHintB: "abre un MD cifrado á crew para acordar datas e detalles.", homeSpots: "Spots de casa", viewSpot: "Ver spot", seeOnMap: "Ver no mapa →", founderLinks: "Fundador e ligazóns", startedBy: "Iniciada por {{name}}", opens: "Abre: {{domain}}" }, crews: { seoTitle: "Crews - SkateSpots", seoDescription: "Atopa a túa xente. Descubre crews de skate, colectivos e comunidades locais preto de ti.", videoPartTooltip: "Esta crew ten unha video part", part: "Part", bandTooltip: "Banda da crew: {{name}}", band: "Banda", focusAll: "Todo", focusAllShort: "Todo", focusDiy: "DIY", focusPhoto: "Foto", focusCoaching: "Adestramento", focusArt: "Arte", focusMusic: "Música", focusPhysio: "Fisio", focusMixed: "Mixto", title: "Crews", heroLine: "A túa familia do skate ancorada no mapa — a xente coa que patinas", heroWith: "con", heroRest: ", non a que contratas (iso é The Lab).", crewCountOne: "{{count}} crew", crewCountMany: "{{count}} crews", cityCountOne: "{{count}} cidade", cityCountMany: "{{count}} cidades", createCrew: "Crear crew", create: "Crear", searchPlaceholder: "Buscar crews por nome ou cidade…", filterTitle: "Filtrar crews", filterDesc: "Que lle interesa á crew.", nearMe: "Preto de min", emptySearchTitle: "Ningunha crew coincide coa túa busca", emptySearchHint: "Non se atopou nada para “{{query}}”. Proba con outro nome ou cidade.", clearSearch: "Limpar busca", emptyFocusTitle: "Aínda non hai crews de {{label}}", emptyFocusHint: "Aquí ninguén leva aínda a bandeira de “{{label}}”. Mostra todas as crews ou comeza ti esta.", showAll: "Mostrar todas as crews", claimTitle: "Reclama a túa escena local", claimHint: "Aínda non hai crews aquí. Sé o primeiro — crea a túa crew, liga os teus spots de casa e pon a túa escena no mapa para que todos a atopen." }, crewCoordinator: { privateChat: "Chat privado da crew", encryptedChat: "Chat cifrado", privateChatName: "Chat privado", privateChatDesc: "Chat de grupo con segredo cara ao futuro (MLS) a través dun coordinador.", privateChatDescFull: "O chat privado créao unha soa vez un admin; despois os membros únense.", chatRowDesc: "Todos na crew — selado coa chave de cada membro (NIP-17).", openChat: "Abrir", setUpChat: "Configurar", joinChat: "Unirse", checking: "Comprobando…", openInAnotherApp: "Abrir noutra app", on: "Activado", defaultA: "A pestana", chatWord: "Chat", defaultB: "está", e2ee: "cifrada de extremo a extremo", defaultC: "para o fundador e todos os membros listados — non hai nada que configurar. As mensaxes séllanse coa chave de cada membro (NIP-17), así que só a túa crew pode lelas.", advancedA: "Avanzado: monta o teu", cordnCoordinator: "Coordinador Cordn", routeThrough: "Encamiñar o chat por el", coordinator: "Coordinador", deliveredOver: "Entregado por", sharedRelay: "— o relay ContextVM compartido.", ownRelay: "— o relay propio da túa crew.", chatLive: "O chat privado está activo", routesA: "A pestana", routesB: "encamiña por este coordinador: as mensaxes van cifradas de extremo a extremo (NIP-44, seladas para cada membro), así que só xestiona tráfico selado.", publicWarning: "Atención: diríxese a través do relay ContextVM compartido, así que o texto cifrado e os seus metadatos (que crew e cando) son visibles publicamente — pero non lexibles. Apunta a crew a un relay wss:// privado para que ata iso sexa privado.", ownRelaySafe: "Nada específico da crew sae do relay propio da túa crew.", manage: "Xestionar coordinador", open: "Abrir {{domain}}", openInCordnWeb: "Cordn (web)", openCordnGroup: "Abrir chat da crew", copyForStaircase: "Copiar para Staircase", runBy: "Coordinador xestionado por" }, dms: { securityReminder: "Lembrete de seguridade", phishingStrong: "SkateSpots nunca che enviará un MD", phishingRest: "pedindo que verifiques a túa conta, compartas as túas chaves ou envies pagamentos. Se alguén di ser o soporte de SkateSpots por MD — é unha estafa.", dismissReminder: "Descartar o lembrete de seguridade", peopleCount: "{{count}} persoas", youPrefix: "Ti: ", unreadMessages: "Mensaxes sen ler", seoTitle: "Mensaxes - SkateSpots", seoDescription: "Mensaxes privadas cifradas coa comunidade do skate", loginTitle: "Inicia sesión para acceder ás mensaxes", loginDesc: "Mensaxería privada e cifrada con skaters da comunidade", secureLoginTitle: "Cómpre un inicio de sesión seguro", secureLoginDesc: "As mensaxes privadas requiren unha app de firma segura para cifrar as túas conversas.", onAndroid: "En Android:", useAmber: "Usa a app Amber", getAmber: "Obter Amber →", onIOS: "En iOS:", iosHint: "Proba a iniciar sesión cunha conexión bunker (nsec.app) desde Axustes", browserHint: "Proba a iniciar sesión cunha extensión do navegador como Alby ou nos2x que admita cifrado.", title: "Mensaxes", subtitleFull: "Cifradas de extremo a extremo con NIP-17", subtitleShort: "Cifradas", newMessage: "Nova mensaxe", groups: "Grupos", refresh: "Actualizar", privateRooms: "Salas privadas", crews: "Crews", crewFounder: "Fundador", crewMember: "Membro", crewOpen: "Abrir", crewSetUp: "Configurar", loadFailed: "Non se puideron cargar as mensaxes", emptyTitle: "Aínda non hai mensaxes", emptyDesc: "Comeza unha conversa con alguén da comunidade", startConversation: "Comezar unha conversa", undecryptableOne: "O teu firmante non puido abrir {{count}} mensaxe cifrada.", undecryptableMany: "O teu firmante non puido abrir {{count}} mensaxes cifradas." }, editCrew: { seoTitleNamed: "Editar {{name}} - SkateSpots", seoTitle: "Editar crew - SkateSpots", seoDescription: "Edita a túa crew de skate.", loginRequired: "Cómpre iniciar sesión", notYours: "Non é a túa crew", notYoursDesc: "Só o fundador da crew pode editala.", backToCrew: "Volver á crew", title: "Editar crew" }, form: { add: "Engadir", added: "Engadido", addNameInBasicsA: "Engade de novo un nome de crew en", addNameInBasicsB: "para rematar.", adminsDescA: "Fai membros de confianza", adminsWord: "admins", adminsDescB: "— poden convidar membros e moderar o feed e o chat da crew coas súas propias chaves. Ti (o fundador) sempre es o dono da identidade da crew.", agentDescA: "Engade", agentDescB: ", un guía de IA que coñece de verdade a túa crew. Os membros poden preguntar por", agentDescC: "— ademais de spots, eventos, adestradores e equipamento próximos cos datos en directo de SkateSpots. Execútase no navegador; sen chaves nin configuración. É pronto (IA de nivel gratuíto, así que ás veces vai lenta).", agentDescStrong: "a vosa próxima jam, quen leva a crew, que buscades e o voso estilo", agentEnabledNote: "Sasquatch aparecerá na páxina da túa crew cando gardes.", bandDesc: "Tes unha banda? As escenas do skate e a música local van da man — pon o nome da túa banda e unha ligazón aos temas.", bandFooterA: "Para un perfil completo de banda (xéneros, instrumentos, concertos), crea un", musicianWord: "Músico", bandFooterB: "en The Lab e despois ligao na sección", linkedLabWord: "Perfís de Lab ligados", bandFooterC: "de arriba.", bandMusicWord: "Banda e música", bandName: "Nome da banda", bandNamePlaceholder: "p. ex. The Bail Outs", bandNudgeA: "Tes unha banda — toca para configurar a túa", crewTypeWord: "Tipo de crew", bandNudgeB: "a", bandNudgeC: "para aparecer tamén na escena de Música de The Lab.", beta: "Beta", bioLabel: "Sobre / Manifesto", bioPlaceholder: "Quen es, que patinas, a túa historia...", continue: "Continuar", crewCreated: "Crew creada!", crewUpdated: "Crew actualizada!", crewName: "Nome da crew", cordnGroup: "Grupo de Cordn", cordnGroupHint: "Opcional: pega a ligazón do grupo desde Staircase ou Cordn web. A túa crew terá entón chat MLS real de extremo a extremo, aloxado no noso coordinador.", crewOnlyWord: "Só crew", crewType: "Tipo de crew", crewTypeDescA: "A túa crew céntrase nalgún oficio? Escolle un para aparecer tamén nesa escena en", theLab: "The Lab", crewTypeDescB: ". As crews de skate normais quedan como", mixedWord: "Mixtas", crewTypeDescC: ".", customVibeHint: "Engade o teu propio estilo ou foco cun #", customVibePlaceholder: "p. ex. downhill, sesións nocturnas, no-comply", editDesc: "A identidade da túa crew, a zona de casa e os membros", enableAgent: "Activar o axente da crew", enableTreasury: "Activar a tesourería da crew", failed: "Fallou", founded: "Fundada (ano)", geolocationUnsupported: "Xeolocalización non compatible", gettingLocation: "Obtendo...", goalHint: "Asegúrate de que o teu perfil de Nostr ten unha dirección Lightning (lud16) para que cheguen as contribucións.", goalPlaceholder: "p. ex. Formigonar o spot DIY", goalTarget: "Obxectivo (sats)", goalWhat: "Cal é o obxectivo?", homeSpots: "Spots de casa", homeSpotsDesc: "Liga os spots que frecuenta a túa crew — conectarán coa túa crew no mapa", homeTurf: "Zona de casa (cidade / área)", homeTurfPlaceholder: "Bristol, Reino Unido", instagramDetected: "Clip de Instagram detectado", invalidMember: "Introduce un npub, nprofile ou pubkey hex válido.", latitude: "Latitude", leaveBlankLocation: "Deixa en branco para manter a localización actual da zona de casa.", links: "Ligazóns", locationError: "Erro de localización", locationFound: "Localización atopada", logoAlt: "Crew", logoHint: "Un logotipo fai que a túa crew se recoñeza ao instante no mapa e nos feeds. O cadrado funciona mellor.", logoLabel: "Logotipo / foto da crew", logoUploaded: "Logotipo subido", longitude: "Lonxitude", looksGood: "Vese ben", makeAdmin: "Facer admin", mapPin: "Alfinete no mapa", mapPinHint: "Pon a túa crew no mapa para que a xente de alí te atope. Toca o botón — sen escribir nada.", memberAlreadyAdded: "Ese membro xa está engadido.", members: "Membros", membersDesc: "Engade as contas de Nostr da túa crew. Cada membro confirma coa súa propia chave — ata entón aparecen como “pendentes”.", musicLink: "Ligazón á música", nameCrew: "Ponlle nome á túa crew", nameCrewDesc: "Unha crew precisa un nome antes de continuar.", nameCrewFirst: "Ponlle nome á túa crew primeiro", nameHint: "O único que realmente necesitas. Podes cambialo despois.", namePlaceholder: "p. ex. Backyard Bandits", nameRequired: "Nome obrigatorio", nameRequiredDesc: "Dálle un nome á túa crew.", nip05DescA: "Un identificador verificable que controlas en calquera dominio, p. ex.", nip05DescB: ". Verifícase contra a chave do fundador desta crew e podes engadir varios — cada un mostra unha marca verde cando o seu dominio o confirma.", nip05Label: "NIP-05 da crew", nip05Placeholder: "crew@yourdomain.com", nip05Add: "Engadir", nip05Invalid: "Introduce un identificador como crew@yourdomain.com", nip05TooMany: "Podes engadir ata {{count}} identificadores.", nip05Unverified: "Sen comprobar", nip05Remove: "Quitar {{handle}}", notAKeyA: "Iso aínda non parece unha chave de Nostr — pega un", notAKeyB: ",", notAKeyC: "ou pubkey hex.", onlyYouTubeInstagram: "Só se admiten ligazóns de YouTube e Instagram.", openCall: "Convocatoria aberta", openCallDescA: "Buscas un filmer, editor ou sangue novo? Fai unha convocatoria — móstrase na páxina da túa crew para que xente compatible de", openCallDescB: "poida contactar.", optional: "· opcional", optionalParen: "(opcional)", otherSocials: "Outras redes", otherSocialsDesc: "Engade todas as que queiras — YouTube, TikTok, Discord, Telegram, etc.", ownVisibility: "a súa propia visibilidade", progress: "Progreso", publicWord: "Público", publishedToScene: "Publicado na escena.", publishFailed: "Non se puido publicar", publishing: "Publicando...", ready: "Listo", readyToRollA: "Todo listo — toca", readyToRollB: "cando queiras.", removeAdminRole: "Quitar o rol de admin", removeMember: "Quitar membro", removeSocial: "Quitar ligazón social", removeVibe: "Quitar {{vibe}}", roles: "Roles:", sasquatch: "Sasquatch", saveCrew: "Gardar crew", skipToEnd: "Ir ao final", socialPlaceholder: "@usuario ou ligazón", sponsorDesc: "Se unha tenda local apoia a túa crew, escóllea aquí para mostrar unha faixa de “Patrocinado por” que liga á súa tenda.", stepAria: "Paso {{step}}: {{title}}", stepBasics: "O básico", stepBasicsShort: "Básico", stepBasicsHint: "Só o esencial — podes crear unha crew con este paso.", stepVibe: "Identidade e estilo", stepVibeShort: "Estilo", stepVibeHint: "Como aparece a túa crew pola app. Todo opcional.", stepSquad: "Equipo e spots", stepSquadShort: "Equipo", stepSquadHint: "Engade a túa xente e a túa zona de casa. Sempre podes facelo despois.", stepExtras: "Extras", stepExtrasShort: "Extras", stepExtrasHint: "Extras para despois — salta o que non teñas claro.", extrasAllOptional: "Todo neste paso é opcional.", groupIdentity: "Identidade", groupIdentityHint: "Identificador, ligazóns", groupAi: "Sasquatch AI", groupShowcase: "Vitrina", groupPayments: "Pagamentos e tesourería", groupIntegrations: "Integracións", groupAdvanced: "Avanzado", groupAdvancedHint: "experimental", pro: "Pro", agentProNote: "Con tecnoloxía de Sasquatch. Pro usa os mellores modelos; sen Pro usa un de reserva gratuíto.", stepOf: "Paso {{step}} de {{total}}", treasuryDescA: "Reúne sats para un obxectivo común — arranxar o spot DIY local, unha viaxe da crew, un bote para premios dunha competición. É un obxectivo Lightning transparente; os zaps van", treasuryDescStrong: "directos á túa carteira", treasuryDescB: "(a través da dirección Lightning do teu perfil). SkateSpots nunca retén os fondos.", upload: "Subir", uploadFailed: "Erro ao subir", useCurrentLocation: "Usar a localización actual", vibeLabel: "Estilo / foco", videoDescA: "A part completa da túa crew, unha montaxe ou o último clip. Pega unha ligazón de", videoDescB: "— reproducirase na mesma páxina da túa crew.", visibilityDescA: "Cada membro controla a súa", visibilityDescB: "— cando confirman coa súa chave poden escoller", visibilityDescC: "(agochados para os de fóra). Non o podes definir por eles; é decisión súa.", website: "Web", yourRoles: "Os teus roles (xefe de equipo)", youtubeDetected: "Vídeo de YouTube detectado", invalidUrl: "Introduce unha ligazón válida (p. ex. https://example.com)." }, groupConversation: { seoTitle: "Chat de grupo - SkateSpots", invalidLink: "Esta ligazón de chat de grupo non é válida.", loginTitle: "Inicia sesión para ver este grupo", secureSignerTitle: "Cómpre un firmante seguro", secureSignerDesc: "As mensaxes de grupo necesitan un firmante compatible con NIP-44.", encryptedGroup: "Grupo cifrado de extremo a extremo", empty: "Aínda non hai mensaxes — saúda ao grupo.", placeholder: "Escribe ao grupo..." }, hero: { established: "Est. {{year}}", teamLeader: "Xefe de equipo: {{name}}", ledBy: "Liderada por" }, inviteCard: { acceptedTitle: "Convite aceptado 🛹", acceptedDesc: "O fundador da crew confirma os membros en {{crew}}. Aparecerás na lista cando te aprobe.", couldNotAccept: "Non se puido aceptar", couldNotDecline: "Non se puido rexeitar", acceptedDone: "Aceptado —", confirmsMembers: "confirma os membros", declinedDone: "Rexeitaches o convite a {{crew}}", invitedYou: "convidoute a unirte", admin: "Admin", accept: "Aceptar", decline: "Rexeitar" }, inviteDialog: { messageIntro: "Ola — únete á crew {{crew}} en SkateSpots 🛹", messageBody: "Inicia sesión coa túa chave de Nostr e despois solicita unirte desde a páxina da crew.", copyFailed: "Erro ao copiar", shareTitle: "Únete a {{crew}}", sentTitle: "Convite enviado! 🛹", sentDesc: "Recibirá unha notificación para aceptar ou rexeitar.", couldNotSend: "Non se puido enviar o convite", trigger: "Convidar", title: "Convidar a {{crew}}", description: "Envia un convite á chave de Nostr de alguén ou comparte unha ligazón.", sendTab: "Enviar convite", shareTab: "Compartir ligazón", npubLabel: "npub do skater", invalidNpub: "Iso non parece un npub válido.", noteLabel: "Nota", optional: "(opcional)", notePlaceholder: "Vén patinar connosco…", inviteAsAdmin: "Convidar como admin", inviteAsAdminDesc: "Pode xestionar a crew e convidar a outros.", sendButton: "Enviar convite", sendFooter: "Recibirá unha notificación para aceptar ou rexeitar. A membresía só conta cando acepte.", inviteLink: "Ligazón de convite", messageLabel: "Mensaxe", copyMessage: "Copiar mensaxe", founderHint: "Como fundador tamén podes engadir directamente a chave dun membro; despois el confirma.", addMemberSettings: "Engadir membro nos axustes da crew" }, joinRequest: { moreCount: "+{{count}} máis", addedTitle: "Engadiches {{name}} a {{crew}} 🛹", addedDesc: "Confirmará desde o seu lado para aparecer como membro.", vouchedTitle: "Avalaches a {{name}} 🤝", vouchedDesc: "O fundador de {{crew}} verá o teu aval e poderá engadilo.", couldNotEndorse: "Non se puido avalar", endorsedDoneA: "Avalaches a", endorsedDoneB: "— o fundador confirmará", vouchedBy: "Avalado por", approveAndAdd: "Aprobar e engadir", addToCrew: "Engadir á crew", vouchedWaiting: "Avalado — agardando polo fundador", vouchForThem: "Dálle o teu aval", leadershipOnly: "Só para a dirección da crew.", adminHelp: "Os admins non poden engadir membros directamente — ao avalar, o fundador sabe que apoias a este rider." }, leadership: { teamLeader: "Xefe de equipo", captain: "Capitán", verifiedMember: "Membro verificado", messageName: "Escribe a {{name}}", title: "Dirección", captainsOne: "{{count}} capitán", captainsMany: "{{count}} capitáns", footer: "O xefe de equipo leva a lista; os capitáns axudan a convidar, organizar jams e manter a crew en orde." }, linkField: { title: "Crew ligada", description: "Tamén levas unha crew? Lígaa para que a xente poida saltar entre o teu estudio e a túa crew. Opcional. Liga esta crew de volta ao perfil desde o editor da crew e aparecerá un", descriptionRest: "distintivo verde en ambos.", none: "Aínda non tes ningunha crew. Crea unha na páxina de crews para ligala aquí.", linkedCrew: "Crew ligada ({{id}})" }, lookingFor: { title: "Convocatoria aberta", subtitle: "Esta crew busca:" }, memberVisibility: { updatedTitle: "Visibilidade actualizada", updatedCrew: "Agora só apareces ante os compañeiros de crew.", updatedPublic: "Agora apareces publicamente nesta crew.", couldNotUpdate: "Non se puido actualizar", title: "A túa visibilidade nesta crew", save: "Gardar visibilidade" }, newMessage: { inCrew: "Na túa crew: {{crews}}", crewmate: "Compañeiro de crew", following: "Seguindo", invalidKey: "Iso non parece un npub ou unha chave pública válida.", description: "Busca a túa xente polo nome ou pega un npub para escribir a calquera. Selecciona dous ou máis para crear un grupo.", searchPlaceholder: "Busca un nome ou pega npub1...", messageThisKey: "Escribir a esta chave", loadingPeople: "Cargando a túa xente...", noPeople: "Aínda non hai compañeiros de crew nin seguidores.", noPeopleHint: "Pega o npub de alguén arriba para comezar unha conversa.", yourCrews: "As túas crews", selected: "{{count}} seleccionados", startGroup: "Crear grupo ({{count}})", message: "Mensaxe" }, nip05: { mismatch: "Este dominio apunta o identificador a unha chave de Nostr distinta da do fundador da crew. Non verificado.", verified: "Verificado — o dominio confirma que este identificador pertence á chave do fundador da crew." }, requestCollective: { sentTitle: "Solicitude enviada 🤝", sentDesc: "{{name}} veráa nas súas notificacións e poderá engadirte.", couldNotSend: "Non se puido enviar a solicitude", title: "Únete a este colectivo", waiting: "Solicitude enviada — agardando por {{name}}.", askA: "Pídeslle á crew detrás de", askB: "que te engada á lista. Recibirá unha notificación e poderá engadirte cun toque.", placeholder: "Opcional: di por que encaixarías…", sendButton: "Enviar solicitude" }, requestToJoin: { sentTitle: "Solicitude enviada! 🛹", sentDesc: "A dirección de {{crew}} veráa nas súas notificacións.", couldNotSend: "Non se puido enviar a solicitude", trigger: "Solicitar unirte", title: "Únete a {{crew}}", description: "Notifica ao fundador e aos admins da crew para que poidan engadirte.", placeholder: "Saúda — onde patinas, a quen coñeces, por que queres entrar…", sending: "Enviando…", sendButton: "Enviar solicitude de unión" }, sponsorBanner: { loading: "Cargando patrocinador…", sponsoredBy: "Patrocinado por" }, sponsorPicker: { selected: "Patrocinador seleccionado", setLoading: "Patrocinador definido (cargando a tenda…)", set: "Patrocinador definido", clearAria: "Borrar patrocinador", searchPlaceholder: "Buscar tendas de skate por nome ou cidade…", loading: "Cargando tendas…", noMatch: "Ningunha tenda coincide — proba outra busca.", none: "Aínda non se atoparon tendas." }, treasury: { title: "Tesourería da crew", ofGoal: "de {{target}} de obxectivo", goalReached: "Obxectivo acadado!", funded: "{{percent}}% financiado", contributionOne: "{{count}} contribución", contributionMany: "{{count}} contribucións", daysLeft: "{{days}} d restantes", closed: "pechada", nonCustodial: "Non custodial · os zaps van directos á carteira Lightning da crew" }, userStatus: { atSpot: "📍 Nun spot", autoClears: "⏱️ Bórrase automaticamente en {{min}} min" }, video: { title: "A part", fullVideo: "Vídeo completo · montaxe", latestClip: "Último clip", watch: "Ver", iframeTitle: "{{crew}} — vídeo", playAria: "Reproducir o vídeo de {{crew}}", thumbAlt: "Miniatura do vídeo de {{crew}}", instagramTitle: "Clip de Instagram" }, vouch: { removedTitle: "Aval retirado", vouchedTitle: "Avalado!", removedDesc: "Xa non avalas a {{name}}.", vouchedDesc: "Avalaches a {{name}}. A escena confía nos seus.", couldNotVouch: "Non se puido avalar", title: "Avals da escena", sceneVerified: "Verificado pola escena", vouched: "Avalado", newUnvouched: "Novo · sen aval", checking: "Comprobando a escena…", empty: "Aínda non hai avais. Os avais de skaters dos teus círculos son o mellor sinal de que alguén é de verdade — non un descoñecido que apareceu por aí.", countOne: "{{count}} aval", countMany: "{{count}} avais", trusted: "{{count}} de skaters da túa rede de confianza", remove: "Retirar aval", vouchFor: "Avalar a {{name}}", ownerNote: "Os skaters que coñecen o teu traballo poden avalarte aquí." } }, labelsUi: { spotCategory: { street: { label: "Rúa", description: "Spots achados ao azar, terreo urbano" }, transition: { label: "Transición", description: "Superficies curvas ou con ramplas" }, park: { label: "Parque", description: "Skateparks construídos" }, plaza: { label: "Praza", description: "Prazas urbanas (como MACBA, Love Park)" } }, spotFeature: { wallrides: "Wallrides", stairs: "Escaleiras e pasamáns", rails: "Rails", ledges: "Ledges e bordos", gaps: "Gaps", flatground: "Chan plano", "manual-pads": "Rampas de manual", "half-pipes": "Half pipes", "quarter-pipes": "Quarter pipes", "mini-ramps": "Mini rampas", bowls: "Bowls", vert: "Rampas vert", "mega-ramps": "Megarrampas", hubbas: "Hubbas", "euro-gaps": "Euro gaps", banks: "Bancos", "spine-ramps": "Rampas spine", "roll-ins": "Roll-ins", hips: "Hips", volcano: "Volcán", pyramids: "Pirámides / funboxes", "snake-runs": "Snake runs", "pump-track": "Pump track rollers", "flat-bars": "Barras planas" }, spotType: { street: "Rúa", transition: "Transición", park: "Parque", plaza: "Praza", wallrides: "Wallrides", stairs: "Escaleiras e pasamáns", rails: "Rails", ledges: "Ledges e bordos", gaps: "Gaps", flatground: "Chan plano", "manual-pads": "Rampas de manual", "half-pipes": "Half pipes", "quarter-pipes": "Quarter pipes", "mini-ramps": "Mini rampas", bowls: "Bowls", vert: "Rampas vert", "mega-ramps": "Megarrampas", hubbas: "Hubbas", "euro-gaps": "Euro gaps", banks: "Bancos", "spine-ramps": "Rampas spine", "roll-ins": "Roll-ins", hips: "Hips", volcano: "Volcán", pyramids: "Pirámides / funboxes", "snake-runs": "Snake runs", "pump-track": "Pump track rollers", "flat-bars": "Barras planas", diy: "DIY", rail: "Rail", ledge: "Ledge", gap: "Gap", bowl: "Bowl", stall: "Stall", slappy: "Slappy" }, access: { public: { label: "Público - Aberto a todos" }, private: { label: "Propiedade privada - Cómpre permiso" }, locals: { label: "Pregunta primeiro á xente de alí" } }, shelter: { outdoor: { label: "Ao aire libre", short: "Exterior", description: "Totalmente exposto — a choiva para a sesión" }, partial: { label: "Parcialmente cuberto", short: "Parcial", description: "Algúns obstáculos quedan secos" }, covered: { label: "Cuberto / con teito", short: "Cuberto", description: "Ao aire libre pero baixo teito" }, indoor: { label: "Interior", short: "Interior", description: "Totalmente pechado — patina chova ou faga sol" } }, eventType: { contest: "Competición", demo: "Demo", session: "Sesión", workshop: "Obradoiro", premiere: "Estrea", tradeshow: "Feira comercial", gameskate: "Xogo de Skate", concert: "🎸 Concerto", jam: "🎵 Jam", festival: "🎪 Festival", popup: "🎯 Pop-up" }, gearCategory: { deck: "Táboa", trucks: "Eixes", wheels: "Rodas", bearings: "Rodamentos", shoes: "Zapatillas de skate", clothing: "Roupa", protective: "Protección", stickers: "Pegatinas", wax: "Cera", tools: "Ferramentas", griptape: "Lixa", rubbrick: "Rub brick" }, gearCondition: { new: { label: "Novo", description: "Nunca usado, aínda na caixa" }, like_new: { label: "Como novo", description: "Apenas usado, en excelente estado" }, good: { label: "Bo", description: "Desgaste normal, funciona perfectamente" }, well_used: { label: "Moi usado", description: "Amosa desgaste pero segue funcionando" } }, priceType: { fixed: { label: "Prezo fixo", description: "Prezo establecido en USD ou sats" }, free: { label: "De balde", description: "Regalando" }, trade: { label: "Intercambio", description: "Busca cambiar" }, offer: { label: "Fai unha oferta", description: "Prezo negociable" } }, listingType: { selling: { label: "Venda", description: "Anuncio de equipamento á venda" }, wtb: { label: "Busco", description: "Busca equipamento concreto" } }, tour: { spotType: { street: "Rúa", park: "Parque", diy: "DIY", transition: "Transición", hidden: "Xoias agochadas" }, category: { local: { label: "Tour local", description: "Amosa spots agochados na túa cidade" }, national: { label: "Tour nacional", description: "Viaxes por varias cidades do país" }, international: { label: "Tour internacional", description: "Aventuras transfronteirizas por varios países" }, destruction: { label: "World Destruction", description: "Competición global por equipos estilo KOTR" } } }, crew: { vibe: { street: "Rúa", transition: "Transición / Vert", park: "Parque", diy: "DIY", cruising: "Paseo / Gravación", oldschool: "Old school", allterrain: "Todo terreo", girls: "Rapaza / Muller", youth: "Xuventude / Groms", adaptive: "Adaptado", punk: "Punk", hiphop: "Rap / Hip-hop" }, focus: { mixed: "Mixto / xeral", builder: "DIY e construtores", photo: "Foto e vídeo", coaching: "Adestramento", art: "Arte e deseño", music: "Banda e música", wellness: "Adestramento e fisio" }, focusDescription: { mixed: "Unha crew de skate normal — só aparece na páxina de crews.", builder: "Unha crew de DIY / construción de parques — tamén aparece en The Lab en Construtores.", photo: "Unha crew de gravación, fotografía ou edición — tamén aparece en The Lab en Foto e vídeo.", coaching: "Unha crew de adestramento / clases — tamén aparece en The Lab en Adestramento.", art: "Un colectivo de arte, deseño, graffiti ou tatuaxe — tamén aparece en The Lab en Arte e deseño.", music: "Unha banda ou colectivo musical — tamén aparece en The Lab en Música.", wellness: "Unha crew de adestramento, fitness ou fisio — tamén aparece en The Lab en Adestramento." }, lookingFor: { filmer: "Filmer", photographer: "Fotógrafo", editor: "Editor de vídeo", coach: "Adestrador", builder: "Construtor de ramplas", artist: "Artista / deseñador", musician: "Músico / banda", members: "Novos membros" }, role: { filmer: "Filmer", photographer: "Fotógrafo", editor: "Editor", coach: "Adestrador", builder: "Construtor", artist: "Artista", graffiti: "Graffiti", tattoo: "Tatuaxe", trainer: "Preparador", musician: "Músico", judge: "Xuíz", manager: "Xestor de equipo", og: "OG" } }, memberVisibility: { public: { label: "Público", description: "Calquera pode verte nesta crew — na páxina pública da crew e no descubrimento de compañeiros." }, crew: { label: "Só crew", description: "Só os compañeiros confirmados e o fundador te ven aquí. Para todos os demais apareces como un “membro agochado” anónimo. Nota: isto é privacidade a nivel de app — a túa etiqueta de membresía segue a existir publicamente nos relays, só que nunca se mostra aos de fóra." } }, tagCategory: { features: { name: "Características", description: "Obstáculos e terreo" }, surfaces: { name: "Superficies", description: "Materiais e texturas" }, sizes: { name: "Tamaños", description: "Dimensións e escala" }, stairs: { name: "Número de escaleiras", description: "Cantidade de escaleiras" }, vibes: { name: "Ambiente", description: "Atmósfera e estado" }, location: { name: "Localización", description: "Contexto da localización" }, tricks: { name: "Trucos", description: "Bos para trucos concretos" } }, spotTagCategory: { street: { label: "Rúa", description: "Spots de rúa - escaleiras, rails, ledges" }, park: { label: "Parque", description: "Skateparks - públicos ou privados" }, diy: { label: "DIY", description: "Spots DIY / feitos á man" }, plaza: { label: "Praza", description: "Prazas públicas con arquitectura amigable para patinar" } }, status: { active: { label: "Activo", description: "Todo ben — pata nel." }, bust: { label: "Bust", description: "Alto risco de botar fóra — seguridade ou policía." }, skate_stopped: { label: "Skate-stopped", description: "Con tacos ou tapado, pero parcialmente patinable." }, closed: { label: "Pechado", description: "Pechado temporalmente — obras ou evento." }, gone: { label: "Desaparecido", description: "Demolido, asfaltado ou valado para sempre." } }, price: { free: "GRATIS", trade: "Intercambio", makeOffer: "Fai unha oferta", offer: "Oferta" } }, cardUi: { save: "Gardar tarxeta en Nostr", saved: "Tarxeta gardada", savedDesc: "A túa tarxeta está asinada e é verificable.", saveFailed: "Non se puido gardar a tarxeta", notPublished: "Sen publicar", titleNeon: "Tarxeta", titleRest: "Rider", saveFrontPng: "Gardar a parte frontal (PNG)", expired: "CADUCADA", logoUploaded: "Logotipo subido", logoUploadFailed: "Non se puido subir o logotipo", venue: "Local ligado (opcional)", venueNone: "Sen local", venueHint: "Escolle un dos teus spots para vincular este pase a un local. Un verificador confirmará que é teu.", venuePick: "Escolle o teu local", parkNoVenue: "O dono do local é o único que pode emitir un pase de Parque — primeiro marca un spot que sexa teu.", parkAddVenue: "Engadir un spot", parkNeedsVenue: "Escolle un local que sexa teu", parkIssued: "Pases emitidos", parkRevoke: "Revogar", parkRevoked: "Revogado", parkRevokeFailed: "Non se puido revogar", v: { valid: "Válido", validDesc: "Sinatura válida e emitida polo local.", expired: "Caducado", expiredDesc: "Pasou a súa data de validez.", revoked: "Revogado", revokedDesc: "O emisor cancelou este pase — non o aceptes.", invalid: "Non válido", invalidDesc: "A sinatura non se verifica. Non confíes nel.", notFound: "Non atopado", notFoundDesc: "Non hai ningún rexistro coincidente nos relays.", unverifiedIssuer: "Emisor non verificado", unverifiedIssuerDesc: "Este pase nomea un local que non pertence á chave do emisor.", notBound: "Sen vincular", notBoundDesc: "Sen vínculo a un local — non demostra nada sobre o acceso.", noRsvp: "Sen RSVP", noRsvpDesc: "O portador non ten ningún RSVP rexistrado para este evento.", admitted: "Admitido", admittedDesc: "Evento do organizador e o portador confirmou asistencia.", noHolder: "Sen portador na ligazón", noHolderDesc: "Este QR non ten portador de entrada (`?h=`), así que non se pode comprobar o portador." }, passes: { tab: "Os meus pases", pass: "Pase de acceso", none: "Aínda non hai pases. Cando un local ou organizador che emita un, aparecerá aquí." }, facets: { title: "Mostrar facetas de identidade", crews: "Crews", local: "Local", roles: "Roles do Lab" }, roles: { coach: "Adestrador", filmer: "Filmer", editor: "Editor", photographer: "Fotógrafo", builder: "Construtor", artist: "Artista", graffiti: "Graffiti", tattoo: "Tatuaxe", trainer: "Preparador", musician: "Músico", judge: "Xuíz", organizer: "Organizador", barber: "Barbeiro" }, crew: { crewCard: "TARXETA DE CREW", crewSub: "A túa crew, nunha tarxeta", pick: "Escolle unha crew", none: "Aínda non estás en ningunha crew — únete ou crea unha primeiro.", hint: "A tarxeta constrúese cos datos asinados da propia crew. Edita a crew na súa páxina para cambiala.", members: "MEMBROS", spots: "SPOTS", est: "Est. {{year}}", openCall: "Convocatoria aberta", verifiedCrew: "Crew verificada", viewCrew: "Ver a crew" }, event: { pass: "PASE DE EVENTO", passSub: "Un pase para un evento ao que vas", pick: "Escolle un evento", none: "Aínda non hai eventos — crea un ou confirma asistencia primeiro.", hint: "O pase constrúese cos datos asinados do propio evento. Só o organizador pode cambialo.", admits: "ADMITE", going: "{{count}} asistindo", verifiedEvent: "Evento verificado", viewEvent: "Ver o evento", issuePass: "Emitir un pase de acceso", issuePassBtn: "Emitir pase", issuePassHint: "Un pase asinado para unha persoa concreta — móstrao na porta.", notOrganiser: "Só o organizador pode emitir pases", passIssued: "Pase emitido", issueFailed: "Non se puido emitir o pase", issuedPasses: "Pases de acceso emitidos" }, studio: { unsaved: "Cambios sen gardar", saved: "Gardado", saveChanges: "Gardar cambios", allSaved: "Gardado — todo ao día", showOnCard: "Mostrar na tarxeta", derived: "Do teu perfil de Skater", noSkaterProfile: "Aínda non hai perfil de Skater —", editSkaterProfile: "engade os teus estilos e nivel", noPhoto: "Aínda non hai foto de perfil —", addPhoto: "engade unha no teu perfil", finishTitle: "Remata a túa tarxeta", finishDesc: "Unha foto e un perfil de Skater fan que pareza real.", checkPhoto: "Foto de perfil", checkName: "Nome visible", checkProfile: "Estilos e nivel", checkCrew: "Únete a unha crew", moreTypes: "Desbloquéanse máis tipos de tarxeta a medida que marcas spots teus, te unes a crews ou confirmas asistencia a eventos.", accent: "Cor de acento", accentHint: "Substitúe a cor de acento do tema", accentClear: "Usar a cor do tema", logo: "Logotipo / escudo personalizado", logoAdd: "Subir", logoChange: "Cambiar", logoClear: "Quitar" }, back: { title: "Parte traseira imprimible", desc: "Crews, roles, patrocinadores e ligazóns no reverso", showBack: "Ver a parte traseira", showFront: "Ver a parte frontal", empty: "Aínda non hai nada — engade crews, roles ou patrocinadores." }, verify: { checking: "Comprobando a tarxeta…", notFound: "Tarxeta non atopada", notFoundDesc: "Non se atopou ningún evento coincidente nos relays. Pode que se eliminase ou que a ligazón estea mal.", invalid: "Sinatura non válida", invalidDesc: "Este evento existe pero a súa sinatura non se verifica. Non confíes nel.", authentic: "Auténtica", authenticDesc: "A sinatura do emisor é válida.", kind: "Tipo", kindPark: "Tarxeta de acceso a parque", kindRider: "Tarxeta de rider", kindCrew: "Tarxeta de crew", kindEvent: "Pase de evento", organiser: "Organizador", expired: "Caducada", valid: "Válida", holder: "Portador", ticketHolder: "Portador da entrada", rsvp: "RSVP", rsvpGoing: "Asistindo", rsvpInterested: "Interesado", rsvpNone: "Non se atopou RSVP", revoked: "Pase revogado", revokedDesc: "O emisor cancelou este pase — non o aceptes.", issuedBy: "Emitido por", accessLevel: "Nivel de acceso", validThru: "Válido ata", selfIssued: "Estado", selfIssuedDesc: "Tarxeta de identidade autoemitida", venue: "Local", venueVerified: "Verificado — a chave do dono deste local coincide co emisor.", venueMismatch: "Este pase nomea un local que non pertence á chave do emisor.", venueNone: "Sen vínculo a un local.", viewCard: "Ver a tarxeta", disclaimer: "Unha sinatura válida demostra quen asinou esta tarxeta — non é proba de habilidade nin de dereitos de acceso máis alá do que emitiu o local.", details: "Detalles", invalidLink: "Ligazón non válida", invalidLinkDesc: "Iso non parece unha ligazón de tarxeta válida." }, public: { invalid: "Iso non parece unha ligazón de tarxeta válida.", createYourOwn: "Crea a túa propia tarxeta", editYourCard: "Edita a túa tarxeta", backToEditor: "Volver ao editor", backHome: "Volver ao inicio", notCustomised: "Este skater aínda non personalizou a súa tarxeta — este é o aspecto por defecto.", verifyNote: "Escanea o QR da tarxeta para verificala." } }, routeUi: { destination: "Destino", routeTo: "Ruta a {{label}}", routeToLabel: "Ruta a", search: "Buscar", description: "Opcións de ruta e indicacións na app.", routeMapAria: "Mapa da ruta", findingLocation: "Buscando a túa localización…", plottingRoute: "Trazando a túa ruta…", refiningLocation: "Axustando a localización…", offlineSavedRoute: "Fóra de liña · ruta gardada {{age}}", tapMapStart: "Toca o mapa para marcar o punto de inicio", fitRouteAria: "Axustar toda a ruta no mapa", wholeRoute: "Ruta completa", next: "Seguinte", nextStep: "Seguinte · paso {{n}}", followTheLine: "Segue a liña", toTheTurn: "ata o xiro", toGo: "por percorrer", tryAgain: "Tentar de novo", mode: { foot: "Skate / a pé", bike: "Bici", moto: "Moto", car: "Coche", transit: "Transporte público" }, from: "Desde", myLocation: "A miña localización", tapTheMap: "Toca o mapa…", chooseOnMap: "Escoller no mapa", direct: "directo", transferOne: "1 transbordo", transfers: "{{count}} transbordos", options: "{{count}} opcións", ride: "trayecto", arrive: "chegada", speedAvg: "{{speed}} km/h de media", stepsCount: "{{count}} pasos", onABoard: "nunha táboa", usesDrivingRoads: "usa estradas para coches", drivingEstimate: "estimación en coche", updating: "actualizando…", pickMode: "Escolle un modo para ver a túa ruta.", waitingLocation: "Agardando pola túa localización…", routeSteps: "Pasos da ruta", walkingRoute: "ruta a pé — máis rápida nunha táboa", planningView: "Vista de planificación — toca Iniciar para seguir con xiros en directo, voz e chegada.", leaveNow: "Saír agora", departAt: "Saír ás", arriveBy: "Chegar antes das", departureTime: "Hora de saída", arrivalTime: "Hora de chegada", only: "Só", clear: "limpar", itinerary: "Itinerario", group: { bus: "Autobús", tram: "Tranvía", metro: "Metro", train: "Tren", ferry: "Ferry" }, walk: "A pé", rideVerb: "Montar", walkLower: "a pé", rideLower: "montar", toStop: "a", track: "vía {{track}}", stopOne: "1 parada", stopsCount: "{{count}} paradas", tickets: "billetes ↗", done: "Feito", stop: "Parar", start: "Iniciar", arrived: "Chegaches. 🛹", voiceOnNote: "A pantalla queda acendida · voz activada — os xiros e a chegada sóen.", voiceOffNote: "A pantalla queda acendida · voz desactivada.", followNote: "Xiros, voz e chegada mentres rolas. Mantén a pantalla acendida.", voiceOffAria: "Desactivar a guía por voz", voiceOnAria: "Activar a guía por voz", voiceStart: "Iniciando a navegación", voiceArrived: "Chegaches", voiceIn: "En {{metres}} metros, {{instruction}}", voiceContinue: "continúa", voiceContinueCaps: "Continúa", errPermissionDenied: "Permiso de localización denegado.", errWaitingGps: "Agardando unha fixación GPS…", errPermissionDeniedLong: "Permiso de localización denegado. Activa a localización para trazar a ruta desde onde estás.", errNoLocation: "Non se puido obter a túa localización. Téntao de novo.", errNoLocationShort: "Non se puido obter a túa localización.", errTransitNoRouteFiltered: "Non hai ruta para esa hora ou modo de transporte — proba outra hora ou inclúe máis modos.", errTransitNoRoute: "Non se atopou ningunha ruta de transporte público aquí — pode que esta zona non publique horarios abertos.", errTransitUnreachable: "Non se puido acceder ao servizo de transporte. Comproba a conexión e téntao de novo.", errRoutingBusy: "O servizo de rutas está ocupado agora mesmo — téntao de novo nun intre.", errNoRouteMode: "Non hai ruta para este modo — pode que o destino estea fóra da rede viaria. Proba outro modo.", errRoutingUnreachable: "Non se puido acceder ao servizo de rutas. Comproba a conexión e téntao de novo.", departures: "Saídas", upcomingFrom: "Próximas saídas desde {{stop}}", loadingDepartures: "Cargando saídas…", noDepartures: "Non se atoparon próximas saídas nesta parada.", live: "en directo", cancelled: "cancelada", refresh: "Actualizar", tripLoginTitle: "Inicia sesión para gardar", tripLoginDesc: "Inicia sesión para gardar esta viaxe como Colección.", tripCollectionTitle: "Viaxe de skate a {{destination}} 🛹", tripCollectionDesc: "Plan de viaxe de The Sasquatch — {{count}} días en {{destination}}.", tripCollectionDescOne: "Plan de viaxe de The Sasquatch — {{count}} día en {{destination}}.", tripSavedTitle: "Gardada en Coleccións 🦧", tripSavedDesc: "A túa viaxe a {{destination}} está marcada.", tripSaveFailed: "Non se puido gardar", tripSaveFailedDesc: "Téntao de novo nun segundo.", daysInDestinationOne: "{{count}} día en {{destination}}", daysInDestination: "{{count}} días en {{destination}}", wetForecast: "Previsión de choiva — busca unha crew local para opcións cubertas ou baixo teito.", dayLabel: "Día {{n}}", freeSkate: "Skate libre — explora e grava. 🎥", tapToBook: "toca para reservar / zap ⚡", localCrews: "Crews locais", saving: "Gardando…", savedToCollections: "Gardada en Coleccións", saveSpotOne: "Gardar {{count}} spot nunha Colección", saveSpots: "Gardar {{count}} spots nunha Colección", flights: "Voos", stays: "Aloxamento", gettingAround: "Como moverse", noMiddleman: "Eu planifico o skate — os voos e o aloxamento ábrense nos sitios reais (sen KYC, sen intermediarios).", ageJustNow: "agora mesmo", ageMinAgo: "hai {{count}} min", ageHourAgo: "hai {{count}} h", ageDayAgo: "hai {{count}} d", skateRightHere: "aquí mesmo", skateMin: "~{{count}} min rolando", skateHours: "~{{hours}} h rolando", maneuver: { headOut: "Pon en marcha", arrive: "Chega ao spot", continueStraight: "Segue recto", bearLeft: "Desvía á esquerda", bearRight: "Desvía á dereita", turnLeft: "Xira á esquerda", turnRight: "Xira á dereita", sharpLeft: "Xiro brusco á esquerda", sharpRight: "Xiro brusco á dereita", turn: "Xira", keepLeft: "Mantente á esquerda", keepRight: "Mantente á dereita", takeFork: "Colle a bifurcación", merge: "Incorpórate", roundabout: "Toma a rotonda", takeRamp: "Colle a rampla", takeExit: "Colle a saída" }, maneuverOnto: "{{instruction}} cara a {{road}}" } }; export default batch2;