diff --git a/src/i18n/pt/batch1.ts b/src/i18n/pt/batch1.ts index 3e5c206..200aa8e 100644 --- a/src/i18n/pt/batch1.ts +++ b/src/i18n/pt/batch1.ts @@ -1,4 +1,290 @@ /** pt — batch 1. Filled by the translation pass; empty until then. */ -const ptBatch1 = {}; +const ptBatch1 = { + common: { + loading: "Carregando...", + error: "Erro", + save: "Salvar", + cancel: "Cancelar", + delete: "Excluir", + edit: "Editar", + add: "Adicionar", + remove: "Remover", + create: "Criar", + submit: "Enviar", + close: "Fechar", + back: "Voltar", + next: "Próximo", + done: "Concluído", + search: "Buscar", + filter: "Filtrar", + sort: "Ordenar", + share: "Compartilhar", + more: "Mais", + copy: "Copiar", + copied: "Copiado!", + viewAll: "Ver tudo", + seeMore: "Ver mais", + showMore: "Mostrar mais", + showLess: "Mostrar menos", + noResults: "Nenhum resultado encontrado", + tryAgain: "Tentar novamente", + learnMore: "Saiba mais", + getStarted: "Começar", + yes: "Sim", + no: "Não", + or: "ou", + and: "e", + free: "Grátis", + new: "Novo", + popular: "Popular", + featured: "Destacado", + verified: "Verificado", + sats: "sats", + clear: "Limpar", + clearFilters: "Limpar filtros", + clearAll: "Limpar tudo", + hide: "Ocultar", + undo: "Desfazer", + }, + nav: { + home: "Início", + map: "Spots", + lab: "The Lab", + events: "Eventos", + crews: "Crews", + wallet: "Carteira", + settings: "Configurações", + more: "Mais", + rewards: "Recompensas", + stats: "Estatísticas da comunidade", + about: "Sobre", + food: "Comida", + marketplace: "Marketplace", + mints: "Mints", + appShop: "App Shop", + diy: "DIY", + trades: "Marketplace", + stash: "Stash", + collections: "Coleções", + contacts: "Contatos", + messages: "Mensagens", + skaters: "Skatistas", + glossary: "Glossário", + riderCard: "Rider Card", + supporters: "Apoiadores ⚡", + newsletter: "Newsletter", + viewProfile: "Ver perfil", + leaderboards: "Rankings", + }, + chromeUi: { + skipToContent: "Ir para o conteúdo", + menu: "Menu", + inBadge: "Ativo", + loggedIn: "Conectado", + profile: "Perfil", + logIn: "Entrar", + logOut: "Sair", + notLoggedIn: "Não conectado", + loggedOutPrompt: "Entre para adicionar spots, dar zap em skatistas e salvar seus favoritos", + accounts: "Contas", + addAnotherAccount: "Adicionar outra conta", + setStatus: "Definir status", + setYourStatus: "Defina seu status", + status: "Status", + addSpot: "Adicionar spot", + myData: "Meus dados", + myStash: "Meu Stash", + myCollections: "Minhas coleções", + viewMyProfile: "Ver meu perfil", + customizeNavBar: "Personalizar barra de navegação", + ecash: "Ecash", + madeWith: "Feito com", + forSkateCommunity: "para a comunidade do skate", + beta: "Beta", + license: "Licença", + privacy: "Privacidade", + collaborators: "Colaboradores e amigos", + notSponsoredBy: "Não patrocinado por", + errorTitle: "Não foi possível carregar", + errorDescription: "A requisição de rede falhou. Verifique sua conexão e tente novamente.", + tryAgain: "Tentar novamente", + weatherOn: "Clima ativado", + weatherOff: "Clima desativado", + trustFilter: "Filtro de confiança", + filterByTrustLevel: "Filtrar por nível de confiança", + trust: { + all: "Todos os usuários", + allDesc: "Mostrar conteúdo de todos", + verified: "Verificado", + verifiedDesc: "Você os segue ou são verificados (confiança ≥90)", + trusted: "Confiável", + trustedDesc: "Amigos de amigos ou verificados por NIP-05 (confiança ≥60)", + following: "Somente quem você segue", + followingDesc: "Mostrar apenas conteúdo de pessoas que você segue", + followingShort: "Seguindo", + }, + sort: { + recent: "Mais recentes", + recentDesc: "Mais novos primeiro", + trust: "Maior confiança", + trustDesc: "Criadores mais confiáveis", + proximity: "Mais perto de mim", + proximityDesc: "Locais mais próximos", + popular: "Mais populares", + popularDesc: "Mais comentários/reações", + zaps: "Mais zapados", + zapsDesc: "Maior valor recebido", + }, + spotType: { + street: "Street", + transition: "Transition", + park: "Park", + plaza: "Plaza", + diy: "DIY", + bowl: "Bowl", + vert: "Vert", + indoor: "Indoor", + skatepark: "Skatepark", + miniramp: "Mini Ramp", + }, + }, + desktopNav: { + title: "Navegação do desktop", + desc: "Escolha quais abas aparecem na barra superior e a ordem delas. As abas ocultas continuam no menu “Mais”.", + fixed: "Fixo", + shownInTopBar: "Mostradas na barra superior ({{count}})", + noExtraTabs: "Nenhuma aba extra exibida — tudo está no menu “Mais”. Adicione algumas abaixo.", + inMoreMenu: "No menu “Mais” ({{count}})", + moveUp: "Mover {{name}} para cima", + moveDown: "Mover {{name}} para baixo", + hide: "Ocultar {{name}}", + moveToMore: "Mover para o menu Mais", + show: "Mostrar", + showInTopBar: "Mostrar {{name}} na barra superior", + showInTopBarTitle: "Mostrar na barra superior", + reset: "Redefinir para o padrão", + }, + navSheet: { + title: "Personalize sua barra", + desc: "Escolha as {{count}} abas que você mais usa. Todo o resto fica no menu.", + preview: "Pré-visualização", + empty: "Vazio", + order: "Ordem ({{done}}/{{total}})", + available: "Abas disponíveis", + full: "Barra cheia — remova uma para trocar", + moveUp: "Mover {{name}} para cima", + moveDown: "Mover {{name}} para baixo", + login: "Entrar", + profile: "Perfil", + reset: "Redefinir", + done: "Concluído", + }, + pwa: { + installTitle: "Instalar o SkateSpots", + installSubtitle: "Tenha a experiência completa do app", + addToHomeScreen: "Adicionar à tela inicial", + installApp: "Instalar app", + maybeLater: "Talvez mais tarde", + gotIt: "Entendi!", + benefits: { + fast: "Muito rápido", + offline: "Funciona offline", + fullAccess: "Acesso completo", + }, + iosStep1: "Toque no botão Compartilhar", + iosStep1Hint: "na parte de baixo do Safari", + iosStep2: "Role e toque em \"Adicionar à Tela de Início\"", + iosStep2Hint: "no menu de compartilhamento", + iosStep3: "Toque em \"Adicionar\" para instalar", + iosStep3Hint: "O app vai aparecer na sua tela inicial", + androidStep1: "Toque no botão de menu", + androidStep1Hint: "(três pontos) no seu navegador", + androidStep2: "Selecione \"Adicionar à tela inicial\"", + androidStep2Hint: "ou \"Instalar app\"", + androidStep3: "Confirme para instalar", + androidStep3Hint: "O app vai aparecer na sua tela inicial", + tagline: "Grátis • Funciona offline • Rápido e confiável", + }, + home: { + tagline: "Feito pela comunidade • Baseado em relays", + title: "SKATE SPOTS", + subtitle: "Descubra spots • Encontre pessoas • Aprenda manobras • Apoie os locais", + description: "O skate de verdade acontece offline - esta ferramenta ajuda você a encontrá-lo.", + betaWarning: "BETA - Em construção • Use por sua conta e risco", + pwaHint: "Progressive Web App - Instale no seu dispositivo", + exploreMap: "Explorar mapa", + addSpot: "Adicionar spot", + globalSpots: "Spots globais", + openCommunity: "Comunidade aberta", + lightningZaps: "Zaps Lightning", + featuredSpots: "Spots em destaque", + featuredSpotsDesc: "Spots de skate verificados pela comunidade no mundo inteiro", + upcomingEvents: "Próximos eventos", + upcomingEventsDesc: "Competições, encontros e sessões que vão acontecer em breve", + noSpotsYet: "Nenhum spot encontrado ainda", + noSpotsHint: "Seja o primeiro a adicionar um spot de skate!", + noEventsYet: "Nenhum evento próximo", + noEventsHint: "Volte mais tarde ou crie um!", + theLab: "The Lab", + theLabDesc: "Aprenda manobras, encontre coaches e evolua no seu skate", + coaches: "Coaches", + coachesDesc: "Aprenda com skatistas experientes que podem te ajudar a evoluir", + filmers: "Filmers", + filmersDesc: "Conecte-se com filmers para gravar seus melhores clipes", + findCoach: "Encontrar um coach", + becomeCoach: "Seja um coach", + findFilmer: "Encontrar um filmer", + becomeFilmer: "Seja um filmer", + viewAllSpots: "Ver todos os spots", + viewAllEvents: "Ver todos os eventos", + createEvent: "Criar evento", + readyToShare: "Pronto para compartilhar?", + readyToShareDesc: "Ajude a comunidade do skate a crescer adicionando seus spots favoritos. Cada lugar que você compartilha ajuda outros skatistas a descobrir novos lugares para andar.", + }, + about: { + title: "Sobre o SkateSpots", + subtitle: "Uma comunidade de skate descentralizada", + whatIs: "O que é o SkateSpots?", + whatIsDesc: "O SkateSpots é uma plataforma feita pela comunidade para descobrir lugares de skate no mundo todo. Construído sobre o Nostr, ele dá aos skatistas a posse real dos seus dados.", + features: "Recursos", + featuresDesc: "Encontre spots, crie eventos, conecte-se com coaches e apoie as lojas de skate da sua região — tudo em um só lugar.", + nostr: "Construído sobre o Nostr", + nostrDesc: "O Nostr é um protocolo simples e aberto que permite comunicação global realmente resistente à censura. Sua conta e seus dados pertencem a você.", + openSource: "Código aberto", + openSourceDesc: "O SkateSpots é totalmente de código aberto. Contribua, faça um fork ou rode sua própria instância.", + lightning: "Pagamentos Lightning", + lightningDesc: "Dê zap nos seus skatistas, coaches e criadores de conteúdo favoritos com pagamentos Bitcoin Lightning.", + }, + faq: { + title: "Perguntas frequentes", + subtitle: "Tudo o que você precisa saber sobre o SkateSpots", + whatIsNostr: "O que é o Nostr?", + whatIsNostrAnswer: "O Nostr é um protocolo aberto para redes sociais descentralizadas. Diferente das plataformas tradicionais, você é dono dos seus dados e da sua identidade.", + howToStart: "Como eu começo?", + howToStartAnswer: "Clique em \"Criar conta\" para criar uma nova conta Nostr, ou em \"Entrar\" se você já tiver uma. Você pode usar uma extensão de navegador, um app de celular ou uma chave secreta.", + whatAreZaps: "O que são Zaps?", + whatAreZapsAnswer: "Zaps são gorjetas em Bitcoin Lightning que você pode enviar para outros usuários. É uma forma de demonstrar seu reconhecimento por um conteúdo bom ou apoiar criadores.", + howToAddSpot: "Como adiciono um spot?", + howToAddSpotAnswer: "Entre na sua conta, clique em \"Adicionar spot\" e preencha os detalhes, incluindo localização, fotos e descrição.", + isItFree: "O SkateSpots é grátis?", + isItFreeAnswer: "Sim! O SkateSpots é totalmente gratuito. Você pode, se quiser, enviar Zaps (gorjetas em Bitcoin) para outros usuários.", + canIEditSpot: "Posso editar ou excluir meus spots?", + canIEditSpotAnswer: "Sim, você pode editar os spots que criou. Devido à natureza descentralizada do Nostr, os pedidos de exclusão são enviados, mas alguns relays podem manter os dados.", + }, + onboarding: { + welcome: "Bem-vindo ao SkateSpots!", + welcomeDesc: "Vamos configurar tudo em apenas alguns passos.", + step1Title: "Crie sua conta", + step1Desc: "Suas chaves Nostr estão sendo geradas. É como uma senha que você controla.", + step2Title: "Faça backup das suas chaves", + step2Desc: "Guarde sua frase de recuperação em um lugar seguro. É a única forma de recuperar sua conta!", + step3Title: "Configure seu perfil", + step3Desc: "Conte à comunidade um pouco sobre você.", + step4Title: "Tudo pronto!", + step4Desc: "Comece a explorar spots, eventos e a se conectar com skatistas.", + skipForNow: "Pular por enquanto", + continueToApp: "Continuar para o app", + }, +}; export default ptBatch1; diff --git a/src/i18n/pt/batch2.ts b/src/i18n/pt/batch2.ts index 6821465..7c1bd20 100644 --- a/src/i18n/pt/batch2.ts +++ b/src/i18n/pt/batch2.ts @@ -1,4 +1,1652 @@ -/** pt — batch 2. Filled by the translation pass; empty until then. */ -const ptBatch2 = {}; +/** pt (pt-BR) — batch 2: mapUi, mapPage, spotUi, diyUi, labelsUi, feesUi, cardUi, routeUi, sasquatchUi, sasquatchChat. */ +const ptBatch2 = { + mapUi: { + mapFooter: { + links: "Links", + hide: "Ocultar barra de links do mapa", + }, + findingSpots: "Buscando spots", + loadingSpots: "Carregando spots", + loadingMap: "Carregando mapa...", + mapViewAria: "Visualização de mapa", + listViewAria: "Visualização de lista", + layers: "Camadas", + mapLayers: "Camadas do mapa", + showOnMap: "Mostrar no mapa", + showResults: "Mostrar resultados", + quickActions: "Ações rápidas", + spots: "Spots", + shops: "Lojas", + gear: "Equipamentos", + tours: "Tours", + events: "Eventos", + crews: "Crews", + spotType: "Tipo de Spot", + sortBy: "Ordenar por", + trustLevel: "Nível de confiança", + weather: "Clima", + buySellGear: "Comprar/Vender Equipamentos", + stash: "Stash", + more: "Mais", + newHere: "Novo por aqui?", + welcomeDesc: "Descubra spots de skate, eventos e a comunidade.", + getOnZapstore: "Baixe na Zapstore", + dismiss: "Dispensar", + addedBy: "Adicionado por", + directions: "Rota", + viewDetails: "Ver detalhes", + viewDetailsArrow: "Ver detalhes →", + spotDetails: "Detalhes do spot", + skateShop: "Skate Shop", + skateSpot: "Skate Spot", + youAreHere: "Você está aqui", + conditions: "Condições", + weatherScoreSuffix: "{{score}}/100 clima", + wind: "Vento", + humidity: "Umidade", + airQuality: "Qualidade do ar", + threeDayForecast: "Previsão de 3 dias", + gearForSale: "Equipamentos à venda ({{count}})", + viewItems: "Ver itens →", + viewAllItems: "Ver todos os {{count}} itens →", + viewGear: "Ver equipamentos →", + localTour: "Tour local", + meetAt: "Encontro em: {{place}}", + hours: "{{count}} horas", + level: "nível {{level}}", + viewTour: "Ver tour →", + upcomingEvent: "Próximo evento", + viewEvent: "Ver evento →", + skateCrew: "Skate Crew", + members: "{{count}} membros", + since: "Desde {{year}}", + viewCrew: "Ver crew →", + acceptsBitcoin: "Aceita Bitcoin", + boosted: "Impulsionado", + website: "Site", + offlineSavedSpots: "Offline · mostrando spots salvos", + cantReachRelays: "Não foi possível alcançar os relays", + relayOnlineNoAnswer: "Você está online, mas o relay da comunidade não está respondendo agora.", + youreOffline: "Você está offline.", + savedOnDevice: "Os spots que você já viu estão salvos neste dispositivo e aparecerão aqui.", + noSpotsMatchTitle: "Nenhum spot corresponde", + noSpotsMatchDesc: "Tente uma busca diferente ou limpe os filtros.", + noSpotsMappedYet: "Nenhum spot mapeado ainda", + noSpotsMappedDesc: "Seja o primeiro a mapear seu park — leva um minuto, é seu, e o próximo skatista que passar vai agradecer.", + addFirstSpot: "Adicionar o primeiro spot", + findSpotsNearMe: "Encontrar spots perto de mim", + locating: "Localizando…", + refiningLocation: "Refinando sua localização…", + refiningLocationDesc: "Centralizado no seu último spot — ajustando um sinal de GPS novo.", + locatingYou: "Localizando você…", + locatingDesc: "Obtendo sinal de GPS. Isso pode levar até um minuto na primeira vez.", + foundYou: "Encontramos você", + foundYouDesc: "Mapa centralizado na sua localização.", + locationPermissionNeeded: "Permissão de localização necessária", + permissionNeededDesc: "Permita a localização para o SkateSpots em Configurações → Apps → SkateSpots → Permissões do seu dispositivo, depois toque em Perto de mim novamente.", + locationTimedOut: "Tempo de localização esgotado", + timeoutNativeDesc: "Não foi possível obter a localização a tempo. Se você está em local fechado, o GPS não vê satélites — ative a Localização por rede (Configurações → Localização) ou vá para um local aberto e tente de novo.", + timeoutWebDesc: "Não foi possível obter sua localização a tempo. Verifique seu sinal e tente novamente.", + noLocationProvider: "Nenhum provedor de localização", + noProviderNativeDesc: "Seu celular não está fornecendo localização. Em ROMs focadas em privacidade (ex.: GrapheneOS), ative a Localização por rede em Configurações → Localização, ou garanta que o GPS esteja ligado e tente ao ar livre.", + noProviderWebDesc: "Nenhum provedor de localização disponível. Ative os serviços de localização e tente novamente.", + locationUnavailable: "Localização indisponível", + unavailableNativeDesc: "Ative Localização/GPS nas configurações do seu celular, permita a localização para o SkateSpots (Configurações → Apps → SkateSpots → Permissões) e tente novamente.", + unavailableWebDesc: "Não foi possível determinar sua localização. Certifique-se de que os serviços de localização estejam ativados.", + locationBlocked: "Localização bloqueada", + locationBlockedDesc: "Seu navegador bloqueou o acesso à localização para este site. Veja como reativar:", + locationPlatformAndroid: "Chrome no Android", + locationPlatformIos: "Safari no iOS", + locationPlatformDesktop: "Chrome no desktop", + locationPlatformFirefox: "Firefox", + locationStepsAndroid: "Toque no ícone de cadeado na barra de endereço → Configurações do site → Localização → Permitir", + locationStepsIos: "App Ajustes → Safari → Localização → Permitir (ou toque no botão \"AA\" na barra de endereço do Safari)", + locationStepsDesktop: "Clique no ícone de cadeado → Configurações do site → Localização → Permitir", + locationStepsFirefox: "Clique no ícone de cadeado → Conexão segura → Mais informações → Permissões → Acessar sua localização → Permitir", + gotIt: "Entendi", + addSpot: "Adicionar Spot", + addShop: "Adicionar Loja", + addEvent: "Adicionar Evento", + addSpotHereTitle: "Adicionar um spot aqui?", + addSpotHereDesc: "Solte um pino onde você tocou", + sellGear: "Vender Equipamentos", + offerTour: "Oferecer Tour", + closeAddMenu: "Fechar menu de adição", + addMenuAria: "Adicionar spot, loja, evento, equipamento ou tour", + localChat: "Chat local", + localChatDesc: "Chat ao vivo para onde o mapa estiver centralizado. Escolha o alcance do canal.", + btcMapShowing: "Mostrando {{count}} lugares onde você pode Spedn seus sats por perto", + btcMapShow: "Mostrar lugares onde você pode Spedn seus sats (via BTC Map)", + yourPrivateStash: "Seu Stash Privado", + stashIntro: "Acompanhe seus equipamentos, defina preços e encontre trocas com outros skatistas.", + encryptionRequired: "Criptografia necessária", + encryptionRequiredDesc: "Use um signer com suporte a NIP-44 (Alby, nos2x, Amber).", + myStash: "Meu Stash", + encrypted: "Criptografado", + itemsCount: "{{count}} itens", + items: "Itens", + wishlist: "Lista de desejos", + types: "Tipos", + stashEmpty: "Seu stash está vazio", + addFirstItem: "Adicionar primeiro item", + wishlistCount: "Lista de desejos ({{count}})", + myGearCount: "Meus equipamentos ({{count}})", + openFullStash: "Abrir Stash completo", + addItem: "Adicionar item", + searchSpotsPlaceholder: "Buscar spots...", + selected: "Selecionado", + noSpotsFound: "Nenhum spot encontrado. Tente uma busca diferente.", + addingSpotsHint: "Adicionar spots ajuda os usuários a te encontrar ao navegar por locais específicos", + report: "Denunciar", + spotSingular: "1 spot", + spotPlural: "{{count}} spots", + view: "Ver", + myCollections: "Minhas coleções", + collectionsSubtitle: "Organize seus spots favoritos em listas personalizadas", + newCollection: "Nova coleção", + loginToCreate: "Entre para criar coleções", + loginToCreateDesc: "Salve seus spots favoritos em listas personalizadas como \"Viagem a Barcelona 2024\" ou \"Melhores rails de SP\"", + noCollections: "Nenhuma coleção ainda", + noCollectionsDesc: "Crie sua primeira coleção para começar a organizar spots", + createFirstCollection: "Crie sua primeira coleção", + createNewCollection: "Criar nova coleção", + createCollectionDesc: "Dê um nome e uma descrição opcional à sua coleção", + collectionName: "Nome da coleção", + collectionNamePlaceholder: "Viagem a Barcelona 2024", + descriptionOptional: "Descrição (opcional)", + descriptionPlaceholder: "Meus spots favoritos da minha viagem a Barcelona...", + creating: "Criando...", + createCollection: "Criar coleção", + editCollection: "Editar coleção", + saving: "Salvando...", + saveChanges: "Salvar alterações", + deleteCollectionTitle: "Excluir coleção?", + deleteCollectionDesc: "Isso excluirá permanentemente \"{{title}}\". Os spots em si não serão afetados.", + deleting: "Excluindo...", + collectionCreated: "Coleção criada!", + collectionCreatedDesc: "\"{{title}}\" está pronta para spots", + collectionCreateFailed: "Falha ao criar a coleção", + collectionUpdated: "Coleção atualizada!", + changesSaved: "Suas alterações foram salvas", + collectionUpdateFailed: "Falha ao atualizar a coleção", + collectionDeleted: "Coleção excluída", + collectionDeletedDesc: "\"{{title}}\" foi removida", + collectionDeleteFailed: "Falha ao excluir a coleção", + somethingWentWrong: "Algo deu errado", + }, + mapPage: { + title: "Lojas e Spots", + spots: "Spots", + shops: "Lojas", + filters: "Filtros", + listView: "Lista", + mapView: "Mapa", + nearMe: "Perto de mim", + searchPlaceholder: "Buscar spots...", + noSpotsInArea: "Nenhum spot nesta área", + zoomIn: "Aproximar", + zoomOut: "Afastar", + myLocation: "Minha localização", + locationsFound: "{{count}} locais encontrados", + spotsOnly: "Somente spots", + shopsOnly: "Somente lojas", + spotsAndShops: "Spots e Lojas", + noSpotsMatch: "Nenhum spot corresponde aos seus filtros.", + noSpotsYet: "Nenhum spot foi adicionado ainda.", + addFirstSpot: "Adicionar primeiro spot", + }, + spotUi: { + claim: { + areYouOwner: "Este spot é seu?", + privateDesc: "Este spot está marcado como privado. Se você é dono ou cuida dele, reivindique-o — um moderador do SkateSpots confirma a propriedade e então você assume o anúncio.", + claimSpot: "Reivindicar este spot", + nip05Required: "Você precisa de um NIP-05 verificado para reivindicar um spot privado (prova de que você controla uma identidade Nostr). Adicione um no seu perfil e volte aqui.", + addNip05: "Adicionar NIP-05 nas Configurações", + pendingTitle: "Reivindicação aguardando revisão", + pendingDesc: "Sua reivindicação foi enviada. Um moderador do SkateSpots vai revisá-la — você poderá concluir a reivindicação assim que for aprovada.", + approvedTitle: "Reivindicação aprovada", + approvedDesc: "Um moderador aprovou sua reivindicação. Conclua para se tornar o dono deste spot.", + complete: "Concluir reivindicação", + submitted: "Reivindicação enviada", + submittedDesc: "Um moderador vai revisar sua reivindicação. Você assumirá o spot assim que for aprovada.", + submitFailed: "Não foi possível enviar a reivindicação", + submit: "Enviar reivindicação", + submitting: "Enviando…", + confirmTitle: "Reivindicar \"{{title}}\"?", + confirmIntro: "Você está pedindo para se tornar o dono deste spot privado.", + confirmBullet1: "Um moderador do SkateSpots revisa o pedido (não podemos verificar propriedade, apenas chaves Nostr)", + confirmBullet2: "Se aprovado, você conclui a reivindicação para se tornar o dono e pode editar o spot", + confirmBullet3: "O spot original permanece no Nostr — a rede é descentralizada", + adminTitle: "Reivindicações de propriedade pendentes", + adminApprove: "Aprovar", + adminApproved: "Aprovado", + adminApprovedDesc: "Agora eles podem concluir a reivindicação do spot.", + adminApproveFailed: "Não foi possível aprovar a reivindicação", + loginRequired: "Entre para reivindicar este spot privado, ou para pedir a propriedade.", + }, + abandonedDesc: "Última atualização {{time}}. Se o dono original estiver inativo, você pode reivindicar este spot para mantê-lo e melhorá-lo.", + claimedNotice: "Anúncio reivindicado", + claimedNoticeDesc: "Este spot foi republicado por um novo dono após uma reivindicação. O anúncio original ainda pode existir separadamente.", + abandonedLoginDesc: "Última atualização {{time}}. Entre para reivindicar e manter este spot.", + accessDeniedDesc: "Você só pode editar spots que você criou.", + accessDeniedTitle: "Acesso negado", + addAtLeastOneTag: "Adicione pelo menos uma tag.", + additionalDetails: "Detalhes adicionais (opcional)", + additionalDetailsPlaceholder: "Forneça qualquer contexto adicional que possa ajudar...", + addNewTags: "Adicionar novas tags:", + addNip05InSettings: "Adicionar NIP-05 nas Configurações", + addPhoto: "Adicionar foto", + addPhotoDesc: "Contribua com uma foto para ajudar outros a descobrir este spot.", + addPhotoOrDescription: "Adicione uma foto ou uma descrição", + addPhotoOrDescriptionDesc: "Dê aos skatistas algo para se orientar — uma imagem, ou uma linha sobre o lugar.", + addPhotos: "Adicionar fotos", + addPhotoToSpot: "Adicionar foto ao spot", + adminDeleteDialogDesc: "Como admin do SkateSpots, você está removendo \"{{title}}\". Ele ficará oculto em todo o app para todos e um pedido de exclusão será enviado aos relays.", + adminDeleteReason: "Admin do SkateSpots removeu o spot \"{{title}}\"", + airQuality: "Qualidade do ar", + altSkateSpot: "Skate spot: {{title}}", + areYouShopOwner: "Você é o dono da loja?", + askBeforeSkating: "Pergunte antes de andar", + backToSpot: "Voltar ao spot", + beFirstToListGear: "Seja o primeiro a anunciar equipamentos neste spot!", + beFirstToSay: "Seja o primeiro a dizer algo.", + byAuthor: "por {{name}}", + captionPlaceholder: "Adicione uma legenda (opcional) - descreva o que há na foto, quando foi tirada, etc.", + chatPublicNote: "Qualquer pessoa pode ler isto — as mensagens são públicas e efêmeras. Para conversas privadas, use as Mensagens Diretas.", + checkPinBelow: "Confira o pino abaixo antes de adicionar uma duplicata.", + claimBullet1: "Você se torna o dono e pode editar o spot", + claimBullet2: "O spot original permanece (o Nostr é descentralizado)", + claimBullet3: "Sua versão pode aparecer ao lado do original", + claimFailed: "Falha na reivindicação", + claiming: "Reivindicando...", + claimIntro: "Você está prestes a reivindicar a propriedade deste spot. Isso criará sua própria versão do spot que você pode editar e manter.", + claimSpot: "Reivindicar spot", + claimThisSpot: "Reivindicar este spot", + claimTitle: "Reivindicar \"{{title}}\"?", + claimWhatHappens: "O que acontece quando você reivindica:", + coachesAndFilmersAvailable: "Coaches e filmers disponíveis neste spot", + coachesCount: "Coaches ({{count}})", + coachHere: "Coach aqui", + community: "Comunidade", + communityVerified: "Verificado pela comunidade", + communityVerifiedTitle: "Outro skatista contribuiu aqui (foto ou relato de status).", + conditions: "Condições", + contactForPermission: "Contato para permissão", + contactInfo: "Informações de contato", + contributePhoto: "Contribuir com foto", + contributing: "Contribuindo...", + couldNotSendMessage: "Não foi possível enviar a mensagem.", + couldNotSubmit: "Não foi possível enviar", + couldNotUploadPhoto: "Não foi possível enviar a foto. Você pode adicionar uma abaixo.", + crewsThatSkateHere: "Crews que andam aqui", + current: "Atuais:", + currentTags: "Tags atuais neste spot:", + daysAgo: "há {{count}} dia", + daysAgoPlural: "há {{count}} dias", + deleteDialogDesc: "Isso excluirá permanentemente \"{{title}}\" de todos os relays. Esta ação não pode ser desfeita.", + deletedSpotReason: "Spot excluído", + deleteFailed: "Falha ao excluir", + deleteSpot: "Excluir spot", + deleteSpotTitle: "Excluir spot?", + differentSpotPublishAnyway: "É um spot diferente — publicar mesmo assim", + dragDropOrClick: "Arraste e solte ou clique", + dropPhotos: "Solte as fotos", + duplicateOne: "Há um spot a menos de 60 m do seu pino. Se for o mesmo lugar, adicione sua foto ou um relato de status lá em vez de criar uma duplicata.", + duplicateOther: "Há spots a menos de 60 m do seu pino. Se for o mesmo lugar, adicione sua foto ou um relato de status lá em vez de criar uma duplicata.", + editSpotSeoDesc: "Edite seu spot de skate.", + failedToContribute: "Falha ao contribuir", + failedToPublish: "Falha ao publicar", + failedToPublishDesc: "Algo deu errado. Verifique o console para detalhes.", + failedToSubmitReport: "Falha ao enviar a denúncia", + failedToSuggestTags: "Falha ao sugerir tags", + failedToUpdate: "Falha ao atualizar", + failedToUploadImage: "Falha ao enviar a imagem", + failedToUploadPhoto: "Falha ao enviar a foto", + feelsLikeTemp: "Sensação de {{temp}}°C", + filmersCount: "Filmers ({{count}})", + filmHere: "Filmar aqui", + gearSwap: "Troca de equipamentos", + geolocationNotSupported: "Geolocalização não suportada", + geolocationNotSupportedDesc: "Seu navegador não suporta geolocalização.", + getDirections: "Obter rota", + hangTight: "Aguarde", + hangTightDesc: "Sua foto ainda está sendo enviada. Ela será anexada em um segundo.", + helpImproveSpot: "Ajude a melhorar este spot adicionando fotos ou sugerindo tags", + hiddenByModerator: "Ocultado por um moderador", + hiddenByModeratorDesc: "Este spot não aparece no mapa nem na busca. Você ainda pode vê-lo porque é seu. Editá-lo não vai desocultá-lo — ele permanece oculto até um moderador retirar o veredito.", + humidity: "Umidade", + imageUploaded: "Imagem enviada", + imageUploadedDesc: "Sua imagem foi enviada com sucesso.", + imHere: "Estou aqui", + invalidCoordinates: "Coordenadas inválidas", + invalidCoordinatesDesc: "Insira uma latitude válida (-90 a 90) e longitude válida (-180 a 180).", + invalidNpub: "npub inválido", + invalidNpubDesc: "Insira um endereço npub válido.", + lastReported: "último {{time}}", + listGear: "Anunciar equipamentos", + listYourGearHere: "Anuncie seus equipamentos aqui", + loadingChat: "Carregando chat…", + locationError: "Erro de localização", + locationFound: "Localização encontrada", + locationFoundDesc: "Sua localização atual foi definida.", + locationRequired: "Localização necessária", + locationRequiredDesc: "Insira coordenadas ou use sua localização atual.", + loginRequiredTitle: "Login necessário", + logInToChat: "Entre para participar do chat local.", + logInToContributePhotos: "Entre para contribuir com fotos", + loginToEditSpot: "Você precisa entrar para editar este spot.", + logInToReport: "Você precisa estar logado para denunciar conteúdo.", + logInToReportStatus: "Entre para relatar o status deste spot.", + logInToSuggestTags: "Entre para sugerir tags", + manageNip05ToClaim: "Gerenciar NIP-05 para reivindicar", + meetAtSpotForPickup: "💡 Encontro neste spot para retirada segura", + memberOne: "{{count}} membro", + memberOther: "{{count}} membros", + messageFailed: "Falha na mensagem", + messageMapper: "Mensagem ao mapeador", + messagePlaceholder: "Envie uma mensagem para este spot… (tente /me ou /who)", + messagesHiddenOne: "{{count}} mensagem ocultada pelo seu filtro de confiança. Reduza o filtro para ver mais.", + messagesHiddenOther: "{{count}} mensagens ocultadas pelo seu filtro de confiança. Reduza o filtro para ver mais.", + messagesHiddenShortOne: "{{count}} mensagem ocultada pelo seu filtro de confiança", + messagesHiddenShortOther: "{{count}} mensagens ocultadas pelo seu filtro de confiança", + metresAway: "a {{distance}} m de distância", + moderatorVouchedDesc: "Um moderador revisou este spot e atestou sua qualidade. Mandou bem.", + monthsAgo: "há {{count}} mês", + monthsAgoPlural: "há {{count}} meses", + newOwnerNpub: "npub do novo dono", + newOwnerNpubHint: "Insira o npub do usuário para quem você quer transferir este spot.", + nip05RequiredToClaim: "⚠️ Verificação NIP-05 necessária para reivindicar lojas", + noCommunitySignalTitle: "Ainda sem foto da comunidade ou relato de status — ninguém confirmou este lugar.", + breakdownPhotos: "{{count}} foto(s)", + breakdownStatus: "{{count}} relato(s) de status", + breakdownComments: "{{count}} comentário(s)", + breakdownReactions: "{{count}} reação(ões)", + breakdownCollections: "{{count}} salvamento(s)", + breakdownZaps: "{{count}} zap(s)", + breakdownTags: "{{count}} sugestão(ões) de tag", + breakdownCrews: "{{count}} crew(s)", + breakdownLab: "{{count}} link(s) pro", + verifyNudgeTitle: "Seja o primeiro a confirmar este spot", + verifyNudgeBody: "Uma foto ou um “já andei aqui” é como um spot é verificado — ajude o próximo skatista.", + verifyNudgeStatus: "Já andei aqui", + communityChip: "Comunidade", + seenChip: "Visto", + noGearListedYet: "Nenhum equipamento anunciado ainda", + noMessagesYet: "Ainda não há mensagens neste canal local. Diga oi — \"alguém anda hoje à noite?\"", + noPhoto: "Sem foto", + noReportsYet: "Nenhuma denúncia ainda", + noTags: "Sem tags", + notASkateSpot: "Não é um skate spot", + offerServicesHere: "💡 Ofereça seus serviços neste spot", + photoCaptured: "Foto capturada!", + photoCapturedDesc: "Sua foto foi enviada com sucesso.", + photoContributed: "Foto contribuída!", + photoContributedDesc: "Sua foto foi adicionada a este spot.", + photosAdded: "Suas fotos foram adicionadas.", + photosRecommended: "fortemente recomendado — spots sem foto ficam marcados como Não verificado", + photosUploaded: "{{count}} fotos enviadas", + photoUploaded: "Foto enviada", + photoUploadedDesc: "Adicione uma legenda e envie para contribuir!", + photoUploadFailed: "Falha no envio da foto", + pleaseTryAgain: "Tente novamente", + public: "Público", + publicChatTitle: "Qualquer pessoa pode ler as mensagens deste canal — ele é público e não criptografado.", + recentReports: "Denúncias recentes", + recipientRequired: "Destinatário obrigatório", + recipientRequiredDesc: "Insira o npub do novo dono.", + removeAdmin: "Remover (admin)", + removeSpot: "Remover spot", + removeSpotAdminTitle: "Remover este spot? (admin)", + reportOne: "denúncia", + reportContent: "Denunciar conteúdo", + reportContentDesc: "Ajude a manter a comunidade segura denunciando conteúdo inadequado.", + reportedBySkaters: " por {{count}} skatistas — em análise. Se este é um spot real, adicione uma foto ou um relato de status para confirmá-lo.", + reportedNotASpot: "Denunciado como não sendo um skate spot", + reportingType: "Denunciando {{type}}", + reports: "denúncias", + reportShop: "Denunciar loja", + reportSpot: "Denunciar spot", + reportStatus: "Relatar status", + reportSubmitted: "Denúncia enviada", + reportSubmittedDesc: "Obrigado por ajudar a manter o SkateSpots seguro.", + reportSubmittedLong: "Obrigado por ajudar a manter o SkateSpots seguro e preciso. Sua denúncia será revisada por membros confiáveis da comunidade.", + reportSubmittedTitle: "Denúncia enviada", + report: { + notASkateSpot: { + label: "Não é um skate spot", + description: "Um registro de teste, ou um lugar que não é para skate de jeito nenhum", + }, + fakeSpot: { + label: "Spot falso/inexistente", + description: "Este spot não existe ou a localização está errada", + }, + stolenPhotos: { + label: "Fotos roubadas/falsas", + description: "As fotos são de banco de imagens ou roubadas de outro lugar", + }, + spamAd: { + label: "Spam ou propaganda", + description: "Conteúdo promocional ou anúncios duplicados", + }, + dangerousLocation: { + label: "Local perigoso", + description: "Propriedade privada, inseguro ou ilegal de acessar", + }, + inappropriateContent: { + label: "Conteúdo inadequado", + description: "Contém conteúdo ofensivo ou adulto", + }, + impersonation: { + label: "Impersonação", + description: "Alguém se passando por outra pessoa", + }, + other: { + label: "Outro", + description: "Algo mais não listado acima", + }, + }, + targetType: { + spot: "Spot", + event: "Evento", + tour: "Tour", + shop: "Loja", + user: "Usuário", + listing: "Anúncio", + coach: "Coach", + filmer: "Filmer", + }, + sameOwner: "Mesmo dono", + sameOwnerDesc: "Não é possível transferir para o dono atual.", + saveChanges: "Salvar alterações", + saving: "Salvando...", + services: "Serviços", + shareSpotText: "Confira este skate spot: {{title}}", + shelter: "Abrigo", + shelterHint: "Este spot é exposto ao tempo? Ajuda os skatistas a encontrar lugares secos quando chove.", + shopClaimDesc: "Se você é dono ou cuida desta loja, pode reivindicá-la para verificar a propriedade e gerenciar o anúncio.", + shopClaimNip05Hint: "Para reivindicar esta loja, adicione um identificador NIP-05 que corresponda ao domínio do site da loja.", + skatersActiveDesc: "Pessoas que postaram neste canal nas últimas 24h.", + skatersActiveOne: "{{count}} skatista ativo aqui", + skatersActiveOther: "{{count}} skatistas ativos aqui", + skatersSellingGear: "Skatistas deste spot estão vendendo equipamentos", + skateSpot: "Skate Spot", + somethingWentWrong: "Algo deu errado", + spot: "Spot", + spotAdded: "Spot adicionado!", + spotAddedDesc: "Seu skate spot foi publicado na rede.", + spotAddedNoPhoto: "Publicado — e marcado como Não verificado até alguém adicionar uma foto. Uma imagem do spot ajuda muito.", + spotChat: "Chat do spot", + spotClaimed: "Spot reivindicado!", + spotClaimedDesc: "Agora você é o dono deste spot. Você pode editá-lo a partir do seu perfil.", + spotDeleted: "Spot excluído", + spotDeletedDesc: "Pedido de exclusão enviado aos relays. A maioria dos relays removerá este conteúdo.", + spotMayAlreadyBeOnMap: "Esse spot já pode estar no mapa", + spotMayAlreadyExist: "Este spot já pode existir", + spotMayBeAbandoned: "O spot pode estar abandonado", + spotPhotoAlt: "Spot", + spotRemoved: "Spot removido", + spotRemovedDesc: "Este spot foi removido e ficará oculto em todo o SkateSpots.", + spotSeoDesc: "Veja este spot de skate no SkateSpots.", + spotStatus: "Status do spot", + spotStatusDesc: "\"{{title}}\" ainda dá pra andar? Avise a comunidade sobre o estado atual.", + spotTypeRequired: "Tipo de spot obrigatório", + spotTypeRequiredDesc: "Escolha um tipo de spot para os skatistas saberem com o que vão se deparar.", + spotUpdated: "Spot atualizado!", + spotUpdatedDesc: "Suas alterações foram publicadas na rede.", + staffVerifiedTitle: "Um admin do SkateSpots revisou e atestou este spot.", + statusNotePlaceholder: "Opcional: adicione detalhes (ex.: \"quinas novas no ledge\", \"segurança expulsa depois das 18h\")", + statusReported: "Status relatado", + statusReportedDesc: "Obrigado por manter o mapa atualizado. Seu relato está no ar.", + submitReport: "Enviar denúncia", + submitting: "Enviando...", + suggestedByUser: "Sugerido por {{count}} usuário", + suggestedByUsers: "Sugerido por {{count}} usuários", + suggestedTagsContent: "Tags sugeridas para {{title}}: {{tags}}", + suggestNTags: "Sugerir {{count}} tags", + suggestOneTag: "Sugerir 1 tag", + suggestTags: "Sugerir tags", + suggestTagsDesc: "Ajude a categorizar este spot sugerindo tags relevantes.", + tags: "Tags", + tagsHint: "Adicione tags para recursos, superfícies, vibes (máx. {{max}})", + tagsSuggested: "Tags sugeridas!", + tagsSuggestedDesc: "Suas sugestões de tags foram enviadas.", + takePhoto: "Tirar foto", + threeDayForecast: "Previsão de 3 dias", + tipTheMapper: "Dar gorjeta ao mapeador", + tipTheMapperDesc: "Achou este spot útil? Envie um zap para agradecer ao mapeador!", + titleRequired: "Nome obrigatório", + titleRequiredDesc: "Insira um nome para este spot.", + today: "Hoje", + tomorrow: "Amanhã", + transferDesc: "Transferir \"{{title}}\" para outro usuário. Esta ação não pode ser desfeita.", + transferFailed: "Falha na transferência", + transferOwnership: "Transferir propriedade", + transferRequestContent: "Pedido de transferência de propriedade do spot \"{{title}}\"", + transferRequested: "Transferência solicitada", + transferRequestedDesc: "O novo dono precisará reivindicar o spot para concluir a transferência.", + transferring: "Transferindo...", + transferSpotOwnership: "Transferir propriedade do spot", + transferWarningDesc: "Após a transferência, você não poderá mais editar ou excluir este spot.", + typeToSearchTags: "Digite para buscar ou adicionar tags...", + underReview: " — em análise. Se este é um spot real, adicione uma foto ou um relato de status para confirmá-lo.", + untitledSpot: "Spot sem título", + unverified: "Não verificado", + updateDetailsFor: "Atualize os detalhes de {{title}}", + updateSpotDesc: "Atualize as informações deste spot. Todos os campos marcados com * são obrigatórios.", + uploadAPhoto: "Envie uma foto", + uploadAPhotoHint: "Arraste e solte ou clique · JPG, PNG, WebP", + uploadedAlt: "Enviado", + uploadFailed: "Falha no envio", + uploadingPhoto: "Enviando foto…", + uploadPhotoFirst: "Envie uma foto primeiro.", + uvIndex: "Índice UV", + verifiedBySkateSpots: "Verificado pelo SkateSpots", + viewPhotoFullScreen: "Ver foto em tela cheia", + viewPhotoOf: "Ver foto {{n}} de {{total}}", + warning: "Aviso", + weatherConditions: "Condições do tempo", + weatherOnly: "apenas tempo", + weatherOnlyUnconfirmed: "Apenas tempo. Ninguém confirmou que este é um skate spot ainda, então não há pontuação de condições — adicione uma foto ou um relato de status para confirmá-lo.", + whyReporting: "Por que você está denunciando isto?", + wind: "Vento", + yearsAgo: "há {{count}} ano", + yearsAgoPlural: "há {{count}} anos", + }, + diyUi: { + title: "DIY — Faça você mesmo", + tagline: "Guias, ferramentas abertas e projetos para construir seus próprios decks, rampas e pistas de concreto — e depois encontrar as pessoas, os lugares e o mercado para acompanhar.", + doItWithPeople: "Faça com gente", + backToDiy: "Voltar ao DIY", + calc: { + title: "Calculadora de custo de deck", + intro: "Quanto custa fazer um deck — mão de obra, equipamento, materiais, tempo de processo, embalagem e margem — e um preço de venda justo. Salvo neste dispositivo.", + }, + designer: { + title: "Designer de deck", + intro: "Modele o contorno de um skate ou longboard e exporte um molde imprimível em 1:1, um SVG ou um DXF para CNC. Salvo neste dispositivo.", + presets: "Predefinições", + dimensions: "Dimensões", + shape: "Formato", + kicks: "Kicks", + hardware: "Furos dos trucks", + width: "Largura máx.", + wheelbase: "Distância entre eixos", + nose: "Comprimento do nose", + tail: "Comprimento do tail", + length: "Comprimento total", + waist: "Cintura", + endRound: "Arredondamento das pontas", + concave: "Concave", + thickness: "Espessura", + tailKick: "Kick do tail", + noseKick: "Kick do nose", + holeNew: "New school (2.125″)", + holeOld: "Old school (2.5″)", + holeSpacing: "New school é 2.125″ × 1.625″ (54 × 41 mm); old school é 2.5″ × 1.625″. Furos de montagem de 3/16″.", + topView: "Vista superior", + sideView: "Perfil lateral", + concaveSection: "Seção de concave", + export: "Exportar", + pdfA4: "PDF 1:1 · A4", + pdfLetter: "PDF 1:1 · Letter", + printNote: "Imprima o PDF em 100% (sem “ajustar à página”) e depois junte as folhas usando as cruzes nos cantos. O SVG também é em tamanho real.", + note: "Este é o contorno 2D que você traça e corta. Para formas 3D completas e design de molde, uma ferramenta CAD de verdade ainda é a escolha certa.", + }, + source: "Fonte", + comingSoon: "Em breve", + footer: "Guias passo a passo estão a caminho. Por enquanto: encontre quem constrói no The Lab, mapeie seu spot e compre ou venda no Marketplace. Ande com segurança — proteções, luvas e óculos.", + categories: { + boards: "Decks", + ramps: "Rampas e obstáculos de madeira", + concrete: "Pistas de concreto e DIY", + repairs: "Consertos e afinação", + tools: "Ferramentas e projetos", + }, + cards: { + ossBuild: { + title: "Construa um skate", + blurb: "Fabricação de deck passo a passo — lâminas, moldes, prensas e acabamento.", + }, + sk8cad: { + title: "SK8CAD", + blurb: "CAD open-source para formatos de deck, concave e design de molde.", + }, + deckCost: { + title: "Custo e preço do deck", + blurb: "Calcule materiais, mão de obra e um preço de venda justo antes de construir.", + }, + deckDesigner: { + title: "Designer de deck", + blurb: "Modele um contorno e imprima um molde 1:1 — ou exporte SVG/DXF para CNC.", + }, + ledgeBox: { + title: "Construa um ledge ou box", + blurb: "Um obstáculo de madeira para iniciantes que você monta em um fim de semana.", + }, + quarterpipe: { + title: "Construa um quarterpipe", + blurb: "Projetos de rampa, transição e coping para um mini no quintal.", + }, + flatbar: { + title: "Construa um flatbar", + blurb: "Barato, portátil e a melhor forma de aprender rails.", + }, + concreteBasics: { + title: "Noções básicas de concreto", + blurb: "Misturar, montar a forma e dar acabamento a um ledge ou bank que dura.", + }, + coping: { + title: "Coping e bordas", + blurb: "Como instalar o coping e dar acabamento a uma transição para um grind liso.", + }, + buyParts: { + title: "Compre peças e equipamentos", + blurb: "Pegue decks, ferragens e ferramentas com vendedores no Marketplace.", + }, + mapSpot: { + title: "Mapeie seu spot DIY", + blurb: "Construiu algo? Adicione ao mapa para que outros encontrem e andem nele.", + }, + regrip: { + title: "Troque o griptape de um shape", + blurb: "Remova o grip velho e aplique o novo direitinho.", + }, + tune: { + title: "Ajuste bearings e trucks", + blurb: "Limpe os bearings, troque os bushings e ajuste a geometria dos seus trucks.", + }, + printMolds: { + title: "Moldes impressos em 3D", + blurb: "Arquivos de moldes e bases de alinhamento imprimíveis da comunidade.", + }, + sk8cadTools: { + title: "Ferramentas de molde e alinhamento", + blurb: "Projete moldes com bases de alinhamento integradas.", + }, + }, + actions: { + findBuilder: { + title: "Encontre um Builder", + blurb: "Builders de rampa e DIY no The Lab que podem projetar ou construir para você.", + }, + findCrew: { + title: "Encontre uma crew de DIY", + blurb: "Crews focadas em construir — junte-se às que transformam spots em realidade.", + }, + mapSpot: { + title: "Mapeie um spot DIY", + blurb: "Adicione o spot que você construiu para que ele fique no mapa.", + }, + sellBuilds: { + title: "Venda suas construções", + blurb: "Anuncie decks, rampas ou peças que você faz no Marketplace.", + }, + findCoach: { + title: "Encontre um coach", + blurb: "Coaches que ensinam módulos de skate DIY e construção de spots.", + }, + }, + }, + labelsUi: { + spotCategory: { + street: { + label: "Street", + description: "Spots aleatórios encontrados, terreno urbano", + }, + transition: { + label: "Transition", + description: "Superfícies curvas/com rampa", + }, + park: { + label: "Park", + description: "Skateparks construídos", + }, + plaza: { + label: "Plaza", + description: "Praças urbanas (como MACBA, Love Park)", + }, + }, + spotFeature: { + wallrides: "Wallrides", + stairs: "Escadas e corrimãos", + rails: "Rails", + ledges: "Ledges e guias", + gaps: "Gaps", + flatground: "Flatground", + "manual-pads": "Manual Pads", + "half-pipes": "Half Pipes", + "quarter-pipes": "Quarter Pipes", + "mini-ramps": "Mini Rampas", + bowls: "Bowls", + vert: "Vert Ramps", + "mega-ramps": "Mega Rampas", + hubbas: "Hubbas", + "euro-gaps": "Euro Gaps", + banks: "Banks", + "spine-ramps": "Spine Ramps", + "roll-ins": "Roll-ins", + hips: "Hips", + volcano: "Volcano", + pyramids: "Pirâmides / Funboxes", + "snake-runs": "Snake Runs", + "pump-track": "Pump Track Rollers", + "flat-bars": "Flat Bars", + }, + spotType: { + street: "Street", + transition: "Transition", + park: "Park", + plaza: "Plaza", + wallrides: "Wallrides", + stairs: "Escadas e corrimãos", + rails: "Rails", + ledges: "Ledges e guias", + gaps: "Gaps", + flatground: "Flatground", + "manual-pads": "Manual Pads", + "half-pipes": "Half Pipes", + "quarter-pipes": "Quarter Pipes", + "mini-ramps": "Mini Rampas", + bowls: "Bowls", + vert: "Vert Ramps", + "mega-ramps": "Mega Rampas", + hubbas: "Hubbas", + "euro-gaps": "Euro Gaps", + banks: "Banks", + "spine-ramps": "Spine Ramps", + "roll-ins": "Roll-ins", + hips: "Hips", + volcano: "Volcano", + pyramids: "Pirâmides / Funboxes", + "snake-runs": "Snake Runs", + "pump-track": "Pump Track Rollers", + "flat-bars": "Flat Bars", + diy: "DIY", + rail: "Rail", + ledge: "Ledge", + gap: "Gap", + bowl: "Bowl", + stall: "Stall", + slappy: "Slappy", + }, + access: { + public: { + label: "Público - Aberto para todos", + }, + private: { + label: "Propriedade privada - Necessário permissão", + }, + locals: { + label: "Pergunte aos locais primeiro", + }, + }, + shelter: { + outdoor: { + label: "Ao ar livre", + short: "Ao ar livre", + description: "Totalmente exposto — a chuva interrompe o rolê", + }, + partial: { + label: "Parcialmente coberto", + short: "Parcialmente coberto", + description: "Alguns obstáculos ficam secos", + }, + covered: { + label: "Coberto / com teto", + short: "Coberto", + description: "Ao ar livre, mas sob um teto", + }, + indoor: { + label: "Indoor", + short: "Indoor", + description: "Totalmente fechado — ande com chuva ou sol", + }, + }, + eventType: { + contest: "Contest", + demo: "Demo", + session: "Sessão", + workshop: "Workshop", + premiere: "Premiere", + tradeshow: "Feira", + gameskate: "Game of Skate", + concert: "🎸 Show", + jam: "🎵 Jam", + festival: "🎪 Festival", + popup: "🎯 Pop-Up", + }, + gearCategory: { + deck: "Deck", + trucks: "Trucks", + wheels: "Wheels", + bearings: "Bearings", + shoes: "Tênis de Skate", + clothing: "Roupas", + protective: "Equipamento de proteção", + stickers: "Adesivos", + wax: "Cera", + tools: "Ferramentas", + griptape: "Griptape", + rubbrick: "Rub Brick", + }, + gearCondition: { + new: { + label: "Novo", + description: "Nunca usado, ainda na embalagem", + }, + like_new: { + label: "Seminovo", + description: "Quase sem uso, excelente estado", + }, + good: { + label: "Bom", + description: "Desgaste normal, funciona perfeitamente", + }, + well_used: { + label: "Bastante usado", + description: "Mostra desgaste mas ainda funciona", + }, + }, + priceType: { + fixed: { + label: "Preço fixo", + description: "Preço definido em USD ou sats", + }, + free: { + label: "Grátis", + description: "Doando", + }, + trade: { + label: "Troca", + description: "Procurando trocar", + }, + offer: { + label: "Aceito ofertas", + description: "Preço negociável", + }, + }, + listingType: { + selling: { + label: "Vendendo", + description: "Anunciando equipamento para venda", + }, + wtb: { + label: "Quero comprar", + description: "Procurando equipamento específico", + }, + }, + tour: { + spotType: { + street: "Street", + park: "Park", + diy: "DIY", + transition: "Transition", + hidden: "Joias escondidas", + }, + category: { + local: { + label: "Tour local", + description: "Mostre spots escondidos na sua cidade", + }, + national: { + label: "Tour nacional", + description: "Viagens de carro por várias cidades do país", + }, + international: { + label: "Tour internacional", + description: "Aventuras transfronteiriças por vários países", + }, + destruction: { + label: "World Destruction", + description: "Competição global de equipes estilo KOTR", + }, + }, + }, + crew: { + vibe: { + street: "Street", + transition: "Transition / Vert", + park: "Park", + diy: "DIY", + cruising: "Cruising / Filmagem", + oldschool: "Old School", + allterrain: "All Terrain", + girls: "Garota / Mulher", + youth: "Juventude / Groms", + adaptive: "Adaptado", + punk: "Punk", + hiphop: "Rap / Hip-Hop", + }, + focus: { + mixed: "Misto / Geral", + builder: "DIY e Builders", + photo: "Foto e Filmagem", + coaching: "Coaching", + art: "Arte e Design", + music: "Banda e Música", + wellness: "Treino e Fisio", + }, + focusDescription: { + mixed: "Uma crew de skate comum — aparece apenas na página de Crews.", + builder: "Uma crew de DIY / construção de park — também aparece no The Lab em Builders.", + photo: "Uma crew de filmagem, fotografia ou edição — também aparece no The Lab em Foto e Filmagem.", + coaching: "Uma crew de coaching / aulas — também aparece no The Lab em Coaching.", + art: "Um coletivo de arte, design, graffiti ou tatuagem — também aparece no The Lab em Arte e Design.", + music: "Uma banda ou coletivo musical — também aparece no The Lab em Música.", + wellness: "Uma crew de treino, fitness ou fisio — também aparece no The Lab em Treino.", + }, + lookingFor: { + filmer: "Filmer", + photographer: "Fotógrafo", + editor: "Editor de vídeo", + coach: "Coach", + builder: "Builder de rampa", + artist: "Artista / Designer", + musician: "Músico / Banda", + members: "Novos membros", + }, + role: { + filmer: "Filmer", + photographer: "Fotógrafo", + editor: "Editor", + coach: "Coach", + builder: "Builder", + artist: "Artista", + graffiti: "Graffiti", + tattoo: "Tatuagem", + trainer: "Preparador", + musician: "Músico", + judge: "Jurado", + manager: "Gerente de equipe", + og: "OG", + }, + }, + memberVisibility: { + public: { + label: "Público", + description: "Qualquer pessoa pode te ver nesta crew — na página pública da crew e na descoberta de colegas de crew.", + }, + crew: { + label: "Somente crew", + description: "Apenas colegas de crew confirmados e o fundador te veem aqui. Para todos os outros, você aparece como um “membro oculto” anônimo. Observação: isto é privacidade no nível do app — sua tag de membro ainda existe publicamente nos relays, só nunca é mostrada a quem está fora.", + }, + }, + tagCategory: { + features: { + name: "Recursos", + description: "Obstáculos e terreno", + }, + surfaces: { + name: "Superfícies", + description: "Materiais e texturas", + }, + sizes: { + name: "Tamanhos", + description: "Dimensões e escala", + }, + stairs: { + name: "Número de escadas", + description: "Quantidade de degraus", + }, + vibes: { + name: "Vibes", + description: "Atmosfera e condição", + }, + location: { + name: "Localização", + description: "Contexto do local", + }, + tricks: { + name: "Tricks", + description: "Bom para tricks específicas", + }, + }, + spotTagCategory: { + street: { + label: "Street", + description: "Spots de rua - escadas, rails, ledges", + }, + park: { + label: "Park", + description: "Skateparks - públicos ou privados", + }, + diy: { + label: "DIY", + description: "Spots DIY/feitos em casa", + }, + plaza: { + label: "Plaza", + description: "Praças públicas com arquitetura amigável ao skate", + }, + }, + status: { + active: { + label: "Ativo", + description: "Tudo certo — vai lá andar.", + }, + bust: { + label: "Bust", + description: "Alto risco de expulsão — segurança ou polícia.", + }, + skate_stopped: { + label: "Skate-stopped", + description: "Com pinos / tampado, mas parcialmente andável.", + }, + closed: { + label: "Fechado", + description: "Fechado temporariamente — obra ou evento.", + }, + gone: { + label: "Acabou", + description: "Demolido, pavimentado ou cercado de vez.", + }, + }, + price: { + free: "GRÁTIS", + trade: "Troca", + makeOffer: "Aceito ofertas", + offer: "Oferta", + }, + }, + feesUi: { + feeFeaturedEventLabel: "Evento em destaque", + feeFeaturedEventDesc: "Destaque seu evento no SkateSpots", + feeFeaturedEventBenefit: "Seu evento aparece no topo da página de eventos", + feeLabProfileLabel: "Perfil Lab Pro", + feeLabProfileDesc: "Destaque seus serviços no The Lab", + feeLabProfileBenefit: "Selo Pro + posição em destaque quando os skatistas navegam pelo The Lab", + feeFeaturedShopLabel: "Loja em destaque", + feeFeaturedShopDesc: "Destaque sua skate shop no mapa e no diretório", + feeFeaturedShopBenefit: "Selo verificado + pino em destaque no mapa", + feeFeaturedTourLabel: "Tour em destaque", + feeFeaturedTourDesc: "Destaque seu tour no SkateSpots", + feeFeaturedTourBenefit: "Selo Pro + posição no topo quando os skatistas navegam pelos tours", + duration7d: "7 dias", + duration30d: "1 mês", + duration90d: "3 meses", + duration365d: "12 meses", + metaActive: "{{label}} — Ativo", + daysRemainingOne: "{{count}} dia restante", + daysRemainingMany: "{{count}} dias restantes", + zapRequestContent: "SkateSpots {{label}} ({{tier}})", + errGenerate: "Falha ao gerar a fatura", + paymentReceived: "⚡ Pagamento recebido!", + paymentReceivedDesc: "{{amount}} sats — {{label}} está ativo agora.", + autoPayFailed: "Falha no pagamento automático", + autoPayFailedDesc: "Pague manualmente usando o QR ou a fatura abaixo.", + payStatusUnknown: "Status do pagamento desconhecido — o pagamento pode ter passado. Verifique sua carteira antes de pagar de novo.", + invoiceCopied: "Fatura copiada!", + activeBang: "{{label}} Ativo!", + chooseDuration: "Escolha a duração", + bestValue: "Melhor custo-benefício", + perDay: "{{price}}/dia", + validFor: "Válido por", + amountLine: "~${{usd}} USD · para {{name}} · {{tier}}", + payToContinue: "Pague {{amount}} sats para continuar", + generating: "Gerando fatura…", + processing: "Processando pagamento…", + invoiceQrAlt: "QR da fatura Lightning", + copyInvoice: "Copiar fatura", + openWallet: "Abrir carteira", + payConnected: "Pagar com carteira conectada", + scanAny: "Escaneie com qualquer carteira Lightning", + tryAgain: "Tentar novamente", + proReceiptTitle: "🦧⚡ Sasquatch Pro — você entrou!", + proReceiptPass: "Passe: {{pass}} ({{sats}} sats)", + proReceiptActiveUntil: "Ativo até: {{until}}", + proReceiptUnlocked: "O que você desbloqueou:", + proReceiptBullet1: "• Assistente pessoal — eu leio seu Stash, crews, spots e anúncios", + proReceiptBullet2: "• Rascunhos de ações — anunciar equipamentos, postar status de spot, planejar viagens (você confirma)", + proReceiptBullet3: "• Respostas que usam seu contexto pessoal, não apenas dados públicos", + proReceiptBullet4: "• ⚡ Você apoia diretamente o SkateSpots e o mantém gratuito e sem anúncios", + proReceiptThanks: "Obrigado por manter o SkateSpots gratuito e sem anúncios. Agora vai andar. 🛹", + proReceiptSubject: "Recibo do Sasquatch Pro", + receiptContent: "Sasquatch Pro — passe de apoiador {{tier}} 🦧⚡", + receiptAlt: "Passe de apoiador Sasquatch Pro ({{tier}}), válido até {{until}}", + purchaseComment: "Sasquatch Pro — {{tier}} 🦧", + errLogin: "Entre para fazer upgrade para o Pro.", + errStart: "Não foi possível iniciar a compra.", + errRecord: "Não foi possível registrar seu passe.", + }, + cardUi: { + save: "Salvar cartão no Nostr", + saved: "Cartão salvo", + savedDesc: "Seu cartão agora está assinado e verificável.", + saveFailed: "Não foi possível salvar o cartão", + notPublished: "Não publicado", + titleNeon: "Rider", + titleRest: "Card", + saveFrontPng: "Salvar frente (PNG)", + expired: "EXPIRADO", + logoUploaded: "Logo enviado", + logoUploadFailed: "Não foi possível enviar o logo", + venue: "Local vinculado (opcional)", + venueNone: "Sem local", + venueHint: "Escolha um dos seus próprios spots para vincular este passe a um local. Um verificador confirmará que você é o dono.", + venuePick: "Escolha seu local", + parkNoVenue: "Um passe de Park só pode ser emitido pelo dono do local — mapeie um spot que você possui primeiro.", + parkAddVenue: "Adicionar um spot", + parkNeedsVenue: "Escolha um local que você possui", + parkIssued: "Passes emitidos", + parkRevoke: "Revogar", + parkRevoked: "Revogado", + parkRevokeFailed: "Não foi possível revogar", + v: { + valid: "Válido", + validDesc: "Assinatura válida e emitida pelo local.", + expired: "Expirado", + expiredDesc: "Passou da data de validade.", + revoked: "Revogado", + revokedDesc: "O emissor cancelou este passe — não aceite.", + invalid: "Inválido", + invalidDesc: "A assinatura não é verificada. Não confie nela.", + notFound: "Não encontrado", + notFoundDesc: "Nenhum registro correspondente nos relays.", + unverifiedIssuer: "Emissor não verificado", + unverifiedIssuerDesc: "Este passe nomeia um local que não pertence à chave do emissor.", + notBound: "Não vinculado", + notBoundDesc: "Não vinculado a um local — não prova nada sobre acesso.", + noRsvp: "Sem RSVP", + noRsvpDesc: "O titular não tem RSVP registrado para este evento.", + admitted: "Admitido", + admittedDesc: "Evento do organizador + o titular confirmou presença.", + noHolder: "Sem titular no link", + noHolderDesc: "Este QR não tem titular de ingresso (`?h=`), então o titular não pode ser verificado.", + }, + passes: { + tab: "Meus passes", + pass: "Passe de acesso", + none: "Nenhum passe ainda. Quando um local ou organizador emitir um para você, ele aparece aqui.", + }, + facets: { + title: "Mostrar facetas de identidade", + crews: "Crews", + local: "Local", + roles: "Funções no Lab", + }, + roles: { + coach: "Coach", + filmer: "Filmer", + editor: "Editor", + photographer: "Fotógrafo", + builder: "Builder", + artist: "Artista", + graffiti: "Graffiti", + tattoo: "Tatuagem", + trainer: "Preparador", + musician: "Músico", + judge: "Jurado", + organizer: "Organizador", + barber: "Barbeiro", + }, + crew: { + crewCard: "CARTÃO DA CREW", + crewSub: "Sua crew, em um cartão", + pick: "Escolha uma crew", + none: "Você ainda não está em uma crew — entre ou crie uma primeiro.", + hint: "O cartão é construído a partir dos dados assinados da própria crew. Edite a crew na página dela para alterá-lo.", + members: "MEMBROS", + spots: "SPOTS", + est: "Desde {{year}}", + openCall: "Vagas abertas", + verifiedCrew: "Crew verificada", + viewCrew: "Ver a crew", + }, + event: { + pass: "PASSE DO EVENTO", + passSub: "Um passe para um evento ao qual você vai", + pick: "Escolha um evento", + none: "Nenhum evento ainda — crie um, ou confirme presença em um, primeiro.", + hint: "O passe é construído a partir dos dados assinados do próprio evento. Apenas o organizador pode alterá-lo.", + admits: "ADMITE", + going: "{{count}} vão", + verifiedEvent: "Evento verificado", + viewEvent: "Ver o evento", + issuePass: "Emitir um passe de check-in", + issuePassBtn: "Emitir passe", + issuePassHint: "Um passe assinado para um participante específico — ele mostra na porta.", + notOrganiser: "Apenas o organizador pode emitir passes", + passIssued: "Passe emitido", + issueFailed: "Não foi possível emitir o passe", + issuedPasses: "Passes de check-in emitidos", + }, + studio: { + unsaved: "Alterações não salvas", + saved: "Salvo", + saveChanges: "Salvar alterações", + allSaved: "Salvo — tudo em dia", + showOnCard: "Mostrar no cartão", + derived: "Do seu perfil de Skater", + noSkaterProfile: "Ainda sem perfil de Skater —", + editSkaterProfile: "adicione seus estilos e nível", + noPhoto: "Ainda sem foto de perfil —", + addPhoto: "adicione uma no seu perfil", + finishTitle: "Termine seu cartão", + finishDesc: "Uma foto e um perfil de Skater fazem ele parecer real.", + checkPhoto: "Foto de perfil", + checkName: "Nome de exibição", + checkProfile: "Estilos e nível", + checkCrew: "Entre em uma crew", + moreTypes: "Mais tipos de cartão são desbloqueados conforme você mapeia spots que possui, entra em crews ou confirma presença em eventos.", + accent: "Cor de destaque", + accentHint: "Substitui a cor de destaque do tema", + accentClear: "Usar a cor do tema", + logo: "Logo / brasão personalizado", + logoAdd: "Enviar", + logoChange: "Alterar", + logoClear: "Remover", + }, + back: { + title: "Verso imprimível", + desc: "Crews, funções, patrocinadores e links no verso", + showBack: "Mostrar verso", + showFront: "Mostrar frente", + empty: "Nada aqui ainda — adicione crews, funções ou patrocinadores.", + }, + verify: { + checking: "Verificando o cartão…", + notFound: "Cartão não encontrado", + notFoundDesc: "Nenhum evento correspondente foi encontrado nos relays. Ele pode ter sido excluído, ou o link está errado.", + invalid: "Assinatura inválida", + invalidDesc: "Este evento existe, mas sua assinatura não é verificada. Não confie nele.", + authentic: "Autêntico", + authenticDesc: "A assinatura do emissor é válida.", + kind: "Tipo", + kindPark: "Cartão de acesso ao Park", + kindRider: "Cartão do Rider", + kindCrew: "Cartão da Crew", + kindEvent: "Passe de evento", + organiser: "Organizador", + expired: "Expirado", + valid: "Válido", + holder: "Titular", + ticketHolder: "Titular do ingresso", + rsvp: "RSVP", + rsvpGoing: "Vou", + rsvpInterested: "Interessado", + rsvpNone: "Nenhum RSVP encontrado", + revoked: "Passe revogado", + revokedDesc: "O emissor cancelou este passe — não aceite.", + issuedBy: "Emitido por", + accessLevel: "Nível de acesso", + validThru: "Válido até", + selfIssued: "Status", + selfIssuedDesc: "Cartão de identidade autoemitido", + venue: "Local", + venueVerified: "Verificado — a chave do dono do local corresponde ao emissor.", + venueMismatch: "Este passe nomeia um local que não pertence à chave do emissor.", + venueNone: "Não vinculado a um local.", + viewCard: "Ver o cartão", + disclaimer: "Uma assinatura válida prova quem assinou este cartão — não é prova de habilidade nem de direitos de acesso além do que o local emitiu.", + details: "Detalhes", + invalidLink: "Link inválido", + invalidLinkDesc: "Isso não parece ser um link de cartão válido.", + }, + public: { + invalid: "Isso não parece ser um link de cartão válido.", + createYourOwn: "Crie seu próprio cartão", + editYourCard: "Edite seu cartão", + backToEditor: "Voltar ao editor", + backHome: "Voltar ao início", + notCustomised: "Este skatista ainda não personalizou o cartão — esta é a aparência padrão.", + verifyNote: "Escaneie o QR no cartão para verificá-lo.", + }, + }, + routeUi: { + destination: "Destino", + routeTo: "Rota até {{label}}", + routeToLabel: "Rota até", + search: "Buscar", + description: "Opções de rota e direções no app.", + routeMapAria: "Mapa da rota", + findingLocation: "Encontrando sua localização…", + plottingRoute: "Traçando sua rota…", + refiningLocation: "Refinando localização…", + offlineSavedRoute: "Offline · rota salva {{age}}", + tapMapStart: "Toque no mapa para definir seu ponto de partida", + fitRouteAria: "Ajustar a rota inteira no mapa", + wholeRoute: "Rota inteira", + next: "Próximo", + nextStep: "Próximo · passo {{n}}", + followTheLine: "Siga a linha", + toTheTurn: "até a curva", + toGo: "a percorrer", + tryAgain: "Tentar novamente", + mode: { + foot: "Skate / A pé", + bike: "Bicicleta", + moto: "Moto", + car: "Carro", + transit: "Transporte público", + }, + from: "De", + myLocation: "Minha localização", + tapTheMap: "Toque no mapa…", + chooseOnMap: "Escolher no mapa", + direct: "direto", + transferOne: "1 baldeação", + transfers: "{{count}} baldeações", + options: "{{count}} opções", + ride: "andar", + arrive: "chegar", + speedAvg: "{{speed}} km/h média", + stepsCount: "{{count}} passos", + onABoard: "de skate", + usesDrivingRoads: "usa vias para carros", + drivingEstimate: "estimativa para carro", + updating: "atualizando…", + pickMode: "Escolha um modo para ver sua rota.", + waitingLocation: "Aguardando sua localização…", + routeSteps: "Passos da rota", + walkingRoute: "rota a pé — mais rápida de skate", + planningView: "Modo de planejamento — toque em Iniciar para seguir com curvas ao vivo, voz e chegada.", + leaveNow: "Sair agora", + departAt: "Partir às", + arriveBy: "Chegar até", + departureTime: "Horário de partida", + arrivalTime: "Horário de chegada", + only: "Somente", + clear: "limpar", + itinerary: "Itinerário", + group: { + bus: "Ônibus", + tram: "Bonde", + metro: "Metrô", + train: "Trem", + ferry: "Balsa", + }, + walk: "A pé", + rideVerb: "Andar", + walkLower: "a pé", + rideLower: "andar", + toStop: "até", + track: "plataforma {{track}}", + stopOne: "1 parada", + stopsCount: "{{count}} paradas", + tickets: "ingressos ↗", + done: "Concluir", + stop: "Parar", + start: "Iniciar", + arrived: "Você chegou. 🛹", + voiceOnNote: "A tela fica ligada · voz ativada — as curvas e a chegada são faladas.", + voiceOffNote: "A tela fica ligada · voz desativada.", + followNote: "Curvas, voz e chegada enquanto você anda. Mantém a tela ligada.", + voiceOffAria: "Desativar a orientação por voz", + voiceOnAria: "Ativar a orientação por voz", + voiceStart: "Iniciando a navegação", + voiceArrived: "Você chegou", + voiceIn: "Em {{metres}} metros, {{instruction}}", + voiceContinue: "continue", + voiceContinueCaps: "Continue", + errPermissionDenied: "Permissão de localização negada.", + errWaitingGps: "Aguardando um sinal de GPS…", + errPermissionDeniedLong: "Permissão de localização negada. Ative a localização para traçar a rota de onde você está.", + errNoLocation: "Não foi possível obter sua localização. Tente novamente.", + errNoLocationShort: "Não foi possível obter sua localização.", + errTransitNoRouteFiltered: "Nenhuma rota para esse horário ou modo de transporte — tente outro horário, ou inclua mais modos.", + errTransitNoRoute: "Nenhuma rota de transporte público encontrada aqui — esta área pode não publicar horários abertos.", + errTransitUnreachable: "Não foi possível alcançar o serviço de transporte público. Verifique sua conexão e tente novamente.", + errRoutingBusy: "O serviço de rotas está sobrecarregado agora — tente novamente em um instante.", + errNoRouteMode: "Nenhuma rota para este modo — o destino pode estar fora da malha viária. Tente outro modo.", + errRoutingUnreachable: "Não foi possível alcançar o serviço de rotas. Verifique sua conexão e tente novamente.", + departures: "Partidas", + upcomingFrom: "Próximas partidas de {{stop}}", + loadingDepartures: "Carregando partidas…", + noDepartures: "Nenhuma partida próxima encontrada nesta parada.", + live: "ao vivo", + cancelled: "cancelado", + refresh: "Atualizar", + tripLoginTitle: "Entre para salvar", + tripLoginDesc: "Faça login para guardar esta viagem como uma Coleção.", + tripCollectionTitle: "Viagem de skate a {{destination}} 🛹", + tripCollectionDesc: "Plano de viagem do The Sasquatch — {{count}} dias em {{destination}}.", + tripCollectionDescOne: "Plano de viagem do The Sasquatch — {{count}} dia em {{destination}}.", + tripSavedTitle: "Salvo nas Coleções 🦧", + tripSavedDesc: "Sua viagem a {{destination}} está salva.", + tripSaveFailed: "Não foi possível salvar", + tripSaveFailedDesc: "Tente novamente em um segundo.", + daysInDestinationOne: "{{count}} dia em {{destination}}", + daysInDestination: "{{count}} dias em {{destination}}", + wetForecast: "Previsão de chuva — procure uma crew local para opções cobertas/indoor.", + dayLabel: "Dia {{n}}", + freeSkate: "Skate livre — explore e filme. 🎥", + tapToBook: "toque para agendar / zap ⚡", + localCrews: "Crews locais", + saving: "Salvando…", + savedToCollections: "Salvo nas Coleções", + saveSpotOne: "Salvar {{count}} spot em uma Coleção", + saveSpots: "Salvar {{count}} spots em uma Coleção", + flights: "Voos", + stays: "Hospedagem", + gettingAround: "Como se locomover", + noMiddleman: "Eu planejo o skate — voos e hospedagem abrem nos sites reais (sem KYC, sem intermediário).", + ageJustNow: "agora mesmo", + ageMinAgo: "há {{count}} min", + ageHourAgo: "há {{count}} h", + ageDayAgo: "há {{count}} d", + skateRightHere: "bem aqui", + skateMin: "~{{count}} min de rolê", + skateHours: "~{{hours}} h de rolê", + maneuver: { + headOut: "Saia", + arrive: "Chegue ao spot", + continueStraight: "Continue", + bearLeft: "Incline à esquerda", + bearRight: "Incline à direita", + turnLeft: "Vire à esquerda", + turnRight: "Vire à direita", + sharpLeft: "Curva acentuada à esquerda", + sharpRight: "Curva acentuada à direita", + turn: "Vire", + keepLeft: "Mantenha-se à esquerda", + keepRight: "Mantenha-se à direita", + takeFork: "Pegue a bifurcação", + merge: "Entre na via", + roundabout: "Pegue a rotatória", + takeRamp: "Pegue o acesso", + takeExit: "Pegue a saída", + }, + maneuverOnto: "{{instruction}} na {{road}}", + }, + sasquatchUi: { + live: "ao vivo", + offline: "offline", + genericTitle: "Assistente SkateSpots 🦧", + genericGreeting: "E aí! Sou o The Sasquatch. Pergunte qualquer coisa sobre spots, eventos, coaches, equipamentos, ou como o app funciona. Tenho dados ao vivo do relay do SkateSpots!", + q1: "Planeje 3 dias em Lisboa", + q2: "Encontre spots perto de mim", + q3: "Algum evento chegando?", + q4: "O que são crews?", + q5: "Como funcionam os zaps?", + q6: "O que é Nostr?", + q7: "O que é Meu Stash?", + q8: "Isso é gratuito?", + bubbleTitle: "Pressione e arraste para mover · Toque para abrir", + openGuideAria: "Abrir o guia do Sasquatch", + hideAria: "Ocultar o assistente Sasquatch", + hide: "Ocultar assistente", + showAria: "Mostrar o assistente Sasquatch", + activeUntil: "Ativo até {{date}}", + platformOwner: "Dono da plataforma", + upgradeTitle: "Faça upgrade para o Sasquatch Pro", + goPro: "Seja Pro", + goProBlurb: "IA pessoal · a partir de 2k sats", + aiBalanceTitle: "Saldo de créditos do Sasquatch AI (somente dono) — recarregue em {{provider}}", + aiChip: "⚡ IA {{balance}}", + minimizeToBubbleAria: "Minimizar para o balão", + minimize: "Minimizar", + closePanelAria: "Fechar painel", + close: "Fechar", + askLab: "Pergunte sobre Coaching e Filmagem", + askMap: "Pergunte sobre Spots, Lojas e Equipamentos", + askAnything: "Pergunte qualquer coisa 🛹", + quickQuestions: "Perguntas rápidas:", + you: "🧑 Você", + thinking: "pensando...", + inputPlaceholder: "Pergunte sobre spots, eventos, coaches...", + liveDataFrom: "Dados ao vivo de", + nostrRelays: "relays Nostr", + clear: "limpar", + gettingLocation: "📍 Obtendo sua localização…", + findingClosest: "🔍 Encontrando os spots mais próximos…", + checkingLive: "🔍 Verificando dados ao vivo…", + planningTrip: "🗺️ Planejando sua viagem a {{destination}}...", + searchingRelays: "🔍 Buscando nos relays por {{tool}}...", + perk1: "Assistente pessoal — o Sasquatch lê seu próprio Stash, crews, spots e anúncios", + perk2: "Rascunhos de ações: anunciar equipamentos, postar um status de skate, planejar uma viagem — você confirma antes de publicar qualquer coisa", + perk3: "As respostas usam seu contexto pessoal, não apenas dados públicos", + perk4: "⚡ Apoie diretamente o SkateSpots e o mantenha gratuito e sem anúncios", + welcomeTitle: "Obrigado por apoiar o Sasquatch Pro! 🦧⚡", + welcomeDesc: "Pagamento enviado — seu passe ativa quando o provedor confirmar (normalmente em um minuto). Obrigado por manter as ruas livres.", + invoiceCopied: "Fatura copiada", + dialogDesc: "Potencialize seu guia de skate com IA. 100% financia um app comunitário gratuito e sem anúncios.", + proSupporter: "Você é um apoiador Pro ⚡", + extendPrompt: "Quer estender? Escolha um plano abaixo para adicionar mais tempo.", + scanToPayPre: "Escaneie para pagar", + scanToPayAmount: "{{sats}} sats", + scanToPayPost: "por {{label}} de Pro", + invoiceQrAlt: "QR da fatura Lightning", + copyInvoice: "Copiar fatura", + ivePaid: "Já paguei", + ivePaidHint: "Toque em \"Já paguei\" depois que sua carteira confirmar — isso registra seu passe na sua identidade Nostr.", + freeStaysPre: "O Sasquatch grátis continua grátis — busca pública de spots/eventos/coaches, planejamento de viagens + o glossário completo de tricks. O Pro adiciona a camada ", + freeStaysEmphasis: "pessoal + de ações", + freeStaysPost: ".", + loginFirst: "Faça login primeiro para fazer upgrade.", + paysTo: "Paga para", + overLightning: "via Lightning. Vinculado ao seu npub.", + popular: "Popular", + sats: "sats", + extend: "Estender", + done: "Pronto!", + cancelledNothing: "Cancelado — nada foi publicado.", + draftReview: "Rascunho — revise e confirme", + statusTextPlaceholder: "Texto do status", + titlePlaceholder: "Título", + priceSatsPlaceholder: "Preço (sats)", + conditionPlaceholder: "Condição", + cancel: "Cancelar", + aiTitle: "Sasquatch AI", + owner: "Dono", + notConfigured: "não configurado", + unavailable: "indisponível", + satsValue: "{{balance}} sats", + theNode: "o nó", + lowBalance: "Acabando — recarregue em {{provider}} ou a IA vai usar o provedor sem chave.", + aiDesc: "IA paga por requisição, financiada em sats via Routstr. Recarrega quando está baixo.", + tier7d: "7 dias", + tier1m: "1 mês", + tier3m: "3 meses", + tier1y: "1 ano", + badgeTry: "Experimente", + badgeOff20: "20% off", + badgeBest: "Melhor custo-benefício · 40% off", + draftPostStatusTitle: "Postar um status de skate", + draftAutoExpires: "Expira automaticamente em {{count}} min", + draftPostStatusCta: "Postar status", + draftCategory: "Categoria: {{value}}", + draftSize: "Tamanho: {{value}}", + draftCondition: "Condição: {{value}}", + draftMaxPrice: "Preço máx.: {{price}} {{currency}}", + draftPriceOpen: "Preço: em aberto", + draftLookingForTitle: "Procurando \"{{title}}\"", + draftWantedCta: "Postar anúncio de procura", + draftPrice: "Preço: {{price}} {{currency}}", + draftPriceOffer: "Preço: aceito ofertas", + draftListTitle: "Anunciar \"{{title}}\" para venda", + draftPublishCta: "Publicar anúncio", + statusPosted: "Status postado 🛹", + wantedPublished: "Anúncio de procura publicado 🔎", + listingPublished: "Anúncio publicado 💸", + mustBeLoggedIn: "Você precisa estar logado.", + }, + sasquatchChat: { + faq: { + hi: "E aí! Sou o The Sasquatch 🦧 Seu guia de skate com IA. Pergunte sobre spots, eventos, coaches, equipamentos — ou qualquer coisa sobre o app. Do que você precisa?", + hello: "E aí! 🛹 Sou o The Sasquatch. Pergunte sobre spots de skate, eventos, coaches, ou como o app funciona. Qual é a boa?", + hey: "E aí, skatista! 🤙 Pergunte sobre spots perto de você, eventos chegando, coaches, ou qualquer coisa do SkateSpots.", + whoAreYou: "Sou o The Sasquatch 🦧 — o guia de IA do SkateSpots. Consigo encontrar spots de skate no mundo todo, procurar eventos, coaches, filmers e anúncios de equipamentos. Tudo com dados ao vivo do Nostr. Manda ver!", + whatCanYouDo: "Consigo encontrar spots de skate por cidade ou país, procurar eventos chegando, encontrar coaches e filmers no The Lab, buscar anúncios de equipamentos e responder perguntas sobre como o app funciona. Tente: 'spots em Bangkok' ou 'encontre um coach'! 🛹", + whatIsNostr: "Nostr é um protocolo simples e aberto para redes sociais descentralizadas. Pense no Twitter, mas sem uma única empresa controlando — você usa chaves criptográficas em vez de nomes de usuário, escolhe quais relays guardam seus dados (ou roda os seus), e uma conta funciona em todo app Nostr! 🔑", + isThisPrivate: "Aqui vai a real 🛡️\n\n• Sua **localização de GPS fica no seu dispositivo** — o 'Perto de mim' só centraliza o mapa. Nunca é enviada para nós nem publicada.\n• **Spots que você adiciona são públicos** (esse é o ponto de um mapa compartilhado) — então não coloque um pino na porta da sua casa.\n• **DMs e chats de crew são criptografados de ponta a ponta** — só os membros conseguem ler.\n• Como qualquer site, os servidores que você acessa (tiles do mapa, relays) podem ver seu **IP**. Quer esconder isso também? Use uma VPN ou Tor.\n\nDetalhes completos na [Privacy page](/privacy). 🛹", + privacy: "Versão rápida 🛡️: seu GPS nunca sai do seu dispositivo, os spots que você publica são públicos por design, e DMs/chats de crew são criptografados de ponta a ponta. Os servidores ainda podem ver seu IP (normal em qualquer site) — uma VPN ou Tor esconde isso se você quiser. Análise completa na [Privacy page](/privacy).", + amITracked: "O SkateSpots não te rastreia — sem anúncios, sem perfilamento por analytics, sem venda de dados, e não há um servidor SkateSpots coletando sua localização. Seu GPS fica no seu dispositivo. A única coisa que os servidores veem (tiles do mapa, relays) é seu **IP** — igual a qualquer site. Use uma VPN ou Tor para esconder isso. Mais na [Privacy page](/privacy). 🛡️", + doYouTrack: "Não — sem rastreamento, sem anúncios, sem coleta de dados. Seu GPS fica no seu dispositivo e não há servidor central te registrando. Os servidores que você acessa podem ver seu IP (como qualquer site); uma VPN/Tor esconde isso. Veja a [Privacy page](/privacy). 🛹", + vpn: "Totalmente opcional, mas ótimo se você quer privacidade extra 🛡️. Uma VPN esconde seu **IP** (localização aproximada) dos servidores com quem o SkateSpots fala — tiles do mapa, relays, etc. Escolha um provedor sem logs em que você confie (ex.: Mullvad); evite os grátis duvidosos.\n\nAviso: uma VPN **não** esconde os spots que você publica (eles são públicos), e não ligue o GPS do navegador se está tentando ficar anônimo. Detalhes completos na [Privacy page](/privacy).", + tor: "O Tor Browser te dá a privacidade de IP mais forte — ele te roteia por vários relays para que os servidores não vejam seu IP real 🧅. Custo: é mais lento, e mapas + alguns relays Nostr podem travar ou bloquear saídas Tor. Ótimo para os mais cautelosos.\n\nLembre-se: o Tor esconde seu IP, não os spots que você publica, e não ative o GPS do navegador se o objetivo é anonimato. Mais na [Privacy page](/privacy).", + hideMyIp: "Duas opções gratuitas 🛡️: uma **VPN confiável** (fácil, rápida — esconde seu IP atrás dos servidores dela) ou o **Tor Browser** (privacidade máxima, mais lento). Qualquer uma impede que os servidores que o SkateSpots acessa vejam seu IP real. Obs.: elas não escondem os spots que você publica. Veja a [Privacy page](/privacy).", + isMyLocation: "Sua localização está segura 📍 — o 'Perto de mim' lê seu GPS só no seu dispositivo, para centralizar o mapa e ordenar spots próximos. Nunca é publicada no Nostr, nunca é enviada para nós, nunca é compartilhada. Só os spots que você adiciona de propósito são públicos. Detalhes na [Privacy page](/privacy).", + whatAreZaps: "Zaps são gorjetas instantâneas de Bitcoin via Lightning enviadas pelo Nostr! Clique no ⚡ em qualquer conteúdo e envie sats direto para a carteira do criador. Como dar 'like' mas com dinheiro de verdade. Instantâneo, ponto a ponto, sem intermediários. ⚡", + howToLogin: "Dois jeitos:\n1. **Extensão de navegador** (Desktop): instale Alby ou nos2x, depois clique em 'Entrar'\n2. **Novo usuário**: clique em 'Cadastre-se' para gerar chaves. Baixe seu nsec (chave secreta) e SALVE — esta é sua conta para sempre!", + whatIsCashu: "Carteira Bitcoin integrada! Tokens de ecash Cashu respaldados por Lightning — funciona offline nos spots, focada em privacidade (as mints não conseguem rastrear pagamentos). Vá em Carteira nas Configurações para usar. 🥜", + whatIsNwc: "Nostr Wallet Connect — tipo um USB-C para carteiras Lightning. Conecte Alby, Minibits, Zeus ou Coinos uma vez e dê zap com um clique para sempre. Criptografado, você controla os limites de gasto. 🔌⚡", + isItFree: "100% gratuito. Sem anúncios, sem assinaturas, sem enrolação corporativa. Feito por skatistas para skatistas. Financiado pela comunidade via Angor — confira a página de Apoiadores. Você também pode ganhar Bitcoin com zaps da comunidade por contribuir com spots de qualidade. 🛹", + whatCanIDo: "Descubra spots no mundo todo no mapa, contrate profissionais no The Lab (coaches, filmers, fotógrafos, editores, builders de rampa), ande com uma crew, participe de eventos, faça tours, compre/venda equipamentos, acompanhe seu Stash privado, dê zap em criadores, confira o clima dos spots e construa a comunidade de skate descentralizada!", + whatIsTheLab: "O The Lab é onde você contrata profissionais da cena do skate: Coaches, Filmers, Fotógrafos, Editores de Vídeo e Builders de rampa/park/DIY. Cada um pode ser uma pessoa solo ou um coletivo (crew/estúdio) — os membros confirmam com suas próprias chaves, então é legítimo. Tudo no Nostr, sem contas falsas. 🎓", + whatIsACrew: "Crews são sua família do skate ancorada no mapa — com quem você anda, não quem você contrata. Cada crew tem território no mapa (pinos verdes), spots da casa, membros, vibes e um manifesto. Os membros confirmam com a própria chave. Crie uma em Crews → 'Criar crew'. 🤘", + whatAreCrews: "Crews são sua família do skate ancorada no mapa — com quem você anda, não quem você contrata. Cada crew tem território no mapa (pinos verdes), spots da casa, membros e um manifesto. Os membros confirmam com a própria chave. Vá até a aba Crews para começar ou entrar em uma! 🤘", + howToStartACrew: "Vá até a aba Crews → 'Criar crew'. Dê um nome, coloque seu território no mapa, adicione vibes (ou sua própria #hashtag), vincule seus spots da casa e adicione membros por npub. Cada membro confirma com a própria chave, então o elenco é legítimo. 🤘", + whatIsMyStash: "Meu Stash é seu armário de equipamentos PRIVADO e criptografado (criptografia NIP-44). Acompanhe seus decks, trucks, wheels, tênis — com local de armazenamento, condição, raridade e preço. Só VOCÊ consegue ler, a menos que marque itens como públicos. Ótimo para seguro ou para planejar uma troca. 🎒", + whatIsStash: "Meu Stash é seu inventário de equipamentos PRIVADO e criptografado. Registre tudo o que você tem — condição, onde está guardado, valor — tudo criptografado para que só você veja. Marque itens como públicos se quiser vender ou mostrar. 🎒", + whatIsABuilder: "Builders são crews de rampa/park/DIY no The Lab que você pode contratar para construir transições, bowls, rails ou um park inteiro. Eles listam o que constroem, materiais, escala do projeto, e podem ter licença/seguro. Muitas vezes coletivos — e podem vincular os spots que construíram ao mapa. 🏗️", + whatIsANutzap: "Nutzaps (NIP-61) são gorjetas de ecash enviadas pelo Nostr — tokens Cashu privados enviados direto para alguém. Você pode configurar o RECEBIMENTO de nutzaps na Carteira. (Enviar nutzaps completos está chegando — por enquanto, use zaps Lightning.) 🥜⚡", + whatIsClink: "CLINK é um código de pagamento nativo do Nostr (um 'noffer'). Lojas, crews e profissionais do Lab podem adicionar um para que você possa pagá-los sem precisar de um endereço Lightning — você verá um botão 'Pagar via CLINK' com um QR. Escaneie com uma carteira CLINK como a ShockWallet. 🔗⚡ [specs](https://clinkme.dev/specs.html) [apps](https://clinkme.dev/apps.html)", + whatIsNoffer: "Um noffer é um código de pagamento CLINK — uma forma reutilizável e nativa do Nostr de receber pagamentos sem servidor web nem endereço Lightning. Adicione o seu no perfil da sua loja/crew/Lab e as pessoas podem te pagar direto. 🔗", + whatAreTours: "Tours são viagens de skate guiadas — sessões locais, road trips nacionais ou tours de destruição mundial. Encontre no mapa ou na seção Tours, encontre a galera e ande em terreno novo com os locais. 🗺️🛹", + whatIsAShop: "Skate Shops são lojas locais listadas no mapa. Descubra e apoie skate shops de verdade (físicas ou online) na sua área — algumas até aceitam Bitcoin. 🏪", + howToSellGear: "Vá em Troca de Equipamentos / Marketplace e crie um anúncio (NIP-99). Adicione fotos, preço em sats, condição, e opcionalmente vincule a um spot para aparecer no mapa. Os compradores te dão zap ou mandam mensagem direto. 🛹💸", + supporters: "O SkateSpots é financiado pela comunidade via Angor (financiamento coletivo descentralizado em Bitcoin) — sem anúncios, sem investidores, sem venda de dados. Confira a página de Apoiadores para apoiar o projeto e manter as ruas livres. ❤️⚡", + trustScore: "Pontuações de confiança (0-100) fornecidas pelo Relatr. Analisa sua rede Nostr: seguidores, atividade, engajamento, zaps. Mais alto = mais confiável. Ajuda a filtrar bots e spam. Confira qualquer perfil para ver a pontuação. 🛡️", + whatRelay: "O SkateSpots usa: 🛹 goskatespots.nostr1.com (principal, na lista de permitidos pela qualidade) + relay.ditto.pub (global) + purplepag.es (agregador de perfis). Seus dados são replicados em todos eles para redundância.", + tripPlanner: "Me diga uma cidade e eu monto uma viagem de skate dia a dia 🗺️ — spots, eventos, coaches e crews locais, atenta ao clima (dia de chuva = dica de crew para spots cobertos). Tente 'planeje 3 dias em Lisboa'. Consigo salvar tudo numa Coleção e te encaminhar para voos/hospedagem nos sites reais (sem KYC, sem intermediário). 🛹", + planATrip: "Só diga 'planeje 3 dias em Barcelona' (ou qualquer cidade) e eu monto spots, sessões, coaches e crews locais para cada dia. Salve como uma Coleção e vai andar. 🗺️🛹", + sasquatchPro: "**Sasquatch Pro** 🦧⚡ é um passe de apoiador via Lightning que desbloqueia meu lado pessoal:\n\n• 🧠 **Assistente pessoal** — eu leio seu próprio Stash, crews, spots e anúncios\n• ✨ **Rascunhos de ações** — anunciar equipamentos, postar seu status de skate, planejar viagens (você sempre confirma antes de publicar)\n• 💬 **Contexto pessoal** — minhas respostas usam seus próprios dados, não só resultados públicos\n• ⚡ **Apoie o projeto** — você mantém o SkateSpots gratuito e sem anúncios\n\nO Sasquatch grátis continua grátis: busca pública de spots/eventos/coaches/crews, o glossário e o planejamento de viagens funcionam sem o Pro. O Pro só adiciona o lado *pessoal*. Toque em **⚡ Seja Pro** lá em cima. Planos: 7 dias ~2k sats, 1 mês ~5k, 3 meses ~12k, 1 ano ~36k.", + proPerks: "Vantagens do Pro 🦧⚡: assistente pessoal (lê seu Stash/crews/spots/anúncios), rascunhos de ações (anunciar equipamentos, postar status, planejar viagens — você confirma) e respostas que usam seu próprio contexto pessoal. Além disso, você apoia diretamente o SkateSpots e o mantém gratuito + sem anúncios. O grátis continua grátis — o Pro adiciona a camada pessoal. Toque em **⚡ Seja Pro** lá em cima.", + proVersion: "A versão Pro de mim 🦧⚡ adiciona um **assistente pessoal**: consigo ler seu próprio Stash, crews, spots e anúncios, rascunhar ações para você (anunciar equipamentos, postar um status, planejar uma viagem — você sempre confirma primeiro) e usar seu contexto pessoal nas respostas. Também apoia diretamente o projeto. O Sasquatch grátis (busca de spots/eventos/coaches/crews, glossário, planejador de viagens) continua grátis. Toque em **⚡ Seja Pro** lá em cima.", + perks: "Vantagens do Pro 🦧⚡: assistente pessoal (seu Stash/crews/spots/anúncios), rascunhos de ações que você confirma e respostas que usam seu próprio contexto — além de manter o app gratuito e sem anúncios. Toque em **⚡ Seja Pro** lá em cima.", + goPro: "Toque no botão **⚡ Seja Pro** lá em cima para abrir a tela de upgrade. O Pro desbloqueia meu assistente pessoal (Stash/crews/spots/anúncios) e rascunhos de ações, e apoia diretamente o projeto. Pague com Lightning — 7 dias ~2k sats até 1 ano ~36k sats. Os recursos grátis continuam grátis. 🦧", + proPricing: "Planos Pro (pague com Lightning ⚡): **7 dias** ~2.000 sats (~$1,20), **1 mês** ~5.000 sats (~$3), **3 meses** ~12.000 sats (~$7, 20% off), **1 ano** ~36.000 sats (~$21, melhor custo-benefício). Toque em **⚡ Seja Pro** lá em cima.", + howMuchIsPro: "Planos Pro: 7 dias ~2.000 sats, 1 mês ~5.000 sats, 3 meses ~12.000 sats (20% off), 1 ano ~36.000 sats (melhor custo-benefício). Pague com Lightning ⚡. Toque em **⚡ Seja Pro** lá em cima.", + upgrade: "Para fazer upgrade para o Sasquatch Pro, toque no botão **⚡ Seja Pro** lá em cima. Pague com Lightning (7 dias ~2k sats até 1 ano ~36k). O Pro desbloqueia meu assistente pessoal e rascunhos de ações, e apoia diretamente o projeto. 🦧⚡", + }, + statsTitle: "📊 **SkateSpots em números**", + weatherTemp: "• {{temp}}°C (sensação {{feels}}°C)", + weatherSkateability: "• Skateabilidade: **{{label}}** ({{score}}/100)", + weatherError: "Não consegui ler o clima agora. Tente de novo em um segundo. 🌧️", + labelSpots: "spots", + labelEvents: "eventos", + labelLabPros: "pros do Lab", + labelCrews: "crews", + labelShops: "skate shops", + labelTours: "tours", + labelGear: "anúncios de equipamentos", + unnamed: "Sem nome", + emptyWhere: " em **{{place}}**", + emptyResult: "Não encontrei nenhum {{label}}{{where}} agora 🦧\n\nIsso pode significar que ainda não há nenhum listado — ou que os relays demoraram a responder. Tente novamente em um instante, confira a grafia, ou [add the first one on the map](https://skate-spots.org/map). 🛹", + foundTitle: "{{emoji}} Encontrei **{{count}}** {{label}}:\n{{lines}}{{more}}", + moreResults: "\n\n…e mais **{{count}}** — [see them all on the map](https://skate-spots.org/map) 🗺️", + locationDenied: "Não consigo ver sua localização — nada sai do seu dispositivo; eu só leio localmente quando você pede, e o navegador acabou de recusar. Toque em 🎯 **Perto de mim** no mapa, ou me diga uma cidade: \"spots em Bangkok\". 🛹", + noNearbySpots: "Nenhum spot mapeado perto de você ainda 🦧 — [be the first to drop one](https://skate-spots.org/create-spot). 🛹", + closestTitle: "Mais perto de você agora:", + closestFooter: "_Calculado no seu dispositivo — sua localização nunca saiu dele._", + proNudge: "Isso é coisa do **Sasquatch Pro** 🦧⚡ — com o Pro consigo ler seu Stash, crews, spots e anúncios, rascunhar anúncios de equipamentos, anúncios de procura e status de skate, e planejar suas viagens. É um passe de apoiador via Lightning que mantém o SkateSpots gratuito e sem anúncios. Toque no botão **⚡ Seja Pro** lá em cima para desbloquear. 🛹", + draftingProPerk: "Rascunhar ações (postar um status, anunciar equipamentos) é uma vantagem do **Sasquatch Pro** 🦧⚡ — toque em **⚡ Seja Pro** lá em cima para desbloquear.", + draftIntro: "Aqui está um rascunho — revise e toque para publicar. Nada vai ao ar até você confirmar. 🛹", + draftFailed: "Não consegui montar esse rascunho — tente me contar os detalhes de novo (ex.: \"anuncie minhas wheels Spitfire por 8000 sats\").", + tripAskCity: "Para onde? Me diga uma cidade (ex.: \"planeje 3 dias em Lisboa\") e eu monto uma viagem. 🗺️", + tripEmptyMap: "Nada no mapa para **{{destination}}** ainda 🦧 — seja o primeiro a colocar spots em [skate-spots.org](https://skate-spots.org). Quando os locais adicionarem spots, crews e eventos, eu monto uma viagem completa para você.", + tripLocked: "Fechei uma missão em **{{destination}}** para você 🛹 — spots, sessões e locais abaixo. Ajuste ou salve.", + tripFailed: "Não consegui acessar os dados ao vivo para planejar isso agora. Tente novamente em um instante! 🛹", + tripEmptyMapLocal: "Nada no mapa para **{{destination}}** ainda 🦧 — seja o primeiro em [skate-spots.org](https://skate-spots.org).", + tripMissionLocal: "Aqui está uma missão em **{{destination}}** 🛹 — spots, sessões e locais abaixo.", + relayFailed: "Os relays não responderam a tempo agora 🛰️ — isso geralmente é uma conexão lenta, não um spot faltando. Tente de novo em um instante. 🛹", + couldNotProcess: "Hum, não consegui processar isso. Tente reformular!", + freeTierFallback: "Essa aí precisa de raciocínio de IA — um recurso do **Sasquatch Pro** ⚡🦧\n\nAinda consigo encontrar **spots, eventos, coaches, crews, lojas, tours e equipamentos** direto dos relays — me pergunte, por ex., \"spots em Barcelona\" — e o [Glossary](/glossary) cobre mais de 150 tricks e termos. Toque em **⚡ Seja Pro** lá em cima para desbloquear respostas de IA.", + aiDownFallback: "Meu cérebro de IA está pegando um ar agora 🦧 — mas ainda te ajudo:\n\n• 🗺️ [Map](/) — spots, lojas e eventos perto de você\n• 🧪 [The Lab](/lab) — coaches, filmers, editores\n• 📖 [Glossary](/glossary) — mais de 150 tricks e termos\n• 👥 [Crews](/crews) — encontre sua galera\n\nOu só me diga uma **cidade** (\"spots em Barcelona\") ou uma **trick** (\"o que é um nollie\") que eu respondo direto. 🛹", + wentWrong: "Algo deu errado do meu lado. Tente de novo em um segundo! 🦧", + publishError: "Não foi possível publicar isso: {{error}}. Tente novamente em um instante.", + unknownError: "erro desconhecido", + }, +}; export default ptBatch2; diff --git a/src/i18n/pt/batch3.ts b/src/i18n/pt/batch3.ts index 0b34b1f..4009f2c 100644 --- a/src/i18n/pt/batch3.ts +++ b/src/i18n/pt/batch3.ts @@ -1,4 +1,1293 @@ -/** pt — batch 3. Filled by the translation pass; empty until then. */ -const ptBatch3 = {}; +const ptBatch3 = { + settingsUi: { + proSupport: { + title: 'Pro e Apoio', + subtitle: 'Extras opcionais que mantêm o SkateSpots gratuito', + prepaidTitle: 'Pré-pago, não é assinatura', + prepaidBody: 'Cada compra é um pagamento único em Bitcoin/Lightning — sem conta, sem cobrança recorrente e sem custódia. Pagar de novo amplia seu tempo.', + sasquatchTitle: 'Sasquatch Pro', + sasquatchBenefit: 'Desbloqueia o assistente pessoal com IA — ele pode ler seu próprio Stash, Crews e anúncios — e ajuda a financiar o projeto.', + active: 'Ativo', + activeUntil: 'Ativo até {{date}}', + daysLeft: 'Faltam {{count}} dias', + notActive: 'Inativo', + goPro: 'Virar Pro', + extend: 'Ampliar Pro', + day: 'dia', + featuredTitle: 'Posição em destaque', + featuredBenefit: 'Leve um anúncio ao topo com um selo Pro — para perfis do The Lab, eventos, Shops e tours.', + featuredHow: 'Os níveis de duração valem para todos os tipos; compromissos mais longos custam menos por dia. Você destaca um anúncio ao criá-lo ou editá-lo.', + featuredUntil: 'Até {{date}}', + yourFeatured: 'Seus anúncios em destaque', + noneFeatured: 'Nenhum destaque ativo.', + freeTitle: 'Opções gratuitas', + freeBody: 'O FAQ com IA e a busca local são sempre gratuitos, e você pode publicar um anúncio com prova de trabalho gratuita em vez da taxa em sats.', + }, + notFound: { + seoTitle: '404 - Página não encontrada', + seoDescription: 'A página que você procura não foi encontrada. Volte à página inicial para continuar navegando.', + message: 'Ops! Página não encontrada', + returnHome: 'Voltar ao início', + }, + loginArea: { + signUp: 'Criar conta', + logIn: 'Entrar', + }, + accountSwitcher: { + switchAccount: 'Trocar de conta', + walletSettings: 'Configurações da carteira', + addAccount: 'Adicionar outra conta', + logout: 'Sair', + }, + amberHint: { + defaultAction: 'enviar', + multiBefore: 'Seu assinador vai pedir que você aprove', + multiTimes: '{{approvals}} vezes', + multiAfter: 'para {{action}} — isso é normal em mensagens criptografadas (uma aprovação por destinatário). Aprove cada uma.', + single: 'Seu assinador vai pedir que você aprove para {{action}}.', + }, + amberCallback: { + processing: 'Processando o login com Amber...', + gotResult: 'Resultado recebido: {{result}}', + noResultDebug: 'Nenhum resultado do Amber', + noResultToast: 'Nenhum resultado recebido do Amber. A operação pode ter sido cancelada.', + validPubkey: 'Chave pública válida! Entrando...', + loginSuccessful: 'Login realizado!', + loginErrorDebug: 'Erro de login: {{error}}', + invalidResultDebug: 'Formato de resultado inválido: {{result}}', + loggedInTitle: 'Sessão iniciada', + amberLoginDesc: 'Login realizado com o Amber!', + loginFailedTitle: 'Falha no login', + loginFailedDesc: 'Não foi possível concluir o login com o Amber. Tente de novo.', + invalidPubkeyDesc: 'Chave pública inválida recebida do Amber.', + sessionLostToast: 'Os dados da sessão foram perdidos. Tente de novo.', + eventSignedTitle: 'Evento assinado', + eventSignedDesc: 'Seu evento foi assinado pelo Amber.', + signingFailedTitle: 'Falha na assinatura', + signingFailedDesc: 'Não foi possível processar o evento assinado do Amber.', + operationCompleteTitle: 'Operação concluída', + operationCompleteDesc: '{{op}} concluído.', + }, + loginDialog: { + loginWithAmber: 'Entrar com Amber (Android)', + welcomeTitle: 'Bem-vindo ao SkateSpots', + welcomeSubtitle: 'Crie uma conta ou entre para continuar', + newHere: 'É novo por aqui?', + createFree: 'Crie uma conta gratuita. Sem e-mail.', + createAccount: 'Criar conta', + orLogIn: 'Ou entre', + loggedInTitle: '🛹 Sessão iniciada!', + loggedIn: 'Sessão iniciada!', + connectedAmber: 'Conectado com o Amber!', + amberLoginFailed: 'Falha no login com o Amber', + amberCancelled: 'Login cancelado. Toque em "Abrir Amber" para tentar de novo.', + amberNotFound: 'Amber não encontrado. Confira se o Amber está instalado pela ZapStore.', + loginFailed: 'Falha no login', + pubkeyError: 'Cole sua chave pública em hex (64 caracteres) ou o npub do Amber', + pairedSigner: 'Emparelhado com seu assinador.', + connectFailed: 'Não foi possível conectar ao seu assinador.', + openedEncrypted: 'Sua chave criptografada foi aberta.', + openKeyFailed: 'Não foi possível abrir essa chave.', + bunkerPrefix: 'Deve começar com bunker://', + connectedBunker: 'Conectado via bunker!', + bunkerFailed: 'Falha: {{error}}', + checkBunkerUri: 'Verifique sua URI de bunker', + nsecPrefix: 'Deve começar com nsec1', + invalidNsec: 'nsec inválido: {{error}}', + checkKey: 'Verifique sua chave', + noExtensionTitle: 'Nenhuma extensão encontrada', + noExtensionDesc: 'Instale o Alby ou outra extensão NIP-07.', + amberIdleDesc: 'Sua chave fica dentro do Amber. Um toque: aprove no Amber e você volta aqui com a sessão iniciada. Nada para copiar.', + continueWithAmber: 'Continuar com Amber', + noAmberGetIt: 'Não tem o Amber? Baixe aqui →', + waitingAmberTitle: 'Esperando o Amber…', + waitingAmberDesc: 'Aprove a solicitação no Amber. Sua sessão será iniciada automaticamente assim que você voltar.', + openAmberAgain: 'Abrir Amber de novo', + havingTrouble: 'Com problemas? Digite sua chave manualmente', + enterPublicKey: 'Digite sua chave pública', + enterPublicKeyDescBefore: 'Só se o fluxo automático não funcionou. No Amber: toque no seu perfil →', + copyPublicKey: 'Copiar chave pública', + enterPublicKeyDescAfter: 'e cole aqui.', + connect: 'Conectar', + back: '← Voltar', + signInWithPhone: 'Entre com seu celular', + signInWithPhoneDesc: 'Escaneie com um app assinador (Amber, nsec.app). Sua chave nunca sai do seu celular.', + showPairingCode: 'Mostrar código de emparelhamento', + waitingSigner: 'Esperando seu assinador…', + copyLink: 'Copiar link', + orPasteBunker: 'ou cole uma URL de bunker', + bunkerTitle: 'Bunker (NIP-46)', + bunkerPasteBefore: 'Cole sua URI', + bunkerPasteAfter: '.', + amberInstructions: 'Configurações → NIP-46 Bunker → Criar → Copiar', + nsecAppInstructions: 'Conectar app → Copiar URI do bunker', + secretKeyTitle: 'Chave secreta', + secretKeyRawDesc: 'Cole sua chave secreta do Nostr diretamente.', + secretKeyEncDesc: 'Abra um backup de chave protegido por senha.', + rawNsec: 'nsec em texto puro', + encryptedNip49: 'Criptografada (NIP-49)', + nsecWarning: '⚠️ Use só em um dispositivo confiável. Nunca compartilhe seu nsec.', + login: 'Entrar', + encSaferDesc: 'Mais seguro: a chave fica criptografada até você digitar sua senha, então o backup é seguro para guardar na nuvem ou em um gerenciador de senhas.', + password: 'Senha', + openEncryptedKey: 'Abrir chave criptografada', + browserExtensionTitle: 'Extensão de navegador (NIP-07)', + browserExtensionDesc: 'Ideal para desktop. Funciona com Alby, nos2x, Flamingo.', + loginWithExtension: 'Entrar com extensão', + }, + signupDialog: { + download: 'Baixar', + stepChoose: 'Escolher', + stepProfile: 'Perfil', + stepSaveKey: 'Salvar chave', + somethingWrong: 'Algo deu errado', + createFailed: 'Não foi possível criar sua conta. Tente de novo.', + keySavedTitle: 'Chave secreta salva!', + keySavedDesc: 'Sua chave foi guardada com segurança.', + downloadFailedTitle: 'Falha no download', + downloadFailedDesc: 'Não foi possível baixar o arquivo da chave. Copie manualmente.', + encSavedTitle: 'Backup criptografado salvo 🔐', + encSavedDesc: 'Guarde o arquivo E a senha: você precisa dos dois para entrar de novo.', + encFailed: 'Não foi possível criptografar essa chave.', + invalidFileTitle: 'Tipo de arquivo inválido', + invalidFileDesc: 'Selecione um arquivo de imagem para seu avatar.', + fileTooLargeTitle: 'Arquivo grande demais', + fileTooLargeDesc: 'A imagem do avatar deve ter menos de 5 MB.', + avatarUploadedTitle: 'Avatar enviado!', + avatarUploadedDesc: 'Seu avatar foi enviado com sucesso.', + uploadFailedTitle: 'Falha no envio', + uploadFailedDesc: 'Não foi possível enviar o avatar. Tente de novo.', + nameRequiredTitle: 'Nome de exibição obrigatório', + nameRequiredDesc: 'Escolha um nome de exibição para os outros skaters saberem quem você é. Você pode mudá-lo quando quiser.', + reserveFailedTitle: 'Não foi possível reservar esse nome', + reserveFailedDesc: '{{error}} Você pode reivindicar um mais tarde nas Configurações.', + profileCreatedTitle: 'Perfil criado!', + profileCreatedDesc: 'Seu perfil foi configurado.', + profileFailedTitle: 'Falha na configuração do perfil', + profileFailedDesc: 'Sua conta foi criada, mas a configuração do perfil falhou. Você pode atualizá-lo mais tarde.', + welcomeToastTitle: 'Boas-vindas!', + welcomeToastDesc: 'Sua conta está pronta.', + titleWelcome: 'Entre no SkateSpots', + titleProfile: 'Configure seu perfil', + titleDone: 'Boas-vindas!', + createFreeAccount: 'Crie sua conta gratuita', + createFreeAccountDesc: 'Sem e-mail, sem telefone, sem senha. Sua conta é uma chave Nostr — escolha onde ela fica.', + recommended: 'Recomendado', + signUpWithAmber: 'Criar conta com Amber', + signUpWithAmberDesc: 'Sua chave é criada e guardada dentro do app Amber — o SkateSpots nunca a toca. O mais seguro. Um toque para aprovar.', + continueWithAmber: 'Continuar com Amber', + orQuickWay: 'ou o jeito rápido', + quickAccount: 'Conta rápida neste dispositivo', + quickAccountDesc: 'Geramos uma chave que fica neste dispositivo. O início mais rápido — ajudamos você a salvar um backup logo depois.', + createQuickAccount: 'Criar conta rápida', + quickReassurance: 'Leva 5 segundos · fica neste dispositivo · ajudamos você a fazer o backup em seguida', + preferAnotherSigner: 'Prefere outro assinador?', + iosDesktopNudge: 'Está no iOS ou desktop? Um app assinador ou uma extensão de navegador é a opção mais segura —', + seeAllOptions: 'Ver todas as opções', + youreInPickName: 'Você entrou! 🛹 Escolha um nome de exibição para os skaters saberem quem você é', + changeAnytime: 'Você pode mudá-lo quando quiser. Bio e avatar são opcionais.', + publishingProfile: 'Publicando seu perfil...', + displayName: 'Nome de exibição', + displayNamePlaceholder: 'ex.: Tony, gnarlyGrind ou o nome da sua Crew', + displayNameHint: 'Obrigatório — como você aparece em todo o SkateSpots. Mude quando quiser.', + skateName: 'Seu nome no SkateSpots', + skateNameHint: 'Gratuito e opcional — um nome de usuário verificado que mostra um ✓ no seu perfil.', + bio: 'Bio', + bioPlaceholder: 'Conte um pouco sobre você...', + avatar: 'Avatar', + uploadAvatar: 'Enviar imagem de avatar', + saving: 'Salvando...', + saveAndStart: 'Salvar e começar a andar', + addNameToContinue: 'Adicione um nome de exibição para continuar.', + savingPublishesNote: 'Ao salvar, seu perfil é publicado no Nostr — seu assinador pode pedir para aprovar uma vez.', + youreIn: 'Você entrou! 🛹', + oneQuickThing: 'Uma coisa rápida antes de você começar…', + saveLoginKey: 'Salve sua chave de acesso', + saveLoginKeyBefore: 'Esta é a', + only: 'única', + saveLoginKeyAfter: 'forma de voltar à sua conta — sem e-mail, sem redefinir senha. Salve-a agora e poderá entrar em qualquer dispositivo, onde quer que você ande.', + revealSaveKey: 'Mostrar e salvar minha chave', + recoveryCopied: 'Código de recuperação copiado. Guarde em um lugar seguro.', + saved: 'Salvo', + treatLikeBoardKeys: 'Trate como as chaves do seu shape — quem tiver este código controla sua conta. Nunca compartilhe.', + hideEncBackup: 'Ocultar backup criptografado', + saveEncBackup: 'Salvar um backup criptografado', + encBackupBefore: 'Uma cópia protegida por senha — segura para guardar na nuvem ou em um gerenciador de senhas. Você vai precisar do arquivo', + and: 'e', + encBackupAfter: 'da senha.', + choosePassword: 'Escolha uma senha', + saveEncBackupCta: 'Salvar backup criptografado', + savedCodeAria: 'Salvei meu código de recuperação', + savedCodeLabel: 'Salvei meu código de recuperação em um lugar seguro — um gerenciador de senhas ou anotado no papel.', + letsSkate: 'Vamos andar', + saveLater: 'Vou salvar mais tarde nas Configurações', + advancedSigner: 'Avançado: usar um app assinador', + }, + mnemonic: { + generatedTitle: 'Frase de recuperação gerada! 🎉', + generatedDesc: 'Anote estas 12 palavras em ordem. Elas são a chave da sua conta!', + savedTitle: 'Frase de recuperação salva!', + savedDesc: 'Guarde este arquivo em um lugar seguro.', + downloadFailedTitle: 'Falha no download', + downloadFailedDesc: 'Não foi possível baixar o arquivo. Copie manualmente.', + copiedTitle: 'Copiado para a área de transferência!', + copiedDesc: 'Sua frase de recuperação foi copiada.', + qrWindowTitle: 'QR Code da frase de recuperação', + qrHeading: 'Seu QR Code da frase de recuperação', + qrAlt: 'QR Code da frase de recuperação', + qrWarning: 'Mantenha este QR Code privado e seguro!', + qrPrint: 'Imprimir QR Code', + qrFailedTitle: 'Falha no QR Code', + qrFailedDesc: 'Não foi possível gerar o QR Code.', + accountCreatedTitle: 'Conta criada! 🎉', + accountCreatedDesc: 'Tudo pronto! Sua frase de recuperação está segura.', + loginFailedTitle: 'Falha no login', + loginFailedDesc: 'Não foi possível criar a conta. Tente de novo.', + verifyFailedTitle: 'Falha na verificação', + verifyFailedDesc: 'As palavras não coincidem. Confira e tente de novo.', + titlePrefix: 'Criar conta com', + titleSuffix: 'frase de recuperação', + twelveWordTitle: 'Frase de recuperação de 12 palavras', + twelveWordDesc: 'Sua frase de recuperação é como uma senha mestra. Anote no papel e guarde bem. Você vai precisar dela para acessar sua conta em outros dispositivos ou se limpar os dados do navegador.', + generate: 'Gerar frase de recuperação', + useNsecInstead: 'Usar uma chave nsec avançada', + yourPhrase: 'Sua frase de recuperação', + copy: 'Copiar', + download: 'Baixar', + qrCode: 'QR Code', + criticalWarning: 'Aviso de segurança crítico', + warnWriteStrong: 'Anote', + warnWrite: 'no papel e guarde em segurança', + warnNeverShareStrong: 'Nunca compartilhe', + warnNeverShare: 'sua frase de recuperação com ninguém', + warnBackupsStrong: 'Guarde várias cópias', + warnBackups: 'em lugares seguros diferentes', + warnAnyoneStrong: 'Quem tiver esta frase', + warnAnyone: 'controla sua conta para sempre', + warnLoseStrong: 'Se você perdê-la', + warnLose: 'perde sua conta permanentemente', + savedSecurely: 'Salvei em segurança', + verifyTitle: 'Verifique sua frase de recuperação', + verifyDesc: 'Para garantir que você salvou corretamente, digite estas palavras:', + wordLabel: 'Palavra nº {{n}}', + wordPlaceholder: 'Digite a palavra nº {{n}}', + goBack: 'Voltar', + verifyCreate: 'Verificar e criar conta', + completeTitle: 'Conta criada!', + completeDesc: 'Sua conta Nostr está pronta!', + signerTitle: 'Recomendado: configure um app assinador', + signerSubtitle: 'Mantenha suas chaves extra seguras', + signerDesc: 'Para maior segurança, use um app assinador dedicado em vez de colar sua frase de recuperação em todo lugar. Os apps assinadores mantêm suas chaves seguras e deixam você usar qualquer app Nostr.', + signerCta: 'Conheça os apps assinadores', + skip: 'Pular por enquanto', + }, + signupMethod: { + titlePrefix: 'Escolha seu', + titleSuffix: 'método de cadastro', + subtitle: 'Os dois métodos são seguros. Escolha o que funciona melhor para você!', + recommended: 'Recomendado', + mnemonicTitle: 'Frase de recuperação', + mnemonicDesc: '12 palavras fáceis de memorizar. O padrão usado por Bitcoin, Ethereum e a maioria das carteiras cripto.', + mnemonicF1: 'Fácil de anotar no papel', + mnemonicF2: 'Funciona com outros apps Nostr (NIP-06)', + mnemonicF3: 'Pode gerar várias contas', + mnemonicF4: 'Familiar para usuários de cripto', + useMnemonic: 'Usar frase de recuperação', + advanced: 'Avançado', + nsecTitle: 'Chave secreta (nsec)', + nsecDesc: 'Chave criptográfica bruta. Mais técnica, mas dá acesso direto à sua identidade Nostr.', + nsecF1: 'Controle criptográfico direto', + nsecF2: 'Compatível com todos os apps Nostr', + nsecF3: 'Uma única string para backup', + nsecF4: 'Sem camada de derivação', + useNsec: 'Usar chave secreta', + footer: '🔒 Os dois métodos são igualmente seguros. Escolha conforme sua preferência!', + }, + skateNip05: { + placeholder: 'seunome', + claimedSuffix: 'é seu — salve seu perfil para publicá-lo.', + checking: 'Verificando disponibilidade…', + available: '{{name}}@{{domain}} está disponível', + claim: 'Reivindicar', + hint: 'Letras, números e hífens. Gratuito, e aparece como selo ✓ no seu perfil.', + }, + nip05Required: { + getFree: 'Consiga um NIP-05 gratuito / barato', + paid: 'Pago', + requiredTitle: 'Verificação NIP-05 obrigatória', + bannerReason: 'Para evitar spam e gerar confiança, {{role}} precisam de um endereço Nostr verificado (NIP-05).', + gateReason: 'Para evitar spam e gerar confiança, {{role}} devem ter verificação NIP-05.', + addInSettings: 'Adicionar NIP-05 nas Configurações', + explainer: 'O NIP-05 prova sua identidade vinculando seu perfil Nostr a um domínio — como', + updateProfile: 'Atualize seu perfil', + }, + editProfile: { + uploadSuccessTitle: 'Sucesso', + uploadSuccessDesc: '{{field}} enviado com sucesso', + uploadErrorDesc: 'Não foi possível enviar {{field}}. Tente de novo.', + mustBeLoggedIn: 'Você precisa estar conectado para atualizar seu perfil', + invalidClinkTitle: 'Código CLINK inválido', + invalidClinkDesc: 'Isso não parece um código noffer1… válido. Limpe-o ou cole um válido.', + invalidLightningTitle: 'Endereço Lightning inválido', + invalidLightningDesc: 'Use um endereço parecido com e-mail, como you@walletofsatoshi.com.', + invalidSpTitle: 'Endereço Silent Payment inválido', + invalidSpDesc: 'Um endereço Silent Payment começa com "sp1" e é bem longo. Limpe-o ou cole um válido.', + invalidCordnTitle: 'Link do Cordn inválido', + invalidCordnDesc: 'Cole um link de contato completo do Cordn https://…', + updateSuccessTitle: 'Sucesso', + updateSuccessDesc: 'Seu perfil foi atualizado', + updateErrorDesc: 'Não foi possível publicar o perfil. Confira suas conexões de Relay em Configurações > Relays', + identityTitle: 'Identidade', + identityDesc: 'Como você aparece em todo o SkateSpots.', + displayName: 'Nome de exibição', + displayNamePlaceholder: 'Seu nome', + bio: 'Bio', + bioPlaceholder: 'Algumas palavras sobre você e seu skate…', + profilePicture: 'Foto de perfil', + pictureDesc: 'Envie ou cole uma imagem quadrada.', + bannerImage: 'Imagem de capa', + bannerDesc: 'Uma imagem larga para o topo do seu perfil.', + website: 'Site', + bitcoinTitle: 'Bitcoin e pagamentos', + bitcoinDesc: 'Deixe as pessoas mandarem Zaps, gorjetas e pagamentos direto para você — sem intermediário.', + lightningAddress: 'Endereço Lightning', + lud16Invalid: 'Use um endereço parecido com e-mail, ex. you@yourdomain.com.', + lud16Ok: 'Ativa o botão “Zap” no seu perfil.', + lud16Hint: 'Gorjetas instantâneas em Bitcoin. Ativa o botão “Zap” no seu perfil.', + silentPaymentAddress: 'Endereço Silent Payment', + spInvalid: 'Deve começar com “sp1” e ser bem longo.', + spOk: 'Válido — um endereço on-chain privado e reutilizável.', + spHint: 'Endereço on-chain estático reutilizável (BIP-352). Compartilhe uma vez; cada pagamento é não vinculável.', + clinkTipCode: 'Código de gorjeta CLINK', + nofferInvalid: 'Isso não parece um código noffer1… válido.', + nofferOk: 'Válido — um botão “Gorjeta em Bitcoin” vai aparecer no seu perfil.', + nofferHint: 'Código CLINK autocustodial para qualquer um te dar gorjeta pelo Nostr — sem intermediário.', + skateProfileTitle: 'Perfil de skate', + skateProfileDesc: 'Mostre seus patrocinadores e como a Crew fala com você.', + badges: 'Selos', + badgesHint: '(rótulo + link opcional)', + badgeExample: 'ex. Independent Trucks', + badgeLabelPlaceholder: 'Rótulo do selo…', + badgeUrlPlaceholder: 'https://… (opcional)', + removeBadge: 'Remover selo', + addBadge: 'Adicionar selo', + badgesDescBefore: 'Patrocinadores, Shops ou pessoas que apoiam seu skate — e qualquer outra coisa que você queira mostrar. Cada um vira um chip clicável no seu perfil. Seu selo de', + badgesDescAfter: 'membro é adicionado automaticamente.', + coordinator: 'Coordenador', + cordnInvalid: 'Isso não parece um coordenador. Cole um nprofile, um link cordn.net ou uma URL https://.', + cordnOk: 'Mostrado no seu perfil — os outros podem adicioná-lo com um toque.', + cordnHint: 'O coordenador do Cordn que os outros usam para falar com você. Privado, criptografado, seu.', + useMyCoordinator: 'Usar meu coordenador', + accountTitle: 'Conta', + accountDesc: 'Configurações extras da conta.', + botAccount: 'Conta bot', + botAccountDesc: 'Marque esta conta como automatizada ou um bot.', + saving: 'Salvando…', + saveProfile: 'Salvar perfil', + nip05VerifiedHandle: 'Nome de usuário verificado NIP-05', + nip05How: 'Como?', + extraHandles: 'Nomes de usuário extras', + extraHandlesHint: 'opcional — adicione até 5', + nip05HintEmpty: 'Um nome de usuário verificado como you@yourdomain.com — a versão do Nostr do check azul. Mostra um selo ✓ no seu perfil e desbloqueia o filtro “Verificado” no diretório de skaters.', + nip05Invalid: 'Use um nome de usuário parecido com e-mail, ex. you@yourdomain.com — sem “https://” nem espaços.', + nip05Checking: 'Verificando seu domínio…', + nip05Verified: 'Verificado — seu domínio confirma que este nome de usuário é seu. ✓', + nip05Mismatch: 'Seu domínio vincula este nome de usuário a uma chave DIFERENTE. Corrija seu .well-known/nostr.json para apontar para esta conta.', + nip05Unreachable: 'Ainda não foi possível alcançar o /.well-known/nostr.json do seu domínio. Os nomes salvos continuam funcionando quando seu domínio estiver configurado corretamente.', + nip05Enter: 'Digite seu nome de usuário NIP-05.', + freeHandleBefore: 'Não tem um domínio próprio? Reivindique um nome de usuário', + freeHandleAfter: 'gratuito do SkateSpots.', + uploadLabel: 'Enviar {{label}}', + previewLabel: 'Prévia de {{label}}', + }, + security: { + recoveryCopied: 'Código de recuperação copiado. Guarde em um lugar seguro.', + savedTitle: 'Salvo!', + recoveryDownloaded: 'Código de recuperação baixado. Guarde em um lugar seguro.', + downloadFailedTitle: 'Falha no download', + downloadFailedDesc: 'Copie manualmente.', + loginRequired: 'Login obrigatório', + loginRequiredDesc: 'Entre para acessar as configurações de segurança.', + backupConfirmedTitle: 'Backup confirmado! ✅', + backupConfirmedDesc: 'Ótimo! Suas chaves estão seguras.', + yourRecoveryCode: 'Seu código de recuperação', + recoveryCodeDesc: 'Não salvou quando se cadastrou? Você pode pegá-lo aqui quando quiser.', + recoveryCodeBefore: 'Este código é a', + only: 'única', + recoveryCodeAfter: 'forma de entrar de novo em um dispositivo ou navegador novo. Guarde em um lugar seguro (um gerenciador de senhas ou no papel). Quem o tiver controla sua conta — nunca compartilhe.', + revealRecovery: 'Mostrar meu código de recuperação', + qrHint: 'Escaneie com outro app Nostr para entrar. Mantenha esta tela em privado.', + neverShareHide: '⚠️ Nunca compartilhe isto. Oculte quando terminar.', + hide: 'Ocultar', + amberNoteBefore: 'Você entrou com o', + amberNoteAfter: '. Seu código de recuperação fica dentro do Amber — abra o app Amber para fazer backup. O SkateSpots nunca vê sua chave.', + bunkerNoteBefore: 'Você entrou com um', + remoteSigner: 'assinador remoto (bunker)', + bunkerNoteAfter: '. Seu código de recuperação é guardado pelo seu serviço assinador, não pelo SkateSpots. Faça o backup lá.', + extensionNoteBefore: 'Você entrou com uma', + browserExtension: 'extensão de navegador', + extensionNoteAfter: '. Seu código de recuperação fica na extensão — use a opção de backup/exportação dela. O SkateSpots nunca vê sua chave.', + otherNote: 'Seu código de recuperação é gerenciado pelo seu app assinador, não pelo SkateSpots. Faça o backup lá.', + backupWarningTitle: '⚠️ Você fez backup da sua frase de recuperação ou chave secreta?', + backupWarningBody: 'Suas chaves são a ÚNICA forma de acessar sua conta. Se você perdê-las, perde tudo — não existe redefinição de senha!', + iveBackedUp: 'Fiz backup das minhas chaves', + backupConfirmed: '✅ Backup confirmado', + backupNotConfirmed: '⚠️ Backup não confirmado', + backupConfirmedStatusDesc: 'Você confirmou que suas chaves estão guardadas em segurança.', + backupNotConfirmedDesc: 'Faça backup da sua frase de recuperação ou chave secreta!', + notSavedYetBefore: 'Ainda não salvou seu código de recuperação? Sem problema — pegue-o na seção', + notSavedYetAfter: 'acima, guarde em um lugar seguro e confirme abaixo.', + yesBackedUp: 'Sim, fiz backup das minhas chaves', + bestPracticesTitle: 'Boas práticas de segurança de chaves', + bestPracticesDesc: 'Como manter sua conta Nostr segura', + bp1Title: 'Anote no papel', + bp1Desc: 'O backup físico é o mais seguro. Guarde em um local seguro, como um cofre.', + bp2Title: 'Vários backups', + bp2Desc: 'Guarde cópias em locais seguros diferentes (cofre de casa, cofre de banco etc.)', + bp3Title: 'Nunca compartilhe suas chaves', + bp3Desc: 'Apps Nostr de verdade NUNCA pedem seu nsec ou frase de recuperação depois do primeiro login', + bp4Title: 'Não guarde na nuvem sem criptografia', + bp4Desc: 'Evite Google Docs, rascunhos de e-mail ou armazenamento em nuvem em texto puro', + bp5Title: 'Considere usar uma extensão de navegador', + bp5Desc: 'Alby, nos2x ou Flamingo mantêm suas chaves seguras e nunca as expõem a sites', + importantReminders: '⚠️ Lembretes importantes', + rem1: 'Se você perder suas chaves, perde sua conta permanentemente', + rem2: 'Nenhuma empresa ou pessoa pode redefinir sua senha — nem nós', + rem3: 'Quem tiver suas chaves tem controle total da sua conta', + rem4: 'Suas chaves controlam todos os seus dados Nostr em TODOS os apps', + recommendedSigners: '🔌 Assinadores Nostr recomendados', + recommendedSignersDesc: 'Use um assinador Nostr para mais segurança e praticidade', + recommended: 'Recomendado', + amberDesc: 'Assinador Nostr seguro para Android. Mantém suas chaves seguras no celular e assina eventos sem expô-las.', + albyDesc: 'Extensão completa com carteira Lightning, WebLN e suporte a NWC.', + flamingoDesc: 'Interface simples e limpa. Foca em assinar no Nostr sem recursos de carteira.', + nos2xDesc: 'Extensão mínima e leve para usuários avançados.', + nostrConnectTitle: '☁️ Nostr Connect (assinadores remotos)', + nostrConnectDesc: 'Use um assinador remoto para acessar sua conta de qualquer dispositivo', + nostrConnectBody: 'O Nostr Connect (também chamado de "bunkers") permite guardar suas chaves em um servidor seguro e entrar de qualquer dispositivo. Suas chaves nunca saem do servidor, mas você pode usar sua conta em qualquer lugar!', + nsecAppDesc: 'Assinador remoto gratuito e seguro. Crie uma URI bunker:// e cole ao entrar.', + nostrumDesc: 'Outra opção de assinador remoto com suporte móvel.', + howToUse: '💡 Como usar:', + howToUseDesc: 'Crie uma conta em um desses serviços, pegue sua string de conexão bunker:// e cole na aba "Nostr Connect" ao entrar.', + }, + relayList: { + connected: 'Conectado', + connecting: 'Conectando…', + offline: 'Offline', + removeUrl: 'Remover {{url}}', + add: 'Adicionar', + publishedTitle: 'Lista de Relays publicada', + publishedDesc: 'Sincronizada com o Nostr (kind 10002).', + publishFailedTitle: 'Falha ao publicar a lista de Relays', + invalidUrlTitle: 'URL de Relay inválida', + invalidUrlDesc: 'Tente algo como wss://relay.example.com', + alreadyInList: 'Relay já está na sua lista', + keepReadWriteTitle: 'Mantenha leitura ou escrita ativada', + keepReadWriteDesc: 'Um Relay precisa de pelo menos leitura ou escrita.', + alreadyInThisList: 'Relay já está nesta lista', + dmPublishedTitle: 'Relays de MD publicados', + dmPublishedDesc: 'Caixa de entrada NIP-17 atualizada.', + dmPublishFailedTitle: 'Falha ao publicar os Relays de MD', + nip65Title: 'Relays (NIP-65)', + nip65DescUser: 'Toque em Leitura / Escrita para alternar. Publicado no Nostr como sua lista kind 10002.', + nip65DescLoggedOut: 'Toque em Leitura / Escrita para alternar. Entre para publicar sua lista no Nostr.', + noRelays: 'Nenhum Relay ainda — adicione um abaixo.', + local: 'Local', + read: 'Leitura', + readHint: 'Buscar conteúdo deste Relay', + write: 'Escrita', + writeHint: 'Publicar seus eventos neste Relay', + dmTitle: 'Relays da caixa de entrada de MD', + dmDesc: 'Onde você recebe mensagens diretas NIP-17 (kind 10050). Quando vazio, usa seus Relays de escrita.', + localTitle: 'Relays locais', + localDesc: 'Só do app (ex. um nó de LAN). Usados para leitura e escrita; nunca publicados.', + blockedTitle: 'Relays bloqueados', + blockedDesc: 'Nunca se conecte a estes — excluídos de toda leitura e escrita.', + }, + relatr: { + searchingTitle: 'Procurando o serviço Relatr...', + searchingDesc: 'Consultando o Nostr por perfis Relatr', + foundTitle: 'Serviço Relatr encontrado!', + foundDesc: 'Serviço: {{name}}', + unknown: 'Desconhecido', + notFoundTitle: 'Nenhum serviço Relatr encontrado', + notFoundDesc: 'Tente digitar a chave pública manualmente ou confira https://www.relatr.xyz/', + searchFailedTitle: 'Falha na busca', + searchFailedDesc: 'Não foi possível consultar o Nostr por perfis Relatr', + invalidPubkeyTitle: 'Chave pública inválida', + invalidPubkeyDesc: 'Digite uma chave pública hex de 64 caracteres válida', + enabledTitle: 'Relatr ativado!', + enabledDesc: 'As pontuações de confiança globais já estão ativas.', + disabledTitle: 'Relatr desativado', + disabledDesc: 'As pontuações de confiança não são mais buscadas.', + title: 'Pontuações de confiança do Relatr', + desc: 'As pontuações de confiança globais ajudam a identificar usuários confiáveis e reduzir spam', + status: 'Status', + active: 'Ativo', + disabled: 'Desativado', + activeStrong: 'O Relatr está ativo.', + activeDesc: 'As pontuações de confiança da análise de rede global do ContextVM ajudam a identificar skaters confiáveis e reduzir spam.', + disabledStrong: 'O Relatr está desativado.', + disabledHint: 'Ative para receber pontuações de confiança da rede Nostr global.', + disable: 'Desativar Relatr', + enable: 'Ativar Relatr', + advancedSettings: 'Configurações avançadas', + servicePubkey: 'Chave pública do serviço Relatr', + pubkeyPlaceholder: 'Digite a chave pública hex de 64 caracteres...', + searching: 'Procurando...', + autoDiscover: 'Descobrir automaticamente', + pubkeyDefault: 'Padrão: serviço Relatr oficial do ContextVM (npub1dvmc...)', + relayLabel: 'Relay (onde o Relatr publica as pontuações)', + relayDefault: 'Padrão: wss://relay.contextvm.org (Relay oficial do ContextVM)', + applyChanges: 'Aplicar alterações', + learnMore: 'Saiba mais:', + website: 'Site do Relatr', + github: 'GitHub do Relatr', + nip85Spec: 'Especificação NIP-85', + }, + followList: { + unfollow: 'Deixar de seguir', + title: 'Sua rede Nostr', + desc: 'Gerencie quem você segue. Seguir usuários ajuda a construir sua Web of Trust e determina quais Spots mostram selos de confiança.', + following: 'Seguindo ({{count}})', + followers: 'Seguidores ({{count}})', + follow: 'Seguir', + followHint: '💡 Cole uma chave pública Nostr (npub1...), um endereço NIP-05 (usuario@dominio.com) ou uma chave pública hex', + notFollowing: 'Você ainda não segue ninguém', + notFollowingHint: 'Siga skaters para ver os Spots deles com selos ✅ VERIFICADO', + trustActiveStrong: '✅ Selos de confiança ativos:', + trustActive: 'Spots criados por pessoas que você segue agora mostram selos VERIFICADO. Spots dos amigos delas mostram selos CONFIÁVEL.', + noFollowers: 'Nenhum seguidor ainda', + noFollowersHint: 'Compartilhe seu perfil Nostr para ganhar seguidores!', + howTitle: '💡 Como seguir afeta os selos de confiança', + verifiedStrong: '✅ VERIFICADO (verde):', + verifiedDesc: 'Spots criados por pessoas que você segue diretamente', + trustedStrong: '🟡 CONFIÁVEL (amarelo):', + trustedDesc: 'Spots criados por pessoas que seus amigos seguem (2 saltos)', + unverifiedStrong: '⚪ Não verificado:', + unverifiedDesc: 'Spots de usuários sem conexão com sua rede', + tip: '💡 Dica: siga skaters ativos para ver mais Spots verificados e construir sua rede de confiança!', + }, + notify: { + enableTitle: 'Ativar notificações', + enableDesc: 'Avise este dispositivo quando algo precisar de você.', + checkingPermission: 'Verificando permissão…', + unsupported: 'Este dispositivo não suporta notificações aqui. Recompile o app Android para ativá-las no seu celular.', + denied: 'As notificações estão bloqueadas para este site. Permita nas configurações do navegador/SO e tente de novo.', + backgroundTitle: 'Notificações em segundo plano', + backgroundDesc: 'Receba avisos de mensagens e negociações mesmo com o SkateSpots fechado.', + pushUnsupported: 'Este navegador não suporta push em segundo plano. No celular, adicione o SkateSpots à tela inicial.', + pushPrivacy: 'Para te alcançar com o app fechado, um servidor de notificações do SkateSpots recebe um aviso do seu Relay quando chega algo para sua chave e o repassa ao serviço de push do seu celular. Ele só vê que sua chave tem algo — nunca quem enviou nem o que diz, e não consegue descriptografar suas mensagens. Ative por dispositivo.', + bgDeliveryTitle: 'Entrega em segundo plano (Android)', + bgDeliveryDesc: 'Verifique novas mensagens, ofertas e negociações enquanto o app está fechado — sem serviços do Google.', + off: 'Desativado', + standard: 'Padrão (~15 min)', + fast: 'Rápido (~5 min)', + bgDeliveryNote: 'O modo padrão é o melhor esforço — o Android pode adiá-lo no modo Doze. O rápido mostra uma notificação persistente e usa mais bateria. Nada é descriptografado no nosso servidor.', + notifyMeAbout: 'Me avisar sobre', + couldNotEnable: 'Não foi possível ativar', + sendTest: 'Enviar uma notificação de teste', + testTitle: 'As notificações do SkateSpots estão ativadas 🛹', + testBody: 'É assim que uma MD, um Zap ou um convite de Crew vai aparecer.', + footerBefore: 'Os alertas são gerados no seu dispositivo com dados que o app já tem, e alertas de mensagens diretas nunca descriptografam suas mensagens — então nunca se pede ao Amber para abrir uma. Com', + footerAfter: 'desativado, um app totalmente fechado não pode ser alcançado, então os alertas chegam na próxima vez que você abrir o SkateSpots.', + cat_dms_label: 'Mensagens diretas', + cat_dms_hint: 'Alguém te manda uma mensagem privada', + cat_crew_label: 'Crews', + cat_crew_hint: 'Convites, pedidos de entrada e confirmações de participação', + cat_social_label: 'Zaps, respostas e menções', + cat_social_hint: 'Reações, reposts, Zaps, respostas e atualizações de eventos', + cat_newsletter_label: 'Boletim', + cat_newsletter_hint: 'Novidades do SkateSpots (só assinantes)', + cat_trades_label: 'Ofertas e negociações', + cat_trades_hint: 'Ofertas, contraofertas e confirmações de negociação', + cat_reminders_label: 'Lembretes de eventos', + cat_reminders_hint: 'Um aviso uma hora antes dos eventos que você vai (app Android)', + }, + regionBackfill: { + taggedTitle: '{{count}} ponto{{s}} marcado{{s}}', + taggedSkipped: '{{count}} ignorados (sem coordenadas ou sem correspondência do geocodificador).', + taggedOk: 'Tags de região gravadas no Relay da comunidade.', + nothingTitle: 'Nada para marcar', + nothingDesc: 'Nenhum pin pôde ser geocodificado. Tente mais tarde.', + failedTitle: 'Falha no preenchimento', + title: 'Preencher tags de região', + admin: 'Admin', + descBefore: 'Pins criados antes da geocodificação existir têm coordenadas mas nenhuma tag de cidade/país, então o mapa os desenha enquanto as Estatísticas da comunidade só conseguem dizer “Sem categoria”. Isto rederiva as tags de cada pin e republica', + descStrong: 'seus próprios', + descAfter: 'Spots e Shops sem tag.', + scanning: 'Escaneando seus Spots…', + allTagged: 'Todo Spot e Shop que você possui já tem uma tag de região. 🎉 Qualquer pin “Sem categoria” restante pertence a outros mapeadores — só as chaves deles podem marcá-los.', + countLine: '{{count}} dos seus Spot{{s}}/Shops não têm tag de região. Seu assinador pode pedir para aprovar cada um.', + tagging: 'Marcando {{done}}/{{total}}…', + run: 'Preencher tags de região', + summary: '{{updated}} atualizados · {{skipped}} ignorados · {{failed}} com falha', + }, + adminReview: { + title: 'Fila de revisão', + flagged: '{{count}} Spot{{s}} acionam os sinais de lixo — oculte ou dispense.', + clean: 'Spots que parecem entradas de teste ou pins fora do tema.', + }, + grantPro: { + invalidNpub: 'Digite um npub válido (ou chave pública hex)', + invalidDays: 'Os dias devem ser um número positivo', + grantedTitle: 'Pro concedido ⚡', + grantedDesc: '{{npub}} até {{date}}', + failedTitle: 'Falha ao conceder', + title: 'Conceder Sasquatch Pro', + owner: 'Proprietário', + desc: 'Alternativa manual para um pagamento verificado que o recibo de Zap não pegou. Publica uma concessão assinada pelo proprietário; o usuário não pode falsificá-la.', + targetPlaceholder: 'npub1… (ou hex)', + grant: 'Conceder', + }, + myData: { + reactionTitle: '{{emoji}} reação', + deleting: 'Excluindo...', + requestDeletion: 'Solicitar exclusão', + selectContentTitle: 'Selecione o conteúdo a excluir', + selectContentDesc: 'Selecione os itens específicos cuja exclusão você quer solicitar.', + all: 'Tudo', + spots: 'Spots', + events: 'Eventos', + shops: 'Shops', + listings: 'Anúncios', + collections: 'Coleções', + lab: 'Lab', + posts: 'Publicações', + reactions: 'Reações', + selectAll: 'Selecionar tudo', + selectAllVisible: 'Selecionar tudo visível', + selectedCount: '{{count}} selecionados', + noItemsCategory: 'Nenhum item nesta categoria', + decentralizedStrong: 'Importante:', + decentralizedNote: 'O Nostr é descentralizado. Os Relays devem honrar pedidos de exclusão, mas alguns podem não fazer. Isto não é uma exclusão permanente garantida.', + deleteCount: 'Excluir {{count}} item{{s}}', + noDataTitle: 'Nenhum dado para exportar', + noDataDesc: 'Você ainda não publicou nenhum evento.', + exportedTitle: 'Dados exportados!', + exportedDesc: '{{count}} eventos baixados como JSON.', + deletionRequestedTitle: 'Exclusão solicitada', + deletionRequestedDesc: 'O pedido de exclusão foi publicado nos Relays.', + deletionRequestedMany: 'Solicitada a exclusão de {{count}} itens. Observação: alguns Relays podem não honrar este pedido.', + deletionFailedTitle: 'Falha na exclusão', + deletionFailedDesc: 'Não foi possível publicar o pedido de exclusão. Tente de novo.', + loginRequired: 'Login obrigatório', + loginRequiredDesc: 'Entre para ver e gerenciar seus dados.', + title: 'Meus dados', + desc: 'Seu conteúdo na rede Nostr. Estes dados são seus — exporte quando quiser ou solicite a exclusão.', + coachFilmer: 'Coach/Filmer', + zaps: 'Zaps', + received: 'Recebidos', + exportAll: 'Exportar todos os dados', + recentActivity: 'Atividade recente', + viewAll: 'Ver tudo ({{count}})', + noDataPublished: 'Nenhum dado publicado ainda', + startBy: 'Comece', + addingASpot: 'adicionando um Spot', + aboutYourData: 'Sobre seus dados', + ownDataStrong: 'Seus dados são seus.', + ownData: 'Todo o conteúdo é assinado com suas chaves criptográficas e guardado em Relays Nostr. Nenhuma empresa o controla.', + exportAnytimeStrong: 'Exporte quando quiser', + exportAnytime: '- Baixe todos os seus eventos como JSON', + portableStrong: 'Portátil', + portable: '- Use suas chaves em qualquer app Nostr', + selectiveStrong: 'Exclusão seletiva', + selective: '- Escolha exatamente o que excluir', + caveatStrong: 'Ressalva da descentralização', + caveat: '- Alguns Relays podem reter dados apesar dos pedidos de exclusão', + }, + settingsPage: { + seoTitle: 'Configurações - SkateSpots', + seoDescription: 'Gerencie as configurações da sua conta SkateSpots.', + heading: 'CONFIGURAÇÕES', + subtitle: 'Conta e preferências do app', + editProfile: 'Editar perfil', + profileRefreshed: 'Perfil atualizado!', + found: 'Encontrado: {{name}}', + unnamed: 'sem nome', + profileNotFound: 'Perfil não encontrado', + notFoundOnRelay: 'Não encontrado em nenhum Relay.', + refreshFailed: 'Falha na atualização', + refreshFailedDesc: 'Não foi possível conectar aos Relays.', + loginToEdit: 'Entre para editar seu perfil', + noProfileRelays: 'Não encontramos um perfil nos Relays. Se você já configurou um, tente atualizar.', + checkDisplayName: 'um nome de exibição', + checkPhoto: 'uma foto de perfil', + checkBio: 'uma bio curta', + checkLightning: 'um endereço Lightning para as pessoas te darem Zaps', + checkHandle: 'um nome de usuário @skate-spots.org gratuito', + finishProfile: 'Complete seu perfil', + addItem: 'Adicionar {{item}}', + nip05Title: 'Verificação NIP-05', + nip05Desc: 'Consiga um endereço Nostr verificado (como nome@dominio.com) para gerar confiança. Obrigatório para criar eventos, perfis de coach e Shops.', + freeFromSkateSpots: 'Gratuito pelo SkateSpots', + claimHandleBefore: 'Reivindique um nome de usuário como', + claimHandleAfter: '— sem cadastro, sem custo, sem domínio para manter. Reivindique na aba Perfil e salve.', + claimInProfile: 'Reivindicar no Perfil', + nip05Footer: 'Depois de conseguir seu NIP-05, adicione-o no campo Perfil e salve.', + localRelayOn: 'Relay local ativado', + localRelayOff: 'Relay local desativado', + lookingForCitrine: 'Procurando o Citrine neste dispositivo…', + noLongerUsing: 'Não usa mais o Relay do dispositivo.', + localRelay: 'Relay local', + citrineOff: 'Leituras mais rápidas e backup offline neste dispositivo', + citrineSearching: 'Procurando o Citrine neste dispositivo…', + citrineLive: 'Conectado — lendo e fazendo backup localmente', + citrineWaiting: 'Ativado — inicie o Citrine para conectar', + toggleCitrine: 'Alternar o Relay local Citrine', + citrineDetected: 'Relay Citrine detectado', + citrineLooking: 'Procurando o Citrine…', + citrineNotDetected: 'Citrine não detectado', + recheckCitrine: 'Verificar o Relay Citrine de novo', + checking: 'Verificando', + recheck: 'Verificar de novo', + chipInstantReads: 'Leituras instantâneas', + chipWorksOffline: 'Funciona offline', + chipOnDeviceBackup: 'Backup no dispositivo', + cantReachStrong: 'Não foi possível alcançar o Citrine.', + cantReachBefore: 'Confira se o app gratuito Citrine está instalado e seu Relay está', + started: 'iniciado', + cantReachAfter: ', e toque em Verificar de novo. Ele roda um Relay Nostr privado no seu celular para leituras instantâneas e um backup offline.', + citrineStep1Before: 'Abra o Citrine → toque em', + start: 'Iniciar', + citrineStep2Before: 'Volte aqui → toque em', + getCitrine: 'Baixar o Citrine', + citrinePrivacy: 'Seu Stash e suas mensagens continuam criptografados de ponta a ponta aqui, exatamente como em qualquer outro lugar. O Relay local só acelera as coisas e guarda uma cópia no seu dispositivo — nunca substitui a criptografia.', + communityRelayDisabled: 'Relay da comunidade desativado', + communityRelayEnabled: 'Relay da comunidade ativado', + usingOnlyPersonal: 'Usando só os seus Relays configurados.', + skateRelayIncluded: 'Relay do SkateSpots incluído.', + relays: 'Relays', + relayPrivacyBefore: 'Os Relays podem ver seu', + ipAddress: 'endereço IP', + relayPrivacyAfter: 'quando você se conecta. O Tor o esconde — e trate uma VPN "gratuita" como sinal de alerta; elas costumam monetizar seu tráfego.', + communityRelay: 'Relay da comunidade', + syncingGlobal: 'Sincronizando com a comunidade global de skate', + usingOnlyPersonalShort: 'Usando só Relays pessoais', + appearance: 'Aparência', + language: 'Idioma', + darkModeOnly: 'Somente modo escuro', + darkModeDesc: 'O SkateSpots usa uma estética neon escura inspirada na cultura do skate. Fundo preto, rosa neon, lima e laranja.', + navigation: 'Navegação', + sasquatchExpanded: 'O Sasquatch foi expandido! 🦧 Recarregue a página para vê-lo.', + advanced: 'Avançado', + sasquatchGuide: '🦧 Guia do Sasquatch', + sasquatchResetDesc: 'Redefinir o guia de introdução para a visão expandida', + expandSasquatch: 'Expandir o Sasquatch', + wallet: 'Carteira', + loginToWallet: 'Entre para gerenciar sua carteira', + openWallet: 'Abrir carteira', + balanceSendReceive: 'Saldo, enviar, receber', + connectNwc: 'Conectar carteira NWC', + account: 'Conta', + security: 'Segurança', + securitySub: 'Chaves, assinatura, Amber', + nip05Sub: 'Consiga um endereço Nostr verificado', + app: 'App', + myStash: 'Meu Stash', + myStashSub: 'Inventário privado de Gear', + relaysSub: 'Conexões a Relays Nostr', + appearanceSub: 'Idioma e tema', + assistant: 'Assistente', + showSasquatch: 'Mostrar o assistente Sasquatch', + showSasquatchDesc: 'Mostra o botão flutuante do Sasquatch no mapa e em outras telas.', + showMapFooter: 'Mostrar a barra de links do mapa', + showMapFooterDesc: 'Mostra a faixa fina de links na parte inferior do mapa.', + notifications: 'Notificações', + notificationsSub: 'Alertas de MD, Crews e Zaps', + coordinator: 'Coordenador', + coordinatorSub: 'Seu servidor de grupo Cordn', + data: 'Dados', + myData: 'Meus dados', + myDataSub: 'Exportar, importar, gerenciar', + advancedSub: 'Relatr, Sasquatch, ferramentas', + notLoaded: 'Não carregado', + notLoggedIn: 'Não conectado', + }, + onboarding: { + seoTitle: 'Começar — SkateSpots', + seoDescription: 'Entre na comunidade de skate descentralizada. Encontre Spots, conecte-se com coaches, envie Zaps. Grátis para sempre.', + homeSetTitle: 'Casa definida 🛹', + homeSetDesc: 'O mapa agora abrirá na sua região.', + locationFailedTitle: 'Não foi possível obter sua localização', + locationFailedDesc: 'Verifique as permissões de localização ou escolha sua região no mapa.', + niceTitle: '🎉 Boa!', + niceDesc: 'Agora você entende como o Nostr funciona. Vamos andar!', + npubCopied: 'npub copiado para a área de transferência.', + saveLoginNow: 'Salve seu acesso — faça isso agora', + saveLoginNowDesc: 'Seu código de recuperação é a única forma de voltar à sua conta. Sem e-mail, sem redefinir senha.', + betaBadge: 'Beta — Aberto a skaters do mundo todo', + headline1: 'SKATE', + headline2: 'SEU MUNDO', + heroBefore: 'Uma comunidade de skate', + decentralized: 'descentralizada', + heroAfter: '. Nenhuma empresa é dona dela. Nenhum algoritmo enterra seus Spots. Sem banimento. Só skaters.', + pillMap: 'Mapa de Spots', + pillCoaches: 'Coaches e filmers', + pillEvents: 'Eventos', + pillGear: 'Comprar/vender Gear', + pillZaps: 'Zaps de Bitcoin', + pillStash: 'Stash de Gear', + pillCrews: 'Crews', + createFreeAccount: 'Crie sua conta gratuita', + noEmailNoPassword: 'Sem e-mail. Sem senha. Sua identidade é sua para sempre.', + findSpots: 'Encontre Spots perto de você', + addFirstSpot: 'Adicione seu primeiro Spot', + accountCreated: 'Você entrou! Conta criada ✓', + identityYours: 'Sua identidade é sua — guardada na sua chave, não nos nossos servidores.', + whereSkate: 'Onde você anda?', + whereSkateDesc: 'Defina sua região uma vez e o mapa abrirá nos seus Spots toda vez. Seu GPS nunca sai do seu dispositivo.', + useMyLocation: 'Usar minha localização', + pickOnMap: 'Escolher no mapa', + loginSaved: 'Acesso salvo — sua conta pode ser recuperada com segurança.', + whyBother: 'Por que se dar ao trabalho?', + why1Title: 'Todo Spot, um mapa', + why1Body: 'Meio-fios, corrimãos, DIY, pistas — mapeados por skaters que realmente andam neles. Confira o status antes de sair para não desperdiçar uma sessão em um lugar proibido.', + why2Title: 'Feito por skaters, não por engravatados', + why2Body: 'Sem anúncios, sem algoritmo empurrando lixo na sua cara, sem coleta de dados. Código aberto. O mapa pertence à comunidade — incluindo você.', + why3Title: 'Ganhe para contribuir', + why3Body: 'Mapeie uma joia, filme um truque matador, organize uma sessão — e receba Zaps de Bitcoin de verdade direto na sua carteira. Sem taxa da plataforma, sem intermediário.', + why4Title: 'Sua conta é de verdade sua', + why4Body: 'Uma chave te conecta a todos os apps Nostr. Nenhuma empresa pode te bloquear ou apagar sua conta por capricho. Leve sua identidade para onde quiser.', + everythingFree: 'Tudo o que você pode fazer — grátis', + featSpots: 'Descubra Spots', + featSpotsDesc: 'Mapa interativo com milhares de Spots no mundo todo', + featLab: 'The Lab', + featLabDesc: 'Encontre coaches, filmers e editores de vídeo perto de você', + featEvents: 'Eventos', + featEventsDesc: 'Competições, sessões, encontros', + featGear: 'Comprar / Vender Gear', + featGearDesc: 'Mercado entre pessoas de Gear de skate usado', + featStash: 'Meu Stash', + featStashDesc: 'Inventário privado e criptografado de tudo o que você tem', + featCrews: 'Crews', + featCrewsDesc: 'Ande com sua Crew — Spots compartilhados, chat e sessões', + whatIsNostr: 'O que é Nostr?', + whatIsNostrSub: 'O protocolo que move o SkateSpots', + nostrBefore: 'O Nostr é um protocolo aberto — como o e-mail, mas para apps sociais. Sua conta é um', + cryptoKeyPair: 'par de chaves criptográficas', + nostrAfter: 'que pertence a você. Nenhuma empresa controla sua conta nem seus dados — você escolhe quais Relays os guardam, e pode até rodar o seu. Sua identidade funciona em todos os apps Nostr.', + nostrPoint1: 'Seus dados e chaves são seus', + nostrPoint2: 'Nenhuma empresa pode te banir', + nostrPoint3: 'A identidade funciona em todo lugar', + nostrPoint4: 'Gorjetas diretas em Bitcoin', + deepDive: 'A fundo: como o Nostr funciona', + privacyTip: 'Dica de privacidade: seu GPS nunca sai do seu dispositivo. Os servidores a que você se conecta (como os blocos do mapa) ainda podem ver seu IP — se quiser esconder isso também, uma VPN ou o Tor resolve. Totalmente opcional.', + readPrivacy: 'Leia nossa página de privacidade', + zapsWallet: '⚡ Zaps e carteira', + optional: 'Opcional', + walletDesc: 'Os Zaps são gorjetas em Bitcoin que você envia direto para um skater que descobriu um Spot irado, filmou um clipe matador ou organizou uma sessão ótima. Sem taxa da plataforma. Sem intermediário. 100% vai para ele.', + builtInWallet: 'Carteira Cashu integrada', + builtInWalletDesc: 'Receba pagamentos Lightning direto no app. Sem configuração.', + balance: 'Saldo', + connectExternal: 'Conectar carteira externa', + connectExternalDesc: 'Tem Alby, Mutiny ou outra carteira? Conecte via NWC.', + connectViaNwc: 'Conectar via NWC', + loginToConnect: 'Entre para conectar sua própria carteira.', + fiveDollars: '💡 US$ 5 em Bitcoin = centenas de Zaps para espalhar pela comunidade', + commonQuestions: 'Perguntas frequentes', + faq1Q: 'O SkateSpots é grátis?', + faq1A: '100% grátis. Explorar Spots, adicionar locais, encontrar coaches, criar eventos, entrar em sessões — tudo grátis, para sempre. Bitcoin (Zaps) é opcional se você quiser dar gorjeta aos criadores.', + faq2Q: 'O que é Nostr e por que o SkateSpots usa?', + faq2Before: 'O Nostr é um protocolo aberto para apps descentralizados — pense nele como a própria internet, sem dono. Sua conta SkateSpots é um par de chaves criptográficas que', + faq2Strong: 'pertence a você', + faq2After: '. Nenhuma empresa pode banir sua conta nem segurar seus dados como refém — você escolhe quais Relays guardam seus dados, e pode até rodar o seu. Sua identidade também funciona em outros apps Nostr como Primal, Damus ou Amethyst.', + faq3Q: 'O que é um nsec e por que é importante?', + faq3Before: 'Seu', + faq3Mid: 'é sua chave privada — é a única prova de que a conta é sua. Diferente de senhas, não existe', + faq3Strong: 'nenhum "esqueci minha senha"', + faq3After: '. Se você perder seu nsec, sua conta se vai para sempre. Ao criar uma conta, baixe seu backup imediatamente e guarde em um lugar seguro (gerenciador de senhas, anotado offline).', + faq4Q: 'Quais assinadores / apps funcionam com o SkateSpots?', + faq4Desktop: 'No desktop:', + faq4Extensions: 'extensões de navegador.', + faq4Android: 'No Android:', + faq4AndroidAfter: '(melhor experiência com o app nativo).', + faq4Ios: 'No iOS:', + faq4IosAfter: 'ou cole seu nsec diretamente (menos seguro).', + faq4Note: 'Você também pode entrar colando seu nsec diretamente — mas usar uma extensão assinadora é mais seguro.', + faq5Q: 'Posso usar o SkateSpots no celular?', + faq5Before: 'Sim! O SkateSpots é um PWA (Progressive Web App). Visite', + faq5Mid: 'no navegador do seu celular e toque em', + faq5Em: '"Adicionar à tela inicial"', + faq5After: 'para ter a experiência completa do app. Ou baixe pela', + faq5End: '— uma loja de apps descentralizada.', + faq6Q: 'O que é um Zap?', + faq6A: 'Um Zap é uma gorjeta instantânea em Bitcoin enviada pela Lightning Network. Quando você dá um Zap a um skater, os sats chegam à carteira dele em segundos — sem PayPal, sem Venmo, sem taxa descontada. Quem filmou aquele 4-stair é pago diretamente pelos fãs.', + faq7Q: 'Meus Spots serão apagados se o SkateSpots fechar?', + faq7A: 'Não. Seus Spots são publicados em Relays Nostr — servidores distribuídos que qualquer um pode rodar. Mesmo se o SkateSpots como produto sumisse amanhã, seus dados ainda existiriam nos Relays e qualquer cliente Nostr poderia exibi-los.', + faq8Q: 'Posso adicionar um Spot em propriedade privada?', + faq8A: 'Pode, mas use o bom senso. Spots em propriedade privada devem ser marcados como tal para os skaters saberem a situação. O SkateSpots não se responsabiliza por invasão — respeite sempre os donos e os moradores.', + faq9Q: 'Como reporto um bug ou dou um feedback?', + faq9Before: 'Mande uma MD para a equipe do SkateSpots direto no Nostr, ou fale com nosso coordenador beta:', + faq9Link: 'Feedback beta → cordn.net', + readyToShred: 'PRONTO PARA MANDAR VER?', + stopScrolling: 'Pare de rolar. Baixe o app. Encontre um Spot. Ande nele.', + exploreSpots: 'Explorar Spots', + betaFeedbackTitle: 'Beta — Queremos seu feedback', + betaFeedbackDesc: 'O SkateSpots está em desenvolvimento ativo. Você pode encontrar arestas — a culpa é nossa, não sua. Reporte bugs, sugira recursos, diga o que não presta.', + betaCoordinator: 'Coordenador beta', + betaCoordinatorDesc: 'cordn.net → fale com a gente', + dmOnNostr: 'MD no Nostr', + fixSameDay: 'Encontrou um bug? Consertamos no mesmo dia. Seus relatos melhoram o app para todos os skaters.', + relaySetup: 'Configuração de Relays', + }, + relayEdu: { + understandingNostr: 'Entendendo o Nostr', + stepOf: 'Passo {{current}} de {{total}}', + step1Title: 'Entendendo os Relays', + step1Desc: 'Pense nos Relays como Shops de skate que compartilham notícias sobre Spots', + you: 'Você', + relays: 'Relays', + skaters: 'Skaters', + s1Good1: 'Nenhuma empresa é dona da sua conta', + s1Good1Desc: 'Sua identidade vive em vários servidores Relay', + s1Good2: 'Você controla onde seus dados ficam', + s1Good2Desc: 'Suas publicações sincronizam nos Relays que você escolher — escolha os seus ou rode um você mesmo', + s1Warn: 'Operadores de Relay podem ver publicações públicas', + s1WarnDesc: 'Pense nisso como postar em um mural de avisos', + step2Title: 'Público vs privado', + step2Desc: 'Saiba o que é visível e o que é criptografado', + publicTitle: 'Público (qualquer um pode ver)', + pub1: 'Spots que você adiciona ao mapa', + pub2: 'Avaliações e comentários', + pub3: 'As informações do seu perfil (nome, foto)', + pub4: 'Quem você segue', + privateTitle: 'Privado (criptografado)', + priv1: 'Mensagens diretas', + priv2: 'Comunicações da carteira', + noteStrong: 'Observação:', + note: 'As publicações podem ser guardadas permanentemente nos Relays. Pense antes de postar — como na vida real!', + step3Title: 'Suas chaves = sua conta', + step3Desc: 'Esta é a coisa mais importante a entender', + secretKeyTitle: 'Sua chave secreta (nsec)', + secretKeyDesc: 'Pense nela como no seu shape — nunca empreste para ninguém. Ela prova que a conta é sua.', + s3Bad1: 'Se perdida, sua conta não pode ser recuperada', + s3Bad2: 'Sem "esqueci a senha" — ninguém pode redefini-la', + s3Good: 'Faça backup e guarde em segurança', + publicKeyTitle: 'Sua chave pública (npub)', + publicKeyDesc: 'É como seu nome de usuário — compartilhe à vontade para os outros te encontrarem!', + inControl: '🔐 Você está no controle — nenhuma empresa pode te bloquear!', + skip: 'Pular', + gotIt: 'Entendi!', + }, + about: { + seoTitle: 'Sobre - SkateSpots', + seoDescription: 'Saiba mais sobre o SkateSpots e nossa missão de construir uma comunidade de skate descentralizada.', + npubCopied: 'npub copiado para a área de transferência. Cole no seu cliente Nostr favorito para enviar uma MD.', + bugReport: '🐛 Relatar bug', + bugWhatHappened: 'O que aconteceu:', + bugExpected: 'O que eu esperava:', + bugSteps: 'Passos para reproduzir:', + aboutWord: 'SOBRE', + heroBefore: 'Conecte-se com cenas de skate locais do mundo todo.', + skaterOwned: 'Dados dos próprios skaters', + heroAfter: ', Relays geridos pela comunidade.', + viewStats: 'Ver estatísticas da comunidade', + missionTitle: 'Nossa missão', + mission1: 'O SkateSpots ajuda skatistas a descobrir Spots, conectar-se com profissionais no The Lab e organizar sessões — tudo sem controle corporativo. O skate de verdade acontece offline; esta ferramenta só te conecta a ele.', + mission2: 'O conhecimento do skate deve viver com a comunidade, não trancado em apps corporativos. Por isso o SkateSpots roda sobre Nostr — um sistema baseado em Relays onde os skaters controlam seus próprios dados, escolhem quais Relays os guardam e podem até rodar o seu. Nenhuma empresa é dona do mapa.', + whyNostr: 'Por que Nostr?', + why1Title: 'Controlado pela comunidade', + why1Desc: 'Seus Spots vivem em Relays da comunidade. Os skaters rodam os servidores, não as corporações.', + why2Title: 'Seus dados são seus', + why2Desc: 'Sua identidade Nostr é sua. Leve-a para qualquer app Nostr — sem aprisionamento.', + why3Title: 'Integração com Bitcoin', + why3Desc: 'Dê Zaps aos criadores diretamente com Bitcoin. Sem plataforma levando 30%.', + why4Title: 'Código aberto', + why4Desc: 'Construído à vista de todos. Qualquer um pode contribuir ou fazer fork do código.', + getInvolved: 'Participe', + getInvolvedDesc: 'O SkateSpots é código aberto e movido pela comunidade. Contribua com código, compartilhe Spots ou ajude outros a começar.', + betaTitle: 'Testes beta', + betaDesc: 'Caro usuário! Obrigado por testar o SkateSpots na beta. Lembre-se de que o app ainda está em beta e pode ter bugs ou problemas de segurança. Se você encontrar algum problema ou quiser relatar um bug, fale com a gente!', + giveFeedback: 'Nos dê seu feedback:', + copyNpub: 'Copiar npub', + reportBug: 'Relatar bug', + viewProfile: 'Ver perfil', + downloadApp: 'Baixe o app', + downloadAppDesc: 'Instale o SkateSpots no Android via Zapstore — a loja de apps de código aberto e nativa de Bitcoin.', + getOnZapstore: 'Pegue na Zapstore', + credits: 'Créditos', + creditPoweredBy: 'Feito com', + creditNostr: 'Protocolo descentralizado', + creditCrewChat: 'Chat de Crew via', + creditCordn: 'Chat em grupo criptografado de ponta a ponta', + creditEcash: 'Ecash via', + creditCashu: 'Ecash chaumiano para Lightning', + creditWalletConnect: 'Conexão de carteira via', + creditNwc: 'Nostr Wallet Connect (NIP-47)', + creditSigning: 'Assinatura no Android com', + creditAmber: 'Assinador Nostr para Android', + creditMapData: 'Dados de mapa de Bitcoin de', + creditBtcmap: 'Lugares que aceitam Bitcoin', + creditCrowdfunding: 'Financiamento coletivo', + creditAngor: 'Financiamento coletivo descentralizado em Bitcoin', + creditDistributed: 'Distribuído em', + creditZapstore: 'Loja de apps de código aberto', + creditTrust: 'Confiança e chat de Crew via', + creditContextvm: 'Pontuações de confiança do Relatr e coordenação de chat de Crew criptografado', + stillQuestions: 'Ainda tem perguntas?', + stillQuestionsDesc: 'O Sasquatch é nosso guia de IA — com dados do SkateSpots ao vivo. Pergunte a ele sobre Spots, eventos, coaches, Gear ou como qualquer coisa funciona.', + askSasquatch: 'Pergunte ao Sasquatch', + poweredBy: 'Feito com', + decentralized: 'Descentralizado', + communityOwned: 'Propriedade da comunidade', + }, + faq: { + seoTitle: 'FAQ - SkateSpots', + seoDescription: 'Pergunte o que quiser ao Sasquatch sobre o SkateSpots.', + greeting: 'Olá! Sou o Sasquatch 🦧 — pergunte o que quiser sobre o SkateSpots. Spots, eventos, Gear, carteiras, privacidade, Nostr — pode perguntar. O que você quer saber?', + gotQuestions: 'Tem perguntas?', + heroDesc: 'Pergunte ao Sasquatch — ele sabe tudo sobre o SkateSpots, Nostr, Bitcoin e skate.', + askTitle: 'Pergunte ao Sasquatch', + askDesc: 'O Sasquatch está aberto no canto inferior esquerdo da sua tela — clique e digite sua pergunta. Ele tem acesso ao vivo a Spots, eventos, coaches e clima.', + askQuestion: 'No que você pode me ajudar no SkateSpots?', + openSasquatch: 'Abrir o Sasquatch', + commonQuestions: 'Perguntas frequentes — toque para perguntar', + quickAnswers: 'Respostas rápidas', + footerHint: 'O Sasquatch usa dados Nostr ao vivo do Relay do SkateSpots + IA para responder suas perguntas. 🛹', + chip1Label: 'O que é o SkateSpots?', + chip1Q: 'O que é o SkateSpots e como funciona?', + chip2Label: 'Como adiciono um Spot?', + chip2Q: 'Como adiciono um Spot de skate ao mapa?', + chip3Label: 'O que são Zaps?', + chip3Q: 'O que são Zaps?', + chip4Label: 'É grátis?', + chip4Q: 'O SkateSpots é grátis?', + chip5Label: 'O que é o Meu Stash?', + chip5Q: 'O que é o Meu Stash?', + chip6Label: 'Como faço login?', + chip6Q: 'Como faço login ou crio uma conta?', + chip7Label: 'O que é Nostr?', + chip7Q: 'O que é Nostr?', + chip8Label: 'Privacidade e dados', + chip8Q: 'Quais dados são públicos e quais são privados no SkateSpots?', + chip9Label: 'Como vender Gear?', + chip9Q: 'Como vendo Gear no SkateSpots?', + chip10Label: 'O que é o The Lab?', + chip10Q: 'O que é o The Lab?', + fact1Label: 'Spots de skate no mundo todo', + fact1Value: 'Descubra e adicione', + fact2Label: 'Zaps de Lightning em Bitcoin', + fact2Value: '100% grátis', + fact3Label: 'Descentralizado no Nostr', + fact3Value: 'Seus dados são seus', + fact4Label: 'Inventário privado de Gear', + fact4Value: 'Stash criptografado', + s1Q: 'O que é o SkateSpots?', + s1A: 'Um mapa e uma comunidade descentralizados para o skate, construídos sobre Nostr. Descubra Spots, encontre coaches e filmers, entre em Crews, publique eventos e compre/venda Gear — sem nenhuma empresa no meio.', + s2Q: 'Como adiciono um Spot?', + s2A: 'Toque no mapa ou use o botão + / "Adicionar Spot", coloque um pin e preencha os detalhes. Você precisa de uma conta Nostr gratuita (toque em Entrar → Criar conta — sem e-mail).', + s3Q: 'O que são Zaps?', + s3A: 'Os Zaps são gorjetas em Lightning de Bitcoin. Você pode dar Zaps em Spots, eventos, Crews e pessoas que você curte. Vão direto ao destinatário pela Lightning — o SkateSpots nunca retém seus fundos.', + s4Q: 'É grátis?', + s4A: 'Sim. Criar uma conta, adicionar Spots e navegar são gratuitos. Extras pagos opcionais (como anúncios em destaque) e gorjetas (Zaps) são pagos diretamente entre as pessoas.', + s5Q: 'Quais dados são públicos?', + s5A: 'Tudo o que você publica — Spots, eventos, seu perfil — é público nos Relays Nostr. Suas mensagens privadas e seu Stash são criptografados de ponta a ponta. Veja a página de Privacidade para detalhes.', + s6Q: 'O que é o The Lab?', + s6A: 'O The Lab é onde você encontra pessoas para contratar ou aprender: coaches, treinadores, filmers, editores de vídeo, fotógrafos, construtores, artistas e mais.', + }, + privacy: { + seoTitle: 'Privacidade — SkateSpots', + seoDescription: 'Como o SkateSpots trata seus dados: seu GPS fica no seu dispositivo, os Spots que você publica são públicos e como esconder seu IP com uma VPN ou o Tor se quiser.', + heroBefore: 'Sua', + heroHighlight: 'Privacidade', + heroDesc: 'Sem rastreamento, sem anúncios, sem venda de dados. Aqui está exatamente o que fica no seu dispositivo, o que é público e como proteger ainda mais se quiser.', + locationTitle: 'Sua localização fica no seu dispositivo', + locationBefore: 'Quando você toca em', + nearMe: '"Perto de mim",', + locationAfter: 'sua localização GPS é lida no seu dispositivo e usada só para centralizar o mapa e ordenar os Spots próximos.', + locationGood1: 'Nunca é publicada no Nostr.', + locationGood2: 'Nunca é enviada ao SkateSpots — não há nenhum servidor do SkateSpots coletando-a.', + locationGood3: 'Nunca é compartilhada com terceiros.', + locationGood4: 'No app nativo usamos diretamente o sistema de localização do seu celular e pulamos o Google Play Services — então funciona em celulares sem Google (GrapheneOS, /e/OS) e o Google nunca a vê.', + weatherBefore: 'O clima fica desativado por padrão. Quando você o ativa, ele consulta as condições da localização pública do', + weatherEm: 'Spot', + weatherAfter: ', não da sua.', + publicTitle: 'O que é público por design', + publicDesc: 'O SkateSpots é um mapa compartilhado, então algumas coisas são feitas para todos verem. Quando você escolhe publicá-las, elas são públicas na rede Nostr:', + public1Strong: 'Os Spots que você adiciona', + public1: '— incluindo suas coordenadas. Se você adicionar um Spot na sua localização exata, essa localização se torna pública. Pense antes de colocar um pin na sua própria garagem.', + public2Strong: 'Avaliações, comentários e seu perfil público', + public2: '(nome, foto).', + public3: 'Quem você segue, e reações públicas.', + public4Strong: 'Os Zaps', + public4: 'são públicos por padrão: um Zap vincula sua conta — muitas vezes seu endereço Lightning — à publicação que você pagou e à própria gorjeta. Sua carteira pode enviá-lo anonimamente se você preferir.', + publicNoteBefore: 'Uma VPN ou o Tor', + notWord: 'não', + publicNoteAfter: 'esconde o conteúdo do que você publica — as coordenadas de um Spot são públicas de qualquer forma. Ferramentas de privacidade escondem sua identidade de rede (seu IP), não as coisas que você escolhe postar.', + encryptedTitle: 'O que é privado e criptografado', + enc1Strong: 'As mensagens diretas', + enc1Mid: 'e', + enc1Strong2: 'os chats de Crew', + enc1: 'são criptografados de ponta a ponta (NIP-17). Só os participantes podem lê-los.', + enc2Strong: 'Meu Stash', + enc2: '— seu inventário privado de Gear — é criptografado com sua própria chave.', + enc3Strong: 'Membros só de Crew', + enc3: 'podem escolher ser visíveis apenas para os colegas de Crew.', + ipTitle: 'O que sai do seu dispositivo: seu IP', + ipBefore: 'Como em todo site, os servidores com que o SkateSpots fala podem ver seu', + ipAddress: 'endereço IP', + ipAfter: '(um indicador aproximado da sua região). Isso é normal em qualquer app web ou de mapas e não é exclusivo nosso. Esses servidores são:', + ipTileStrong: 'Blocos do mapa', + ipTile: '(OpenStreetMap) — veem seu IP e que área do mapa você observa.', + ipGeoStrong: 'Geocodificação de Spot/Shop', + ipGeo: '— quando você cria ou edita um Spot ou Shop, suas coordenadas vão ao Nominatim do OpenStreetMap para preencher a tag de cidade/país. Quando você abre as Estatísticas da comunidade, as coordenadas dos pins sem tag de local vão ao BigDataCloud para serem agrupadas por região (em cache no seu dispositivo — no máximo uma vez por pin). Ambos veem seu IP. São as coordenadas do pin que você colocou / pins públicos, nunca o GPS ao vivo do seu dispositivo.', + ipPushStrong: 'Notificações em segundo plano', + ipPush: '(opcional) — se você as ativar, um servidor de push do SkateSpots vê que sua chave recebeu algo e quando (nunca quem enviou nem o que diz — as mensagens continuam criptografadas), e o serviço de push do seu SO (Google/Mozilla/Apple) entrega o alerta.', + ipBtcStrong: 'Lugares de Bitcoin', + ipBtc: '(BTCMap, quando você ativa essa camada) — veem seu IP e a área que você está vendo.', + ipRelayStrong: 'Relays Nostr', + ipRelay: '— veem seu IP quando o app lê ou publica.', + ipMintStrong: 'Mints da Cashu', + ipMint: '— veem seu IP sempre que sua carteira envia, recebe ou funde.', + ipRouteStrong: 'Rotas', + ipRoute: '(OSRM e Transitous para transporte público) — recebem o início e o fim de qualquer rota que você pedir, não só seu IP. O roteamento fica no app: sua origem e destino nunca são entregues ao Google ou Apple Maps.', + ipWeatherStrong: 'Clima', + ipWeatherMid: '(Open-Meteo, opcional) e', + ipUploadStrong: 'envio de imagens', + ipWeather: '(Blossom), quando você os usa.', + ipAiStrong: 'IA do Sasquatch', + ipAi: '— sua mensagem vai ao nosso próprio servidor e depois ao provedor do modelo.', + ipLink1: 'Como você envia sua chave pública (npub) na mesma conexão, um Relay pode vincular seu IP a você — não apenas "alguém se conectou", mas "esta pessoa, deste endereço".', + ipShieldBefore: 'Uma coisa que protegemos: o', + ipMintsStrong: 'diretório de mints', + ipShieldAfter: 'é buscado pelo nosso servidor, então o MintRadar nunca vê seu IP.', + vpnTitle: 'Quer mais privacidade? VPN ou Tor (opcional)', + vpnDesc: 'Para a maioria dos skaters isso não é necessário — mas se você quiser esconder seu IP e localização aproximada dos servidores acima, tem duas opções gratuitas:', + vpnReputable: '🛡️ Uma VPN confiável', + vpnReputableDesc: 'Esconde seu IP atrás dos servidores da VPN. Fácil e rápido. Use uma que você pague e confie; VPNs gratuitas costumam monetizar seu tráfego, então trate "grátis" como sinal de alerta.', + torBrowser: '🧅 Navegador Tor', + torDesc: 'Grátis, privacidade máxima de IP, roteia por vários Relays. Mais lento — mapas e alguns Relays Nostr podem ficar lentos ou bloquear nós de saída do Tor. Ótimo para os mais cautelosos.', + readThis: 'Leia isto para não cair em papo furado', + caveat1Before: 'Uma VPN/Tor esconde seu', + ipWord: 'IP', + caveat1: '— não os Spots que você publica. Um pin na sua casa é público, use ou não uma VPN.', + caveat2Before: 'Não ative', + nearMeGps: '"Perto de mim" / GPS do navegador', + caveat2: 'se seu objetivo é ficar anônimo — um GPS preciso anula qualquer ocultação de IP.', + caveat3: 'Nenhuma ferramenta te deixa totalmente "anônimo". Elas reduzem o que os servidores podem inferir sobre sua localização de rede — só isso.', + keysTitle: 'Suas chaves, sua conta', + keysBefore: 'Sua conta é um par de chaves criptográficas que pertence a você. A forma mais segura de entrar é um', + signer: 'assinador', + keysAfter: '(Alby, nos2x ou Amber no Android) para sua chave secreta nunca ser colada no app.', + keysCaveatBefore: 'Se você colar seu', + keysCaveatAfter: 'diretamente, ele fica guardado no seu navegador. Use uma extensão assinadora quando puder, e guarde seu backup do nsec em um lugar seguro offline.', + footerBefore: 'Perguntas? Pergunte ao', + sasquatchName: 'Sasquatch', + footerMid: 'no app, ou leia o', + gettingStarted: 'guia de primeiros passos', + about: 'Sobre', + }, + license: { + seoTitle: 'Licença - SkateSpots', + seoDescription: 'Licença do SkateSpots. Você é livre para andar de skate.', + tagline: 'Ande, ganhe, divirta-se e gaste sats onde quer que você esteja.', + copyright: 'Colaboradores do SkateSpots e a comunidade', + licenseLabel: 'Licença', + freeLine1: 'VOCÊ É LIVRE', + freeLine2: 'PARA ANDAR DE SKATE', + body: 'Este projeto é aberto. Compartilhe, faça fork, construa em cima, ande. As ruas pertencem a todos. Este código também. Continue andando, divirta-se, aprenda truques, apoie os construtores e ande de novo.', + builtBefore: 'Feito com ❤️ em', + builtMid: '· Movido por', + lightning: 'Bitcoin Lightning ⚡', + viewSource: 'Ver código-fonte', + aboutSkateSpots: 'Sobre o SkateSpots', + supporters: 'Apoiadores', + }, + glossary: { + seoTitle: 'Glossário de truques · SkateSpots', + seoDescription: 'O glossário completo do skate — {{count}} entradas cobrindo flips, grinds, slides, grabs, aéreos, truques de lip, handplants, freestyle, termos de transição, base e equipamento, com nomes alternativos.', + heading: 'GLOSSÁRIO DE TRUQUES', + subheading: '{{count}} entradas · truques, transição, freestyle, base e equipamento', + searchPlaceholder: 'Busque truques ou apelidos — tre flip, crooks, method…', + clearSearch: 'Limpar busca', + all: 'Todos', + results: '{{count}} resultado{{s}} para', + noMatch: 'Nenhum truque corresponde. Tente um apelido como “tre flip”, “crooks” ou “melon”.', + tricksCount: '{{count}} truques', + footerBefore: 'Conhece algum truque ou apelido que faltou? Os truques ganham nomes diferentes em cada cena — chame', + sasquatch: 'o Sasquatch 🦧', + footerAfter: 'e avise a gente.', + }, + signers: { + seoTitle: 'Apps assinadores - Proteja suas chaves Nostr | SkateSpots', + seoDescription: 'Conheça os apps assinadores que mantêm suas chaves Nostr seguras. Encontre a melhor opção para Android, iOS ou navegadores de desktop.', + securityGuide: 'Guia de segurança', + protect: 'Proteja suas', + nostrKeys: 'chaves Nostr', + heroDesc: 'Os apps assinadores mantêm suas chaves privadas seguras assinando eventos sem expô-las. Em vez de colar sua chave em cada app, deixe um assinador cuidar disso com segurança.', + whySignerStrong: 'Por que usar um assinador?', + whySigner: 'Sua chave privada Nostr é como uma senha que nunca pode ser trocada. Um app assinador a mantém segura e deixa você usar qualquer app Nostr.', + androidTitle: 'Assinadores para Android', + androidDesc: 'Apps assinadores nativos para dispositivos Android, incluindo GrapheneOS.', + iosTitle: 'Assinadores para iOS', + iosDesc: 'Opções de assinador para usuários de iPhone e iPad.', + browserTitle: 'Extensões de navegador', + browserDesc: 'Extensões de navegador de desktop para assinar em apps web.', + recommended: 'Recomendado', + yourPlatform: 'Sua plataforma', + get: 'Obter {{name}}', + protocolsTitle: 'Entendendo os protocolos', + nip07Desc: 'Padrão de extensão de navegador. A extensão injeta recursos de assinatura nos apps web. Usado por Alby, nos2x, Flamingo e extensões similares.', + nip46Desc: 'Protocolo de assinatura remota ("bunker"). Seu app assinador aprova pedidos de outros apps sem compartilhar suas chaves. Usado por Nsec.app, Nostria e Nowser.', + nip55Desc: 'Protocolo de assinador específico do Android. Apps nativos podem pedir assinaturas ao Amber sem expor as chaves. A experiência Android mais fluida.', + whichChoose: 'Qual escolher?', + chooseAndroid: 'Android:', + chooseAndroidDesc: 'Amber (NIP-55) para apps nativos', + chooseIos: 'iOS:', + chooseIosDesc: 'Nsec.app (NIP-46) para melhor compatibilidade', + chooseDesktop: 'Desktop:', + chooseDesktopDesc: 'Alby, nos2x ou Flamingo (NIP-07)', + amberDesc: 'Assinador nativo do Android focado em segurança e facilidade de uso. A melhor escolha para usuários de Android.', + nsecAppDesc: 'Assinador remoto multiplataforma que funciona como um cofre seguro para suas chaves.', + nostriaDesc: 'App assinador remoto com chaves guardadas no armazenamento seguro do dispositivo.', + nowserDesc: 'Assinador multi-autenticação compatível com extensão de navegador e protocolos de assinatura remota.', + nsecAppIosDesc: 'A melhor opção para iOS. Use como assinador remoto com qualquer cliente Nostr.', + nowserTfDesc: 'Assinador para iOS disponível via TestFlight com recursos de assinatura parecidos com o Android.', + nostriaIosDesc: 'Assinador remoto com armazenamento seguro de chaves no seu dispositivo.', + nos2xDesc: 'Extensão de navegador simples e confiável para assinar eventos Nostr.', + albyDesc: 'Carteira Bitcoin Lightning com gerenciamento de chaves Nostr e WebLN integrados.', + flamingoDesc: 'Extensão de navegador focada em Nostr com interface limpa.', + kiwiDesc: 'No Android/GrapheneOS, use o Kiwi Browser para carregar as extensões nos2x ou Alby.', + fNativeApp: 'App nativo', + fMultiKey: 'Suporte a várias chaves', + fEventSigning: 'Assinatura de eventos', + fSecureStorage: 'Armazenamento seguro de chaves', + fRemoteSigning: 'Assinatura remota', + fAnyClient: 'Funciona com qualquer cliente', + fCrossDevice: 'Sincronização entre dispositivos', + fMultiKeySupport: 'Suporte a múltiplas chaves', + fNip07: 'Suporte a NIP-07', + fNip46: 'Suporte a NIP-46', + fFlexibleSigning: 'Assinatura flexível', + fNativeIos: 'App nativo para iOS', + fLightweight: 'Leve', + fEasyToUse: 'Fácil de usar', + fChromeSupport: 'Compatível com Chrome/Brave/Edge', + fLightningPayments: 'Pagamentos Lightning', + fNostrSigning: 'Assinatura Nostr', + fWebln: 'Suporte a WebLN', + fNwc: 'Suporte a NWC', + fCleanUi: 'Interface limpa', + fPrivacyFocused: 'Focado em privacidade', + fExtensionMobile: 'Suporte a extensões no celular', + fFullBrowser: 'Experiência completa de navegador', + fGraphene: 'Funciona no GrapheneOS', + }, + betaDisclaimer: { + title: 'Atenção — isto é beta', + subtitle: 'Uma palavra rápida antes de você começar.', + ossTitle: 'Código aberto e experimental', + ossBody: 'Construído em aberto pela comunidade. Explore, faça fork, quebre.', + betaTitle: 'Em beta — sem auditoria', + betaBody: 'O código ainda não passou por uma auditoria de segurança formal. Bugs acontecem.', + moneyTitle: 'Lida com Bitcoin e Lightning de verdade', + moneyBody: 'Use dinheiro nele por sua conta e risco. Carregue só o que você pode perder.', + finePrint: 'Sem garantia de qualquer tipo. Você é o único responsável pelos seus próprios fundos e chaves.', + viewCode: 'Ver o código', + accept: 'Entendi, deixa eu entrar', + }, + }, +}; export default ptBatch3; diff --git a/src/i18n/pt/batch4.ts b/src/i18n/pt/batch4.ts index 8b930ec..6625576 100644 --- a/src/i18n/pt/batch4.ts +++ b/src/i18n/pt/batch4.ts @@ -1,4 +1,1269 @@ -/** pt — batch 4. Filled by the translation pass; empty until then. */ -const ptBatch4 = {}; +/** pt — batch 4. Brazilian Portuguese translation of the `walletUi` namespace. */ +const ptBatch4 = { + walletUi: { + page: { + title: 'Carteira', + subtitle: 'Bitcoin Lightning + Cashu', + manage: 'Gerenciar', + getAWallet: 'Obtenha uma carteira', + learnPlanB: 'Saiba mais na Plan B Academy', + walletMinibits: 'Cashu móvel · NWC', + walletAlby: 'Extensão de navegador · WebLN + NWC', + walletZeus: 'Lightning autocustodial', + walletCoinos: 'Baseada na web · funciona em todo lugar', + whatAreZaps: 'O que são Zaps?', + whatAreZapsShort: 'O que são zaps?', + zapsDesc: + 'Pagamentos instantâneos pela Lightning do Bitcoin. Envie sats para qualquer skatista, criador de pico ou coach — sem intermediário, sem taxa da plataforma.', + instant: 'Instantâneo', + instantDesc: 'Liquida em segundos', + flexible: 'Flexível', + flexibleDesc: 'Sua carteira, suas chaves', + private: 'Privado', + privateDesc: 'O Cashu oculta quem paga', + direct: 'Direto', + directDesc: 'O valor vai para o criador', + loginRequired: 'Login necessário', + loginRequiredDesc: + 'Faça login com sua conta Nostr para conectar sua carteira Lightning e começar a zapear.', + browseMints: 'Explorar mints Cashu', + }, + modal: { + walletName: 'Nome da carteira (opcional)', + walletNamePlaceholder: 'Minha carteira Lightning', + connectionUri: 'URI de conexão', + spendLimitTitle: 'Defina um limite de gastos primeiro', + spendLimitBody1: + 'Esta string permite que o SkateSpots pague faturas Lightning da sua carteira. No app da sua carteira, dê a esta conexão um pequeno', + dailyBudget: 'orçamento diário', + spendLimitBody2: '(por exemplo, alguns milhares de sats) e habilite apenas', + spendLimitBody3: + 'Nunca cole uma conexão com orçamento ilimitado. Você pode revogá-la na sua carteira a qualquer momento.', + addWallet: 'Adicionar carteira', + nwcConnection: 'Conexão NWC', + lightningWallet: 'Carteira Lightning', + pasteNwc: 'Cole sua string de conexão NWC para enviar zaps', + connectWallet: 'Conectar carteira', + browserExtension: 'Extensão de navegador (WebLN)', + autoDetected: 'Detectada automaticamente se instalada', + ready: 'Pronto', + notFound: 'Não encontrada', + getNwcFrom: 'Obtenha NWC em:', + connectionRequired: 'URI de conexão obrigatória', + connectionRequiredDesc: 'Informe uma URI de conexão NWC válida.', + activeChanged: 'Carteira ativa alterada', + activeChangedDesc: 'A carteira selecionada agora está ativa para zaps.', + connectNwc: 'Conectar carteira NWC', + connectNwcDesc: 'Insira sua string de conexão de uma carteira compatível.', + connect: 'Conectar', + connecting: 'Conectando...', + walletSettings: 'Configurações da carteira', + connectDesc: 'Conecte sua carteira Lightning para enviar zaps na hora.', + }, + cashu: { + title: 'Carteira Cashu', + desc: 'Carteira ecash integrada — sem configuração externa', + initializing: 'Inicializando carteira...', + walletError: 'Erro na carteira', + balance: 'Saldo', + balanceAria: 'Saldo da carteira {{amount}} sats', + activeMint: 'Mint ativo', + selectMint: 'Selecione um mint', + receive: 'Receber', + send: 'Enviar', + receiveViaLightning: '⚡ Receber via Lightning', + amountSats: 'Valor em sats', + generateInvoice: 'Gerar fatura', + generating: 'Gerando…', + or: 'Ou', + receiveCashu: '🥜 Receber token Cashu', + scanQr: 'Escanear QR', + pasteCashu: 'Cole o token Cashu (cashu...)', + receiveToken: 'Receber token', + receiving: 'Recebendo…', + createCashu: '🥜 Criar token Cashu', + createToken: 'Criar token', + creating: 'Criando…', + payInvoice: '⚡ Pagar fatura Lightning', + pasteInvoice: 'Cole a fatura Lightning (lnbc...)', + payInvoiceBtn: 'Pagar fatura', + processing: 'Processando...', + payAddress: '📧 Pagar Lightning Address', + sendToAddress: 'Enviar para endereço', + sending: 'Enviando…', + recentActivity: 'Atividade recente', + receivedLightning: 'Recebido ⚡ Lightning', + sentLightning: 'Enviado ⚡ Lightning', + sentToken: 'Token 🥜 enviado', + receivedToken: 'Token 🥜 recebido', + whatIsCashu: 'O que é Cashu?', + whatIsCashuDesc: + 'Cashu é dinheiro digital lastreado em Bitcoin Lightning. Pense nele como tokens de Bitcoin que você guarda no navegador.', + benefitOffline: 'Funciona offline nos picos', + benefitInstant: 'Pagamentos instantâneos entre pessoas', + benefitPrivacy: 'Focado em privacidade (mints não podem te rastrear)', + benefitRedeemable: 'Sempre resgatável por sats na Lightning', + findMints: 'Encontre mints em mintradar.pedani.eu', + backupTitle: 'Faça backup da sua carteira', + backupDesc: + 'Sua carteira é protegida por uma frase de recuperação de 12 palavras. Guarde-a em segurança — você precisará dela para restaurar seu saldo se limpar os dados do navegador.', + viewRecovery: 'Ver frase de recuperação', + backupNote: + 'Isso é como sua nsec do Nostr — mantenha em segredo e faça backup!', + tokenReceived: 'Token recebido', + tokenReceivedDesc: 'Token Cashu resgatado com sucesso!', + receiveFailed: 'Falha ao receber', + unknownError: 'Erro desconhecido', + requestUnsupported: 'Solicitação Cashu ainda não suportada', + requestUnsupportedDesc: + 'Esta carteira ainda não consegue pagar uma solicitação Cashu (creq) — peça uma fatura ou um endereço Lightning.', + onchainUnsupported: 'On-chain não suportado aqui', + onchainUnsupportedDesc: + 'Esse é um endereço Bitcoin. Esta carteira só envia tokens Cashu e pagamentos Lightning.', + nostrProfile: 'Esse é um perfil Nostr', + nostrProfileDesc: + 'Escaneie um token Cashu, uma fatura Lightning ou um endereço Lightning para pagar.', + clinkUnsupported: 'Código de pagamento ainda não suportado', + clinkUnsupportedDesc: + 'Esta carteira ainda não consegue pagar códigos CLINK. Use uma fatura ou um endereço Lightning.', + unrecognizedQr: 'Código QR não reconhecido', + unrecognizedQrDesc: + 'Escaneie um token Cashu, uma fatura Lightning ou um endereço Lightning.', + invalidAmount: 'Valor inválido', + invalidAmountDesc: 'Informe um valor válido', + paymentSent: 'Pagamento enviado', + paymentSentDesc: 'Enviados {{amount}} sats para {{address}}', + paymentFailed: 'Falha no pagamento', + copied: 'Copiado', + copiedDesc: '{{label}} copiado para a área de transferência', + receiveSats: 'Receber {{amount}} sats', + payInvoiceHint: 'Pague esta fatura em qualquer carteira Lightning', + invoiceQrAlt: 'Código QR da fatura', + lightningInvoice: 'Fatura Lightning', + invoiceLabel: 'Fatura', + waiting: '⏳ Aguardando pagamento...', + tokenReady: 'Token pronto para enviar', + shareToken: 'Compartilhe este token com o destinatário', + tokenQrAlt: 'Código QR do token', + cashuToken: 'Token Cashu', + tokenLabel: 'Token', + copyToken: 'Copiar token', + tokenWarning: + 'Qualquer pessoa com este token pode resgatá-lo — trate-o como dinheiro!', + browser: { + title: 'Carteira ecash integrada', + appOnly: 'Somente no app', + desc: 'Ecash Cashu autocustodial, movido por Bitcoin Lightning', + unlockTitle: 'Desbloqueie a carteira completa no app SkateSpots', + unlockDesc: + 'A carteira ecash integrada permite cunhar, enviar e resgatar tokens Cashu direto no pico. Ela vive no app nativo, onde pode falar com os mints diretamente — os navegadores isolam essas conexões por segurança.', + zapTipTitle: 'Zap e gorjeta — já funciona no seu navegador', + zapTipDesc: + 'Enviar sats para picos, eventos, coaches e crews funciona aqui mesmo. Basta conectar uma carteira Lightning abaixo — Nostr Wallet Connect ou uma extensão de navegador como a Alby. Nenhum mint Cashu é necessário.', + }, + }, + escrow: { + title: 'Custódia', + desc: 'Venda com segurança: ative a custódia e o comprador pode travar os sats dele com você para uma troca. Você libera os sats quando entrega — se não entregar, o comprador pode recuperá-los após o prazo combinado.', + active: 'Custódia ativada', + publish: 'Ativar custódia', + published: 'Custódia ativada', + publishedDesc: + 'Agora os compradores podem travar fundos com você para uma troca.', + failed: 'Não foi possível ativar a custódia', + }, + escrowSettings: { + title: 'Configurações de custódia', + desc: 'Padrões para negociações com custódia em Cashu. Salvos no dispositivo.', + lockWindow: 'Janela de bloqueio padrão', + lockWindowHint: + 'Por quanto tempo os fundos ficam travados antes de o comprador poder recuperá-los. Mais tempo é mais seguro para o vendedor.', + days: 'dias', + preferredMint: 'Mint para custódia', + activeMint: 'Mint ativo', + preferredMintHint: 'Qual mint financia a custódia. Use um confiável.', + requireListings: 'Exigir custódia em novos anúncios', + requireListingsHint: + 'Pré-seleciona "Exigir custódia" quando você anuncia um item.', + }, + privacy: { + title: 'Dicas de privacidade', + subtitle: 'Aprenda a proteger sua privacidade financeira', + cashuRecommended: 'CASHU (recomendado)', + anon: 'Transações anônimas', + blind: 'Assinaturas cegas ocultam a atividade', + noIp: 'Sem exposição de IP', + trustMint: 'Confiar fundos ao mint', + lightningAddress: 'LIGHTNING ADDRESS', + linked: 'Pode ser vinculado à identidade', + traceable: 'Histórico de pagamentos rastreável', + ipVisible: 'IP visível ao emitir faturas', + selfCustody: 'Autocustódia possível', + bestPractices: 'Boas práticas', + tip1Title: 'Use Cashu para receber gorjetas', + tip1Desc: + 'A carteira Cashu integrada é a forma mais privada de receber zaps', + tip2Title: 'Use uma carteira separada para o SkateSpots', + tip2Desc: + 'Não use sua carteira principal de poupança — mantenha os fundos do app separados', + tip3Title: 'Considere usar VPN ou Tor', + tip3Desc: 'Oculta seu endereço IP ao fazer transações', + tip4Title: 'Evite endereços Lightning vinculados à sua identidade', + tip4Desc: + 'Use endereços pseudônimos, sem vínculo com seu nome real', + proTip: 'Dica pro:', + proTipDesc: + 'Receba pagamentos primeiro na sua carteira Cashu e depois mova periodicamente quantias maiores para sua carteira pessoal usando uma VPN na transferência.', + warnTitle: 'Nota de privacidade', + warnDesc: + 'Endereços Lightning podem potencialmente vincular sua atividade no SkateSpots à sua identidade real.', + betterPrivacy: 'Para maior privacidade:', + bullet1: 'Use uma carteira dedicada para este app', + bullet2: 'Considere usar a carteira Cashu em vez disso', + bullet3: 'Use VPN/Tor para transações', + useCashu: 'Use Cashu em vez disso', + understand: 'Entendi', + }, + mintPrivacy: { + title: 'Privacidade dos mints', + desc: 'Usar vários mints melhora a privacidade ao impedir que um único mint veja todas as suas transações', + distribution: 'Distribuição dos fundos', + singleWarning: + 'Usar um único mint significa que esse mint pode ver todo o momento e os valores das suas transações. Considere adicionar mais mints para melhor privacidade.', + yourMints: 'Seus mints ({{count}})', + default: 'Padrão', + addMint: 'Adicionar mint', + addMintDesc: 'Adicione um novo mint Cashu à sua carteira', + mintUrl: 'URL do mint', + add: 'Adicionar', + adding: 'Adicionando...', + orChoose: 'Ou escolha da lista', + recommended: 'Mints recomendados', + allMints: 'Todos os mints (diretório)', + searchMints: 'Buscar mints…', + noDirectoryMints: 'Nenhum mint corresponde à sua busca.', + directoryHint: + 'Do diretório comunitário MintRadar — não oficial e pode estar desatualizado.', + added: 'Adicionado', + soon: 'Em breve', + autoDistribute: 'Distribuir fundos automaticamente', + autoDesc: 'Espalhe os fundos recebidos por vários mints', + autoAria: 'Distribuir fundos automaticamente (em breve)', + tip1: 'Use no mínimo 2 a 3 mints diferentes para melhor privacidade', + tip2: 'Não guarde todos os fundos em um só mint — espalhe-os', + tip3: 'Considere a jurisdição do mint (países diferentes = acessos legais diferentes)', + tip4: 'Os mints veem o momento das transações, mas NÃO quem você paga (assinaturas cegas)', + future: + 'Recursos futuros: rotação de mints e pontuação de privacidade — fique ligado!', + findMore: 'Encontre mais mints em mintradar.pedani.eu', + trustWarning: 'Aviso de confiança:', + trustWarningDesc: + 'Mints são custodiais — eles guardam seus fundos. Use apenas mints em que você confia. Se um mint desaparecer, seus fundos podem se perder. Espalhar fundos por vários mints reduz o risco.', + removeTitle: 'Remover mint?', + removeDesc: 'Tem certeza de que deseja remover {{name}}?', + removeMint: 'Remover mint', + warning: 'Aviso:', + withdrawWarning: + 'Este mint tem {{amount}} sats. Saque seus fundos antes de removê-lo!', + invalidUrl: 'URL inválida', + invalidUrlDesc: 'A URL do mint deve começar com https://', + mintAdded: 'Mint adicionado', + mintAddedDesc: 'Novo mint adicionado com sucesso', + mintAddedNamed: '{{name}} adicionado com sucesso', + failedAdd: 'Falha ao adicionar mint', + failed: 'Falhou', + noMints: 'Nenhum mint', + singleMint: 'Mint único', + concentrated: 'Concentrado', + moderate: 'Moderado', + wellDistributed: 'Bem distribuído', + mintCoinosWebDesc: 'Mint compatível com a web (recomendado para navegadores)', + mintMinibitsWebDesc: + '⚠ Somente app nativo — não acessível por navegadores', + mintMinibitsNativeDesc: 'Mint do SkateSpots — recomendado', + mintCoinosDesc: 'Mint compatível com a web', + mintLnbitsDesc: 'Mint comunitário no LNbits', + }, + nwc: { + title: 'Carteira Lightning', + noConnection: 'Carteira NWC', + refresh: 'Atualizar saldo', + createInvoice: 'Criar fatura', + copyInvoice: 'Copiar fatura', + pasteInvoice: 'Cole uma fatura Lightning (lnbc…)', + amount: 'Valor: {{amount}} sats', + pasteToSee: 'Cole uma fatura para ver o valor', + pay: 'Pagar', + invoiceQrAlt: 'Código QR da fatura Lightning', + enterAmount: 'Insira um valor em sats', + readBalanceFailed: 'Não foi possível ler o saldo', + readBalanceFailedDesc: 'Sua carteira não respondeu.', + createInvoiceFailed: 'Não foi possível criar a fatura', + createInvoiceFailedDesc: 'Tente novamente em instantes.', + paymentSent: 'Pagamento enviado', + paidAmount: 'Pagos {{amount}} sats.', + paid: 'Pago.', + paymentRejected: 'A carteira rejeitou o pagamento.', + }, + qr: { + title: 'Escanear código QR', + desc: 'Posicione o código QR no campo de visão da câmera para escanear', + paste: 'Colar da área de transferência', + hint: 'Escaneie um token Cashu, uma fatura Lightning ou um endereço Lightning', + clipboardEmpty: 'Área de transferência vazia', + clipboardEmptyDesc: 'Nenhum texto encontrado na área de transferência', + pasteFailed: 'Falha ao colar', + pasteFailedDesc: 'Não foi possível ler da área de transferência', + }, + recovery: { + title: 'Frase de recuperação', + desc: 'Estas 12 palavras são a única forma de restaurar seu saldo de ecash. Anote-as na ordem e guarde offline — nunca compartilhe com ninguém.', + tapReveal: 'Toque para revelar', + noWatching: 'Certifique-se de que ninguém esteja olhando', + hide: 'Ocultar', + reveal: 'Revelar', + paperHint: + 'Anotar no papel é o mais seguro — copiar para a área de transferência pode vazar para outros apps.', + written: 'Eu anotei', + revealFirst: 'Revele as palavras primeiro', + copiedDesc: + 'Frase de recuperação copiada — cole em um lugar seguro e depois limpe a área de transferência.', + copyFailed: 'Falha ao copiar', + copyFailedDesc: 'Anote as palavras em vez disso.', + }, + guide: { + quickGuide: 'Guia rápido', + fullGuide: 'Guia da carteira (edição skatista)', + cashuSummary: 'Privacidade + praticidade', + mintHoldsFunds: '(o mint guarda os fundos)', + lightningSummary: 'Controle + segurança', + youHoldKeys: '(você guarda as chaves)', + useBoth: 'Use as duas: Cashu para gorjetas, Lightning para poupança', + cashuTitle: 'CARTEIRA CASHU', + cashuTagline: 'Como dinheiro no bolso na pista', + cashuBullet1: 'Rápida de sacar para uma gorjeta', + cashuBullet2: 'Não carregue suas economias de uma vida aqui', + cashuBullet3: 'Se o mint desaparecer, os fundos podem se perder', + cashuBullet4: 'Ninguém sabe quanto você tem (privacidade!)', + cashuPerfectFor: 'Lanches de sessão, zaps em clipes, gorjetas pequenas', + lightningTitle: 'CARTEIRA LIGHTNING', + lightningTagline: 'Como sua conta bancária — você está no controle', + lightningBullet1: 'Segura, você controla as chaves', + lightningBullet2: 'Leva um tempo para configurar', + lightningBullet3: 'Histórico completo de transações', + lightningBullet4: 'Melhor para quantias maiores', + lightningPerfectFor: 'Compras de equipamento, poupança, zaps grandes', + perfectFor: 'Perfeita para:', + proTips: 'DICAS PRO', + tip1Title: 'Use as duas carteiras', + tip1Desc: 'Mantenha o dinheiro da sessão no Cashu e a poupança na Lightning', + tip2Title: 'Experimente carteiras diferentes', + tip2Desc: + 'Experimente para descobrir o que funciona para você. Cada uma tem recursos e trade-offs diferentes', + tip3Title: 'Mais privacidade', + tip3Desc: + 'Usar várias carteiras significa que nenhum app vê toda a sua atividade', + tip4Title: 'Ganhe experiência', + tip4Desc: + 'Quanto mais ferramentas você conhece, mais opções tem. Comece pequeno e aprenda no caminho', + tldr: 'Resumindo:', + tldrDesc: + 'Não existe carteira "melhor" — depende das suas necessidades. Experimente as duas, use a que parecer certa e não guarde todos os seus sats em um só lugar!', + }, + zap: { + count: '{{count}} zaps', + connectFirst: 'Conecte sua carteira primeiro', + connectFirstDesc: + 'Para enviar zaps (gorjetas em Bitcoin), você precisa conectar uma carteira Lightning.', + quickSetup: 'Configuração rápida (30 segundos)', + quickSetupDesc: + 'Conecte sua carteira Lightning atual com o Nostr Wallet Connect (NWC). Sem contas extras.', + connectNwc: 'Conectar carteira com NWC', + noWallet: 'Não tem uma carteira? Saiba como', + skip: 'Pular por enquanto (fatura manual)', + note: 'ℹ️ Observação:', + noteDesc: + 'Você ainda pode criar uma fatura sem conectar uma carteira, mas precisará copiá-la manualmente para pagar.', + payWithWebln: 'Pagar com WebLN', + processing: 'Processando...', + openInWallet: 'Abrir na carteira Lightning', + scanHint: + 'Escaneie o código QR ou copie a fatura para pagar com qualquer carteira Lightning.', + cashuInstant: 'Pague na hora com sua carteira integrada', + satsAvailable: 'sats disponíveis', + or: 'OU', + customAmount: 'Valor personalizado', + addComment: 'Adicione um comentário (opcional)', + insufficientBanner: + '⚠️ Saldo Cashu insuficiente. Você precisa de mais {{amount}} sats. Mude para Lightning ou recarregue sua carteira Cashu.', + creatingInvoice: 'Criando fatura...', + zapAmount: 'Zapar {{amount}} sats', + zapAmountCashu: 'Zapar {{amount}} sats com Cashu', + lightningInvoice: 'Fatura Lightning', + qrAlt: 'Código QR da fatura Lightning', + enterAmount: 'Insira um valor', + enterAmountDesc: + 'Escolha um valor predefinido ou digite um número válido de sats.', + cashuUnavailable: 'Carteira Cashu indisponível', + cashuUnavailableDesc: + 'Sua carteira Cashu não está pronta. Mude para Lightning ou abra sua carteira primeiro.', + insufficientCashu: 'Saldo Cashu insuficiente', + insufficientCashuDesc: + 'Você precisa de mais {{amount}} sats. Mude para Lightning ou recarregue.', + zapSentCashu: 'Zap enviado! 🥜', + zapSentCashuDesc: 'Zapados {{amount}} sats da sua carteira Cashu.', + cashuFailed: 'Falha no pagamento Cashu', + cashuFailedDesc: 'Falha ao pagar com sua carteira Cashu.', + invoiceCopied: 'Fatura copiada', + invoiceCopiedDesc: 'Fatura Lightning copiada para a área de transferência', + defaultComment: 'Zapado no SkateSpots! 🛹', + titleConnect: 'Conectar carteira', + titlePayment: 'Pagamento Lightning', + titleZap: 'Enviar um zap', + descConnect: 'Conecte sua carteira Lightning para enviar zaps', + descPayment: 'Pague com a Lightning Network do Bitcoin', + descZap: + 'Zaps são pequenos pagamentos em Bitcoin que apoiam o criador deste item. Se você gostou, considere enviar um zap!', + descZapShort: + 'Zaps são pequenos pagamentos em Bitcoin que apoiam criadores. Considere enviar um zap!', + }, + zapCrew: { + title: 'Zapear a crew', + desc: 'Divida um zap igualmente entre {{count}} membros da crew com Lightning Address.', + noMembers: 'Nenhum outro membro da crew para zapear no momento.', + totalAmount: 'Valor total', + customTotal: 'Total personalizado', + each: 'sats cada', + rounded: '(arredondado)', + noWallet: + 'Nenhuma carteira conectada — você receberá uma fatura por membro para pagar manualmente. Conecte uma carteira para dividir com um toque.', + zapAcross: 'Zapear {{amount}} sats entre {{count}}', + sentTo: '⚡ Enviado para {{done}}/{{total}}', + none: 'Nenhum pagamento automático concluído', + copyPending: + 'Copie as faturas pendentes para terminar de pagar manualmente.', + thanks: 'Obrigado por apoiar a crew!', + payingCrew: 'Pagando a crew…', + defaultComment: 'Zapeei a crew {{crew}}! 🤘', + sent: 'Enviado', + paying: 'Pagando', + resolving: 'Resolvendo', + skipped: 'Ignorado', + failed: 'Falhou', + waiting: 'Aguardando', + copyInvoice: 'Copiar fatura', + invoiceCopied: 'Fatura copiada', + invoiceCopiedDesc: 'Cole-a em qualquer carteira Lightning', + }, + zapBadges: { + title: 'Selos de zap', + zaps: 'zaps', + satsSent: 'sats enviados', + rank: 'posição', + footnote: 'Com base nos últimos 30 dias de zaps.', + first: 'Primeiro zap', + firstHint: 'Envie seu primeiro zap', + regular: 'Regular', + regularHint: 'Envie 10 zaps', + generous: 'Generoso', + generousHint: 'Envie 10.000 sats', + patron: 'Patrono', + patronHint: 'Envie 100.000 sats', + top10: 'Top 10', + top10Hint: 'Chegue aos 10 maiores apoiadores', + }, + trust: { + unavailable: 'Pontuação de confiança indisponível', + yourContent: 'Este é o seu conteúdo', + following: 'Você segue este usuário', + friendOfFriend: 'Amigo de um amigo (2 graus)', + nip05: 'Usuário verificado por NIP-05', + unknown: 'Usuário desconhecido', + help: 'As pontuações de confiança ajudam a identificar contribuidores confiáveis na comunidade do skate.', + }, + share: { + title: 'Compartilhar perfil', + desc: 'Aponte a câmera do celular para o código para abrir o perfil de {{name}}.', + qrAlt: 'Código QR do perfil', + copyLink: 'Copiar link', + copyFailed: 'Falha ao copiar', + copyFailedDesc: 'Não foi possível copiar o link.', + shareEllipsis: 'Compartilhar…', + }, + addToCollection: { + title: 'Salvar na coleção', + desc: 'Salve "{{spot}}" em uma das suas coleções', + loginRequired: 'Faça login para salvar picos em coleções', + noCollections: 'Você ainda não tem nenhuma coleção', + createFirst: 'Crie a sua primeira abaixo!', + spotCount: '{{count}} picos', + alreadySavedTag: 'Já salvo', + alreadySaved: 'Já salvo', + alreadySavedDesc: '"{{spot}}" já está em "{{collection}}"', + saved: 'Pico salvo!', + savedDesc: '"{{spot}}" adicionado a "{{collection}}"', + saveFailed: 'Falha ao salvar', + somethingWrong: 'Algo deu errado', + created: 'Coleção criada!', + createdDesc: '"{{spot}}" adicionado à sua nova coleção "{{collection}}"', + createFailed: 'Falha ao criar a coleção', + name: 'Nome da coleção', + descriptionOptional: 'Descrição (opcional)', + creating: 'Criando...', + createAndSave: 'Criar e salvar', + createNew: 'Criar nova coleção', + }, + collection: { + back: 'Voltar às coleções', + created: 'Criada em {{date}}', + deleteTitle: 'Excluir coleção?', + deleteDesc: + 'Isto excluirá permanentemente "{{title}}". Os picos em si não serão afetados.', + deleting: 'Excluindo...', + deleteFailed: 'Falha ao excluir a coleção', + deleted: 'Coleção excluída', + deletedDesc: '"{{title}}" foi removida', + empty: 'Nenhum pico nesta coleção', + emptyOwner: + 'Adicione picos à sua coleção clicando em "Salvar na coleção" em qualquer pico', + emptyOther: 'Esta coleção está vazia', + browseSpots: 'Explorar picos', + linkCopied: 'Link copiado!', + linkCopiedDesc: + 'O link da coleção foi copiado para a área de transferência', + map: 'Mapa da coleção', + removeFailed: 'Falha ao remover o pico', + shareText: 'Dê uma olhada nesta coleção de picos: {{title}}', + spotRemoved: 'Pico removido', + spotRemovedDesc: '"{{title}}" foi removido desta coleção', + }, + mints: { + title: 'Mints', + subtitle: + 'Explore mints Cashu e a saúde deles. As operações da carteira Cashu rodam no app SkateSpots.', + searchPlaceholder: 'Buscar mints por nome ou URL…', + onlineOnly: 'Somente online', + count: '{{filtered}} de {{total}} mints', + directoryError: 'Não foi possível carregar o diretório de mints.', + directoryHint: + 'O diretório é mantido pela comunidade e tem limite de requisições — pode ficar indisponível por um momento.', + goToWallet: 'Ir para a carteira', + appOnly: + 'Adicionar um mint acontece no app SkateSpots (o Cashu é somente no app).', + noMatch: 'Nenhum mint corresponde a "{{query}}".', + footer: + 'Dados de saúde do projeto comunitário MintRadar — não oficiais e podem estar desatualizados. Sempre revise os termos de um mint antes de confiar fundos a ele.', + archived: 'Arquivado', + degraded: 'Degradado', + offline: 'Offline', + online: 'Online', + terms: 'Termos', + reliability: 'confiabilidade', + add: 'Adicionar', + addToWallet: 'Adicionar à carteira', + copyUrl: 'Copiar URL', + openMint: 'Abrir mint', + inWallet: 'Na sua carteira', + addedBadge: 'Adicionado', + urlCopied: 'URL do mint copiada', + added: 'Mint adicionado', + addedDesc: '{{host}} agora está na sua carteira.', + couldNotAdd: 'Não foi possível adicionar o mint', + communityRating: 'Avaliação da comunidade', + reliabilityLabel: 'Confiabilidade', + uptime: 'Tempo ativo 24h / 7d', + location: 'Localização', + latency: 'Latência', + nuts: 'NUTs suportados', + units: 'Unidades', + version: 'Versão', + ratedBy: 'Avaliado com {{rating}}/5 por {{count}} pessoas no MintRadar.', + noRating: 'Ainda sem avaliação da comunidade no MintRadar.', + reviewsNote1: 'Avaliações escritas não fazem parte do diretório —', + openMintRadar: 'abrir o MintRadar', + reviewsNote2: 'para ler ou deixar uma.', + liveness: + 'Auditoria de atividade: {{mints}} mints e {{melts}} melts testados', + livenessErrors: ' · {{errors}}/{{total}} erros recentes', + whatsAMint: 'O que é um mint?', + whatsAMintDesc: + 'Um mint Cashu emite e resgata o ecash da sua carteira. Ele guarda o Bitcoin que lastreia seus tokens — então um mint que você não opera é um em que você precisa confiar.', + mintWarning: + 'Mints podem ficar offline, mudar os termos ou desaparecer com os fundos. Mantenha apenas saldos pequenos, a menos que confie no operador.', + healthDisclaimer: + 'Os dados de saúde são mantidos pela comunidade (MintRadar) — não oficiais e possivelmente desatualizados.', + }, + appShop: { + title: 'Loja do app', + subtitle: + 'Produtos do SkateSpots para quem mantém a cena girando.', + comingSoon: 'Em breve', + wearThe: 'Vista a', + scene: 'Cena', + heroDesc1: + 'Produtos para quem mantém isso girando — vendidos', + locally: 'localmente, sob encomenda', + heroDesc2: + '. Você me manda mensagem, acertamos os detalhes e você paga em', + heroDesc3: + '— Lightning ou Cashu — quando retirar. Sem cartões, sem contas, sem robô de checkout, sem intermediário levando uma parte.', + requestItem: 'Solicitar um item', + dmHint: 'Abre uma DM privada e criptografada comigo.', + lightning: 'Lightning', + cashu: 'Cashu', + localHandover: 'Entrega local', + inTheWorks: 'Em produção', + notForSale: 'ainda não está à venda', + soon: 'em breve', + tees: 'Camisetas e moletons', + decks: 'Decks', + shopTools: 'Ferramentas de oficina', + stickerPacks: 'Pacotes de adesivos', + stickerPacksDesc: + 'Os pacotes estão chegando. Os designs não — imprima estes dois agora, de graça.', + sticker: 'Adesivo', + stickerTip: + 'Recorte preto. Imprima em papel adesivo e corte na borda preta.', + poster: 'Pôster', + posterTip: + 'Imprime em A3; reduza para A4 (50%) e ainda escaneia bem.', + printableAlt: 'SkateSpots {{title}} — para imprimir', + print: 'Imprimir', + printNote1: 'Imprima em', + actualSize: '100% / "Tamanho real"', + printNote2: + 'para que o tamanho seja exato e o QR continue nítido — ele aponta para skate-spots.org. Arquivos vetoriais, então escalam sem ficar borrados.', + howBuying: 'Como funciona a compra', + dmNotCart: 'é uma DM, não um carrinho', + step1Title: 'Me mande mensagem', + step1Desc: + 'Envie uma DM com o que você quer — item, tamanho, cor, o que for.', + step2Title: 'A gente acerta', + step2Desc: + 'Preço em sats, e onde e quando encontrar. É uma conversa, não um checkout.', + step3Title: 'Pague em sats', + step3Desc: + 'Lightning ou Cashu na entrega, e então é seu. Sem frete, sem salas de espera.', + }, + newsletter: { + newIssue: 'Nova edição', + composerTitle: 'Publicar uma edição da newsletter', + composerDesc: + 'Publicada como artigo NIP-23 (kind 30023) no relay da comunidade. Os assinantes recebem no sino de notificações. O corpo aceita Markdown.', + fieldTitle: 'Título', + identifier: 'Identificador (slug)', + leaveBlank: 'deixe em branco para gerar automaticamente', + reusingSlug: + 'Reutilizar um slug existente edita aquela edição em vez de criar uma nova.', + summary: 'Resumo', + optional: 'opcional', + coverImage: 'URL da imagem de capa', + bodyMarkdown: 'Corpo (Markdown)', + characters: '{{count}} caracteres', + publishIssue: 'Publicar edição', + issuePublished: 'Edição publicada! 🛹', + issuePublishedDesc: + 'Os assinantes verão no sino de notificações.', + publishFailed: 'Falha ao publicar', + couldNotReachRelay: + 'Não foi possível alcançar nenhum relay — verifique sua conexão e tente de novo.', + tryAgain: 'Tente novamente.', + publishedToNostr: 'Publicado no Nostr', + publishedToast: 'Publicado!', + postedToNostr: 'Drop {{number}} publicado no Nostr.', + postToNostr: 'Publicar no Nostr', + previewLabel: 'Pré-visualização', + editFirst: 'Editar primeiro', + previewNoteDesc: + 'É assim que a nota aparecerá na maioria dos clientes Nostr. A formatação varia conforme o cliente.', + editNoteDesc: + 'Edite o texto da nota abaixo. As mudanças afetam apenas esta publicação — o arquivo de origem permanece inalterado.', + dropNumber: 'Drop {{number}}', + publish: 'Publicar', + publishing: 'Publicando...', + dropIsOut: 'Drop {{number}} saiu', + daysAgo: 'há {{count}}d', + dismiss: 'Dispensar', + itsMonday: 'É segunda-feira', + mondayDesc: + 'Hora de lançar a newsletter semanal. Um clique e a IA escreve a partir do git log.', + writeDrop: 'Escrever o drop {{number}}', + dismissReminder: 'Dispensar lembrete', + loginPrompt: + 'Faça login com o Nostr para receber novos drops na sua caixa de entrada.', + subscribedToast: 'Você está inscrito! 🛹', + subscribedToastDesc: + 'Novos drops chegarão no seu sino de notificações em "Notícias".', + unsubscribed: 'Inscrição cancelada', + unsubscribedDesc: + 'Você ainda pode ler todas as edições aqui a qualquer momento.', + checking: 'Verificando…', + subscribed: 'Inscrito', + unsubscribe: 'Cancelar inscrição', + subscribeCta: 'Assine a newsletter', + archiveSynced: 'Arquivo sincronizado com o Nostr', + missingCount: '{{count}} edições do arquivo ainda não estão no Nostr', + backfillDesc: + 'Publique {{list}} como artigos NIP-23 para que assinantes e leitores de textos longos vejam o arquivo completo. A página mantém seu layout rico de qualquer forma.', + backfill: 'Enviar {{count}} para o Nostr', + publishing2: 'Publicando…', + publishingLabel: 'Publicando…', + backfilled: '{{count}} edições enviadas 🛹', + backfilledDesc: + 'O arquivo agora vive no Nostr para assinantes e leitores.', + partialBackfill: 'Publicadas {{published}}, {{failed}} falharam', + retryFinish: 'Tente de novo para concluir: {{list}}.', + notLoggedIn: 'Não conectado', + allIssues: 'Todas as edições', + brand: 'Newsletter do SkateSpots', + digTheDrop: 'Curte o drop? Dê um zap e nunca perca o próximo.', + sectionStats: 'A comunidade em números', + sectionWhatsNew: 'Novidades', + sectionSpotOfWeek: 'Pico da semana', + sectionCommunity: 'Comunidade', + sectionSupport: 'Apoie o projeto', + sectionLatestDrops: 'Últimos drops · ao vivo do Nostr', + mappedBy: 'Mapeado por', + viewOnMap: 'Ver no mapa', + noSpotPicked: + 'Nenhum pico escolhido esta semana. Envie o seu e pode aparecer no próximo drop.', + browseMap: 'Explorar o mapa', + spotMap: 'Mapa de picos', + statsBadge: 'Estatísticas', + supportDesc: + '100% código aberto, financiado pela comunidade, sem anúncios, sem investidores. Se for útil, dê um zap ou apoie no Angor.', + readFull: 'Ler a edição completa', + joinSkaters: 'Junte-se a {{count}} skatistas que recebem os drops', + weeklyDrops: 'Drops semanais', + tagline: 'Uma newsletter semanal · lançada quando a gente quiser', + freeNote: + 'Grátis. Movida a Nostr — sua assinatura vive nas suas chaves e te acompanha entre dispositivos. Novos drops chegam no seu sino de notificações.', + live: 'Ao vivo', + builtOn: 'Construído em', + openSource: 'Código aberto', + supportUs: 'Apoie-nos', + freeToSkate: 'Você é livre para andar de skate', + }, + stats: { + subtitle: + 'Métricas ao vivo direto da rede Nostr. Transparentes, descentralizadas, verificáveis por qualquer pessoa.', + dataSource: 'Fonte dos dados:', + updated: 'atualizado {{age}}', + refresh: 'Atualizar', + partial: + 'Não foi possível alcançar todos os relays — estes números podem estar incompletos.', + error: + 'Não foi possível alcançar o relay agora. As estatísticas carregarão quando a conexão for restabelecida.', + atAGlance: 'A comunidade em um relance', + skateSpots: 'Picos de skate', + listedShops: 'Lojas listadas', + events: 'Eventos', + mappers: 'Mapeadores', + uniqueContributors: 'contribuidores únicos', + labHeader: 'The Lab · Criadores e serviços', + total: '{{count}} no total', + coaches: 'Coaches', + filmers: 'Filmakers', + editors: 'Editores', + photographers: 'Fotógrafos', + builders: 'Construtores', + artists: 'Artistas', + graffiti: 'Grafite', + tattoo: 'Tatuagem', + trainers: 'Treinadores', + musicians: 'Músicos', + judges: 'Jurados', + organizers: 'Organizadores', + barbers: 'Barbeiros', + showFewer: 'Mostrar menos', + showAllCrafts: 'Mostrar todos os 13 ofícios', + community: 'Comunidade', + tours: 'Tours', + crews: 'Crews', + marketplace: 'Mercado', + liveListings: 'Anúncios ativos', + tradesRecorded: 'Trocas registradas', + satsTraded: 'Sats negociados', + zapsToMappers: 'Zaps para mapeadores', + tradesNote1: 'trocas mútuas entre', + tradesNote2: + 'pessoas. Os sats são autodeclarados pelos negociadores — o app não consegue observar um pagamento fora do app — então o número principal conta apenas', + mutual: 'mútuas', + tradesNote3: 'trocas com um limite por par; o valor bruto declarado é', + tradesNote4: + 'sats. "Zaps para mapeadores" conta apenas recibos endereçados aos nossos principais contribuidores — é', + not: 'não', + tradesNote5: 'o volume global de zaps.', + byRegion: 'Picos e lojas por região', + resolving: + 'Resolvendo {{count}} locais sem marcação a partir das coordenadas… uma vez, depois fica em cache neste dispositivo.', + topCountries: 'Principais países', + topCities: 'Principais cidades', + other: 'Outros', + otherCountriesTitle: 'Países fora do top 6', + otherCitiesTitle: 'Cidades fora do top 6', + uncategorised: 'Sem categoria', + uncategorisedTitle: 'Sem marcação de cidade/país', + regionNote1: 'Conta', + spotsAndShops: 'picos e lojas', + regionNote2: + ', não skatistas — a partir da marcação de cidade/país de cada um, ou derivada das coordenadas do pino quando não há nenhuma (em cache no seu dispositivo; países agrupados por código ISO quando presente), somente o relay da comunidade, com conteúdo oculto pela moderação excluído.', + ofTotal: '{{count}} de {{total}}', + regionNote3: + 'locais não têm marcação de localização e aparecem como "Sem categoria".', + growth: 'Crescimento ao longo do tempo', + chartCumulativeTitle: 'Picos mapeados (acumulado)', + chartCumulativeDesc: + 'Total de picos adicionados ao mapa ao longo do tempo', + chartMonthlyTitle: 'Atividade mensal', + chartMonthlyDesc: 'Novo conteúdo publicado a cada mês', + chartMappersTitle: 'Mapeadores ativos / mês', + chartMappersDesc: + 'Contribuidores únicos publicando a cada mês', + chartMixTitle: 'Mistura de conteúdo', + chartMixDesc: 'Detalhamento por tipo de conteúdo (todo o período)', + noData: 'Ainda sem dados', + topMappers: 'Principais mapeadores', + mostSpots: '— mais picos adicionados', + noMapperData: 'Ainda sem dados de mapeadores', + topShops: 'Principais lojas', + mostShops: '— mais lojas adicionadas', + shopCount: '{{count}} lojas', + noShopData: 'Ainda sem dados de lojas', + supporters: 'Apoiadores da comunidade', + fundedTitle: 'Financiado pela comunidade', + fundedDesc1: + 'Financiamento coletivo descentralizado em Bitcoin via Angor.', + fundedDesc2: 'Sem anúncios, sem investidores, sem venda de dados.', + backAngor: 'Apoie-nos no Angor', + communityLink: 'Comunidade →', + footer1: 'Todos os dados são puxados ao vivo de', + footer2: '— um relay público do Nostr.', + footer3: + 'Cada evento é assinado pelo seu criador e verificável criptograficamente.', + footer4: 'Nenhum número pode ser falsificado.', + spots: 'Picos', + shops: 'Lojas', + lab: 'Lab', + thisMonth: '+{{count}} este mês', + fromActive: '{{count}} de contas ativas', + viewAll: 'Ver tudo', + spotCount: '{{count}} picos', + }, + leaderboard: { + mapEarn: 'Mapeie e ganhe', + helpMap: 'AJUDE A MAPEAR O MUNDO', + intro: + 'Adicione picos e lojas e receba zaps de skatistas gratos. Os principais contribuidores podem receber recompensas extras!', + howItWorks: 'Como funciona', + step1Title: '1. Mapeie', + step1Desc: 'Adicione picos e lojas com fotos e detalhes', + step2Title: '2. Ganhe zaps', + step2Desc: 'Skatistas que acharem seus picos úteis darão gorjeta', + step3Title: '3. Recompensas extras', + step3Desc: + 'Os principais mapeadores podem receber recompensas extras do nosso fundo', + proTips: '💡 Dicas pro para mais zaps:', + tipPhotos: 'Adicione 3+ fotos', + tipDescriptions: 'Escreva descrições detalhadas', + tipLocation: 'Localização precisa', + mapShop: 'Mapear uma loja', + mapShopDesc: 'Skate shops, lojas de shapes', + mapSpot: 'Mapear um pico', + mapSpotDesc: 'Pracinhas, picos de rua, DIY', + shops: 'Lojas', + spotsLower: 'picos', + shopsLower: 'lojas', + contributions: 'contribuições', + yourRanking: 'Sua posição', + spotsShops: '{{spots}} picos • {{shops}} lojas', + totalLower: 'total', + overall: 'Geral', + noContributions: 'Ainda sem contribuições. Seja o primeiro!', + addFirstSpot: 'Adicionar primeiro pico', + noShops: 'Ainda sem lojas mapeadas', + addFirstShop: 'Adicionar primeira loja', + noSpots: 'Ainda sem picos mapeados', + poweredBy: 'Movido por zaps da comunidade', + poweredByDesc: + 'Quando um pico for útil, dê um zap no mapeador! É a melhor forma de agradecer e incentivar mais contribuições.', + you: 'Você', + zapTitle: 'Rankings de zap', + zapSubtitle: + 'Os picos que mais recebem carinho — e os skatistas que o dão.', + thisWeek: 'Esta semana', + thisMonth: 'Este mês', + allTime: 'Todo o período', + topZappedSpots: 'Picos mais zapeados', + noZaps: + 'Ainda sem zaps neste período. Seja o primeiro — toque no ⚡ de um pico que você ama.', + topSupporters: 'Principais apoiadores', + noZapsSent: 'Ainda sem zaps enviados neste período.', + fromTop10: '⚡ {{amount}} sats dos 10 primeiros', + supporter: 'Apoiador', + skateShop: 'Skate shop', + skateSpot: 'Pico de skate', + }, + supporters: { + our: 'NOSSA', + community: 'COMUNIDADE', + heroDesc: + 'O SkateSpots é feito pela e para a comunidade. Apoiadores, colaboradores, parceiros e amigos que mantêm tudo gratuito e descentralizado.', + backAngor: 'Apoie-nos no Angor', + backers: 'Apoiadores', + backersDesc: + 'Skatistas que apoiaram o SkateSpots — financiamento on-chain via Angor e zaps Lightning para o projeto.', + sourceAngor: 'Angor', + supportersTotals: + '{{count}} apoiadores · {{angor}} sats via Angor · {{zap}} sats zapeados', + quietNote: + 'Além de todos que contribuíram em silêncio — obrigado. ❤️', + silentTitle: 'On-chain privado (pagamentos silenciosos)', + silentDesc: + 'Um nome, um endereço novo a cada pagamento — on-chain via pagamentos silenciosos, ou Lightning a partir do mesmo registro. Nada para reutilizar, nada para vincular.', + silentCopyName: 'Copiar nome', + silentCopied: 'Copiado', + silentWallets: + 'Precisa de uma carteira compatível com payment names / pagamentos silenciosos: Sparrow, Cake, Dana, Phoenix, BlueWallet, Wasabi, Nunchuk ou BitBox02.', + wayLightningTitle: 'Instantâneo e público', + wayLightningDesc: + 'Dê um zap no SkateSpots ou pague em silêncio. Funciona sem login.', + waySilentTitle: 'On-chain privado', + waySilentDesc: + 'Um nome de pagamentos silenciosos — um endereço novo a cada pagamento.', + wayAngorTitle: 'Financie o desenvolvimento', + wayAngorDesc: + 'Angor — liberação por etapas, reembolsável acima de 100k sats.', + donateTitle: 'Apoie o SkateSpots', + donateDesc: + 'Três caminhos, três motivos — escolha o que combina com você. Cada sat mantém o mapa gratuito, sem anúncios e open-source.', + donatePageLink: 'Abrir a página simples de doação', + updatedAt: 'Atualizado {{when}}', + tiersNote: + 'Níveis: Apoiador abaixo de 100k sats · Patrono 100k–1M · Lenda 1M+', + tierEmpty: 'Ninguém ainda — seja o primeiro.', + joinSupporters: 'Junte-se a {{count}} apoiadores', + showAll: 'Mostrar todos os {{count}}', + showLess: 'Mostrar menos', + impactSeeStats: 'Veja o quadro completo →', + impactAsOf: 'ao vivo dos relays da comunidade', + anonymousBacker: 'Apoiador anônimo', + beFirstBacker: 'Ainda sem apoiadores públicos — seja o primeiro.', + backersTotal: + '{{count}} apoiadores · {{amount}} sats arrecadados', + verifiedOnChain: 'Verificado on-chain', + supportedBy: 'Apoiado por {{count}}', + tierSupporter: 'Apoiador', + tierPatron: 'Patrono', + tierLegend: 'Lenda', + topZappers: 'Zaparam o SkateSpots', + topZappersDesc: + 'Skatistas que enviaram um zap público direto para o projeto. Pagamentos silenciosos não são listados.', + paysFor: 'No que seu apoio é usado', + paysForDesc: + 'Para onde vai cada sat — sem salários, sem escritórios, sem anúncios.', + payRelay: 'Hospedagem de relay', + payDomain: 'Domínio e TLS', + payAi: 'Nó de IA / ContextVM', + payDev: 'Tempo de desenvolvimento', + payOps: 'Operações', + payMarketing: 'Marketing', + payRelayDesc: 'Mantém o mapa online e resiliente.', + payDomainDesc: 'O nome, o certificado, a conexão segura.', + payAiDesc: 'Sasquatch, o guia da comunidade.', + payDevDesc: 'Construindo e consertando o SkateSpots.', + payOpsDesc: 'O trabalho sem glamour que mantém tudo rodando.', + payMarketingDesc: 'Alcançando novas cenas locais e skateshops.', + impact: 'Impacto até agora', + impactDesc: + 'O que a comunidade construiu — financiado por skatistas.', + impactSpots: 'Picos', + impactCrews: 'Crews', + impactEvents: 'Eventos', + impactLab: 'Pros do Lab', + impactShops: 'Lojas', + impactMappers: 'Mapeadores', + support: 'Apoio', + supportDesc: + 'Financie o SkateSpots no Angor — financiamento coletivo descentralizado em Bitcoin on-chain. Sem intermediário, sem KYC.', + collaborators: 'Colaboradores', + collaboratorsDesc: + 'Pessoas construindo ativamente o SkateSpots — desenvolvedores, designers, operadores de relay.', + partners: 'Parceiros', + partnersDesc: + 'Organizações e projetos com quem trabalhamos de perto.', + friends: 'Amigos', + friendsDesc: 'Pessoas com quem temos sintonia.', + backTitle: 'Apoie o projeto no Angor', + backDesc: + 'Angor é financiamento descentralizado em Bitcoin on-chain construído no Nostr — seus fundos ficam sob seu controle, liberados por etapas, sem nenhum custodiante segurando o bolo. Contribuições de até 100.000 sats funcionam como doação (sem handshake de recuperação); valores maiores são investimentos cujos fundos não gastos podem ser recuperados. Cada sat vai para desenvolvimento, hospedagem de relay e para manter o SkateSpots gratuito para todo skatista do mundo.', + donateNote: + 'Prefere uma doação direta? ⚡ Dê um zap abaixo — nada a reembolsar, nada a recuperar.', + openAngor: 'Abrir o Angor', + orZap: + 'ou ⚡ dê um zap em qualquer pico, crew ou criador direto no app', + wantCollaborate: 'Quer colaborar?', + wantCollaborateDesc: + 'Desenvolvedores, designers, skatistas com habilidades — fale com a gente.', + viewNostrHub: 'Ver no NostrHub', + wantPartner: + 'Quer ser parceiro do SkateSpots? Fale com a gente no Nostr.', + comingSoon: 'Em breve', + wantListed: 'Quer aparecer aqui?', + wantListedDesc: + 'Envie um logo (PNG/WebP, fundo transparente, mín. 200×200px) e sua URL por DM no Nostr, só se você tiver as vibes.', + whyTitle1: 'Por que precisamos', + whyTitle2: 'de apoio', + whyDesc: + 'O SkateSpots é 100% gratuito, open-source e construído no Nostr — um protocolo descentralizado sem servidor central para desligá-lo. Sem anúncios, sem venda de dados, sem investidores. Cada sat vai diretamente para desenvolvimento, hospedagem de relay e para manter tudo gratuito para todo skatista do mundo.', + why1Title: 'Nativo do Nostr', + why1Desc: + 'Sem servidor central. Seus dados vivem nos relays que você escolhe.', + why2Title: 'Movido a Bitcoin', + why2Desc: + 'Ganhe sats mapeando picos. Gaste-os nas lojas locais.', + why3Title: 'Gratuito para sempre', + why3Desc: + 'Código aberto, sem paywalls, sem rastreamento, sem capital de risco.', + thankYou: + 'Obrigado. Cada sat mantém os picos no mapa. 🛹⚡', + license: 'Licença', + faq: 'FAQ', + }, + admin: { + confirmed: 'Confirmado', + title: 'Fila de revisão', + subtitle: + 'Picos, lojas, eventos, tours e equipamentos que acionam os sinais de lixo. Ocultar e Confirmar são rótulos leves e reversíveis; denúncias vêm primeiro. Nada é excluído.', + tabReports: 'Denúncias', + tabSpots: 'Picos', + tabShops: 'Lojas', + tabEvents: 'Eventos', + tabTours: 'Tours', + tabGear: 'Equipamentos', + tabCrews: 'Crews', + tabLab: 'Lab', + tabClaims: 'Reivindicações', + nothingToReview: + 'Nada para revisar — nada desse tipo aciona os sinais de lixo.', + hideActioned: 'Ocultar tratados', + showActioned: 'Mostrar tratados ({{count}})', + undoAll: 'Desfazer todos os {{count}}', + undoAllTitle: 'Desfazer todos os veredictos desta aba?', + undoAllDesc: + 'Isso redefine cada item para neutro — nem oculto, nem atestado. Publica um rótulo público por item, então com o Amber você verá {{count}} telas de aprovação.', + undoCount: 'Desfazer {{count}}', + undo: 'Desfazer', + confirm: 'Confirmar', + hide: 'Ocultar', + hideIt: 'Ocultar', + hideForEveryone: 'Ocultar isto para todos?', + hideForEveryoneDesc: + 'Isto remove o item da navegação e da busca para todos os usuários do SkateSpots. É um rótulo público e reversível — você pode desfazê-lo nesta fila.', + hidden: 'Oculto', + hiddenDesc: + 'Removido do app por meio de um rótulo público. Reversível.', + couldNotHide: 'Não foi possível ocultar', + notASpot: 'Não é um pico de skate', + lookAtIt: 'Ver', + }, + profile: { + nip05Verified: 'Verificado por NIP-05', + nip05NotVerified: 'NIP-05 não verificado para esta chave', + message: 'Mensagem', + zapsReceived: 'zaps recebidos', + memberSince: 'Membro desde', + badges: 'Selos', + sponsorsSupport: 'Patrocinadores e apoio', + skater: 'Skatista', + stance: 'Base', + skating: 'Andando', + homeSpot: 'Pico de casa', + basedIn: 'Mora em', + addSkateDetails: 'Adicione seus detalhes de skate', + addSkateDetailsDesc: + 'Defina sua base, estilos e nível para aparecer no diretório de skatistas.', + spotsAdded: 'Picos adicionados', + shopsAdded: 'Lojas adicionadas', + noSpots: 'Você ainda não adicionou nenhum pico', + noSpotsDesc: 'Coloque seu pico local no mapa →', + stash: 'Stash', + gear: 'Equipamentos', + crews: 'Crews', + info: 'Info', + lightning: 'Lightning', + silentPayment: 'Pagamento silencioso', + coordinator: 'Coordenador', + coordinatorAdded: 'Coordenador adicionado', + add: 'Adicionar', + messagePrivately: 'Enviar mensagem privada', + founder: 'Fundador', + member: 'Membro', + supportSkater: 'Apoie este skatista', + supportSkaterDesc: + 'Envie uma gorjeta para agradecer pelas contribuições', + }, + index: { + joinCommunity: + 'Entre na comunidade para adicionar picos, criar eventos e mais', + topZapped: 'MAIS ZAPEADOS', + topZappedDesc: 'Picos mais apoiados este mês', + leaderboard: 'Ranking', + newHere: 'É NOVO AQUI?', + newHereDesc: + 'Crie uma conta gratuita para adicionar picos, participar de eventos, conectar-se com skatistas e fazer parte da comunidade. Sem e-mail.', + followFounder: 'Siga o fundador', + followFounderDesc: + 'Segure o avatar por 3 segundos para seguir e ficar por dentro das novidades e eventos!', + createAccount: 'Criar conta', + accountWorks: + 'Sua conta funciona em todos os apps da rede', + footerTagline: 'Código aberto • Da comunidade • Sem anúncios', + }, + stash: { + title: 'Meu Stash', + loginDesc: + 'Seu inventário privado de equipamentos. Acompanhe o que você tem, defina preços e compartilhe seletivamente com negociadores.', + encrypted: 'Criptografado', + syncsEverywhere: 'Sincroniza em todo lugar', + p2pTrading: 'Negociação P2P', + encryptionRequired: 'Criptografia necessária', + encryptionRequiredDesc: + 'Seu Stash é criptografado por privacidade. Use um signer compatível com criptografia NIP-44 (como Alby, nos2x ou Amber).', + learnSigners: 'Saiba sobre signers', + select: 'Selecionar', + stash: 'Stash', + wishlist: 'Lista de desejos', + allCategories: 'Todas as categorias', + sortNewest: 'Mais recentes', + sortValue: 'Valor', + sortCondition: 'Condição', + sortAz: 'A–Z', + friendsOnly: 'Só amigos', + addToWishlist: 'Adicionar à lista de desejos', + addItemToStash: 'Adicionar item ao Stash', + addItem: 'Adicionar item', + editItem: 'Editar item', + publicStash: 'Stash público', + listView: 'Visão em lista', + gridView: 'Visão em grade', + uploading: 'Enviando...', + addPhotos: 'Adicionar fotos', + wishlistReqPlaceholder: 'Algum requisito específico...', + itemDescPlaceholder: 'Descreva o item, qualquer dano...', + itemsCount: '{{count}} item(ns)', + wishlistEmpty: 'Lista de desejos vazia', + wishlistEmptyDesc: + 'Adicione equipamentos que você procura — vamos combinar você com os Stashes dos amigos.', + stashEmpty: 'Seu Stash está vazio', + stashEmptyDesc: + 'Comece a acompanhar seu equipamento. Shapes, trucks, tênis — adicione uma vez e acesse em todo lugar via Nostr.', + noMatch: 'Nenhum item corresponde', + noMatchDesc: 'Tente ajustar seus filtros.', + backupTransfer: 'Backup e transferência', + backupDesc: + 'Seu Stash é criptografado no Nostr. Guarde uma cópia sob seu controle — um relay fora do ar ou uma conta nova não podem perder sua lista de equipamentos.', + exportTitle: 'Backup criptografado', + exportDialogDesc: + 'Salve {{count}} item(ns) em um arquivo. Criptografe-o para que um arquivo vazado não seja um vazamento.', + modePassword: 'Senha', + modeKey: 'Minha chave', + password: 'Senha', + confirmPassword: 'Confirme a senha', + passwordHint: + 'Use pelo menos 8 caracteres. Não há recuperação — não a esqueça.', + keyModeHint: + 'Criptografado com sua chave Nostr. Só essa chave pode abri-lo — nada para lembrar.', + exportPlaintext: 'Exportar sem criptografia', + pwTooShort: 'Use pelo menos 8 caracteres.', + pwMismatch: 'As senhas não coincidem.', + exportFailed: 'Não foi possível criar o backup.', + unlockTitle: 'Desbloquear backup', + unlockDesc: 'Este backup é protegido por senha.', + unlock: 'Desbloquear', + unlockFailed: 'Não foi possível desbloquear o backup.', + show: 'Mostrar', + hide: 'Ocultar', + strength: 'Força da senha', + strengthWeak: 'Fraca', + strengthFair: 'Razoável', + strengthGood: 'Boa', + strengthStrong: 'Forte', + filenameWillSave: 'Será salvo como {{name}}', + export: 'Exportar', + import: 'Importar', + exported: 'Stash exportado', + exportedDesc: '{{count}} itens salvos em um arquivo.', + noItemsInFile: 'Nenhum item encontrado nesse arquivo.', + noValidItems: 'Nenhum item válido encontrado nesse arquivo.', + imported: '{{count}} itens importados', + importSkipped: '{{count}} ignorados (já no seu Stash).', + importAdded: 'Adicionado ao seu Stash.', + importFailed: 'Falha na importação', + couldNotRead: 'Não foi possível ler esse arquivo.', + updateFailed: 'Não foi possível atualizar seu Stash', + updatedCount: '{{count}} itens atualizados', + markedForSale: '{{count}} marcados para venda', + unmarkedCount: '{{count}} desmarcados', + removedCount: '{{count}} itens removidos', + selectedCount: '{{count}} selecionados', + selectAll: 'Selecionar tudo', + visibilityPublic: 'Público', + visibilityPrivate: 'Privado', + forSale: 'À venda', + remove: 'Remover', + bulkDeleteTitle: 'Remover {{count}} itens?', + bulkDeleteDesc: + 'Isto reescreve seu Stash criptografado em uma única assinatura e não pode ser desfeito aqui. Exporte um backup antes se não tiver certeza.', + deleteTitle: 'Remover do seu Stash?', + deleteDesc: '"{{title}}" será removido do seu Stash', + deleteDescPublic: ' e retirado do seu mostruário público', + deleteUndone: '. Isto não pode ser desfeito.', + deleteDescGeneric: + 'Este item será removido do seu Stash. Isto não pode ser desfeito.', + listOnMarketplace: 'Anunciar no Mercado', + noPriceSet: 'Nenhum preço definido', + categoryLabel: 'Categoria', + photosLabel: 'Fotos', + willingToSell: 'Disposto a vender', + willingToTrade: 'Disposto a trocar', + whereIsThisItem: 'Onde está este item?', + visibilityLabel: 'Visibilidade', + visibilityPrivateOnlyYou: 'Privado - Só você', + visibilityFriendsMutual: 'Amigos - Seguidores mútuos', + visibilityPublicAnyone: 'Público - Qualquer pessoa', + visibilityFriends: 'Amigos', + brandLabel: 'Marca', + sizeLabel: 'Tamanho', + descriptionLabel: 'Descrição', + conditionLabel: 'Condição', + itemName: 'Nome do item', + saveChanges: 'Salvar alterações', + listItemDialogTitle: 'Anunciar "{{title}}"', + pickUpWhere: 'Onde os compradores podem retirar este item?', + linkToSpot: 'Vincular a um pico de skate', + linkToSpotDesc: + 'Melhor para vendas locais • Aparece na página do pico e no mapa', + recommended: 'Recomendado', + noSpecificSpot: 'Nenhum pico específico', + noSpecificSpotDesc: 'Visível apenas na página do Mercado', + tipLinkedSpots: + '💡 Dica: anúncios vinculados a picos são mais fáceis de encontrar para skatistas locais.', + anyoneCanSee: 'Qualquer pessoa pode ver isto no seu perfil.', + seeWhatOthersSee: 'Veja o que os outros veem', + inventory: 'Inventário', + publicWantsNote: + 'Os desejos públicos são publicados no Mercado como anúncios de "procura-se", para que os vendedores possam te encontrar.', + howItWorks: 'Como funciona', + tapToMarketplace: 'Toque para ir ao Mercado →', + viewWishlist: 'Ver lista de desejos', + tipEditItems: 'Edite itens com o botão de caneta', + tipListForSale: 'Anuncie para venda com o botão de loja', + tipAddPhotos: 'Adicione fotos para melhores ofertas de troca', + tipKeySyncs: 'A chave Nostr sincroniza com todos os dispositivos', + itemsReadyToSell: '{{count}} item(ns) prontos para vender', + }, + }, +}; export default ptBatch4; diff --git a/src/i18n/pt/batch5.ts b/src/i18n/pt/batch5.ts index 285550f..2310dac 100644 --- a/src/i18n/pt/batch5.ts +++ b/src/i18n/pt/batch5.ts @@ -1,4 +1,1597 @@ /** pt — batch 5. Filled by the translation pass; empty until then. */ -const ptBatch5 = {}; +const ptBatch5 = { + labUi: { + activeCount: "{{count}} ativos", + addMusicProfile: "Adicionar Perfil de Música", + all: "Todos", + clearAll: "Limpar tudo", + collective: "Coletivo", + filters: "Filtros", + following: "Seguindo", + getRiderCard: "Obter Rider Card", + judgeEvents: "Julgar Eventos", + justASkater: "Só um", + labForServices: "O The Lab é para serviços. Explore e entre na comunidade skatista inteira", + loginToOffer: "Entre para oferecer serviços", + newest: "Mais recentes", + noResults: "Nenhum resultado", + offer: "Oferecer", + offerBuilding: "Oferecer Construção", + offerCoaching: "Oferecer Coaching", + offerCuts: "Oferecer Cortes", + offerDesignArt: "Oferecer Design / Arte", + offerEditing: "Oferecer Edição", + offerFilming: "Oferecer Filmagem", + offerGraffiti: "Oferecer Grafite", + offerPhotography: "Oferecer Fotografia", + offerServices: "Oferecer Serviços", + yourProfiles: "Seus perfis do Lab", + preview: { + button: "Prévia", + title: "Prévia ao vivo", + desc: "É assim que seu perfil de {{noun}} vai aparecer depois de publicado.", + untitled: "Seu nome", + noBio: "Ainda sem bio — adicione uma linha sobre o que você oferece.", + years: "{{count}} anos de experiência", + portfolio: "Portfólio", + note: "Apenas prévia — nada foi publicado ainda.", + }, + draft: { + title: "Você tem um rascunho não salvo", + body: "Continue de onde parou — nada é publicado até você pressionar Publicar.", + resume: "Retomar rascunho", + discard: "Descartar rascunho", + }, + progress: { + title: "Completude do perfil", + count: "{{done}} de {{total}} concluídos", + photo: "Foto", + bio: "Bio", + skills: "Habilidades", + rate: "Valor", + location: "Localização", + contact: "Contato", + }, + wizard: { + identity: "Identidade", + offer: "O que você oferece", + rates: "Valores", + contact: "Contato", + media: "Mídia", + }, + offerTattoo: "Oferecer Tatuagem", + offerTraining: "Oferecer Treino / Fisioterapia", + organizeEvents: "Organizar Eventos", + resultsMany: "{{count}} resultados", + resultsOne: "{{count}} resultado", + searchCityPlaceholder: "Cidade…", + searchNamePlaceholder: "Nome, bio…", + showResults: "Mostrar resultados", + showResultsActive: "Mostrar resultados · {{count}} ativos", + skaterWord: "skatista", + sortBy: "Ordenar por", + theCrew: "A Crew", + topRated: "Mais bem avaliados", + trusted: "Confiável", + trustLevel: "Nível de confiança", + yearsExp: "{{count}} anos de exp.", + tabCoaches: "Coaches", + tabFilmers: "Filmers", + tabPhoto: "Foto", + tabEditors: "Editors", + tabBuilders: "Builders", + tabArtists: "Artistas", + tabGraffiti: "Grafite", + tabTattoo: "Tatuagem", + tabTrainers: "Treinadores", + tabMusic: "Música", + tabJudges: "Juízes", + tabOrganizers: "Organizadores", + tabBarbers: "Barbeiros", + filterSkillsToLearn: "Habilidades para aprender", + filterContentType: "Tipo de conteúdo", + filterEquipmentStyle: "Equipamento e estilo", + filterServices: "Serviços", + filterCamera: "Câmera", + filterLenses: "Lentes", + filterLighting: "Iluminação", + filterSupportRig: "Suporte e equipamento", + filterStyle: "Estilo", + filterWhatTheyBuild: "O que eles constroem", + filterMaterialsTrade: "Materiais e ofício", + filterProjectScale: "Escala do projeto", + filterWhatTheyMake: "O que eles fazem", + filterMedium: "Meio", + filterSoftwareTools: "Software e ferramentas", + filterWorkContext: "Contexto de trabalho", + filterMethod: "Método", + filterFocus: "Foco", + filterInjuriesTreated: "Lesões tratadas", + filterCredentialsSetting: "Credenciais e ambiente", + filterGenre: "Gênero", + filterInstrumentsRole: "Instrumentos e função", + filterEventFormats: "Formatos de evento", + filterSpecialty: "Especialidade", + filterLevelCircuit: "Nível / Circuito", + filterEventTypes: "Tipos de evento", + filterWhatYouHandle: "O que você cuida", + filterScale: "Escala", + filterWhatTheyOffer: "O que eles oferecem", + filterSignatureStyles: "Estilos marcantes", + filterSetting: "Ambiente", + filterEditType: "Tipo de edição", + role: { + coach: "Coach", + filmer: "Filmer", + builder: "Builder", + editor: "Editor de Vídeo", + photographer: "Photographer", + skater: "Skatista", + }, + empty: { + footer: "Tem dúvidas? Veja as Perguntas Frequentes →", + loginSuffix: "para criar um perfil.", + coachesTitle: "Ainda não há Coaches", + coachesBody: "Seja o primeiro a oferecer coaching de skate na sua região.", + filmersTitle: "Ainda não há Filmers", + filmersBody: "Seja o primeiro a oferecer filmagem de skate — clipes, partes completas, cobertura de campeonatos e mais.", + photographersTitle: "Ainda não há Photographers", + photographersBody: "Seja o primeiro a oferecer fotografia de skate na sua região — fotos de ação, sequências, editorial e mais.", + editorsTitle: "Ainda não há editores de vídeo", + editorsBody: "Seja o primeiro a oferecer serviços de edição de vídeo de skate.", + buildersTitle: "Ainda não há Builders", + buildersBody: "Seja o primeiro a listar sua construção de rampas, pistas ou DIY — concreto, madeira, corrimãos e mais.", + artistsTitle: "Ainda não há artistas", + artistsBody: "Seja o primeiro a oferecer arte de shape, logos, pôsteres e produtos para a cena.", + graffitiTitle: "Ainda não há artistas de grafite", + graffitiBody: "Seja o primeiro a oferecer peças, murais e arte de skatepark na sua região.", + tattooTitle: "Ainda não há tatuadores", + tattooBody: "Seja o primeiro tatuador da cultura do skate a se listar — flash, autoral, fine line e mais.", + trainersTitle: "Ainda não há treinadores", + trainersBody: "Seja o primeiro treinador ou fisioterapeuta a ajudar skatistas a ficarem fortes e saudáveis.", + musiciansTitle: "Ainda não há músicos", + musiciansBody: "Anda de skate e faz música? Adicione sua banda ou projeto solo — gêneros, instrumentos e links.", + judgesTitle: "Ainda não há juízes", + judgesBody: "Organiza campeonatos justos? Liste-se para julgar Game of S.K.A.T.E., melhores truques, campeonatos e etapas de turnê.", + organizersTitle: "Ainda não há organizadores", + organizersBody: "Organiza encontros, campeonatos, rolês ou demos? Liste-se para skatistas te encontrarem e contratarem.", + barbersTitle: "Ainda não há barbeiros", + barbersBody: "Corta cabelo de skatistas? Liste sua cadeira ou serviço móvel para a cena dar aquele trato.", + }, + become: { + addNip05: "Adicione NIP-05 nas Configurações", + backToLab: "Voltar para o The Lab", + bioWorkLabel: "Bio / Sobre seu trabalho", + checkContact: "Confira seus dados de contato", + cityArea: "Cidade / Região", + cityCountry: "Cidade, País", + connectWallet: "Conectar Carteira", + connectWalletNwc: "Conectar Carteira com NWC", + contactInfo: "Informações de contato", + contactInfoDesc: "Como os clientes podem te alcançar (tudo opcional, mas recomendado)", + coordinatesOptional: "Coordenadas (opcional)", + email: "E-mail", + failedToPublish: "Falha ao publicar", + fromNostrProfile: "Do seu perfil Nostr", + geolocationUnsupported: "Geolocalização não suportada", + getting: "Obtendo…", + headline: "Título", + headlineHint: "Mostrado como o título do seu cartão do Lab — ex.: “{{example}}”. Usa seu nome por padrão.", + imageUploaded: "Imagem enviada", + instagram: "Instagram", + invalidEmail: "Digite um endereço de e-mail válido.", + invalidPortfolio: "Digite uma URL de portfólio válida.", + invalidWebsite: "Digite uma URL de site válida.", + latitude: "Latitude", + learnHow: "Saiba como", + locationError: "Erro de localização", + locationFound: "Localização encontrada", + loginRequired: "Login necessário", + loginRequiredDesc: "Você precisa entrar para criar um perfil de {{role}}.", + loginRequiredDescCraft: "Você precisa entrar para criar um perfil de {{noun}}.", + longitude: "Longitude", + nip05Recommended: "Verificação NIP-05 recomendada", + nip05RecommendedDesc: "Verifique sua identidade para ganhar a confiança dos clientes.", + noWallet: "Nenhuma carteira conectada", + otherSocial: "Outra rede social", + paymentSetup: "⚡ Configuração de pagamento necessária", + phoneNumber: "Número de telefone", + profilePhoto: "Foto do perfil", + profilePublished: "Seu perfil foi publicado.", + publishing: "Publicando...", + socialMedia: "Redes sociais", + tip: "💡 Dica: a maioria das carteiras Lightning é compatível com NWC (Alby, Minibits, Zeus, Coinos).", + tipWithTime: "💡 Dica: a maioria das carteiras Lightning é compatível com NWC (Alby, Minibits, Zeus, Coinos). Leva 30 segundos para configurar.", + upload: "Enviar", + uploadFailed: "Falha no envio", + uploadImage: "Enviar imagem", + uploading: "Enviando…", + useCurrentLocation: "Usar localização atual", + useMyLocation: "Usar minha localização", + usingNwc: "Usando Nostr Wallet Connect", + usingWebln: "Usando extensão de navegador WebLN", + walletConnected: "Carteira conectada — pronta para receber pagamentos!", + website: "Site", + yearsExperience: "Anos de experiência", + }, + coachForm: { + anonymous: "Coach anônimo", + bioLabel: "Bio / Filosofia de coaching", + bioPlaceholder: "Sua experiência, estilo de ensino...", + create: "CRIAR PERFIL DE COACH", + created: "Perfil de Coach criado!", + createPro: "CRIAR PERFIL DE COACH PRO", + dmNote: "💬 Alunos podem te mandar mensagem direto pelo mensageiro criptografado do SkateSpots", + heading: "Torne-se um Coach", + headlineExample: "Skate Coach Berlin", + hourlyRate: "Valor por hora", + identity: "Sua identidade de Coach", + nip05Reason: "Adicione um identificador NIP-05 para verificar sua identidade e ganhar a confiança dos alunos — mostra a eles que você é um Coach legítimo.", + paymentDesc: "Para receber pagamentos de aulas dos alunos, você precisa conectar uma carteira Lightning. Os alunos vão te dar Zap diretamente pelas sessões de coaching.", + profileDesc: "Fale aos alunos sobre sua experiência", + profileTitle: "Perfil de Coach", + ratePlaceholder: "5000 sats/h", + selectSkill: "Selecione ao menos uma habilidade.", + skillsLabel: "Habilidades que ensino * (selecione ao menos uma)", + skillsRequired: "Habilidades obrigatórias", + formatsLabel: "Formatos de sessão", + formatsHint: "Como você entrega o coaching.", + levelsLabel: "Níveis ensinados", + agesLabel: "Faixas de idade", + credentialsLabel: "Credenciais e segurança", + credentialsHint: "Autodeclarado — o SkateSpots não verifica isso.", + languagesLabel: "Idiomas falados", + languagesHint: "Adicione os idiomas em que você pode dar coaching.", + languagePlaceholder: "ex.: Português, Español", + availabilityLabel: "Disponibilidade", + bookingLabel: "Link de agendamento", + bookingHint: "Opcional — uma página onde os alunos podem agendar e pagar.", + galleryLabel: "Fotos do portfólio", + galleryHint: "Mostre sessões reais, alunos e Spots (até 12).", + galleryAdd: "Adicionar fotos do portfólio", + galleryUploaded: "{{count}} foto(s) enviada(s)", + videoLabel: "Reel de destaque", + videoHint: "Opcional — um vídeo no YouTube ou Instagram do seu coaching.", + formatOneOnOne: "Individual", + formatGroup: "Em grupo", + formatCamp: "Camp", + formatVideo: "Análise de vídeo", + formatContestPrep: "Preparação para campeonato", + formatParkLesson: "Aula na pista", + formatAdaptive: "Adaptado", + formatGirls: "Sessão para meninas", + formatAfterSchool: "Após a escola", + levelBeginner: "Iniciante", + levelIntermediate: "Intermediário", + levelAdvanced: "Avançado", + levelCompetition: "Competição", + ageKids: "Crianças", + ageTeens: "Adolescentes", + ageAdults: "Adultos", + ageSeniors: "Idosos", + certFirstAid: "Primeiros socorros", + certCpr: "RCP", + certSafeguarding: "Proteção infantil", + certBackgroundCheck: "Antecedentes criminais", + certInsured: "Segurado", + certFederation: "Coach de federação nacional", + certQualification: "Qualificação de coaching", + certJudge: "Juiz de competição", + certNoteLabel: "Outras credenciais (opcional)", + certNotePlaceholder: "ex.: Skateboard GB Nível 2, 8 anos de coaching…", + availWeekdays: "Dias de semana", + availWeekends: "Fins de semana", + availEvenings: "Noites", + availAfterSchool: "Após a escola", + availHolidays: "Férias escolares", + availSeasonal: "Sazonal", + sectionWhatYouCoach: "O que você ensina", + sectionCredentials: "Credenciais e segurança", + sectionAvailability: "Disponibilidade e agendamento", + sectionWhereYouCoach: "Onde você dá coaching", + sectionPortfolio: "Portfólio", + rateAmountLabel: "Valor", + rateCurrencySats: "sats", + rateCurrencyUsd: "USD", + rateCurrencyEur: "EUR", + rateCurrencyGbp: "GBP", + perHour: "por hora", + perSession: "por sessão", + perHalfDay: "por meio período", + perDay: "por dia", + perCamp: "por camp", + perProject: "por projeto", + perEvent: "por evento", + perGig: "por show", + perShoot: "por ensaio", + perPiece: "por peça", + perCut: "por corte", + perMonth: "por mês", + availByAppointment: "Com agendamento", + rateNotesLabel: "Observações do valor (opcional)", + rateNotesPlaceholder: "Preço social, primeira sessão grátis, deslocamento incluído…", + sectionPayments: "Pagamentos", + paymentMethodsHint: "Como os clientes podem te pagar. Isto é uma declaração — o SkateSpots nunca retém fundos.", + payMethodCash: "Dinheiro no local", + payMethodLightning: "Lightning", + payMethodCashu: "Cashu", + payMethodBank: "Transferência bancária", + payMethodOther: "Outro", + payWhatYouCanLabel: "Preço social / pague o quanto puder", + bookingFeeLabel: "Taxa de agendamento (opcional)", + bookingFeeHint: "Uma pequena taxa paga diretamente a você para confirmar um agendamento. O SkateSpots não retém nem reembolsa.", + paymentNoteLabel: "Observação de pagamento (opcional)", + paymentNotePlaceholder: "Primeira sessão grátis, deslocamento incluído, pagamento após a sessão…", + spotsDesc: "Selecione os Spots onde você oferece sessões de coaching", + spotsLabel: "Spots onde você dá coaching", + tagline: "Compartilhe seu conhecimento de skate", + update: "ATUALIZAR PERFIL DE COACH", + updated: "Perfil de Coach atualizado!", + }, + filmerForm: { + anonymous: "Filmer anônimo", + bioPlaceholder: "Sua experiência, estilo, equipamento...", + camerasLabel: "Câmeras e equipamento * (selecione ao menos um)", + create: "CRIAR PERFIL DE FILMAGEM", + created: "Perfil de filmagem criado!", + createPro: "CRIAR PERFIL DE FILMAGEM PRO", + dmNote: "💬 Clientes podem te mandar mensagem direto pelo mensageiro criptografado do SkateSpots", + gearHelper: "Liste suas câmeras, lentes e rigs exatos — skatistas se importam com o setup.", + gearLabel: "O que tem na bolsa (opcional)", + gearPlaceholder: "ex.: Sony VX1000 + fisheye MK1, Panasonic HVX200, gimbal DJI RS3, GoPro Hero 12, microfone Sennheiser...", + heading: "Torne-se um Filmer", + headlineExample: "Skate Filmer Berlin", + identity: "Sua identidade de Filmer", + nip05Reason: "Adicione um identificador NIP-05 para verificar sua identidade e ganhar a confiança dos clientes — mostra a eles que você é um Filmer legítimo.", + paymentDesc: "Para receber pagamentos de clientes pelos serviços de filmagem, você precisa conectar uma carteira Lightning. Os clientes vão te dar Zap diretamente pelo seu trabalho.", + profileDesc: "Fale aos clientes sobre sua experiência em filmagem", + profileTitle: "Perfil de filmagem", + rate: "Valor", + ratePlaceholder: "10000 sats/vídeo", + reelLabel: "Reel / Portfólio", + selectService: "Selecione ao menos um serviço.", + selectSkill: "Selecione ao menos uma habilidade de filmagem.", + servicesLabel: "Serviços oferecidos * (selecione ao menos um)", + servicesRequired: "Serviços obrigatórios", + skillsRequired: "Habilidades obrigatórias", + spotsDesc: "Selecione os Spots onde você oferece serviços de filmagem", + spotsLabel: "Spots onde você filma", + tagline: "Ofereça sua filmagem de vídeo de skate — clipes, linhas, partes completas e cobertura de campeonatos", + update: "ATUALIZAR PERFIL DE FILMAGEM", + updated: "Perfil de filmagem atualizado!", + }, + editorForm: { + anonymous: "Editor anônimo", + bioPlaceholder: "Seu estilo de edição, experiência, projetos notáveis…", + contactPortfolio: "Contato e portfólio", + create: "Publicar perfil de Editor", + created: "Perfil de Editor criado!", + createPro: "Publicar perfil de Editor Pro", + editTypes: "Tipos de edição oferecidos * (selecione ao menos um)", + hardware: "Hardware", + hardwarePlaceholder: "ex.: MacBook Pro M3, Sony FX3", + heading: "Torne-se um Editor de Vídeo", + headlineExample: "Editor de Vídeo de Skate", + identity: "Sua identidade", + locationOptional: "Localização (opcional)", + loginDesc: "Entre para criar seu perfil de editor de vídeo.", + phoneTelegram: "Telefone / Telegram", + portfolioPlaceholder: "Portfólio (Vimeo, YouTube…)", + profileDesc: "Fale à comunidade sobre seu estilo de edição e habilidades", + profileTitle: "Perfil de Editor", + published: "Seu perfil foi publicado no SkateSpots.", + rate: "Valor / Preço", + ratePlaceholder: "ex.: 50k sats/min, DM para orçamento", + selectService: "Selecione ao menos um tipo de edição.", + servicesRequired: "Serviços obrigatórios", + socialPlaceholder: "Instagram / @ da rede social", + software: "Software", + softwareHardware: "Habilidades de software e hardware", + softwarePlaceholder: "ex.: DaVinci Resolve, Premiere", + tagline: "Ofereça seus serviços de edição de vídeo para a comunidade do skate", + thumbnail: "Miniatura do perfil / showreel", + update: "Atualizar perfil de Editor", + updated: "Perfil de Editor atualizado!", + walletConnected: "Carteira conectada ✓", + walletDesc: "Receba pagamentos em Bitcoin ⚡ direto dos clientes pelo seu trabalho de edição.", + walletTitle: "⚡ Carteira Lightning para pagamentos", + yearsExperience: "Anos de experiência", + yearsPlaceholder: "ex.: 5 anos", + }, + photoForm: { + anonymous: "Photographer anônimo", + bioPlaceholder: "Sua experiência, estilo, o que você ama fotografar...", + cameraLabel: "Câmeras * (selecione ao menos uma)", + cameraRequired: "Câmera obrigatória", + contactDesc: "Como os skatistas podem ver seu trabalho e te alcançar (tudo opcional, mas recomendado)", + create: "CRIAR PERFIL DE FOTOGRAFIA", + created: "Perfil de fotografia criado!", + createPro: "CRIAR PERFIL DE FOTOGRAFIA PRO", + dmNote: "💬 Skatistas podem te mandar mensagem direto pelo mensageiro criptografado do SkateSpots", + gearHelper: "Liste corpos, lentes e luzes exatos — skatistas adoram saber o setup.", + gearPlaceholder: "ex.: Canon R6 II, fisheye 8-15mm, 70-200mm f/2.8, 2× Godox AD200, disparadores remotos, tripé Manfrotto...", + heading: "Torne-se um Photographer", + headlineExample: "Fotografia de Skate", + identity: "Sua identidade de Photographer", + lensesLabel: "Lentes", + lightingLabel: "Equipamento de iluminação", + nip05Reason: "Adicione um identificador NIP-05 para verificar sua identidade e ganhar a confiança dos clientes.", + paymentDesc: "Para receber por ensaios, conecte uma carteira Lightning. Os clientes vão te dar Zap diretamente pelo seu trabalho.", + portfolioLabel: "Portfólio / Instagram", + profileDesc: "Fale aos skatistas sobre seu olhar, seu kit e seus serviços", + profileTitle: "Perfil de fotografia", + ratePlaceholder: "20000 sats/ensaio", + selectCamera: "Selecione ao menos um tipo de câmera que você usa.", + selectService: "Selecione ao menos um serviço que você oferece.", + servicesLabel: "Serviços oferecidos * (selecione ao menos um)", + servicesRequired: "Serviços obrigatórios", + spotsDesc: "Selecione os Spots onde você oferece fotografia", + spotsLabel: "Spots onde você fotografa", + styleLabel: "Estilo de fotografia", + supportLabel: "Suporte e equipamento", + tagline: "Registre as sessões — ofereça sua fotografia de skate", + update: "ATUALIZAR PERFIL DE FOTOGRAFIA", + updated: "Perfil de fotografia atualizado!", + }, + builderForm: { + anonymous: "Builder anônimo", + bioLabel: "Bio / Sobre suas construções", + bioPlaceholder: "Sua crew, construções notáveis, como você aborda um projeto...", + buildTypesLabel: "O que você constrói * (selecione ao menos um)", + buildTypesRequired: "Tipos de construção obrigatórios", + cityBase: "Cidade / Base", + contactPortfolio: "Contato e portfólio", + contactPortfolioDesc: "Como a cena pode ver suas construções e te alcançar (tudo opcional, mas recomendado)", + create: "CRIAR PERFIL DE BUILDER", + created: "Perfil de Builder criado!", + createPro: "CRIAR PERFIL DE BUILDER PRO", + dmNote: "💬 Clientes podem te mandar mensagem direto pelo mensageiro criptografado do SkateSpots", + gearHelper: "Crews e clientes adoram conhecer seu kit e processo.", + gearLabel: "Como você trabalha / Equipamento (opcional)", + gearPlaceholder: "ex.: equipe de concreto completa, betoneira própria + equipamento de projetado, solda móvel, cuidamos de licenças e drenagem...", + heading: "Torne-se um Builder", + headlineExample: "Construtor de Rampas e Pistas", + identity: "Sua identidade de Builder", + insured: "Licenciado / Segurado", + insuredHelper: "Relevante para trabalho em pistas públicas e prefeituras", + logoPhoto: "Logo / Foto", + materialsLabel: "Materiais e habilidades de ofício", + nip05Reason: "Adicione um identificador NIP-05 para verificar sua identidade e ganhar a confiança dos clientes.", + pastBuilds: "Construções anteriores / Instagram", + paymentDesc: "Para receber por construções, conecte uma carteira Lightning. Os clientes vão te dar Zap diretamente pelo seu trabalho.", + profileDesc: "Fale à cena o que você constrói e como trabalha", + profileTitle: "Perfil de Builder", + rateLabel: "Base do valor / orçamento", + ratePlaceholder: "por m² / por projeto", + scaleLabel: "Escala do projeto", + selectBuild: "Selecione ao menos uma coisa que você constrói.", + serviceArea: "Área de atendimento", + serviceAreaPlaceholder: "ex.: Catalunha, viajo pela UE", + spotsDesc: "Vincule Spots e pistas que você construiu para as pessoas verem seu trabalho no mapa", + spotsLabel: "Spots que você construiu", + tagline: "Concretou, soldou, construiu — liste sua construção de rampas e pistas", + update: "ATUALIZAR PERFIL DE BUILDER", + updated: "Perfil de Builder atualizado!", + yearsBuilding: "Anos construindo", + }, + skaterForm: { + backToSkaters: "Voltar aos Skatistas", + bioHelperPulled: "Puxado do seu perfil — ajuste para o seu cartão de skatista ou deixe como está.", + bioHelperShort: "Uma pequena introdução para o seu cartão de skatista.", + bioPlaceholder: "Há quanto tempo você anda, o que você curte, no que está trabalhando…", + browseSpots: "Explorar Spots", + changePhoto: "Alterar foto do perfil", + chipBio: "Bio", + chipPhoto: "Foto", + cityArea: "Cidade / região", + created: "Você está no mapa! 🛹", + custom: "Personalizado", + customHelper: "Seu próprio rótulo — mostrado no seu cartão de skatista em vez de uma predefinição.", + customPlaceholder: "ex.: OG, Weekend Warrior, Aposentado…", + discoverable: "Outros skatistas agora podem te descobrir.", + editFullProfile: "editar seu perfil completo", + fromProfile: "Do seu perfil", + heroEditPrefix: "Edite seu", + heroJoinPrefix: "Entre no", + heroSuffix: "Diretório", + homeHelper: "Digite livremente, ou vincule um Spot real do mapa para as pessoas irem até lá.", + homePlaceholder: "Pista / praça local — ou toque em “Explorar Spots”", + homeSpot: "Spot de casa", + layerEnd: "para mudá-los em todos os lugares.", + layerIntro: "Esta é a sua", + layerMid: ", construída sobre seu perfil Nostr. Seu nome, foto, bio, Lightning e verificação vêm de lá —", + layerWord: "camada de skate", + level: "Nível", + linked: "Vinculado a um Spot no mapa", + loadingProfile: "Carregando seu perfil…", + loadingSpots: "Carregando Spots…", + locationHelper: "Ajuda outras pessoas a encontrar skatistas perto delas. Só uma área aproximada é compartilhada.", + loginToJoin: "Entre para participar", + loginToJoinDesc: "Crie seu perfil de skatista para a comunidade te encontrar.", + mappedSpot: "Spot no mapa", + noSpots: "Nenhum Spot encontrado ainda.", + noSpotsMatch: "Nenhum Spot corresponde à sua busca.", + openMap: "Abrir o mapa", + pickEverything: "Escolha tudo que combina com seu estilo.", + pickHomeSpot: "Escolha seu Spot de casa", + pickStyles: "Escolha seus estilos", + pickStylesDesc: "Escolha ao menos uma coisa que você anda.", + profilePic: "Foto do perfil", + profilePicHelper: "Seu cartão de skatista usa sua foto de perfil do Nostr — a mesma imagem em todo lugar.", + publishingAs: "Publicando como", + putOnMap: "Me coloque no mapa", + searchSpots: "Buscar Spots por nome ou cidade…", + skateStory: "Sua história no skate", + stance: "Base", + unlinkSpot: "Desvincular Spot", + updateButton: "Atualizar meu perfil", + updated: "Perfil atualizado!", + whatYouSkate: "O que você anda *", + yearsPlaceholder: "ex.: 8", + yearsSkating: "Anos andando", + yourProfilePic: "Sua foto de perfil", + zapsOn: "Zaps ativados", + }, + skaters: { + clearSearch: "Limpar busca", + community: "A Comunidade", + countMany: "skatistas", + countOne: "skatista", + editProfile: "Editar meu perfil de skatista", + heroDesc: "Encontre sua galera. Explore a crew de skatistas que representam o SkateSpots — por estilo, base, nível e cidade.", + nip05Verified: "NIP-05 verificado", + noMatches: "Nenhum resultado", + noneDesc: "Seja o primeiro a entrar no diretório e colocar o SkateSpots no mapa.", + noneTitle: "Ainda não há skatistas", + noVerifiedMatch: "Nenhum skatista verificado corresponde", + searchPlaceholder: "Buscar por nome, cidade ou npub…", + tryDifferentSearch: "Tente outra busca ou limpe seus filtros.", + tryTurnOffVerified: "Tente desativar o filtro “Verificado” para ver todo mundo.", + verifiedFilterTitle: "Mostrar apenas skatistas com uma identidade NIP-05 verificada", + }, + skaterCard: { + inDirectory: "Você está no Diretório de Skatistas", + joinDesc: "Adicione sua base, estilos e nível para skatistas te encontrarem.", + joinTitle: "Entrar no Diretório de Skatistas", + }, + crewsStrip: { + allCrews: "Todas as Crews", + memberMany: "{{count}} membros", + memberOne: "{{count}} membro", + title: "Crews nesta cena", + }, + labLink: { + coach: "Coach", + filmer: "Filmer", + editor: "Editor", + photographer: "Photographer", + builder: "Builder", + artist: "Artista", + graffiti: "Grafite", + tattoo: "Tatuagem", + trainer: "Treinador", + musician: "Músico", + judge: "Juiz", + barber: "Barbeiro", + organizer: "Organizador", + lab: "Lab", + linkedProfiles: "Perfis do Lab vinculados", + desc: "Também tem um estúdio, coaching ou serviço de construção? Vincule seus anúncios do Lab para as pessoas contratarem sua crew. Opcional. Quando o perfil do Lab também vincula de volta a esta crew, ambos mostram um selo", + descEnd: "verde.", + empty: "Você ainda não tem nenhum perfil do Lab. Crie um no The Lab para vinculá-lo aqui.", + }, + proUpgrade: { + goPro: "Seja Pro", + optional: "· opcional", + freeTo: "Grátis para listar. Pro adiciona um", + proBadge: "selo Pro", + featuredPlacement: "posicionamento em destaque", + atTop: "no topo do The Lab.", + active: "Ativo", + benefit1: "Selo \"Pro\" dourado no seu perfil e cartões", + benefit2: "Destaque primeiro quando skatistas exploram o The Lab", + benefit3: "Apoia o SkateSpots — sem anúncios, sem intermediários", + platformOwner: "Dono da plataforma — Pro está sempre ativo.", + proActiveOne: "Pro ativo · {{count}} dia restante. Seu perfil ficará em destaque.", + proActiveMany: "Pro ativo · {{count}} dias restantes. Seu perfil ficará em destaque.", + context: "Seu perfil continua no ar de graça depois que o Pro expira — você só perde o selo e o destaque.", + }, + profilePreview: { + viewPublic: "Ver público", + unnamed: "Skatista sem nome", + noHandle: "Ainda sem handle", + }, + pyramid: { + pyramidWord: "PIRÂMIDE", + rankingsWord: "RANKINGS", + subtitle: "Maiores contribuidores da sua cidade", + yourRank: "Sua posição", + keepContributing: "Continue contribuindo para subir mais!", + topContributors: "Maiores contribuidores", + noContributors: "Ainda não há contribuidores. Seja o primeiro a adicionar um Spot ou criar um evento!", + spots: "Spots", + events: "Eventos", + total: "Total", + trust: "Confiança", + }, + detail: { + joined: "Entrou em", + about: "Sobre", + howWeWork: "Como trabalhamos", + inTheBag: "Na bolsa", + hardware: "Hardware", + software: "Software", + eventsJudged: "Eventos julgados", + eventsOrganized: "Eventos organizados", + spots: "Spots", + viewSpot: "Ver Spot", + credentialsTitle: "Credenciais e segurança", + selfAttested: "Autodeclarado pelo Coach — não verificado pelo SkateSpots.", + formats: "Formatos", + levels: "Níveis", + ages: "Idades", + languages: "Idiomas", + availability: "Disponibilidade", + bookSession: "Agendar uma sessão", + portfolio: "Portfólio", + watchReel: "Assistir no {{platform}}", + paymentsTitle: "Pagamentos", + payWhatYouCan: "Pague o quanto puder", + bookingFee: "Taxa de agendamento", + payBookingFee: "Pagar taxa de agendamento", + bookingFeeNote: "Pago diretamente ao Coach. O SkateSpots não retém nem reembolsa.", + bookingFeeNoRail: "Este Coach não tem endereço Lightning configurado, então o pagamento no app não está disponível — entre em contato para combinar o pagamento.", + serviceArea: "Área de atendimento", + licensedInsured: "Licenciado / Segurado", + studio: "Estúdio", + shopStudio: "Loja / Estúdio", + booksOpen: "Agenda aberta", + credentials: "Credenciais", + remoteOnline: "Remoto / Online disponível", + graffitiCrew: "Crew de Grafite", + act: "Atração", + listen: "Ouvir", + upcomingGigs: "Próximos shows", + past: "Passado", + experience: "Experiência", + yearsCount: "{{count}} anos", + rate: "Valor", + contact: "Contato", + sendMessage: "Enviar mensagem", + bookGig: "Contratar para um show", + portfolioDomain: "Portfólio · {{domain}}", + manage: "Gerenciar", + admin: "Admin", + editProfile: "Editar perfil", + publishedTitle: "Você está no ar", + publishedBody: "Seu perfil foi publicado no The Lab. Compartilhe para skatistas te encontrarem.", + manageRemove: "Remova seu perfil de {{noun}} do The Lab.", + adminTakeDown: "Derrubar este perfil de {{noun}}. Ele ficará oculto em todo o SkateSpots.", + entityLabel: "perfil de {{noun}}", + deleteProfile: "Excluir perfil", + location: "Localização", + servicesSkills: "Serviços e habilidades", + noun: { + coach: "coach", + filmer: "filmer", + editor: "editor de vídeo", + photographer: "photographer", + builder: "builder", + artist: "artista", + graffiti: "artista de grafite", + tattoo: "tatuador", + trainer: "treinador", + musician: "músico", + judge: "juiz de eventos", + organizer: "organizador de eventos", + barber: "barbeiro", + profile: "perfil", + }, + skillsTitle: { + skills: "Habilidades", + servicesGear: "Serviços e equipamento", + whatWeBuild: "O que construímos", + whatTheyMake: "O que eles fazem", + stylesWork: "Estilos e trabalho", + styles: "Estilos", + focusSpecialties: "Foco e especialidades", + genresInstruments: "Gêneros e instrumentos", + formatsSpecialties: "Formatos e especialidades", + servicesStyles: "Serviços e estilos", + eventTypesServices: "Tipos de evento e serviços", + }, + }, + rider: { + heroDesc: "Sua identidade de skatista verificável. Assinada no Nostr, pronta para imprimir, impossível de falsificar.", + heroDesc2: "Ganhe selos de habilidade testemunhados por outros skatistas. Tenha passes de acesso a pistas. Compartilhe seu cartão em qualquer lugar.", + headerTagline: "Assinado no Nostr · Pronto para imprimir · Verificado por QR", + tabCard: "Meu cartão", + tabBadges: "Selos", + tabAward: "Conceder", + rendering: "Renderizando…", + shareCard: "Compartilhar cartão", + savePng: "Salvar PNG", + print: "Imprimir", + copyId: "Copiar ID", + cardType: "Tipo de cartão", + licenseLabel: "Licença de Skatista", + licenseSub: "Sua identidade pessoal de rider", + parkLabel: "Acesso à pista", + parkSub: "Emita passes como dono de pista", + theme: "Tema", + holoTitle: "Brilho holográfico", + holoDesc: "Efeito de lâmina animado", + cardDetails: "Detalhes do cartão", + skateStyle: "Estilo de skate", + ridesFor: "Anda por", + ridesForPlaceholder: "Loja local…", + sponsors: "Patrocinadores", + sponsorsPlaceholder: "Marcas…", + showOnCard: "Mostrar no cartão", + zaps: "Zaps ⚡", + skills: "Habilidades", + selected: "{{count}}/6 selecionados", + goldBadgesHint1: "Selos dourados no seu cartão vêm de outros skatistas que testemunharam você — veja os", + goldBadgesHint2: ".", + parkOwnersOnly: "Apenas donos de pista.", + parkOwnersDesc: "Emita isto usando a mesma chave Nostr que publicou seu anúncio de pista. Qualquer um pode escanear o QR e verificar a assinatura on-chain — nenhuma autoridade central é necessária.", + parkDetails: "Detalhes da pista", + parkName: "Nome da pista", + parkNamePlaceholder: "The Berrics…", + riderName: "Nome do rider", + riderNamePlaceholder: "Nome no cartão", + riderNpub: "ID Nostr do rider (npub)", + accessLevel: "Nível de acesso", + validThru: "Válido até", + publishToNostr: "Publicar no Nostr", + badgesIntro: "Estes selos foram testemunhados e assinados por outros skatistas no Nostr. Eles aparecem como chips dourados ⭐ no seu cartão.", + earnMore: "Quer ganhar mais? Ande na frente de alguém e peça para testemunhar seu truque.", + awardSomeone: "Conceder um selo a outra pessoa", + youSawIt: "Você viu acontecer", + youSawItDesc: "Assine a prova no Nostr. Ela vira parte do registro permanente da pessoa — criptograficamente ligada à sua chave.", + skillsWitnessed: "Habilidades que você testemunhou", + whereSeen: "Onde você viu?", + optional: "(opcional)", + signingOnNostr: "Assinando no Nostr…", + awardBadge: "Conceder selo", + addRiderSkill: "Adicione o npub do rider + ao menos uma habilidade", + invalidNpub: "npub inválido", + badgeAwarded: "🏅 Selo concedido!", + badgeSent: "{{skills}} enviados.", + failed: "Falhou", + couldNotRender: "Não foi possível renderizar o cartão", + popupBlocked: "Popup bloqueado", + popupBlockedDesc: "Permita popups para este site.", + linkCopied: "🔗 Link copiado!", + enterRiderNpub: "Digite o npub do rider", + parkPublished: "✅ Cartão de Acesso à Pista publicado!", + publishFailed: "Falha ao publicar", + noBadges: "Ainda sem selos. Ande na frente de alguém e peça para testemunhar seus truques!", + showMore: "Mostrar mais {{count}}", + witnessedBy: "Testemunhado por", + at: "em", + previewLicense: "Licença de Skatista", + previewSince: "Desde {{year}}", + previewEvts: "Evts", + previewScan: "Escaneie para verificar", + previewSkatepark: "Skatepark", + previewAccessPass: "Passe de acesso", + previewMemberName: "Nome do membro", + previewIssuedBy: "Emitido pelo dono da pista · Assinado no Nostr", + previewValidThru: "Válido até", + previewNostrVerified: "Verificado no Nostr", + }, + craftFields: { + detailsTitle: "Detalhes adicionais", + deliverables: "Entregáveis", + turnaround: "Prazo de entrega", + surfaces: "Superfícies / Paredes", + maxSize: "Tamanho máximo", + setLength: "Duração do set", + techRider: "Rider técnico", + travel: "Deslocamento", + certifications: "Certificações", + insurance: "Seguro", + permits: "Licenças", + deposit: "Sinal", + minimum: "Mínimo", + modalities: "Modalidades", + duration: "Duração do atendimento", + drone: "Drone", + leadTime: "Prazo", + warranty: "Garantia", + }, + craftForm: { + profileImage: "Imagem do perfil", + nameHeadline: "Nome / título", + about: "Sobre", + aboutPlaceholder: "Fale aos skatistas sobre seu trabalho de {{noun}}…", + required: "obrigatório", + nip05Title: "Adicione NIP-05 para ganhar confiança", + nip05Desc: "Um identificador NIP-05 ajuda skatistas a verificarem que você é de verdade. Altamente recomendado antes de listar.", + editingNote: "Editando seu perfil de {{noun}} existente — publicar o substitui.", + location: "Localização", + pinned: "📍 Fixado no mapa ({{lat}}, {{lng}})", + experienceYears: "Experiência (anos)", + expPlaceholder: "ex.: 5", + ratePlaceholder: "ex.: 20k sats / por projeto", + contactLinks: "Contato e links", + phoneOptional: "Telefone (opcional)", + emailOptional: "E-mail (opcional)", + socialPlaceholder: "Rede social (Instagram, etc.)", + gettingPaid: "Recebendo pagamento", + updateProfile: "Atualizar perfil", + publishProfile: "Publicar perfil", + rateLeftBlankNote: "Opcional — deixe em branco se o valor acima já basta.", + sectionRequired: "{{section}} obrigatório", + sectionRequiredDesc: "Selecione ao menos uma opção em \"{{section}}\".", + updated: "Perfil atualizado!", + created: "Perfil criado!", + headlineExample: "Skate Coach Berlin", + }, + }, + socialUi: { + agentPanel: { + spot: "Spot", + event: "Evento", + labPro: "Lab pro", + gear: "Equipamento", + crew: "Crew", + description: "Conhece esta crew — seus encontros, elenco e chamada aberta — além da cena mais ampla com dados ao vivo.", + greeting: "E aí! Sou o Sasquatch, o guia da {{crew}}. Me pergunte sobre a crew — nosso próximo encontro, quem comanda, o que buscamos — ou sobre a cena mais ampla.", + suggestion1: "Qual é o nosso próximo encontro?", + suggestion2: "Quem comanda esta crew?", + suggestion3: "O que estamos procurando?", + suggestion4: "Melhores Spots perto da gente?", + suggestion5: "Como está o tempo para andar de skate?", + thinking: "Sasquatch está pensando…", + placeholder: "Pergunte sobre sua cena local…", + disclaimer: "A IA pode errar — os links levam a anúncios reais.", + }, + badge: { + upcomingOne: "{{count}} evento futuro", + upcomingMany: "{{count}} eventos futuros", + comingOne: "{{count}} evento chegando", + comingMany: "{{count}} eventos chegando", + }, + bell: { + youAreIn: "Você está na {{crew}}! 🛹", + membershipConfirmed: "Participação confirmada.", + couldNotConfirm: "Não foi possível confirmar", + addedYouTo: "adicionou você a", + confirmToAppear: "Confirme para aparecer como membro.", + notifications: "Notificações", + notificationsNew: "Notificações ({{count}} novas)", + unreadCount: "{{count}} notificações não lidas", + markRead: "Marcar como lidas", + allClear: "Tudo em dia", + tabAll: "Tudo", + tabTrades: "Negociações", + tabSocial: "Social", + tabNews: "Notícias", + tabCrews: "Crews", + checkingUpdates: "Verificando atualizações…", + checkingTrades: "Verificando ofertas e negociações…", + loadingDrops: "Carregando os últimos lançamentos…", + emptyAll: "Ofertas, negociações, Zaps, respostas, lançamentos da newsletter e atividade das crews vão aparecer aqui.", + emptyTrades: "Ofertas, contra-ofertas e confirmações de negociação chegam todas aqui — seja você vendendo, comprando ou trocando.", + emptySocial: "Zaps, reações, reposts, menções, respostas, RSVPs de eventos e atualizações de anfitriões chegam todas aqui.", + emptyNews: "Os lançamentos da newsletter do SkateSpots vão aparecer aqui. Assine na página da Newsletter.", + emptyCrews: "Convites de crew, pedidos coletivos e pedidos de participação vão aparecer aqui.", + subscribeBanner: "Assine para receber novos lançamentos no seu sino", + read: "Lida", + allCaughtUp: "Você está em dia", + }, + chat: { + hidden: "Oculta", + hideMessageAria: "Ocultar esta mensagem", + hideMessageTitle: "Ocultar mensagem (admin)", + messageHidden: "Mensagem oculta", + messageHiddenDesc: "Oculta do chat da crew para todos.", + messageHideFailed: "Falha ao ocultar a mensagem", + encryptionUnavailable: "Criptografia indisponível", + encryptionUnavailableDesc: "Seu signer não é compatível com criptografia NIP-44. Atualize sua extensão.", + messageFailed: "Falha na mensagem", + couldNotSend: "Não foi possível enviar a mensagem.", + noOneToMessage: "Ainda não há ninguém para conversar", + noOneToMessageDesc: "Esta crew não tem outros membros para conversar.", + subject: "chat da crew {{crew}}", + title: "Chat da Crew", + cordnBadgeTitle: "Roteado pelo coordenador Cordn desta crew via ContextVM. Criptografado de ponta a ponta.", + private: "Privado", + privateBadgeTitle: "Criptografado de ponta a ponta — só membros da crew podem ler estas mensagens.", + encryptedCordn: "Criptografado e roteado pelo coordenador da crew (Cordn) — nenhuma mensagem passa por relays públicos.", + encryptedNip17: "Chat em grupo criptografado para o fundador e todos os membros listados da crew.", + moderatorNote: " Você pode ocultar mensagens da crew como moderador.", + loginToSee: "Entre para ver se você pode participar do chat da crew.", + membersOnly: "Este chat é privado para membros da crew. Peça ao fundador para adicionar você à crew e entrar na conversa.", + noMessages: "Ainda não há mensagens. Comece o chat da crew — planeje uma sessão, compartilhe um Spot, anime um clipe.", + newMessages: "Novas mensagens", + new: "Nova", + placeholder: "Mande uma mensagem para sua crew…", + sendAria: "Enviar mensagem", + }, + collectiveJoinRequest: { + addedTitle: "{{name}} adicionado a {{collective}} 🛹", + addedDesc: "A pessoa vai confirmar do lado dela para aparecer como membro verificado.", + couldNotAdd: "Não foi possível adicionar o membro", + couldNotDismiss: "Não foi possível dispensar", + addedDone: "Adicionado", + addedTo: "a", + dismissedDone: "Pedido de {{name}} dispensado", + wantsToJoin: "quer entrar", + alreadyOnRoster: "Já está no elenco", + openCollective: "Abrir coletivo", + dismiss: "Dispensar", + addToCollective: "Adicionar ao coletivo", + }, + collectiveMembers: { + confirmed: "Confirmado", + pending: "Pendente", + pendingTooltip: "Listado pelo coletivo — aguardando a confirmação deste membro.", + crewOnly: "Só a Crew", + crewOnlyTooltip: "Este membro escolheu ser visível apenas para os colegas de crew. Você consegue vê-lo porque está na crew.", + hiddenMember: "Membro oculto", + title: "Membros", + verifiedOf: "{{confirmed}} de {{total}} verificados — cada membro confirmado assinou com sua própria chave Nostr.", + verifiedPerMember: "A participação é verificada por membro. Cada membro confirma com sua própria chave Nostr.", + adminsOne: "{{count}} admin ajuda a administrar a crew.", + adminsMany: "{{count}} admins ajudam a administrar a crew.", + }, + confirmMembership: { + public: "Público", + crewOnly: "Só a Crew", + confirmedTitle: "Participação confirmada!", + confirmedCrew: "Você está verificado em {{name}} — visível apenas para os colegas de crew.", + confirmedPublic: "Agora você aparece como membro verificado de {{name}}.", + failed: "Falha ao confirmar", + addedTo: "Você foi adicionado a {{name}}", + addedDesc: "Confirme sua participação para aparecer como verificado no seu perfil e no da pessoa.", + yourVisibility: "Sua visibilidade", + confirming: "Confirmando…", + confirmButton: "Confirmar participação", + }, + contacts: { + message: "Mensagem", + removePrivate: "Remover dos contatos privados", + savePrivate: "Salvar nos contatos privados", + seoTitle: "Contatos - SkateSpots", + seoDescription: "Sua cena — colegas de crew, pessoas que você segue e conversas recentes, com contatos privados criptografados.", + encryptionUnavailableDesc: "Seu signer não é compatível com criptografia NIP-44.", + removed: "Removido dos contatos privados", + saved: "Salvo nos contatos privados", + savedDesc: "Só você pode ver esta lista.", + updateFailed: "Não foi possível atualizar os contatos", + loginTitle: "Sua cena, em um só lugar", + loginDesc: "Entre para ver seus colegas de crew, pessoas que você segue e conversas recentes — e manter uma lista de contatos privada e criptografada.", + title: "Contatos", + subtitle: "Sua cena — colegas de crew, seguidores e conversas", + filterPlaceholder: "Filtrar por npub…", + tabCrew: "Crew", + tabFollows: "Seguindo", + tabDms: "DMs", + tabSaved: "Salvos", + emptyCrewmates: "Ainda não há colegas de crew. Entre ou crie uma crew para montar sua rede da cena.", + emptyFollowing: "Você ainda não segue ninguém.", + emptyDms: "Ainda não há conversas. Mande mensagem para um skatista para começar uma.", + savedHint: "Esta lista é criptografada com sua chave — só você pode lê-la. Toque na estrela de alguém para adicioná-lo.", + emptySaved: "Ainda não há contatos salvos. Marque pessoas com estrela em qualquer aba para montar sua agenda privada.", + }, + conversation: { + unknown: "Desconhecido", + seoTitle: "Conversa com {{name}} - SkateSpots", + seoDescription: "Conversa privada criptografada", + sendFailed: "Falha ao enviar a mensagem", + sendFailedDesc: "Tente novamente em instantes.", + tradeConfirmed: "Negociação confirmada", + tradeConfirmedDesc: "Reputação atualizada para vocês dois.", + tradeConfirmFailed: "Não foi possível confirmar a negociação", + somethingWrong: "Algo deu errado.", + soldNote: "Vendido para {{name}}.", + saleConfirmed: "Venda confirmada", + saleConfirmedDesc: "{{name}} agora pode confirmar o lado dele.", + saleConfirmFailed: "Não foi possível confirmar a venda", + escrowRedeemed: "Escrow resgatado", + escrowRedeemedDesc: "Os fundos agora estão na sua carteira Cashu.", + escrowRedeemFailed: "Não foi possível resgatar o escrow", + loginTitle: "Entre para ver as mensagens", + secureLoginTitle: "Login seguro necessário", + secureLoginDesc: "As mensagens exigem um app signer seguro.", + encrypted: "Criptografado", + refresh: "Atualizar", + didCompleteTrade: "Você concluiu esta negociação?", + recordedSale: "{{name}} registrou a venda. Confirme para atualizar a reputação de vocês dois.", + confirm: "Confirmar", + confirmSale: "Confirmar esta venda?", + askedToRecord: "{{name}} pediu para você registrar. Confirmar constrói reputação para vocês dois.", + confirmSaleButton: "Confirmar venda", + redeemEscrow: "Resgatar escrow", + escrowAppOnly: "O escrow Cashu é só no app — abra o SkateSpots no seu celular para resgatar.", + startThread: "Envie uma mensagem para iniciar a conversa", + placeholder: "Digite uma mensagem...", + e2eeNote: "As mensagens são criptografadas de ponta a ponta com NIP-17", + }, + coordinator: { + secondsAgo: "há {{count}}s", + minutesAgo: "há {{count}}m", + hoursAgo: "há {{count}}h", + daysAgo: "há {{count}}d", + statusIdle: "Não verificado", + statusChecking: "Verificando…", + statusOnline: "Conectado", + statusStale: "Silencioso", + statusOffline: "Não visto", + statusError: "Inacessível", + notACoordinator: "Isso não é um coordenador", + notACoordinatorDesc: "Cole um nprofile, um npub ou um link cordn.net.", + added: "Coordenador adicionado", + relayOne: "{{count}} relay", + relayMany: "{{count}} relays", + lastSeen: "visto por último {{time}}", + onlineDesc: "Anunciando. Grupos que o usam podem entregar mensagens agora.", + staleDesc: "Encontrado, mas não anunciou recentemente — pode estar dormindo.", + offlineDesc: "Nenhum anúncio visto. Pode ser privado (tudo bem) ou simplesmente offline.", + errorDesc: "Não foi possível alcançar os relays.", + idleDesc: "Verificando…", + checkingDesc: "Procurando o anúncio dele…", + eventFoundOne: "{{count}} evento encontrado.", + eventFoundMany: "{{count}} eventos encontrados.", + check: "Verificar", + addLinkCopied: "Link de adicionar copiado", + copyFailed: "Falha ao copiar", + copyManually: "Copie manualmente.", + addLink: "Adicionar link", + removeConfirm: "Remover este coordenador deste dispositivo?", + scanToJoin: "Escaneie no Cordn para entrar neste coordenador.", + noCoordinator: "Ainda sem coordenador", + noCoordinatorDescA: "Um coordenador entrega as mensagens", + encryptedWord: "criptografadas", + noCoordinatorDescB: "de grupo da sua crew em ordem. Ele vê quem, quando e qual grupo — nunca o conteúdo. Escolha um ou rode o seu próprio.", + change: "Trocar coordenador", + addTitle: "Adicionar um coordenador", + add: "Adicionar", + scanQR: "Escanear o QR de um coordenador", + inputPlaceholder: "nprofile… ou um link cordn.net", + runOwn: "Rode o seu próprio", + runOwnDesc: "Ele pode viver num celular velho, num Raspberry Pi ou em qualquer caixinha que você deixe ligada. Seu grupo continua funcionando enquanto ele estiver no ar — e você pode mover o grupo quando quiser.", + onPhone: "Num celular", + onPhoneDesc: "Use o app Cordn Coordinator e escaneie o QR dele aqui para adicioná-lo.", + openCordn: "Abrir Cordn", + scanItsQR: "Escanear o QR dele", + onServer: "Num servidor", + commandCopied: "Comando copiado", + copyCommand: "Copiar comando", + androidSleep: "O Android pode suspender um coordenador no celular. Espere mover um grupo de vez em quando.", + privacyNote: "🔒 Um coordenador só vê texto cifrado e metadados — nunca o conteúdo das mensagens. Rode o seu próprio para manter até os metadados com você.", + customTitle: "Coordenador de Chat personalizado", + customBadge: "· experimental · seu próprio relay", + customDescShort: "Opcional — sua crew já tem chat criptografado de ponta a ponta embutido, então você não precisa disto. Só configure se você roda o seu próprio", + remove: "Remover", + pointerNote: "Apenas um ponteiro por enquanto: um endpoint wss:// é usado como relay de chat da crew; um https:// via o relay ContextVM compartilhado. O MLS real do Cordn ainda não está conectado.", + cordnCoordinator: "Coordenador Cordn", + invalid: "Isso não parece um coordenador. Cole um nprofile, um link cordn.net ou uma URL https/wss.", + useMine: "Usar meu coordenador", + }, + createCrew: { + seoTitle: "Criar uma Crew - SkateSpots", + seoDescription: "Crie sua crew de skate — território, membros e Spots.", + loginRequired: "Login necessário", + loginRequiredDesc: "Você precisa entrar para criar uma crew.", + backToCrews: "Voltar às Crews", + title: "Criar uma Crew", + intro: "Sua família do skate — as pessoas com quem você anda. Só um nome já basta para começar; o resto é opcional.", + }, + crew: { + seoTitleNamed: "{{name}} - Crew do SkateSpots", + seoTitle: "Crew - SkateSpots", + seoDescription: "Uma crew de skate no SkateSpots.", + postHidden: "Publicação oculta", + postHiddenDesc: "Removida do feed da crew para todos.", + postHideFailed: "Falha ao ocultar a publicação", + backToCrews: "Voltar às Crews", + disband: "Desfazer", + youAreCaptain: "Você é capitão", + member: "Membro", + askSasquatch: "Perguntar ao Sasquatch", + agent: "Agente da Crew", + agentDesc: "O guia de IA da sua crew — Spots, eventos, Coaches e equipamento por perto, com dados ao vivo.", + eventsTab: "Eventos", + chatTab: "Chat", + newMessages: "Novas mensagens", + hostJam: "Organizar um encontro", + noEvents: "Ainda não há eventos da crew. Organize um encontro, campeonato ou rolê como a crew — conecta sua crew à agenda de eventos e deixa as pessoas darem Zap nele.", + support: "Apoiar", + zapCrew: "Dar Zap na Crew", + bandTitle: "Banda da Crew", + bandTagline: "Música ao vivo · skate e som", + listenTitle: "Ouvir: {{domain}}", + listen: "Ouvir as músicas", + setUpGig: "Marcar um show", + bookGigMessage: "E aí {{crew}} — interesse em contratar {{band}} para um show. Vocês estão disponíveis para falar de datas?", + messageAboutGig: "Mensagem sobre um show", + gigHintA: "adiciona um evento musical à agenda organizado por esta crew.", + messageShort: "Mensagem", + gigHintB: "abre uma DM criptografada para a crew para combinar datas e detalhes.", + homeSpots: "Spots de casa", + viewSpot: "Ver Spot", + seeOnMap: "Ver no mapa →", + founderLinks: "Fundador e links", + startedBy: "Iniciada por {{name}}", + opens: "Abre: {{domain}}", + }, + crews: { + seoTitle: "Crews - SkateSpots", + seoDescription: "Encontre sua galera. Descubra crews de skate, coletivos e comunidades perto de você.", + videoPartTooltip: "Esta crew tem uma parte de vídeo", + part: "Parte", + bandTooltip: "Banda da crew: {{name}}", + band: "Banda", + focusAll: "Tudo", + focusAllShort: "Tudo", + focusDiy: "DIY", + focusPhoto: "Foto", + focusCoaching: "Coaching", + focusArt: "Arte", + focusMusic: "Música", + focusPhysio: "Fisio", + focusMixed: "Misto", + title: "Crews", + heroLine: "Sua família do skate ancorada no mapa — as pessoas com quem você anda", + heroWith: "com", + heroRest: ", não quem você contrata (isso é o The Lab).", + crewCountOne: "{{count}} crew", + crewCountMany: "{{count}} crews", + cityCountOne: "{{count}} cidade", + cityCountMany: "{{count}} cidades", + createCrew: "Criar Crew", + create: "Criar", + searchPlaceholder: "Buscar crews por nome ou cidade…", + filterTitle: "Filtrar crews", + filterDesc: "O que a crew curte.", + nearMe: "Perto de mim", + emptySearchTitle: "Nenhuma crew corresponde à sua busca", + emptySearchHint: "Nada encontrado para “{{query}}”. Tente outro nome ou cidade.", + clearSearch: "Limpar busca", + emptyFocusTitle: "Ainda não há crews de {{label}}", + emptyFocusHint: "Ninguém levantou a bandeira “{{label}}” aqui ainda. Mostre todas as crews ou comece esta você mesmo.", + showAll: "Mostrar todas as crews", + claimTitle: "Reivindique sua cena local", + claimHint: "Ainda não há crews plantadas aqui. Seja o primeiro — comece sua crew, vincule seus Spots de casa e coloque sua cena no mapa para todos encontrarem.", + }, + crewCoordinator: { + privateChat: "Chat Privado da Crew", + on: "Ativado", + defaultA: "A aba", + chatWord: "Chat", + defaultB: "é", + e2ee: "criptografada de ponta a ponta", + defaultC: "para o fundador e todos os membros listados — nada para configurar. As mensagens são seladas com a chave de cada membro (NIP-17), então só sua crew pode lê-las.", + advancedA: "Avançado: rode o seu próprio", + cordnCoordinator: "coordenador Cordn", + routeThrough: "Rotear o chat por ele", + coordinator: "Coordenador", + deliveredOver: "Entregue via", + sharedRelay: "— o relay ContextVM compartilhado.", + ownRelay: "— o relay próprio da sua crew.", + chatLive: "O chat privado está no ar", + routesA: "A aba", + routesB: "roteia por este coordenador: as mensagens são criptografadas de ponta a ponta (NIP-44, seladas para cada membro), então ele só lida com tráfego selado.", + publicWarning: "Aviso: ele é endereçado pelo relay ContextVM compartilhado, então o texto cifrado e seus metadados (qual crew e quando) ficam visíveis publicamente — apenas não legíveis. Aponte a crew para um relay wss:// privado para manter até isso privado.", + ownRelaySafe: "Nada específico da crew sai do relay próprio da sua crew.", + manage: "Gerenciar coordenador", + open: "Abrir {{domain}}", + runBy: "Coordenador operado por", + }, + dms: { + securityReminder: "Lembrete de segurança", + phishingStrong: "O SkateSpots nunca vai te mandar DM", + phishingRest: "pedindo para verificar sua conta, compartilhar suas chaves ou enviar pagamentos. Se alguém diz ser suporte do SkateSpots por DM — é golpe.", + dismissReminder: "Dispensar lembrete de segurança", + peopleCount: "{{count}} pessoas", + youPrefix: "Você: ", + unreadMessages: "Mensagens não lidas", + seoTitle: "Mensagens - SkateSpots", + seoDescription: "Mensagens privadas criptografadas com a comunidade do skate", + loginTitle: "Entre para acessar as mensagens", + loginDesc: "Mensagens privadas e criptografadas com skatistas da comunidade", + secureLoginTitle: "Login seguro necessário", + secureLoginDesc: "As mensagens privadas exigem um app signer seguro para criptografar suas conversas.", + onAndroid: "No Android:", + useAmber: "Use o app Amber", + getAmber: "Obter Amber →", + onIOS: "No iOS:", + iosHint: "Tente entrar com uma conexão bunker (nsec.app) pelas Configurações", + browserHint: "Tente entrar com uma extensão de navegador como Alby ou nos2x que seja compatível com criptografia.", + title: "Mensagens", + subtitleFull: "Criptografadas de ponta a ponta com NIP-17", + subtitleShort: "Criptografadas", + newMessage: "Nova mensagem", + groups: "Grupos", + loadFailed: "Falha ao carregar as mensagens", + emptyTitle: "Ainda não há mensagens", + emptyDesc: "Comece uma conversa com alguém da comunidade", + startConversation: "Iniciar uma conversa", + undecryptableOne: "{{count}} mensagem criptografada não pôde ser aberta pelo seu signer.", + undecryptableMany: "{{count}} mensagens criptografadas não puderam ser abertas pelo seu signer.", + }, + editCrew: { + seoTitleNamed: "Editar {{name}} - SkateSpots", + seoTitle: "Editar Crew - SkateSpots", + seoDescription: "Edite sua crew de skate.", + loginRequired: "Login necessário", + notYours: "Não é sua crew", + notYoursDesc: "Só o fundador da crew pode editá-la.", + backToCrew: "Voltar à Crew", + title: "Editar Crew", + }, + form: { + add: "Adicionar", + added: "Adicionado", + addNameInBasicsA: "Adicione um nome de crew de volta em", + addNameInBasicsB: "para terminar.", + adminsDescA: "Torne membros confiáveis", + adminsWord: "admins", + adminsDescB: "— eles podem convidar membros e moderar o feed e o chat da crew com as próprias chaves. Você (o fundador) continua sempre o dono da identidade da crew.", + agentDescA: "Adicione", + agentDescB: ", um guia de IA que realmente conhece sua crew. Os membros podem perguntar sobre", + agentDescC: "— além de Spots, eventos, Coaches e equipamento próximos a partir de dados ao vivo do SkateSpots. Roda direto no navegador; sem chaves nem configuração. É novo (IA de plano gratuito, então às vezes lento).", + agentDescStrong: "seu próximo encontro, quem comanda a crew, o que vocês procuram e o clima de vocês", + agentEnabledNote: "O Sasquatch vai aparecer na página da sua crew assim que você salvar.", + bandDesc: "Tem uma banda? Cenas de skate e música local andam juntas — coloque o nome da sua banda e um link para as músicas.", + bandFooterA: "Para um perfil de banda completo (gêneros, instrumentos, shows), crie um", + musicianWord: "Músico", + bandFooterB: "no The Lab e vincule-o na seção", + linkedLabWord: "Perfis do Lab vinculados", + bandFooterC: "acima.", + bandMusicWord: "Banda e música", + bandName: "Nome da banda", + bandNamePlaceholder: "ex.: The Bail Outs", + bandNudgeA: "Você tem uma banda — toque para definir seu", + crewTypeWord: "Tipo de Crew", + bandNudgeB: "como", + bandNudgeC: "para você também aparecer na cena de Música do The Lab.", + beta: "Beta", + bioLabel: "Sobre / Manifesto", + bioPlaceholder: "Quem você é, o que você anda, sua história...", + continue: "Continuar", + crewCreated: "Crew criada!", + crewUpdated: "Crew atualizada!", + crewName: "Nome da Crew", + crewOnlyWord: "Só a crew", + crewType: "Tipo de Crew", + crewTypeDescA: "Sua crew é focada em um ofício? Escolha um para também aparecer naquela cena no", + theLab: "The Lab", + crewTypeDescB: ". Crews de skate comuns ficam", + mixedWord: "Misto", + crewTypeDescC: ".", + customVibeHint: "Adicione seu próprio clima ou foco com um #", + customVibePlaceholder: "ex.: downhill, sessões noturnas, no-comply", + editDesc: "A identidade da sua crew, território e membros", + enableAgent: "Ativar Agente da Crew", + enableTreasury: "Ativar Tesouraria da Crew", + failed: "Falhou", + founded: "Fundada (ano)", + geolocationUnsupported: "Geolocalização não suportada", + gettingLocation: "Obtendo...", + goalHint: "Garanta que seu perfil Nostr tenha um endereço Lightning (lud16) para as contribuições chegarem.", + goalPlaceholder: "ex.: Concretar o Spot DIY", + goalTarget: "Meta (sats)", + goalWhat: "Qual é a meta?", + homeSpots: "Spots de casa", + homeSpotsDesc: "Vincule os Spots que sua crew frequenta — eles vão se conectar à sua crew no mapa", + homeTurf: "Território (Cidade / Região)", + homeTurfPlaceholder: "Bristol, Reino Unido", + instagramDetected: "Clipe do Instagram detectado", + invalidMember: "Digite um npub, nprofile ou chave pública hex válida.", + latitude: "Latitude", + leaveBlankLocation: "Deixe em branco para manter a localização atual do território.", + links: "Links", + locationError: "Erro de localização", + locationFound: "Localização encontrada", + logoAlt: "Crew", + logoHint: "Um logo torna sua crew reconhecível na hora no mapa e nos feeds. Quadrado funciona melhor.", + logoLabel: "Logo / Foto da Crew", + logoUploaded: "Logo enviado", + longitude: "Longitude", + looksGood: "Está bom", + makeAdmin: "Tornar admin", + mapPin: "Ponto no mapa", + mapPinHint: "Coloque sua crew no mapa para os locais te encontrarem. Toque no botão — sem digitar.", + memberAlreadyAdded: "Esse membro já foi adicionado.", + members: "Membros", + membersDesc: "Adicione as contas Nostr da sua crew. Cada membro confirma com sua própria chave — até então aparece como “pendente”.", + musicLink: "Link de música", + nameCrew: "Dê um nome à sua crew", + nameCrewDesc: "Uma crew precisa de um nome antes de continuar.", + nameCrewFirst: "Dê um nome à sua crew primeiro", + nameHint: "A única coisa que você realmente precisa. Pode mudar depois.", + namePlaceholder: "ex.: Backyard Bandits", + nameRequired: "Nome obrigatório", + nameRequiredDesc: "Dê um nome à sua crew.", + nip05DescA: "Um handle verificável que você controla em qualquer domínio, ex.", + nip05DescB: ". Ele é verificado contra a chave do fundador desta crew, e você pode adicionar alguns — cada um mostra um check verde quando o domínio confirma.", + nip05Label: "NIP-05 da Crew", + nip05Placeholder: "crew@seudominio.com", + nip05Add: "Adicionar", + nip05Invalid: "Digite um handle como crew@seudominio.com", + nip05TooMany: "Você pode adicionar até {{count}} handles.", + nip05Unverified: "Não verificado", + nip05Remove: "Remover {{handle}}", + notAKeyA: "Isso ainda não parece uma chave Nostr — cole um", + notAKeyB: ",", + notAKeyC: ", ou chave pública hex.", + onlyYouTubeInstagram: "Só links do YouTube e Instagram são suportados.", + openCall: "Chamada aberta", + openCallDescA: "Procurando um Filmer, Editor ou sangue novo? Faça uma chamada — ela aparece na página da sua crew para pessoas compatíveis do", + openCallDescB: "entrarem em contato.", + optional: "· opcional", + optionalParen: "(opcional)", + otherSocials: "Outras redes sociais", + otherSocialsDesc: "Adicione quantas quiser — YouTube, TikTok, Discord, Telegram, etc.", + ownVisibility: "própria visibilidade", + progress: "Progresso", + publicWord: "Público", + publishedToScene: "Publicada para a cena.", + publishFailed: "Falha ao publicar", + publishing: "Publicando...", + ready: "Pronto", + readyToRollA: "Pronto para rodar — aperte", + readyToRollB: "quando quiser.", + removeAdminRole: "Remover função de admin", + removeMember: "Remover membro", + removeSocial: "Remover link social", + removeVibe: "Remover {{vibe}}", + roles: "Funções:", + sasquatch: "Sasquatch", + saveCrew: "Salvar Crew", + skipToEnd: "Ir para o fim", + socialPlaceholder: "@usuario ou link", + sponsorDesc: "Se uma loja local apoia sua crew, escolha-a aqui para mostrar um banner “Patrocinado por” com link para a loja.", + stepAria: "Etapa {{step}}: {{title}}", + stepBasics: "O básico", + stepBasicsShort: "Básico", + stepBasicsHint: "Só o essencial — você pode montar uma crew apenas com esta etapa.", + stepVibe: "Identidade e clima", + stepVibeShort: "Clima", + stepVibeHint: "Como sua crew aparece pelo app. Tudo opcional.", + stepSquad: "Time e Spots", + stepSquadShort: "Time", + stepSquadHint: "Adicione sua galera e seu território. Você pode fazer isso depois.", + stepExtras: "Extras", + stepExtrasShort: "Extras", + stepExtrasHint: "Poderes para depois — pule o que não tiver certeza.", + extrasAllOptional: "Tudo nesta etapa é opcional.", + groupIdentity: "Identidade", + groupIdentityHint: "Handle, links", + groupAi: "IA Sasquatch", + groupShowcase: "Vitrine", + groupPayments: "Pagamentos e tesouraria", + groupIntegrations: "Integrações", + groupAdvanced: "Avançado", + groupAdvancedHint: "experimental", + pro: "Pro", + agentProNote: "Desenvolvido pelo Sasquatch. O Pro tem os melhores modelos; sem Pro, usa uma opção gratuita de reserva.", + stepOf: "Etapa {{step}} de {{total}}", + treasuryDescA: "Arrecade sats para uma meta compartilhada — consertar o Spot DIY local, uma viagem da crew, um prêmio de campeonato. É uma meta Lightning transparente; os Zaps vão", + treasuryDescStrong: "direto para a sua carteira", + treasuryDescB: "(pelo endereço Lightning do seu perfil). O SkateSpots nunca retém os fundos.", + upload: "Enviar", + uploadFailed: "Falha no envio", + useCurrentLocation: "Usar localização atual", + vibeLabel: "Clima / Foco", + videoDescA: "A parte completa, montagem ou clipe mais recente da sua crew. Cole um link do", + videoDescB: "— ele toca direto na página da sua crew.", + visibilityDescA: "Cada membro controla sua", + visibilityDescB: "— quando confirmam com a própria chave, podem escolher", + visibilityDescC: "— oculto de estranhos). Você não pode definir isso por eles; é escolha deles.", + website: "Site", + yourRoles: "Suas funções (Líder de time)", + youtubeDetected: "Vídeo do YouTube detectado", + invalidUrl: "Digite um link válido (ex.: https://exemplo.com).", + }, + groupConversation: { + seoTitle: "Chat em grupo - SkateSpots", + invalidLink: "Este link de chat em grupo é inválido.", + loginTitle: "Entre para ver este grupo", + secureSignerTitle: "Signer seguro necessário", + secureSignerDesc: "Mensagens em grupo precisam de um signer compatível com NIP-44.", + encryptedGroup: "Grupo criptografado de ponta a ponta", + empty: "Ainda não há mensagens — diga oi ao grupo.", + placeholder: "Mande uma mensagem para o grupo...", + }, + hero: { + established: "Desde {{year}}", + teamLeader: "Líder de time: {{name}}", + ledBy: "Liderada por", + }, + inviteCard: { + acceptedTitle: "Convite aceito 🛹", + acceptedDesc: "O fundador da crew confirma membros em {{crew}}. Você aparecerá no elenco assim que ele aprovar.", + couldNotAccept: "Não foi possível aceitar", + couldNotDecline: "Não foi possível recusar", + acceptedDone: "Aceito —", + confirmsMembers: "confirma membros", + declinedDone: "Convite para {{crew}} recusado", + invitedYou: "convidou você para entrar", + admin: "Admin", + accept: "Aceitar", + decline: "Recusar", + }, + inviteDialog: { + messageIntro: "E aí — entre na crew {{crew}} no SkateSpots 🛹", + messageBody: "Entre com sua chave Nostr e depois peça para entrar pela página da crew.", + copyFailed: "Falha ao copiar", + shareTitle: "Entrar na {{crew}}", + sentTitle: "Convite enviado! 🛹", + sentDesc: "A pessoa vai receber uma notificação para aceitar ou recusar.", + couldNotSend: "Não foi possível enviar o convite", + trigger: "Convidar", + title: "Convidar para {{crew}}", + description: "Envie um convite para a chave Nostr de alguém, ou compartilhe um link.", + sendTab: "Enviar convite", + shareTab: "Compartilhar link", + npubLabel: "npub do skatista", + invalidNpub: "Isso não parece um npub válido.", + noteLabel: "Nota", + optional: "(opcional)", + notePlaceholder: "Venha andar com a gente…", + inviteAsAdmin: "Convidar como admin", + inviteAsAdminDesc: "Pode gerenciar a crew e convidar outras pessoas.", + sendButton: "Enviar convite", + sendFooter: "A pessoa vai receber uma notificação para aceitar ou recusar. A participação só conta quando ela aceitar.", + inviteLink: "Link de convite", + messageLabel: "Mensagem", + copyMessage: "Copiar mensagem", + founderHint: "Como fundador, você também pode adicionar a chave de um membro diretamente, e depois ele confirma.", + addMemberSettings: "Adicionar membro nas configurações da crew", + }, + joinRequest: { + moreCount: "+{{count}} mais", + addedTitle: "{{name}} adicionado a {{crew}} 🛹", + addedDesc: "A pessoa vai confirmar do lado dela para aparecer como membro.", + vouchedTitle: "Você deu aval para {{name}} 🤝", + vouchedDesc: "O fundador de {{crew}} vai ver seu endosso e poderá adicioná-lo.", + couldNotEndorse: "Não foi possível endossar", + endorsedDoneA: "Você deu aval para", + endorsedDoneB: "— o fundador vai confirmar", + vouchedBy: "Avalizado por", + approveAndAdd: "Aprovar e adicionar", + addToCrew: "Adicionar à crew", + vouchedWaiting: "Com aval — aguardando o fundador", + vouchForThem: "Dar aval para a pessoa", + leadershipOnly: "Só a liderança da crew.", + adminHelp: "Admins não podem adicionar membros diretamente — dar aval diz ao fundador que você apoia este rider.", + }, + leadership: { + teamLeader: "Líder de time", + captain: "Capitão", + verifiedMember: "Membro verificado", + messageName: "Mensagem para {{name}}", + title: "Liderança", + captainsOne: "{{count}} Capitão", + captainsMany: "{{count}} Capitães", + footer: "O Líder de time comanda o elenco; os Capitães ajudam a convidar, organizar encontros e manter a crew em ordem.", + }, + linkField: { + title: "Crew vinculada", + description: "Também tem uma crew? Vincule-a para as pessoas pularem entre seu estúdio e sua crew. Opcional. Vincule esta crew de volta ao perfil pelo editor da crew e ambos mostrarão um selo", + descriptionRest: "verde.", + none: "Você ainda não tem nenhuma crew. Crie uma na página de Crews para vinculá-la aqui.", + linkedCrew: "Crew vinculada ({{id}})", + }, + lookingFor: { + title: "Chamada aberta", + subtitle: "Esta crew está procurando:", + }, + memberVisibility: { + updatedTitle: "Visibilidade atualizada", + updatedCrew: "Agora você aparece apenas para os colegas de crew.", + updatedPublic: "Agora você aparece publicamente nesta crew.", + couldNotUpdate: "Não foi possível atualizar", + title: "Sua visibilidade nesta crew", + save: "Salvar visibilidade", + }, + newMessage: { + inCrew: "Na sua crew: {{crews}}", + crewmate: "Colega de crew", + following: "Seguindo", + invalidKey: "Isso não parece um npub ou chave pública válida.", + description: "Busque sua galera pelo nome, ou cole um npub para mandar mensagem para qualquer pessoa. Selecione dois ou mais para iniciar um grupo.", + searchPlaceholder: "Busque por nome ou cole npub1...", + messageThisKey: "Mensagem para esta chave", + loadingPeople: "Carregando sua galera...", + noPeople: "Ainda não há colegas de crew ou pessoas seguidas.", + noPeopleHint: "Cole o npub de alguém acima para iniciar uma conversa.", + yourCrews: "Suas crews", + selected: "{{count}} selecionados", + startGroup: "Iniciar grupo ({{count}})", + message: "Mensagem", + }, + nip05: { + mismatch: "Este domínio aponta o handle para uma chave Nostr diferente da do fundador da crew. Não verificado.", + verified: "Verificado — o domínio confirma que este handle pertence à chave do fundador da crew.", + }, + requestCollective: { + sentTitle: "Pedido enviado 🤝", + sentDesc: "{{name}} vai ver nos avisos e poderá adicionar você.", + couldNotSend: "Não foi possível enviar o pedido", + title: "Entrar neste coletivo", + waiting: "Pedido enviado — aguardando {{name}}.", + askA: "Peça à crew por trás de", + askB: "para adicionar você ao elenco. A pessoa receberá uma notificação e poderá adicionar você num toque.", + placeholder: "Opcional: diga por que você seria uma boa adição…", + sendButton: "Enviar pedido", + }, + requestToJoin: { + sentTitle: "Pedido enviado! 🛹", + sentDesc: "A liderança da {{crew}} vai ver nos avisos.", + couldNotSend: "Não foi possível enviar o pedido", + trigger: "Pedir para entrar", + title: "Entrar na {{crew}}", + description: "Notifica o fundador e os admins da crew para que possam adicionar você.", + placeholder: "Diga oi — onde você anda, quem você conhece, por que quer entrar…", + sending: "Enviando…", + sendButton: "Enviar pedido para entrar", + }, + sponsorBanner: { + loading: "Carregando patrocinador…", + sponsoredBy: "Patrocinado por", + }, + sponsorPicker: { + selected: "Patrocinador selecionado", + setLoading: "Patrocinador definido (carregando loja…)", + set: "Patrocinador definido", + clearAria: "Limpar patrocinador", + searchPlaceholder: "Buscar lojas de skate por nome ou cidade…", + loading: "Carregando lojas…", + noMatch: "Nenhuma loja corresponde — tente outra busca.", + none: "Nenhuma loja encontrada ainda.", + }, + treasury: { + title: "Tesouraria da Crew", + ofGoal: "da meta de {{target}}", + goalReached: "Meta alcançada!", + funded: "{{percent}}% financiado", + contributionOne: "{{count}} contribuição", + contributionMany: "{{count}} contribuições", + daysLeft: "{{days}}d restantes", + closed: "encerrada", + nonCustodial: "Sem custódia · os Zaps vão direto para a carteira Lightning da crew", + }, + userStatus: { + atSpot: "📍 Num Spot", + autoClears: "⏱️ Some automaticamente em {{min}} min", + }, + video: { + title: "A Parte", + fullVideo: "Vídeo completo · montagem", + latestClip: "Clipe mais recente", + watch: "Assistir", + iframeTitle: "{{crew}} — vídeo", + playAria: "Reproduzir vídeo de {{crew}}", + thumbAlt: "Miniatura do vídeo de {{crew}}", + instagramTitle: "Clipe do Instagram", + }, + vouch: { + removedTitle: "Aval removido", + vouchedTitle: "Aval dado!", + removedDesc: "Você não dá mais aval para {{name}}.", + vouchedDesc: "Você deu aval para {{name}}. A cena confia em quem é da casa.", + couldNotVouch: "Não foi possível dar aval", + title: "Avals da Cena", + sceneVerified: "Verificado pela cena", + vouched: "Com aval", + newUnvouched: "Novo · sem aval", + checking: "Verificando a cena…", + empty: "Ainda não há avais. Avais de skatistas dos seus círculos são o melhor sinal de que alguém é de verdade — não um aleatório que apareceu.", + countOne: "{{count}} aval", + countMany: "{{count}} avais", + trusted: "{{count}} de skatistas na sua rede de confiança", + remove: "Remover aval", + vouchFor: "Dar aval para {{name}}", + ownerNote: "Skatistas que conhecem seu trabalho podem dar aval para você aqui.", + }, + }, +}; export default ptBatch5; diff --git a/src/i18n/pt/batch6.ts b/src/i18n/pt/batch6.ts index c5f67e5..f04c954 100644 --- a/src/i18n/pt/batch6.ts +++ b/src/i18n/pt/batch6.ts @@ -1,4 +1,1948 @@ -/** pt — batch 6. Filled by the translation pass; empty until then. */ -const ptBatch6 = {}; +/** pt — batch 6: placesUi, marketUi, labOptions. */ +const ptBatch6 = { + placesUi: { + addToCalendar: { + add: "Adicionar ao Calendário", + appleOutlook: "Apple / Outlook (.ics)", + google: "Google Agenda", + }, + attendees: { + goingCount: "vão", + goingTab: "Vão ({{count}})", + interestedTab: "Interessados ({{count}})", + nobodyGoing: "Ninguém confirmou ainda.", + nobodyInterested: "Ninguém marcou interesse ainda.", + noRsvps: "Ainda sem RSVPs — seja o primeiro a dizer que vai.", + trusted: "Confiável", + trustedTitle: "Alguém que você segue ou um mapeador confiável", + youTrust: "você confia", + }, + bounty: { + addressCoords: "Endereço e coordenadas", + basic: "Básico", + contactInfo: "Informações de contato", + description: "Descrição", + earningPotential: "Potencial de ganhos", + excellent: "Excelente!", + gettingStarted: "Primeiros passos", + good: "Bom", + onePhoto: "Pelo menos 1 foto", + openingHours: "Horário de funcionamento", + shopName: "Nome da loja", + threePhotos: "3+ fotos", + tip: "💡 Mais qualidade = Mais zaps da comunidade!", + }, + calendar: { + allDay: "Dia inteiro", + eventDay: "Dia do evento", + eventsOnDay: "{{count}} eventos", + eventsThisMonth: "eventos neste mês", + going: "vão", + months: { + january: "Janeiro", + february: "Fevereiro", + march: "Março", + april: "Abril", + may: "Maio", + june: "Junho", + july: "Julho", + august: "Agosto", + september: "Setembro", + october: "Outubro", + november: "Novembro", + december: "Dezembro", + }, + nextMonth: "Próximo mês", + nothingOnDay: "Nada neste dia.", + prevMonth: "Mês anterior", + tapHighlighted: "Toque em um dia destacado para ver o que está rolando.", + today: "Hoje", + tourDay: "Dia do Tour", + toursOnDay: "{{count}} tours", + toursThisMonth: "tours neste mês", + weekdays: { + sun: "Dom", + mon: "Seg", + tue: "Ter", + wed: "Qua", + thu: "Qui", + fri: "Sex", + sat: "Sáb", + }, + weekdaysShort: { + sun: "D", + mon: "S", + tue: "T", + wed: "Q", + thu: "Q", + fri: "S", + sat: "S", + }, + }, + countdown: { + ended: "Encerrado", + happeningNow: "Acontecendo agora", + inDays: "Em {{count}} dias", + inHoursMins: "Em {{hours}}h {{mins}}min", + inMins: "Em {{count}} min", + startingNow: "Começando agora", + tomorrow: "Amanhã", + }, + createEvent: { + add: "Adicionar", + addNewSpot: "Adicionar um novo Spot →", + changeSpot: "Alterar Spot", + created: "Evento criado!", + createdDesc: "Seu evento foi publicado na rede.", + entryFee: "Taxa de entrada", + entryFeeHint: "(opcional — ex.: \"500 sats\" ou \"R$ 10\")", + entryFeePlaceholder: "Deixe em branco para eventos gratuitos", + featuring: "Com {{name}}", + featuringDesc: "Esta atração será marcada como música ao vivo e exibida na agenda de shows dela.", + fundingGoal: "Meta de arrecadação", + fundingGoalHint: "(opcional — sats para financiar coletivamente via zaps)", + fundingGoalPlaceholder: "ex.: 50000", + geoNotSupported: "Geolocalização não suportada", + geoNotSupportedDesc: "Seu navegador não suporta geolocalização.", + hideSpots: "Ocultar Spots", + hostingAs: "Hospedando como {{name}}", + hostingAsDesc: "Este evento aparecerá na página da sua crew e será marcado como hospedado pela crew.", + imageUploaded: "Imagem enviada", + imageUploadedDesc: "Sua imagem foi enviada com sucesso.", + invalidDate: "Data inválida", + invalidDateDesc: "Insira uma data e hora de início válidas.", + invalidEnd: "Horário de término inválido", + invalidEndDesc: "O horário de término deve ser depois do início.", + linkedTo: "Vinculado a: {{title}}", + linkToSpot: "Vincular a um Spot", + linkToShop: "Vincular a uma Shop", + selectedShop: "Vinculado a {{name}}", + selectShopHint: "Opcional — realizado em ou hospedado por uma loja de skate.", + selectShop: "Selecionar loja", + changeShop: "Alterar loja", + hideShops: "Ocultar lojas", + searchShops: "Buscar lojas…", + noShopsMatch: "Nenhuma loja corresponde à sua busca.", + noShopsAvailable: "Nenhuma loja disponível ainda.", + linkToTour: "Vincular a um Tour (Opcional)", + linkTourDesc: "Vincule este evento a um tour para mostrar que faz parte de uma série maior. Ótimo para tours nacionais, aventuras internacionais ou dias de desafio do World Destruction Tour.", + loadingSpots: "Carregando spots...", + loadingTours: "Carregando tours...", + locationError: "Erro de localização", + locationFound: "Localização encontrada", + locationFoundDesc: "Sua localização atual foi definida.", + logoUrl: "URL do logo (opcional)", + noSpotsAvailable: "Nenhum spot disponível", + noSpotsMatch: "Nenhum spot corresponde à sua busca", + noTourLinked: "Nenhum tour vinculado", + optional: "(opcional)", + pastDesc: "Escolha uma data e hora no futuro para que os skatistas possam confirmar presença e aparecer.", + pastTitle: "Esse horário de início já passou", + publishFailed: "Falha ao publicar", + publishFeatured: "Publicar Evento Destacado", + removeSponsor: "Remover patrocinador", + searchSpots: "Buscar spots por nome, localização ou categoria...", + selectedSpot: "Selecionado: {{name}}", + selectSpot: "Selecionar Spot", + selectSpotHint: "Selecione no mapa um spot onde este evento acontece", + selectTour: "Selecionar Tour", + somethingWrong: "Algo deu errado", + sponsorName: "Nome do patrocinador", + sponsors: "Patrocinadores", + sponsorsHint: "Tem uma loja ou marca apoiando? Adicione o logo — ele aparece como uma faixa \"Apresentado por\" no evento.", + startRequired: "Horário de início obrigatório", + startRequiredDesc: "Insira quando o evento começa.", + titleRequired: "Título obrigatório", + titleRequiredDesc: "Insira um nome para este evento.", + uploadFailed: "Falha no envio", + uploadFailedDesc: "Falha ao enviar a imagem", + websiteUrl: "URL do site (opcional)", + }, + createShop: { + address: "Endereço da Shop", + addressPlaceholder: "ex.: 411 N Fairfax Ave, Los Angeles, CA 90036", + addressRequired: "Endereço obrigatório", + addressRequiredDesc: "Insira o endereço da sua loja.", + contactHint: "Ajude os clientes a falar com você (recomendado ao menos um meio de contato)", + contactInfo: "Informações de contato", + created: "🎉 Shop adicionada!", + createdDesc: "Sua loja de skate agora está no mapa. Os skatistas podem te dar zaps para agradecer!", + descriptionPlaceholder: "Conte às pessoas sobre sua loja, o que você vende, sua especialidade...", + detailsDesc: "Conte à comunidade sobre sua loja. Todos os campos marcados com * são obrigatórios.", + email: "E-mail", + hoursOfOperation: "Horário de funcionamento", + hoursPlaceholder: "ex.: Seg-Sáb 10h-20h, Dom 12h-18h", + instagram: "Instagram", + invalidCoords: "Coordenadas inválidas", + invalidCoordsDesc: "Insira latitude (-90 a 90) e longitude (-180 a 180) válidas.", + latPlaceholder: "Latitude (ex.: 34.0737)", + lngPlaceholder: "Longitude (ex.: -118.3614)", + locationRequired: "Localização obrigatória", + locationRequiredDesc: "Insira as coordenadas ou use sua localização atual.", + loginToAdd: "Você precisa entrar para adicionar uma loja de skate.", + namePlaceholder: "ex.: Supreme Los Angeles", + nameRequired: "Nome da loja obrigatório", + nameRequiredDesc: "Insira um nome para sua loja.", + phoneNumber: "Telefone", + publishFailedDesc: "Algo deu errado. Verifique o console para detalhes.", + shopPhotoAlt: "Shop", + shopPhotos: "Fotos da Shop", + subtitle: "Liste sua loja no mapa e conecte-se com a comunidade", + upload: "Enviar", + }, + createTour: { + acceptedClipSources: "Fontes de clipes aceitas", + acceptedClipSourcesDesc: "Quais formatos você aceita para envio de clipes?", + accommodationInfo: "Informações de hospedagem", + accommodationPlaceholder: "Recomendações ou arranjos de hospedagem, ex.: 'Hostels baratos ao longo da rota', 'Equipamento de camping necessário', 'Airbnbs inclusos'", + addChallenge: "Adicionar Desafio", + addCity: "Adicionar uma cidade...", + addCountry: "Adicionar um país...", + addShopFirst: "Adicione uma loja primeiro", + alsoSelected: "Também selecionado:", + availabilityPlaceholder: "ex.: Fins de semana, Somente manhãs, Com agendamento", + availabilityQuestion: "Quando você costuma estar disponível?", + availableShops: "Lojas de Skate disponíveis ({{count}})", + challengeDescPlaceholder: "Descrição opcional...", + challenges: "Desafios", + challengesRequired: "Desafios obrigatórios", + challengesRequiredDesc: "Adicione pelo menos um desafio para as equipes completarem.", + challengesSecret: "Todos os desafios são SECRETOS até a data de início da competição. As equipes não os verão até então!", + challengeTitlePlaceholder: "Título do desafio, ex.: 'Kickflip numa escada de 10'", + citiesLabel: "Cidades", + citiesOnTour: "Cidades no Tour", + cityPlaceholder: "ex.: Berlim, Alemanha", + cityRegion: "Cidade / Região", + cityRequired: "Cidade/região obrigatória", + cityRequiredDesc: "Insira sua cidade ou região.", + clipAnyUrl: "🔗 Qualquer URL", + clipBlossom: "📦 Envio via Blossom", + clipInstagram: "📸 Instagram", + clipYouTube: "▶️ YouTube", + competitionDates: "Datas da competição", + competitionDatesWarning: "⚠️ Todos os desafios são SECRETOS até a data de início! As equipes não verão os desafios até a competição começar.", + competitionLocations: "Locais da competição", + competitionLocationsDesc: "Onde as equipes vão competir? Adicione todas as cidades e países envolvidos.", + coordsHint: "As coordenadas são opcionais. Adicione-as para marcar seu ponto de encontro no mapa.", + countriesLabel: "Países", + countriesRequired: "Países obrigatórios", + countriesRequiredDesc: "Adicione pelo menos um país para seu tour internacional.", + createdDestruction: "💀 WORLD DESTRUCTION TOUR CRIADO!", + createdDestructionDesc: "As equipes podem se registrar. Desafios revelados na data de início!", + createDestructionTour: "Criar World Destruction Tour", + createdInternational: "✈️ Tour Internacional criado!", + createdInternationalDesc: "Sua aventura global está listada! Conecte-se com skatistas do mundo todo.", + createdLocal: "🏠 Tour Local criado!", + createdLocalDesc: "Seu tour já está visível. Os skatistas podem reservar por DM!", + createdNational: "🚐 Tour Nacional criado!", + createdNationalDesc: "Sua viagem está no ar! Comece a coordenar com skatistas interessados.", + departure: "Partida *", + departureRequired: "Data de partida obrigatória", + departureRequiredDesc: "Defina quando a viagem parte para que os skatistas possam planejar e reservar.", + descriptionPlaceholder: "Descreva o que os skatistas vão vivenciar: spots que você visitará, a vibe, o que torna seu tour único...", + destructionDesc: "Monte sua competição global estilo KOTR — você define TUDO!", + discountHint: "Os participantes do tour podem mostrar a confirmação da reserva na loja para receber este desconto", + discountPercentage: "Porcentagem de desconto", + dropTour: "Publicar um Tour", + duration: "Duração", + durationHintDestruction: "Quanto tempo dura a competição? (1-12 meses)", + durationHintInternational: "Quantas semanas dura a aventura? (até 2 meses)", + durationHintLocal: "Quanto tempo dura seu tour típico?", + durationHintNational: "Quantos dias dura a viagem?", + durationWeeksMonths: "{{weeks}} semanas (~{{months}} meses)", + editTour: "Editar Tour", + enable: "Ativar", + enabled: "Ativado", + endBeforeStart: "Término antes do início", + endBeforeStartDesc: "A data de término da competição deve ser igual ou posterior à data de início.", + endDate: "Data de término", + entryFeeHint: "Você fica com 95% • A plataforma fica com 5% • Deixe vazio para entrada gratuita", + entryFeePerTeam: "Taxa de entrada por equipe (sats)", + entryFeePlaceholder: "ex.: 100000", + entryPrizes: "Entrada e prêmios", + filmPremieres: "Estreias dos filmes das equipes", + filmPremieresDesc: "Depois da competição, os clipes de cada equipe viram um filme completo que pode estrear em lojas de skate locais pelo mundo.", + filmPremieresInfo: "🎥 As equipes compilam seus clipes de desafios em um filme final. As lojas podem sediar eventos de estreia, conectando a competição global às comunidades locais.", + filmReleaseDate: "Data de lançamento dos filmes (opcional)", + filmReleaseDateHint: "Quando os filmes estarão disponíveis. Deixe em branco para lançar imediatamente após o fim da competição.", + fixedSession: "Sessão fixa", + fixedSessionDesc: "Uma data e hora definidas", + flexible: "Flexível", + flexibleDesc: "Reserve a qualquer momento por DM", + hide: "Ocultar", + howDestruction1: "• Competição global de equipes — com até 12 meses", + howDestruction2: "• VOCÊ define desafios, pontos, prêmios — nós só fornecemos a plataforma", + howDestruction3: "• Todos os desafios são SECRETOS até a data de início da competição", + howDestruction4: "• Clipes via envio no Blossom OU links externos (YouTube, Instagram, qualquer URL)", + howDestruction5: "• Somente nível avançado — todos os tipos de spot incluídos automaticamente", + howDestruction6: "• A plataforma fica com apenas 5% das taxas de entrada (NÃO do prêmio acumulado)", + howDestructionTitle: "💀 WORLD DESTRUCTION TOUR — Estilo KOTR", + howInternational1: "• Aventuras transfronteiriças por vários países", + howInternational2: "• Você define o preço — a plataforma fica com apenas 5%", + howInternational3: "• Defina datas de partida e retorno para que a crew possa reservar voos", + howInternational4: "• Conecte skatistas do mundo todo", + howInternational5: "• Crie experiências globais inesquecíveis!", + howInternationalTitle: "Como funcionam os Tours Internacionais", + howItWorks: "Como funciona:", + howLocal1: "• Você define seu preço — a plataforma fica com 10%", + howLocal2: "• Spots secretos continuam secretos — você os mostra pessoalmente", + howLocal3: "• Faça uma sessão agendada ou mantenha flexível / com agendamento", + howLocal4: "• Os skatistas reservam por DM, pagam em Lightning e podem adicionar ao calendário", + howLocal5: "• Construa sua reputação com avaliações e zaps", + howLocalTitle: "Como funcionam os Tours Locais", + howNational1: "• Viagens por várias cidades do seu país", + howNational2: "• Você define o preço — a plataforma fica com apenas 7%", + howNational3: "• Defina as datas da viagem para que os skatistas possam planejar folgas e deslocamento", + howNational4: "• Inclua informações de transporte / hospedagem para a crew", + howNational5: "• Construa aventuras de skate lendárias!", + howNationalTitle: "Como funcionam os Tours Nacionais", + imageUploadedDesc: "A imagem do seu tour foi enviada.", + incompleteCoords: "Coordenadas incompletas", + incompleteCoordsDesc: "Insira latitude e longitude, ou deixe ambas em branco.", + internationalDetails: "Detalhes da aventura internacional", + languagesSelected: "{{count}} selecionados", + languagesSpoken: "Idiomas falados", + latOptional: "Latitude (opcional)", + lngOptional: "Longitude (opcional)", + loadingProfile: "Carregando perfil...", + loadingProfileDesc: "Verificando o status da sua verificação NIP-05.", + loadingShops: "Carregando lojas...", + localShopPremieres: "Estreias em lojas locais", + localShopPremieresDesc: "Lojas de skate do mundo todo podem sediar noites de filmes", + loginToCreate: "Você precisa entrar para criar um tour.", + maxGroupSize: "Tamanho máximo do grupo", + maxTeams: "Máximo de equipes", + maxTeamSize: "Tamanho máximo da equipe", + meetingLocationSet: "Sua localização atual foi definida como ponto de encontro.", + meetingPointDesc: "Onde você vai encontrar os participantes do tour? Escolha um lugar público e conhecido.", + meetingPointLabel: "Ponto de encontro", + meetingPointPlaceholder: "ex.: Estação Warschauer Straße", + meetingPointRequired: "Ponto de encontro obrigatório", + meetingPointRequiredDesc: "Insira onde você vai encontrar os participantes do tour.", + minTeamSize: "Tamanho mínimo da equipe", + noChallenges: "Nenhum desafio ainda", + noChallengesDesc: "Adicione desafios para as equipes completarem", + noPartnerShop: "Nenhuma loja parceira", + noShopsFound: "Nenhuma loja de skate encontrada na rede ainda.", + noShopsRegistered: "Nenhuma loja de skate registrada ainda", + onlineRelease: "Lançamento online", + onlineReleaseDesc: "Também lançar os filmes no YouTube/Nostr", + organizerContact: "Detalhes de contato do organizador", + organizerContactHint: "Isto ficará visível para as equipes registradas", + organizerContactPlaceholder: "Como as equipes podem falar com você? ex.: npub do Nostr, e-mail, Telegram etc.", + partnerDiscountDesc: "Ofereça um desconto aos participantes do tour em uma loja de skate local", + partnerStep1: "1. Faça parceria com uma loja de skate local em que você confie", + partnerStep2: "2. Defina uma porcentagem de desconto para os participantes do tour", + partnerStep3: "3. Após o tour, dê aos participantes uma confirmação para mostrar na loja", + partnerStep4: "4. A loja honra o desconto — fortalece a comunidade e traz movimento!", + percentOff: "{{percent}}% OFF", + photoHint: "Adicione uma foto sua andando de skate ou de um spot legal do seu tour.", + pickRide: "Escolha sua carona", + place1: "🥇 1º", + place2: "🥈 2º", + place3: "🥉 3º", + platformFee: "Você define o preço • A plataforma fica com {{percent}}", + points: "Pontos:", + pricePerPerson: "Preço por pessoa (sats)", + pricePlaceholder: "ex.: 25000", + prizeDistribution: "Distribuição dos prêmios", + prizePoolHint: "Opcional — total de prêmios disponíveis", + prizePoolPlaceholder: "ex.: 2000000", + proTipDesc: "Antes de listar um desconto de parceiro, fale com o dono da loja por DM para combinar a porcentagem. Assim você garante que ele topa e vai honrar o desconto para os participantes do seu tour.", + proTipTitle: "💡 Dica: combine com a loja primeiro!", + return: "Retorno", + returnBeforeDeparture: "Retorno antes da partida", + returnBeforeDepartureDesc: "A data de retorno deve ser igual ou posterior à data de partida.", + roadTripDetails: "Detalhes da viagem", + schedule: "Agenda", + scheduleDesc: "Faça isto como uma sessão agendada única, ou mantenha flexível e deixe os skatistas reservarem um horário por DM.", + secretUntilStart: "Secreto até o início", + selectPartnerShop: "Selecionar loja parceira", + sessionDateRequired: "Data da sessão obrigatória", + sessionDateRequiredDesc: "Escolha a data e a hora da sua sessão agendada, ou mude para uma agenda flexível.", + sessionDateTime: "Data e hora da sessão", + sessionDateTimeHint: "Os skatistas verão este horário e poderão adicioná-lo ao calendário pela página do tour.", + shopPremieresContact: "Fale diretamente com estas lojas para organizar noites de estreia. Todos os acertos são privados.", + shopPremieresHow: "💡 Como funcionam as estreias em lojas: fale diretamente com as lojas para organizar noites de estreia. Todos os acertos são privados entre você e as lojas.", + shopsCanRegister: "As lojas podem se registrar em /create-shop", + show: "Mostrar", + showAllLanguages: "Mostrar todos os {{count}} idiomas", + somethingWrong: "Algo deu errado.", + spotTypes: "Tipos de Spots", + spotTypesRequired: "Tipos de spot obrigatórios", + spotTypesRequiredDesc: "Selecione pelo menos um tipo de spot que você vai mostrar.", + startDate: "Data de início", + startDateRequired: "Data de início obrigatória", + startDateRequiredDesc: "Defina quando a competição começa (os desafios serão revelados nesta data).", + startingCity: "Cidade de partida", + startingCityPlaceholder: "ex.: Los Angeles, EUA", + teamSettings: "Configurações da equipe", + teamsCount: "{{count}} equipes", + titlePlaceholder: "ex.: Berlim Kreuzberg — Tour por Spots subterrâneos", + titleRequired: "Título do tour obrigatório", + titleRequiredDesc: "Insira um nome para seu tour.", + totalPercent: "Total: {{percent}}%", + totalPrizePool: "Prêmio acumulado total (sats)", + tourDesc: "Conte aos skatistas o que esperar no seu tour", + tourDetails: "Detalhes do Tour", + tourPhoto: "Foto do Tour", + tourTitle: "Título do Tour", + transportDestructionPlaceholder: "Como as equipes vão se deslocar entre os locais? Algum transporte fornecido ou recomendado?", + transportInfo: "Informações de transporte", + transportPlaceholder: "Como os participantes vão se deslocar? ex.: 'Van fornecida', 'Voe para Barcelona, alugamos uma van', 'Trem entre cidades'", + tripDatesDesc: "Fixe as datas para que os skatistas possam pedir folga, reservar voos e planejar a viagem.", + tripDatesTitle: "Datas da viagem", + updated: "Tour atualizado!", + updatedDesc: "Suas alterações foram publicadas.", + upload: "Enviar", + view: "Ver →", + worldDestruction: "World Destruction Tour", + youReceive: "Você recebe: {{amount}} sats por pessoa", + }, + editEvent: { + accessDenied: "Acesso negado", + accessDeniedDesc: "Você só pode editar eventos que você criou.", + backToEvent: "Voltar ao Evento", + detailsDesc: "Atualize as informações deste evento. Todos os campos marcados com * são obrigatórios.", + eventCover: "Capa do evento", + locationUpdated: "Localização atualizada.", + loginToEdit: "Você precisa entrar para editar este evento.", + newSpot: "Novo spot: {{location}}.", + newTime: "Novo horário: {{date}} às {{time}}.", + saveChanges: "Salvar alterações", + saving: "Salvando...", + title: "Editar Evento", + updated: "Evento atualizado!", + updatedDesc: "Suas alterações foram publicadas na rede.", + updateDetails: "Atualize os detalhes de {{title}}", + updatedNotified: "Alterações publicadas — {{count}} participantes notificados.", + updateFailed: "Falha ao atualizar", + updateMessage: "{{parts}} — veja o evento para detalhes.", + }, + editShop: { + accessDeniedDesc: "Você só pode editar lojas que você criou.", + backToShop: "Voltar à Shop", + detailsDesc: "Atualize as informações da sua loja. Todos os campos marcados com * são obrigatórios.", + loginToEdit: "Você precisa entrar para editar esta loja.", + updated: "Shop atualizada!", + updateDetails: "Atualize os detalhes de {{name}}", + }, + editTour: { + accessDeniedDesc: "Você só pode editar tours que você criou.", + loginToEdit: "Você precisa entrar para editar este tour.", + }, + eventCard: { + report: "Denunciar", + }, + eventDetail: { + aCrew: "uma crew", + addToCalendar: "Adicionar ao calendário", + backToEvents: "Voltar aos Eventos", + cancelled: "Este evento foi cancelado", + checkUpdate: "— confira a atualização", + copyFailed: "Falha ao copiar", + date: "Data", + editEvent: "Editar evento", + eventFallback: "Evento", + eventOrganizer: "Organizador do Evento", + getDirections: "Ver rota", + linkCopied: "Link copiado", + linkCopiedDesc: "Link do evento copiado — cole onde quiser.", + live: "Ao vivo:", + liveMusic: "música ao vivo", + location: "Localização", + newLocation: "Novo local", + noRsvps: "Nenhum RSVP foi registrado.", + organizer: "Organizador", + rsvpsClosed: "Os RSVPs estão fechados — este evento foi cancelado pelo anfitrião.", + seeMap: "Ver mapa", + shareEvent: "Compartilhar evento", + shareText: "{{title}} — um evento de skate no SkateSpots", + shareTextFallback: "Confira este evento de skate no SkateSpots", + time: "Horário", + timeChanged: "Horário alterado", + updatesFromHost: "Atualizações do anfitrião", + where: "Onde", + whoCame: "Quem foi", + whosGoing: "Quem vai", + }, + events: { + calendar: "Calendário", + createTour: "Criar Tour", + events: "Eventos", + faqFooter: "Tem dúvidas? Confira o FAQ →", + hosting: "Hospedando", + hostingSubtitle: "Seus eventos — RSVPs, atualizações e edições rápidas", + list: "Lista", + noEventsMatchFilters: "Nenhum evento corresponde aos seus filtros. Tente ajustá-los ou limpá-los.", + noPast: "Nenhum evento passado", + noPastBody: "Nenhum evento de skate passado encontrado nos seus filtros atuais.", + noTours: "Nenhum tour encontrado", + noToursBody: "Ainda não há tours de skate. Crie o primeiro e leve skatistas para descobrir spots!", + noToursMatchFilters: "Nenhum tour corresponde aos seus filtros. Tente ajustá-los ou limpá-los.", + noUpcoming: "Nenhum evento futuro", + noUpcomingBody: "Nenhum evento de skate futuro encontrado. Seja o primeiro a criar um!", + past: "Passados", + resultsCount: "{{count}} resultados", + searchCity: "Cidade…", + searchEvent: "Nome do evento…", + searchTour: "Nome do tour…", + tours: "Tours", + toursSubtitle: "Guias locais, viagens e competições world destruction", + upcoming: "Futuros", + }, + eventTypes: { + contest: "Competição", + demo: "Demo", + jam: "Jam", + meetup: "Meetup", + premiere: "Estreia", + session: "Sessão", + workshop: "Oficina", + }, + featured: { + active: "Ativo", + bodyEvent: "Grátis para publicar. Eventos destacados ganham um selo e ficam no topo da página de eventos.", + bodyTour: "Grátis para publicar. Tours destacados ganham um selo e ficam no topo da lista de tours.", + contextEvent: "Seu evento fica listado de graça de qualquer forma — o destaque só adiciona o selo e o impulso.", + contextTour: "Seu tour fica listado de graça de qualquer forma — o destaque só adiciona o selo e o impulso.", + daysRemaining: "Destaque ativo · restam {{count}} dias.", + headingEvent: "Destacar este evento", + headingTour: "Destacar este tour", + optional: "opcional", + platformOwner: "Dono da plataforma — o destaque fica sempre ativo.", + }, + filters: { + activeCount: "{{count}} ativos", + all: "Todos", + allLevels: "Todos os níveis", + eventType: "Tipo de evento", + following: "Seguindo", + newest: "Mais recentes", + popular: "Populares", + showResults: "Mostrar resultados", + showResultsActive: "Mostrar resultados · {{count}} ativos", + skillLevel: "Nível de habilidade", + sortBy: "Ordenar por", + topRated: "Mais bem avaliados", + tourCategory: "Categoria do tour", + trusted: "Confiável", + trustLevel: "Nível de confiança", + verified: "Verificado", + }, + food: { + bar: "Bar", + cafe: "Café", + call: "Ligar", + chooseSpot: "Escolha um spot...", + directions: "Rota", + fastFood: "Fast food", + foodCourt: "Praça de alimentação", + locationLabel: "Localização:", + noneFound: "Nenhum ponto de comida encontrado", + noneFoundDesc: "Não encontramos restaurantes ou cafés num raio de 1 km deste spot. Tente selecionar outro local.", + placesFound: "{{count}} lugares encontrados num raio de 1 km de {{spot}}", + pub: "Pub", + restaurant: "Restaurante", + selectSpot: "Selecione um spot", + selectSpotDesc: "Escolha um spot de skate no menu acima para encontrar restaurantes, cafés e outras opções de comida por perto.", + selectSpotTitle: "Selecione um Spot", + subtitle: "Encontre lugares para comer perto dos seus spots favoritos", + title: "Comida perto dos Spots", + unknown: "Desconhecido", + website: "Site", + }, + rsvp: { + areYouGoing: "Você vai?", + cant: "Não posso", + cantMakeIt: "Não vou conseguir", + going: "Eu vou", + goingCount: "vão", + goingShort: "Vou", + hostNote: "Você está hospedando isto — mas ainda pode definir seu status.", + interested: "Interessado", + interestedCount: "interessados", + loginToRsvp: "Entre para confirmar presença.", + maybe: "Talvez", + toastError: "Não foi possível confirmar presença", + toastGoing: "Você vai! 🛹", + toastInterested: "Marcado como interessado.", + toastNotGoing: "Marcado como não vai.", + tryAgain: "Tente novamente.", + }, + shop: { + addNip05Settings: "Adicione NIP-05 nas Configurações", + adminRemovedReason: "Um admin do SkateSpots removeu a shop \"{{name}}\"", + areYouOwner: "Você é o dono da Shop?", + backToMap: "Voltar ao Mapa", + claimDesc: "Se você é dono ou gerencia esta loja, pode reivindicá-la para verificar a propriedade usando NIP-05.", + claimNip05Intro: "Para reivindicar esta loja, adicione um identificador NIP-05 que corresponda ao domínio do site da loja. Por exemplo, se o site da loja é", + claimNip05Your: "seu NIP-05 deve ser", + contactShop: "Falar com a Shop", + deleted: "Shop excluída", + deletedDesc: "Pedido de exclusão enviado aos relays. A maioria dos relays removerá este conteúdo.", + deleteDialogDesc: "Isto excluirá permanentemente \"{{name}}\" de todos os relays. Esta ação não pode ser desfeita.", + deleteDialogTitle: "Excluir Shop?", + deletedReason: "Shop excluída", + deleteFailed: "Falha ao excluir", + deleteShop: "Excluir Shop", + linkCopied: "Link copiado!", + linkCopiedDesc: "Link da shop copiado.", + nip05Required: "⚠️ Verificação NIP-05 necessária para reivindicar lojas", + opens: "Abre: {{domain}}", + removeAdmin: "Remover (admin)", + removed: "Shop removida", + removedDesc: "Esta shop foi retirada e ficará oculta em todo o SkateSpots.", + removeDialogDesc: "Como admin do SkateSpots, você está retirando \"{{name}}\". Ela ficará oculta no app para todos e um pedido de exclusão será enviado aos relays.", + removeDialogTitle: "Remover esta shop? (admin)", + removeShop: "Remover Shop", + tipMapper: "Dê um zap ao mapeador", + tipMapperDesc: "Esta shop foi adicionada por um membro da comunidade. Dê um zap para agradecer!", + updateNip05: "Atualizar NIP-05 para reivindicar", + viewPhotoFull: "Ver foto em tela cheia", + viewPhotoOf: "Ver foto {{index}} de {{total}}", + }, + sponsors: { + presentedBy: "Apresentado por", + }, + tourCard: { + active: "Ativo", + completed: "Concluído", + contactForPrice: "Fale para saber o preço", + durationDays: "{{count}} dias", + durationHours: "{{count}} horas", + durationMonths: "{{count}} meses", + durationWeeks: "{{count}} semanas", + entry: "Entrada: {{amount}} sats", + happeningNow: "Acontecendo agora", + inDays: "Em {{count}} dias", + inHours: "Em {{count}}h", + inMonths: "Em {{count}} meses", + inWeeks: "Em {{count}} semanas", + maxGroup: "Máx. {{count}}", + price: "{{amount}} sats", + prizePool: "{{amount}} sats", + registrationOpen: "Inscrições abertas", + startingSoon: "Começa em breve", + teamsMax: "máx. {{count}} equipes", + tomorrow: "Amanhã", + worldwide: "Mundial", + }, + tourDetail: { + about: "Sobre este Tour", + availability: "Disponibilidade", + competitionWindow: "Janela da competição", + contactToBook: "Fale com o guia para reservar", + discountAt: "{{percent}}% OFF na {{shop}}", + duration: "Duração", + languages: "Idiomas", + loginToBook: "Entre para reservar", + loginToBookDesc: "Entre para falar com o guia e reservar este tour", + maxGroup: "Grupo máximo", + meetingPoint: "Ponto de encontro", + notFound: "Tour não encontrado", + notFoundDesc: "Este tour pode ter sido removido ou não existe.", + organizer: "Organizador", + partnerDiscount: "Desconto em loja parceira", + partnerDiscountDesc: "Reserve este tour para receber um desconto na loja de skate parceira. Mostre a confirmação da reserva à equipe da loja.", + people: "{{count}} pessoas", + perPerson: "por pessoa", + price: "Preço", + runsAbout: "Dura cerca de {{duration}}", + scheduledSession: "Sessão agendada", + shareText: "Confira este tour de skate local: {{title}}", + skillLevel: "Nível de habilidade", + spotTypes: "Tipos de Spots", + tourGuide: "Guia do Tour", + tourSponsors: "Patrocinadores do Tour", + tripDates: "Datas da viagem", + viewProfile: "Ver perfil", + }, + updates: { + admin: "Admin", + adminNote: "Você está publicando como admin do SkateSpots. Será rotulado claramente como aviso de admin, não do anfitrião.", + kindCancelled: "Cancelado", + kindNewSpot: "Novo spot", + kindNewTime: "Novo horário", + kindUpdate: "Atualização", + loading: "Carregando atualizações…", + notifiedCount: "{{count}} pessoas notificadas.", + notifiedEveryone: "Todos verão no evento.", + notifiesRsvps: "Notifica {{count}} RSVPs", + noUpdates: "Ainda sem atualizações do anfitrião. Confirme presença e você será notificado se algo mudar.", + placeholder: "Chuva — adiado para domingo 14h. Encontro na borda dos fundos…", + post: "Publicar", + postAdminUpdate: "Publicar uma atualização de admin", + posted: "Atualização publicada", + postError: "Não foi possível publicar a atualização", + postUpdate: "Publicar uma atualização", + tryAgain: "Tente novamente.", + visibleToEveryone: "Visível para todos neste evento", + }, + destination: { + bitcoin: "Bitcoin", + closeSearch: "Fechar busca", + nothingMatches: "Nada corresponde a “{{query}}”.", + placeholder: "Buscar spots, shops, comerciantes Bitcoin…", + shop: "Shop", + spot: "Spot", + typeChars: "Digite ao menos 2 caracteres. Busca spots de skate, lojas de skate e comerciantes Bitcoin.", + typeCharsNear: "Digite ao menos 2 caracteres. Busca spots de skate, lojas de skate e comerciantes Bitcoin por perto.", + }, + dateWindow: { + any: "Qualquer", + anytime: "Qualquer momento", + month: "Este mês", + monthShort: "Mês", + today: "Hoje", + todayShort: "Hoje", + week: "Esta semana", + weekend: "Fim de semana", + weekendShort: "Fds", + weekShort: "Semana", + }, + }, + marketUi: { + gearSwap: { + title: "Gear Swap", + subtitle: "Compre e venda gear de skate usado com outros skatistas", + listGear: "Anunciar Gear", + searchPlaceholder: "Buscar gear...", + allCategories: "Todas as categorias", + forSale: "À venda", + wtb: "WTB", + trust: "Confiança", + filterByTrust: "Filtrar por confiança", + allSellers: "Todos os vendedores", + verifiedOnly: "Somente verificados", + trustedPlus: "Confiáveis+", + followingOnly: "Somente seguindo", + pickupOrShip: "Retirada ou envio", + localPickup: "Retirada local", + ships: "Envia", + sortBy: "Ordenar por", + newest: "Mais recentes", + priceLowHigh: "Preço: baixo → alto", + priceHighLow: "Preço: alto → baixo", + trustScore: "Índice de confiança", + nearest: "Mais perto (local)", + listingFound: "{{count}} anúncio encontrado", + listingsFound: "{{count}} anúncios encontrados", + loadFailed: "Falha ao carregar os anúncios", + tryLater: "Tente novamente mais tarde.", + noneTitle: "Nenhum anúncio encontrado", + noneFiltered: "Nenhum gear corresponde aos seus filtros atuais. Tente limpá-los ou buscar outra coisa.", + noneFirst: "Seja o primeiro a anunciar seu gear — decks, trucks, wheels, tênis, qualquer coisa de skate!", + listYourGear: "Anuncie seu Gear", + faqLink: "Tem dúvidas? Confira o FAQ →", + }, + hub: { + browse: "Explorar", + selling: "Vendendo", + myTrades: "Minhas Trocas", + reputation: "Reputação", + loginListings: "Entre para gerenciar seus anúncios.", + loginReputation: "Entre para ver sua reputação e avaliações.", + }, + marketplace: { + heroTitle: "Shops e Marketplace", + heroBefore: "Nosso marketplace é movido por", + heroAfter: "- um marketplace descentralizado no Nostr. Lojas de skate podem listar seus produtos, e você pode comprar/vender gear usado diretamente com Bitcoin.", + whatIsTitle: "O que é o Plebeian Market?", + whatIsBody: "O Plebeian Market é um marketplace descentralizado construído no Nostr. Compre e venda gear de skate diretamente com outros skatistas usando Bitcoin. Sem intermediários, sem taxas, liberdade total.", + noFeesTitle: "Sem taxas", + noFeesBody: "Nenhuma plataforma ficando com 30%. Vendas diretas entre pessoas.", + bitcoinTitle: "Pagamentos em Bitcoin", + bitcoinBody: "Pague com Bitcoin. Rápido, seguro, global.", + decentralizedTitle: "Descentralizado", + decentralizedBody: "Construído no Nostr. Nenhuma empresa o controla.", + visit: "Visitar o Plebeian Market", + buySellTitle: "O que você pode comprar e vender", + catCompletes: "Completes montados", + preBuilt: "Completes pré-montados", + customSetups: "Setups personalizados", + beginnerBoards: "Shapes para iniciantes", + catParts: "Peças", + decks: "Decks", + trucks: "Trucks", + wheels: "Wheels", + bearings: "Bearings", + gripTape: "Griptape", + hardware: "Ferragens", + catApparel: "Vestuário e proteção", + skateShoes: "Tênis de skate", + clothing: "Roupas", + helmets: "Capacetes", + pads: "Proteções", + backpacks: "Mochilas", + catAccessories: "Acessórios", + tools: "Ferramentas", + wax: "Cera", + rails: "Rails", + stickers: "Adesivos", + videos: "Vídeos", + magazines: "Revistas", + howItWorks: "Como funciona", + step1Title: "Explore os produtos", + step1Body: "Visite o Plebeian Market e explore gear de skate de lojas e pessoas do mundo todo.", + step2Title: "Fale com os vendedores", + step2Body: "Mande mensagem diretamente aos vendedores pelo Nostr. Negocie preços, tire dúvidas e combine o envio.", + step3Title: "Pague com Bitcoin", + step3Body: "Finalize sua compra usando Bitcoin Lightning para pagamentos instantâneos e com taxas baixas.", + step4Title: "Deixe seu feedback", + step4Body: "Avalie sua experiência e construa a reputação dos vendedores no Nostr. Suas avaliações ajudam a comunidade.", + needBitcoinTitle: "Precisa de Bitcoin?", + needBitcoinBefore: "Você vai precisar de uma carteira Lightning com alguns sats para fazer compras. Confira o", + onboardingGuide: "guia de primeiros passos", + needBitcoinAfter: "para recomendações de carteira.", + ownShopTitle: "Tem uma loja de skate?", + ownShopBody: "Liste sua loja no SkateSpots e venda seus produtos no Plebeian Market. Alcance clientes no mundo todo com zero taxas de plataforma.", + addShop: "Adicione sua Shop", + startSelling: "Comece a vender", + }, + listingDetail: { + notFound: "Anúncio não encontrado", + notFoundBody: "Ele pode ter sido excluído, ou o link está errado.", + backToGearSwap: "Voltar ao Gear Swap", + gearSwap: "Gear Swap", + viewPhoto: "Ver foto {{n}}", + photoAlt: "{{title}} — foto {{n}}", + wantToBuy: "QUERO COMPRAR", + sold: "VENDIDO", + description: "Descrição", + usuallyHere: "Costuma estar aqui {{availability}}", + listed: "Anunciado em {{date}}", + listingCountOne: "{{count}} anúncio · há {{age}}d", + listingCountMany: "{{count}} anúncios · há {{age}}d", + relistActive: "Reativar como ativo", + markSold: "Marcar como vendido", + deleteListing: "Excluir anúncio", + makeOffer: "Fazer uma oferta", + shareListing: "Compartilhar anúncio", + unknown: "Desconhecido", + linkCopied: "Link copiado", + linkCopiedBody: "Compartilhe com um skatista.", + copyFailed: "Não foi possível copiar o link", + relisted: "Reativado", + relistedBody: "Seu anúncio está ativo novamente.", + couldNotUpdate: "Não foi possível atualizar", + somethingWrong: "Algo deu errado", + }, + create: { + imageUploaded: "Imagem enviada", + uploadFailed: "Falha no envio", + failed: "Falhou", + cooldownActive: "Espera ativa", + cooldownWait: "Aguarde {{time}} antes de criar outro anúncio", + limitReached: "Limite de anúncios atingido", + limitReachedBody: "Você atingiu seu limite mensal de {{limit}} anúncios", + feeRequired: "Taxa necessária", + feeRequiredBody: "Pague a taxa anti-spam para continuar", + titleRequired: "Título obrigatório", + categoryRequired: "Categoria obrigatória", + photoRequired: "Foto obrigatória", + photoRequiredBody: "Pelo menos uma foto é obrigatória ao vender gear", + nip05Required: "Verificação NIP-05 obrigatória", + nip05RequiredBody: "Você precisa de um endereço Nostr verificado para anunciar gear", + priceRequired: "Preço obrigatório para anúncios de preço fixo", + sizeRequired: "Tamanho obrigatório", + sizeRequiredBody: "Selecione um tamanho para {{category}}", + conditionRequired: "Condição obrigatória", + conditionRequiredBody: "Selecione a condição do seu {{category}}", + wtbPosted: "Pedido de compra publicado!", + wtbPostedBody: "Os vendedores poderão encontrar seu pedido.", + listingCreated: "Anúncio criado!", + listingCreatedBody: "Seu gear agora está anunciado.", + publishFailed: "Falha ao publicar", + loginRequired: "Login necessário", + loginRequiredBody: "Você precisa entrar para anunciar gear.", + backToStash: "Voltar ao Stash", + backToSpot: "Voltar para {{title}}", + backToMarketplace: "Voltar ao Marketplace", + backToMap: "Voltar ao Mapa", + wantToBuy: "Quero comprar", + listYourGear: "Anuncie seu Gear", + wtbSubtitle: "Diga à comunidade que gear você está procurando", + sellSubtitle: "Venda gear de skate para a comunidade", + fromStashTitle: "Anunciando do seu Stash", + fromStashBody: "Pré-preenchido com os detalhes do item do seu stash. Revise e escolha um ponto de encontro!", + nip05Banner: "Para evitar spam e proteger os compradores, você precisa de um endereço Nostr verificado (NIP-05) para anunciar gear.", + verifiedLabel: "Verificado:", + checkingTrust: "Verificando seu nível de confiança...", + trustLevel: "Nível de confiança:", + trusted: "Confiável", + active: "Ativo", + newcomer: "Novato", + newUser: "Novo usuário", + remaining: "{{remaining}} de {{limit}} anúncios restantes neste mês", + cooldownBody: "Usuários novos têm uma espera de 24 horas entre anúncios.", + timeRemaining: "Tempo restante: {{time}}", + monthlyLimitTitle: "Limite mensal atingido", + monthlyLimitBody: "Você atingiu seu limite de {{limit}} anúncios neste mês. Construa sua reputação criando spots ou concluindo vendas para aumentar seu limite.", + powAccepted: "Proof of work aceito!", + feePaid: "Taxa paga!", + canCreateNow: "Você já pode criar seu anúncio.", + whatDoTitle: "O que você quer fazer?", + sellGear: "VENDER GEAR", + categoryTitle: "Categoria *", + categoryHint: "Que tipo de gear?", + detailsTitle: "Detalhes do Gear", + detailsWtbHint: "Descreva o que você está procurando", + detailsSellHint: "Conte aos compradores sobre seu item", + titleLabel: "Título *", + titlePlaceholderWtb: "Procurando deck 8.0\"", + titlePlaceholderSell: "Deck Palace 8.25\" quase novo", + summaryLabel: "Resumo curto", + summaryPlaceholderWtb: "Qualquer marca, prefiro graphics minimalistas", + summaryPlaceholderSell: "Ótimo estado, mal usado", + descriptionLabel: "Descrição", + descriptionPlaceholderWtb: "Descreva exatamente o que você procura — preferências de marca, requisitos de condição etc.", + descriptionPlaceholderSell: "Ganhei este deck no Natal mas prefiro um tamanho menor. Fico feliz em deixar você testar antes de comprar!", + fulfilmentLabel: "Como é a entrega?", + pickup: "Retirada", + pickupHint: "Encontro local", + ships: "Envio", + shipsHint: "Postar", + both: "Ambos", + bothHint: "Qualquer um", + addressNote: "Nunca coletamos seu endereço — para envio, compartilhe-o em particular no chat da troca.", + postageLabel: "Quem paga o frete?", + requireEscrow: "Exigir escrow", + requireEscrowHint: "Peça ao comprador que liquide via escrow Cashu.", + postageBuyer: "Comprador paga", + postageSeller: "Eu pago", + postageSplit: "Dividido", + sizeLabel: "Tamanho", + selectSize: "Selecionar tamanho", + truckHeight: "Altura do truck", + selectHeight: "Selecionar altura", + wheelHardness: "Dureza da wheel", + selectHardness: "Selecionar dureza", + pricingTitle: "Preço", + pricingWtbHint: "Como você quer pagar?", + pricingSellHint: "Como você quer vender?", + priceLabel: "Preço *", + currencyLabel: "Moeda", + photosTitle: "Fotos", + photosSellHint: "Pelo menos uma foto é obrigatória", + photosWtbHint: "Opcional — adicione imagens de referência", + productPhoto: "Produto {{n}}", + upload: "Enviar", + photosNote: "Adicione até 5 fotos. A primeira imagem será a foto principal.", + pickupLocationTitle: "Local de retirada", + pickupLocationHint: "Vincule a um spot de skate para encontros fáceis", + searchSpots: "Buscar spots...", + noSpotsFound: "Nenhum spot encontrado. Tente outra busca.", + availabilityLabel: "Quando você costuma estar disponível?", + availabilityPlaceholder: "Fins de semana 10h-14h, ter/qui à noite", + availabilityHint: "Ajuda os compradores a combinar encontros com você", + durationTitle: "Duração do anúncio", + durationHint: "Por quanto tempo este anúncio deve ficar ativo?", + publishing: "Publicando...", + checkingEligibility: "Verificando elegibilidade...", + cooldownButton: "ESPERA: {{time}}", + limitReachedButton: "LIMITE ATINGIDO", + payFeeButton: "PAGAR TAXA PARA CONTINUAR", + postWtbButton: "PUBLICAR QUERO COMPRAR", + listForSaleButton: "ANUNCIAR GEAR À VENDA", + }, + trades: { + title: "Minhas Trocas", + loginBody: "Entre para gerenciar suas trocas do marketplace e sua reputação.", + subtitle: "Confirmações, pedidos e a reputação que eles constroem. O pagamento é combinado com o outro skatista — o app apenas registra o negócio.", + actionNeeded: "Ação necessária", + askedToConfirmSale: "pediu para você confirmar uma venda", + recordedSale: "registrou uma venda — confirme seu lado", + confirmSale: "Confirmar venda", + confirm: "Confirmar", + nothingWaiting: "Nada esperando por você agora. 🛹", + yourRecords: "Seus registros de trocas", + noTrades: "Nenhuma troca ainda. Feche um negócio e confirme-o para começar a construir reputação.", + browseGearSwap: "Explorar o Gear Swap", + roleSold: "Vendido", + roleBought: "Comprado", + roleTrade: "Troca", + with: "com", + viewListing: "Ver anúncio", + revoke: "Revogar", + revokeTitle: "Revogar este registro de troca?", + revokeBody: "Ele deixará de contar para sua reputação. A outra parte mantém a própria atestação. Use isto para um negócio disputado ou equivocado.", + revokeNote: "Retratado pelo autor.", + revoked: "Registro de troca revogado", + revokedBody: "Ele não conta mais para a reputação.", + revokeFailed: "Não foi possível revogar a troca", + saleConfirmed: "Venda confirmada", + saleConfirmedBody: "Agora eles podem confirmar o lado deles.", + saleConfirmFailed: "Não foi possível confirmar a venda", + tradeConfirmed: "Troca confirmada", + tradeConfirmedBody: "Reputação atualizada para vocês dois.", + tradeConfirmFailed: "Não foi possível confirmar a troca", + somethingWrong: "Algo deu errado.", + }, + card: { + listingDeleted: "Anúncio excluído", + listingRemoved: "Anúncio removido", + listingDeletedBody: "Seu anúncio foi removido. Relays que honram exclusões deixarão de servi-lo.", + listingRemovedBody: "Este anúncio foi retirado e ficará oculto em todo o SkateSpots.", + removeFailed: "Falha ao remover", + somethingWrong: "Algo deu errado", + markedSold: "Marcado como vendido", + markedSoldBody: "Seu anúncio agora aparece como vendido.", + couldNotUpdate: "Não foi possível atualizar", + relisted: "Reativado", + relistedBody: "Seu anúncio está ativo novamente.", + listingOptions: "Opções do anúncio", + report: "Denunciar", + removeAdmin: "Remover (admin)", + postage: "frete", + newSeller: "Novo vendedor", + saleOne: "{{count}} venda", + saleMany: "{{count}} vendas", + iHaveThis: "Eu tenho isto!", + deleteTitle: "Excluir \"{{title}}\"?", + adminRemoveTitle: "Remover este anúncio? (admin)", + deleteBody: "Isto pede aos relays que removam seu anúncio \"{{title}}\". Não dá para desfazer daqui — você teria que criar um novo.", + adminRemoveBody: "Como admin do SkateSpots, você está retirando \"{{title}}\". Ele ficará oculto no app para todos e um pedido de exclusão será enviado aos relays.", + deleting: "Excluindo…", + removing: "Removendo…", + deleteListing: "Excluir anúncio", + removeListing: "Remover anúncio", + reportCount: "{{count}} denúncia", + reports: "{{count}} denúncias", + viewTitle: "Ver {{title}}", + reportListing: "Denunciar anúncio", + manageListing: "Gerenciar anúncio", + trusted: "Confiável", + daysOld: "há {{n}}d", + monthsOld: "há {{n}}m", + yearsOld: "há {{n}}a", + listingsCount: "{{count}} anúncios", + postageBuyer: "frete: comprador", + postageSeller: "frete: vendedor", + postageSplit: "frete: dividido", + powTitle: "Proof of work NIP-13 — anti-spam gratuito", + verifiedTradeOne: "{{count}} troca verificada", + verifiedTrades: "{{count}} trocas verificadas", + reportSubmitted: "Denúncia enviada", + reportSubmittedBody: "Obrigado por ajudar a manter o marketplace seguro.", + reportFailed: "Falha ao enviar a denúncia", + selectReason: "Selecione um motivo", + reportDialogBody: "Ajude a manter o marketplace seguro denunciando anúncios inadequados ou enganosos.", + reasonLabel: "Motivo da denúncia *", + detailsLabel: "Detalhes adicionais (opcional)", + detailsPlaceholder: "Forneça qualquer contexto adicional que possa ajudar...", + reportNote: "As denúncias são publicadas no Nostr e ajudam a comunidade a identificar anúncios problemáticos. Anúncios com várias denúncias podem ser ocultados automaticamente.", + submitting: "Enviando...", + submitReport: "Enviar denúncia", + }, + tradeActions: { + tradeConfirmed: "Troca confirmada", + tradeConfirmedWithProof: "Um recibo verificável foi anexado — isto conta para trocas verificadas.", + tradeConfirmedBody: "Reputação atualizada para vocês dois.", + tradeConfirmFailed: "Não foi possível confirmar a troca", + somethingWrong: "Algo deu errado.", + requestNote: "Confirme nossa troca de \"{{title}}\".", + requestSent: "Confirmação solicitada", + requestSentBody: "O vendedor agora pode confirmar a venda e construir a reputação de ambos.", + requestFailed: "Não foi possível enviar o pedido", + escrowRefunded: "Escrow reembolsado", + escrowRefundedBody: "Os fundos voltaram para sua carteira Cashu.", + escrowRefundFailed: "Não foi possível reembolsar o escrow", + confirmThisTrade: "Confirmar esta troca", + escrowAndRequest: "Escrow e pedido", + shipsEscrowHint: "Negócio com envio — use escrow para que nenhum dos lados envie para o vazio. Compartilhe seu endereço em particular no chat da troca, nunca aqui.", + shipsHint: "Negócio com envio — prefira escrow se o vendedor oferecer, e compartilhe seu endereço apenas no chat.", + askSeller: "Pedir ao vendedor para confirmar", + waitingSeller: "Confirmação solicitada — aguardando o vendedor.", + refundEscrow: "Reembolsar escrow", + buyWithSats: "Comprar com sats", + depositTitle: "Sinal de boa-fé (opcional)", + payDeposit: "Pagar sinal", + depositBefore: "Uma troca não tem fatura, então é assim que ela ganha um", + verifiableCost: "custo verificável", + depositAfter: ". Reembolso na entrega (ou use escrow Cashu para reembolso automático). ⚠️ Prova compromisso, não entrega.", + depositPaid: "Sinal pago", + depositPaidBody: "Salvo — será anexado quando a troca for confirmada.", + paid: "Pago ⚡", + paidWithProof: "Recibo verificável salvo — confirme a troca para que ela conte.", + paidBody: "Peça ao vendedor para confirmar a troca para que ela conte para vocês dois.", + }, + offers: { + accepted: "Aceita", + declined: "Recusada", + withdrawn: "Retirada", + open: "Aberta", + noAmount: "sem valor", + titleOwner: "Ofertas ({{count}})", + titleBuyer: "Suas negociações", + you: "Você", + them: "Eles", + paidAskConfirm: "Pago — peça ao vendedor para confirmar a troca.", + payWithSats: "Pagar com sats", + accept: "Aceitar", + decline: "Recusar", + counter: "Contra-oferta", + counterPlaceholder: "Sua contra-oferta (sats)", + send: "Enviar", + counterItemPlaceholder: "…ou contra-oferte com um item para trocar (opcional)", + waitingOn: "Aguardando", + waitingOnSuffix: "— sua vez volta se eles fizerem uma contra-oferta.", + withdraw: "Retirar", + dmAccepted: "✅ Sua oferta foi aceita! Mande mensagem para combinar a entrega.", + dmDeclined: "❌ Sua oferta foi recusada.", + offerAccepted: "Oferta aceita", + offerDeclined: "Oferta recusada", + respondFailed: "Não foi possível responder", + somethingWrong: "Algo deu errado.", + offerWithdrawn: "Oferta retirada", + withdrawFailed: "Não foi possível retirar", + enterAmountOrItem: "Insira um valor ou um item para trocar", + counterDm: "Contra-oferta", + counterSent: "Contra-oferta enviada", + counterSentBody: "Agora é a vez deles.", + counterFailed: "Não foi possível enviar a contra-oferta", + }, + offer: { + validAmount: "Insira um valor válido", + describeOffer: "Descreva sua oferta", + describeOfferBody: "Adicione um valor, um item para trocar ou uma mensagem.", + dmAmount: " por {{amount}} sats", + dmItem: " (oferecendo: {{item}})", + dmBody: "🛹 Nova oferta no seu anúncio \"{{title}}\"{{amount}}{{item}}.{{note}}", + sent: "Oferta enviada", + sentBody: "{{sellerName}} pode aceitar ou recusar.", + sendFailed: "Não foi possível enviar a oferta", + somethingWrong: "Algo deu errado.", + title: "Fazer uma oferta", + description: "Ofereça sats, ou troque por algo — {{sellerName}} pode aceitar, recusar ou fazer contra-oferta. Vocês combinam a entrega entre si.", + amountLabel: "Valor (sats, opcional)", + amountPlaceholder: "ex.: 45000", + itemLabel: "Ou trocar por algo (opcional)", + itemPlaceholder: "ex.: meu deck 8.25 + wheels sobrando", + itemHint: "Vai trocar? Coloque aqui o que você oferece — pode combinar com sats.", + messageLabel: "Mensagem (opcional)", + messagePlaceholder: "Algo que o vendedor deva saber…", + send: "Enviar oferta", + }, + markSold: { + enterBuyer: "Insira o npub do comprador", + dealClosed: "Negócio fechado 🎉", + dealClosedBody: "Anúncio marcado como vendido e a troca foi publicada para reputação.", + closeFailed: "Não foi possível fechar o negócio", + somethingWrong: "Algo deu errado.", + title: "Fechar o negócio", + description: "Marca este anúncio como vendido e registra uma atestação de troca assinada para você e o comprador.", + buyerLabel: "npub do comprador", + methodLabel: "Como foi pago? (autorrelatado)", + amountLabel: "Valor em sats (opcional)", + submit: "Marcar como vendido", + }, + handoff: { + title: "Combinar a entrega", + suggest: "Sugerir um horário e lugar", + suggestDm: "Oi! Gostaria de comprar \"{{title}}\". Sugira um horário e lugar para nos encontrarmos — topo encontrar num spot de skate público.", + orMeetAt: "Ou encontre num spot público por perto:", + spotDm: "Oi! Gostaria de comprar \"{{title}}\". Quer se encontrar em {{spot}}? {{url}}", + shareDelivery: "Compartilhar detalhes de entrega", + deliveryDm: "Oi! Gostaria de comprar \"{{title}}\". Aqui estão meus detalhes de entrega:\n\nNome:\nEndereço:\n\n(Compartilhe só o que a transportadora precisa.)", + useLocker: "Usar um locker / ponto de coleta", + lockerDm: "Oi! Gostaria de comprar \"{{title}}\". Poderíamos usar um locker / ponto de coleta em vez do endereço residencial?", + noteBefore: "Estes detalhes ficam no chat privado — o SkateSpots nunca os vê. Para negócios com envio, prefira", + escrow: "escrow", + noteMiddle: ", e", + neverPay: "nunca pague fora dos trilhos do app", + noteAfter: ". Encontre-se em local público.", + }, + shipping: { + noCounterparty: "Ainda sem contraparte", + noCounterpartyBody: "O vendedor deve registrar a venda (nomeando o comprador) primeiro.", + markedShipped: "Marcado como enviado", + markedReceived: "Marcado como recebido", + issueReported: "Problema relatado", + receivedBody: "Obrigado — isto não libera o escrow; acerte diretamente com o vendedor.", + notifiedBody: "A outra parte foi notificada.", + updateFailed: "Não foi possível atualizar", + somethingWrong: "Algo deu errado.", + title: "Envio", + shipped: "enviado", + received: "recebido", + issue: "problema", + trackingPlaceholder: "Código de rastreio (opcional)", + iShipped: "Eu enviei", + iReceived: "Eu recebi", + reportIssue: "Relatar um problema", + noteBefore: "Autorrelatado — uma nota logística,", + notProof: "não uma prova", + noteAfter: ". Marcar \"recebido\" não libera o escrow. ⚠️ Não fotografe um pacote com o endereço visível, e só compartilhe um código de rastreio se estiver confortável que ele seja público.", + }, + pay: { + sent: "Pagamento enviado ⚡", + sentWithProof: "Recibo de pagamento verificável salvo — contará como pagamento verificado.", + sentBody: "Avise o vendedor — ele pode confirmar a troca para que ela conte para vocês dois.", + failed: "Falha no pagamento", + title: "Pagar com sats", + descSendPrefix: "Enviar", + descSendSuffix: "para {{sellerName}} para acertar este negócio.", + descSettle: "Acerte este negócio diretamente com {{sellerName}}.", + paid: "Pago!", + paidBody: "Peça ao vendedor para confirmar a troca — duas confirmações constroem a reputação de ambos.", + noMethod: "{{sellerName}} não definiu um método de pagamento (sem fatura Lightning ou endereço). Mande mensagem para combinar o pagamento.", + ownListing: "Este é o seu próprio anúncio.", + paying: "Pagando…", + pay: "Pagar", + payAmount: "Pagar {{amount}} sats", + footnote: "Paga da sua carteira conectada (NWC, WebLN ou Cashu) direto para {{sellerName}} — o SkateSpots nunca fica com os fundos.", + }, + spamFee: { + invoiceComment: "Taxa de anúncio do SkateSpots", + generateFailed: "Falha ao gerar a fatura", + paymentSuccess: "Pagamento bem-sucedido!", + satsSent: "{{amount}} sats enviados para {{name}}", + autoPayFailed: "Falha no pagamento automático", + autoPayFailedBody: "Pague manualmente usando o QR code ou a fatura", + invoiceCopied: "Fatura copiada!", + copyFailed: "Falha ao copiar", + received: "Pagamento recebido!", + receivedBody: "Sua taxa de {{amount}} sats foi paga. Você já pode criar seu anúncio.", + title: "Taxa única de anúncio", + subtitle: "Como novo membro, uma pequena taxa é necessária para seu primeiro anúncio.", + whyTitle: "Por que preciso pagar?", + spamLabel: "Prevenção de spam:", + spamBody: "Esta taxa impede bots e golpistas de inundar o marketplace com anúncios falsos.", + trustLabel: "Construção de confiança:", + trustBody: "Contas novas precisam provar compromisso antes de anunciar. Depois de alguns anúncios bem-sucedidos, esta taxa é dispensada.", + supportsLabel: "Ajuda a comunidade:", + supportsPrefix: "A taxa vai para", + supportsSpotOwner: " — a pessoa que criou este spot!", + supportsPlatform: " — ajudando a manter o SkateSpots no ar.", + oneTimeFee: "~${{usd}} USD • Taxa única", + payToContinue: "Pague {{amount}} sats para continuar", + proveWork: "Prove trabalho em vez disso — grátis", + proveWorkBody: "Gaste alguns segundos de CPU em vez de {{amount}} sats. Sem dinheiro, sem carteira — um imposto anti-spam, não um pagamento.", + generating: "Gerando fatura...", + processing: "Processando pagamento...", + qrAlt: "QR code de pagamento", + copyInvoice: "Copiar fatura", + openWallet: "Abrir carteira", + payWithWallet: "Pagar com carteira conectada", + scanHint: "Escaneie o QR code com uma carteira Lightning ou use os botões acima", + skipTitle: "Como pular esta taxa no futuro:", + skip1: "Adicione um spot ao mapa", + skip2: "Complete 2-3 anúncios bem-sucedidos", + skip3: "Construa sua reputação na comunidade", + skipNote: "Membros confiáveis ganham anúncios gratuitos ilimitados!", + }, + reputation: { + highlyTrusted: "Negociador altamente confiável", + building: "Construindo reputação", + newTrader: "Novo negociador", + title: "Trocas", + verified: "Verificadas", + sales: "Vendas", + purchases: "Compras", + tradeConfirmedOne: "troca mutuamente confirmada", + tradeConfirmedMany: "trocas mutuamente confirmadas", + with: "com", + personOne: "pessoa", + personMany: "pessoas", + awaiting: "Aguardando confirmação mútua", + withPaymentProof: "com uma prova de pagamento anexada", + selfReported: "(autorrelatado — não verificado)", + paymentVerified: "pagamento verificado", + zapReceipt: "(recibo de zap)", + singlePartnerWarning: "Todas as confirmações são com a mesma conta. A confirmação mútua é autorrelatada, então trate este registro com cuidado.", + lowDiversityWarning: "A maioria das confirmações vem de muito poucas contas. Um grupo pequeno atestando uns aos outros pode parecer movimentado — trate este registro com cuidado.", + ringWarning: "Estas contas negociam quase só entre si — um grupo fechado. A confirmação mútua dentro de um anel é evidência fraca.", + weighted: "Ponderado por confiança e atividade", + footnote: "Autorrelatado e assinado mutuamente — um sinal, não prova de pagamento.", + }, + reputationPanel: { + reviewOfYou: "Avaliação sobre você", + yourRecord: "seu registro", + listing: "Anúncio", + averageOne: "média de {{count}} avaliação", + averageMany: "média de {{count}} avaliações", + reviewsTitle: "Avaliações e registros de trocas", + fromOthers: "{{count}} de outros", + emptyBefore: "Ainda sem registros de trocas. Conclua um negócio e confirme-o em", + emptyAfter: "— cada confirmação vira uma avaliação nos dois perfis.", + }, + recommendations: { + published: "Recomendação publicada", + publishedBody: "Obrigado por atestar.", + failed: "Não foi possível recomendar", + somethingWrong: "Algo deu errado.", + title: "Negociador confiável", + recommendedBy: "Recomendado por", + skaterOne: "skatista", + skaterMany: "skatistas", + none: "Ainda sem recomendações.", + youRecommend: "Você recomenda este negociador ✓", + recommend: "Recomendar como negociador confiável", + }, + notification: { + newOffer: "Nova oferta", + counterOffer: "Contra-oferta", + offerAccepted: "Oferta aceita", + offerDeclined: "Oferta recusada", + offerWithdrawn: "Oferta retirada", + confirmTrade: "Confirmar uma troca", + tradeConfirmed: "Troca confirmada", + reviewOffer: "Ver a oferta", + openListing: "Abrir anúncio", + }, + confirmRow: { + rateTrade: "Avalie a troca:", + }, + deckRating: { + title: "{{value}}/10 decks", + aria: "{{n}} de 10", + }, + clink: { + tip: "Dê uma gorjeta em Bitcoin", + copiedBody: "Código CLINK copiado.", + copyFailed: "Falha ao copiar", + copyFailedBody: "Não foi possível acessar a área de transferência.", + whatIs: "O que é CLINK?", + tooltipTitle: "Pague diretamente com Bitcoin pelo Nostr", + tooltipBody: "CLINK é um código de pagamento autocustodial — sem conta em app, sem intermediário. Escaneie com uma carteira Lightning compatível e a gorjeta vai direto para a pessoa.", + descRecipient: "Envie um pagamento autocustodial em Bitcoin (Lightning) para {{recipientName}} — sem intermediário.", + descGeneric: "Envie um pagamento autocustodial em Bitcoin (Lightning) pelo Nostr — sem intermediário.", + qrAlt: "QR code da oferta CLINK", + copyCode: "Copiar código CLINK", + openWallet: "Abrir na carteira CLINK", + copyToWallet: "Copiar código para sua carteira", + priceFixed: "Fixo — {{amount}} sats", + priceFixedShort: "Preço fixo", + priceVariable: "Preço variável", + priceVariableCurrency: "Preço em {{currency}}", + priceSpontaneous: "Você escolhe o valor", + footnote: "Escaneie com uma carteira compatível com CLINK (ex.: ShockWallet). Se nada abrir, copie o código acima — talvez você não tenha uma carteira compatível com CLINK instalada. Sem custodiante, sem servidor web: a fatura é solicitada diretamente pelo Nostr.", + }, + paymentReadiness: { + ready: "Você pode receber pagamentos", + notReady: "Configure os pagamentos para receber", + readyBefore: "Seu endereço Lightning", + readyAfter: " está no seu perfil — as pessoas podem te dar zaps e pagar você diretamente.", + silentSet: " Um endereço de Bitcoin Silent Payment também está definido.", + notReadyBefore: "Adicione um endereço Lightning (e, opcionalmente, um endereço de Bitcoin Silent Payment) ao seu", + nostrProfile: "perfil Nostr", + notReadyAfter: "para que os skatistas possam te pagar. Configura uma vez e funciona em todos os perfis que você tem aqui.", + }, + seller: { + trade: "Troca", + active: "Ativo", + markSold: "Marcar vendido", + yourListings: "Seus anúncios", + activeCount: "{{count}} ativo(s)", + listItem: "Anunciar um item", + loading: "Carregando seus anúncios…", + empty: "Você ainda não tem anúncios.", + listFirst: "Anuncie seu primeiro item", + }, + noffer: { + label: "Código de Oferta CLINK", + optional: "(opcional, avançado)", + offerId: "Oferta: {{id}}", + relay: "Relay: {{relay}}", + invalidBefore: "Isto não parece um código", + invalidAfter: "válido.", + valid: "Código CLINK válido — um botão \"Pagar via CLINK\" aparecerá no seu perfil.", + help: "Cole um código de pagamento CLINK autocustodial (ex.: do ShockWallet / Lightning.Pub) para aceitar pagamentos Lightning nativos do Nostr — sem servidor web ou custodiante.", + learnSpecs: "Ver especificações", + }, + escrowPanel: { + escrowed: "Em escrow {{amount}} sats", + mint: "Mint", + refundSinceBefore: "O comprador pode reembolsar desde", + redeemBefore: "O vendedor pode resgatar agora · o comprador reembolsa após", + noExpiry: "Sem expiração definida neste token.", + }, + escrowRequest: { + enterAmount: "Insira um valor de escrow", + minLock: "Bloqueie por pelo menos {{days}} dia(s)", + requestNote: "Em escrow {{amount}} sats pela nossa troca — por favor confirme a venda.", + created: "Escrow criado 🎉", + createdBody: "{{amount}} sats bloqueados por {{days}} dias. {{sellerName}} pode resgatar na entrega.", + createFailed: "Não foi possível criar o escrow", + somethingWrong: "Algo deu errado.", + title: "Colocar esta troca em escrow", + description: "Os fundos ficam bloqueados para {{sellerName}} e são reembolsáveis por você se o negócio der errado após o prazo. Requer uma carteira Lightning conectada.", + amountLabel: "Valor (sats)", + daysLabel: "Reembolso do comprador após (dias)", + daysHint: "Após estes dias você pode recuperar os fundos se o vendedor não entregar.", + nativeOnly: "O escrow Cashu está disponível apenas no app SkateSpots (não na versão web).", + lockAndRequest: "Bloquear e solicitar", + }, + }, + labOptions: { + coach: { + skill: { + basics: "Fundamentos", + ollies: "Ollies", + kickflips: "Kickflips", + grinds: "Grinds e Slides", + manuals: "Manuals", + inverts: "Inverts", + vert: "Vert/Rampa", + bowl: "Bowl", + street: "Street", + freestyle: "Freestyle", + safety: "Segurança", + diy: "Módulos de Skate DIY", + }, + skillDesc: { + basics: "Empurrar, base, equilíbrio, virar", + ollies: "Ollie e variações (nollie, fakie)", + kickflips: "Kickflip, heelflip e variações", + grinds: "50-50, 5-0, boardslide e mais", + manuals: "Manual, nose manual, combos", + inverts: "Invert, handplant, eggplant, andrecht", + vert: "Half-pipe, quarter-pipe, drop-ins", + bowl: "Bowl carving, pumping, linhas", + street: "Obstáculos de rua e criatividade", + freestyle: "Manobras de flat e flow", + safety: "Como cair, equipamento de proteção, prevenção de lesões", + diy: "Construir rampas, rails, bordas e outros obstáculos de skate", + }, + }, + filmer: { + service: { + miniclips: "Mini Clipes", + longparts: "Video Parts Longas", + koth: "Estilo King of the Road", + documentaries: "Documentários", + contests: "Filmagem para Competições", + raw: "Material Bruto", + followlines: "Filmagem Follow / Line", + lines: "Filmagem de Lines e B-Roll", + }, + serviceDesc: { + miniclips: "Clipes de 15-60 seg para redes sociais", + longparts: "Video parts completas de 3-10 min com música", + koth: "Vídeos de skate estilo aventura/desafio", + documentaries: "Conteúdo de cultura do skate e histórias", + contests: "Cobertura profissional de competições", + raw: "Material bruto multiângulo sem edição", + followlines: "Follow-cam com fisheye para lines", + lines: "Lines com teleobjetiva e b-roll cinematográfico", + }, + skill: { + vx1000: "VX1000", + hvx: "HVX / HPX", + cinema: "Câmera de Cinema", + dslr: "DSLR / Mirrorless", + actioncam: "GoPro / Action Cam", + phone: "Filmagem com Celular", + drone: "Drone / Aéreo", + gimbal: "Gimbal / Estabilizador", + fisheye: "Lente Fisheye", + longlens: "Teleobjetiva", + "4k": "4K / Alta Taxa de Quadros", + editing: "Edição de Vídeo", + color: "Color Grading", + }, + skillDesc: { + vx1000: "Estética clássica do skate com VX1000", + hvx: "Visual SD / HD da Panasonic HVX/HPX", + cinema: "Câmera de cinema (FX3, série C, RED, BMPCC)", + dslr: "Câmera DSLR ou mirrorless de alta qualidade", + actioncam: "POV e suportes com GoPro / action cam", + phone: "Filmagem com smartphones modernos", + drone: "Imagens aéreas com drone", + gimbal: "Movimento estabilizado com gimbal", + fisheye: "Tomadas com lente fisheye grande-angular", + longlens: "Teleobjetiva para tomadas detalhadas", + "4k": "Resolução 4K e slow-mo em alta taxa de quadros", + editing: "Edição e pós-produção profissionais", + color: "Correção de cor e grading", + }, + }, + editor: { + service: { + parts: "Video Parts", + montages: "Montagens", + reels: "Reels / Clipes Curtos", + documentaries: "Documentários", + contest: "Edits de Competição", + brand: "Vídeos de Marca / Promo", + motion: "Motion Graphics", + colorgrade: "Somente Color Grading", + }, + serviceDesc: { + parts: "Video parts completas de skate com trilha sonora", + montages: "Edits de compilação a partir de material bruto", + reels: "Clipes e reels de 15–60 seg para redes sociais", + documentaries: "Filmes de cultura do skate com histórias", + contest: "Edits de resumo para competições e eventos", + brand: "Conteúdo promocional para marcas e lojas", + motion: "Títulos, transições, efeitos e gráficos", + colorgrade: "Correção de cor e grading com LUTs", + }, + skill: { + premiere: "Adobe Premiere", + resolve: "DaVinci Resolve", + finalcut: "Final Cut Pro", + aftereffects: "After Effects", + luts: "LUTs Personalizadas", + vhs: "Estética VHS / Retrô", + "4k": "Fluxos de Trabalho 4K e RAW", + sound: "Sound Design / Mixagem", + }, + skillDesc: { + premiere: "Edição no Adobe Premiere Pro", + resolve: "Edição e grading no DaVinci Resolve", + finalcut: "Edição no Final Cut Pro", + aftereffects: "Motion graphics e composição", + luts: "Desenvolvimento de looks de cor personalizados", + vhs: "Glitch VHS, super-8, looks de filme retrô", + "4k": "Fluxos de trabalho com câmeras RAW/LOG de alta resolução", + sound: "Sincronia musical, SFX, masterização de áudio", + }, + }, + photo: { + service: { + action: "Action / Fotos de Manobras", + sequence: "Fotos em Sequência", + portraits: "Retratos", + editorial: "Editorial / Revista", + product: "Fotografia de Produto / Loja", + events: "Cobertura de Eventos", + lifestyle: "Lifestyle / Documental", + prints: "Prints e Zines", + }, + serviceDesc: { + action: "Fotos do auge da ação de manobras e lines", + sequence: "Sequências de manobras em múltiplos quadros", + portraits: "Retratos de skatistas e fotos de equipe", + editorial: "Espaços editoriais prontos para revista", + product: "Fotografia de decks, gear e produtos da loja", + events: "Cobertura de comps, jams e estreias", + lifestyle: "Documental de bastidores e cultura", + prints: "Prints físicos, zines e livros de fotos", + }, + camera: { + dslr: "DSLR", + mirrorless: "Mirrorless", + medium: "Médio Formato", + film35: "Filme 35mm", + filmmedium: "Filme Médio Formato", + point: "Point & Shoot", + phone: "Celular", + }, + lens: { + fisheye: "Fisheye", + wide: "Grande-angular", + standard: "Padrão / Prime", + telephoto: "Teleobjetiva / Longa", + macro: "Macro", + zoom: "Zoom", + }, + lighting: { + strobes: "Strobes de Estúdio", + speedlights: "Speedlights / Flashes", + profoto: "Profoto", + elinchrom: "Elinchrom", + godox: "Godox", + triggers: "Disparadores Remotos", + continuous: "Contínua / LED", + reflectors: "Refletores / Difusores", + naturallight: "Somente Luz Natural", + }, + support: { + tripod: "Tripé", + monopod: "Monopé", + lightstands: "Tripés de Luz", + gimbal: "Gimbal", + bag: "Rig Móvel / Bolsa", + laptop: "Tethering no Local", + }, + style: { + flashfisheye: "Flash Fisheye", + natural: "Luz Natural", + bw: "Preto e Branco", + film: "Estética de Filme", + longlens: "Teleobjetiva", + studio: "Estúdio / Iluminado", + street: "Rua / Documental", + }, + }, + builder: { + service: { + diy: "Spots DIY", + concrete: "Parques de Concreto", + wood: "Rampas de Madeira", + bowls: "Bowls e Piscinas", + transitions: "Transições e Quarters", + rails: "Rails e Bordas", + boxes: "Manny Pads e Boxes", + minis: "Mini Rampas", + pumptrack: "Pump Tracks", + foam: "Foam Pits / Indoor", + repairs: "Reparos e Recuperação", + design: "Projeto e Consultoria", + }, + serviceDesc: { + diy: "Spots DIY comunitários e construções guerrilha", + concrete: "Pistas de skate de concreto moldado e obstáculos", + wood: "Rampas de madeira, launch boxes e obstáculos", + bowls: "Bowls, piscinas e transição funda", + transitions: "Quarterpipes, banks e transição", + rails: "Rails de aço, bordas e obstáculos de grind", + boxes: "Manny pads, funboxes e obstáculos de rua", + minis: "Mini rampas e setups de quintal", + pumptrack: "Pump tracks e linhas de flow", + foam: "Foam pits, resi e obstáculos de treino indoor", + repairs: "Conserto, remendo e recuperação de spots existentes", + design: "Plantas, desenhos e consultoria de construção", + }, + skill: { + concretework: "Concreto / Projetado", + welding: "Solda / Fabricação em Aço", + carpentry: "Carpintaria / Madeira", + formwork: "Formas e Armadura", + masonry: "Alvenaria / Blocos", + coping: "Coping (piscina / aço)", + surfacing: "Skatelite / Superfície", + earthworks: "Terraplenagem / Escavação", + }, + scale: { + backyard: "Quintal / Mini", + diycommunity: "DIY Comunitário", + publicpark: "Parque Público Completo", + indoor: "Espaço Indoor", + event: "Pista de Evento / Competição", + }, + }, + artist: { + service: { + boardart: "Arte de Shape", + logos: "Logos e Branding", + posters: "Pôsteres e Flyers", + merch: "Merch e Vestuário", + zines: "Zines e Impressos", + illustration: "Ilustração", + stickers: "Adesivos e Decalques", + webdesign: "Web / Digital", + typography: "Tipografia / Lettering", + animation: "Animação / Motion", + }, + serviceDesc: { + boardart: "Artes de deck e arte de griptape", + logos: "Identidade de marca, logos e wordmarks", + posters: "Pôsteres de eventos, flyers e arte de shows", + merch: "Estampas para camisetas, moletons e vestuário", + zines: "Zines, editorial e layout de impressão", + illustration: "Ilustração personalizada e criação de personagens", + stickers: "Pacotes de adesivos, decalques e slaps", + webdesign: "Sites, digital e UI", + typography: "Lettering à mão e tipos personalizados", + animation: "Motion graphics e animação", + }, + medium: { + digital: "Digital / Vetor", + handdrawn: "Feito à Mão", + screenprint: "Serigrafia", + paint: "Tinta / Acrílico", + collage: "Colagem / Misto", + photo: "Foto / Photoshop", + "3d": "3D / Render", + }, + tool: { + illustrator: "Adobe Illustrator", + photoshop: "Adobe Photoshop", + procreate: "Procreate", + affinity: "Affinity", + figma: "Figma", + blender: "Blender", + aftereffects: "After Effects", + clipstudio: "Clip Studio", + }, + }, + graffiti: { + style: { + throwups: "Throw-ups", + pieces: "Pieces / Burners", + murals: "Murais", + characters: "Personagens", + lettering: "Lettering / Wildstyle", + stencil: "Estêncil", + handstyles: "Handstyles / Tags", + "3dstyle": "Estilo 3D", + abstract: "Abstrato", + }, + styleDesc: { + throwups: "Preenchimentos rápidos de duas cores", + pieces: "Pieces e burners em cores cheias", + murals: "Murais e produções em grande escala", + characters: "Trabalho de personagens e figuras", + lettering: "Wildstyle e estrutura de letras", + stencil: "Estêncil e arte de rua", + handstyles: "Tags e handstyles", + "3dstyle": "Lettering 3D e anamórfico", + abstract: "Abstrato e freestyle", + }, + medium: { + spray: "Latas de Spray", + rollers: "Rolos / Emulsão", + markers: "Marcadores / Tintas", + brush: "Pincel / Tinta", + digital: "Digital / Procreate", + }, + context: { + legalwalls: "Muros Legais", + commissions: "Encomendas", + liveart: "Pintura ao Vivo", + skateparks: "Murais em Pistas de Skate", + interiors: "Interiores / Lojas", + workshops: "Oficinas", + }, + }, + tattoo: { + style: { + traditional: "Tradicional / Old School", + neotraditional: "Neo-Tradicional", + fineline: "Traço Fino", + blackwork: "Blackwork", + realism: "Realismo", + lettering: "Lettering / Script", + illustrative: "Ilustrativo", + skateflash: "Skate Flash", + ignorant: "Estilo Ignorant / Handpoke", + japanese: "Japonês / Irezumi", + }, + styleDesc: { + traditional: "Linhas fortes, clássico americano", + neotraditional: "Tradicional com detalhes modernos", + fineline: "Trabalho delicado de agulha única", + blackwork: "Preto sólido e padrões", + realism: "Fotorrealista e retratos", + lettering: "Script, lettering e frases", + illustrative: "Ilustrativo e gráfico", + skateflash: "Desenhos flash de cultura do skate", + ignorant: "Estilo ignorant / handpoke ingênuo", + japanese: "Tradicional japonês / irezumi", + }, + method: { + machine: "Máquina", + handpoke: "Hand-Poke / Stick & Poke", + flash: "Flash Disponível", + custom: "Desenhos Personalizados", + coverup: "Cover-ups", + }, + }, + trainer: { + focus: { + strength: "Força e Condicionamento", + mobility: "Mobilidade e Flexibilidade", + injuryprevention: "Prevenção de Lesões", + rehab: "Reabilitação / Fisio", + recovery: "Recuperação e Bodywork", + balance: "Equilíbrio e Estabilidade", + cardio: "Cardio / Resistência", + nutrition: "Orientação Nutricional", + }, + focusDesc: { + strength: "Construir força e potência para andar de skate", + mobility: "Amplitude de movimento e flexibilidade", + injuryprevention: "Prehab e redução do risco de lesões", + rehab: "Fisioterapia e reabilitação pós-lesão", + recovery: "Massagem, bodywork e recuperação", + balance: "Propriocepção, equilíbrio e estabilidade", + cardio: "Condicionamento e resistência", + nutrition: "Dicas de alimentação e nutrição", + }, + injury: { + ankles: "Tornozelos", + knees: "Joelhos", + wrists: "Punhos", + hips: "Quadris", + back: "Costas / Coluna", + shoulders: "Ombros", + heelbruise: "Contusão no Calcanhar", + concussion: "Protocolo de Concussão", + }, + credential: { + physio: "Fisioterapeuta Licenciado", + osteo: "Osteopata", + certtrainer: "Personal Certificado", + sportstherapist: "Terapeuta Esportivo", + massage: "Massoterapeuta", + inperson: "Presencial", + remote: "Remoto / Online", + }, + }, + musician: { + genre: { + punk: "Punk", + hardcore: "Hardcore", + metal: "Metal", + rock: "Rock", + indie: "Indie / Alt", + hiphop: "Hip-Hop / Rap", + electronic: "Eletrônica", + lofi: "Lo-Fi / Beats", + reggae: "Reggae / Dub", + ska: "Ska", + jazz: "Jazz", + funk: "Funk / Soul", + flamenco: "Flamenco", + folk: "Folk / Acústico", + experimental: "Experimental", + grunge: "Grunge", + }, + instrument: { + vocals: "Vocais", + guitar: "Guitarra", + bass: "Baixo", + drums: "Bateria", + keys: "Teclas / Synth", + dj: "DJ / Pratos", + producer: "Produtor / Beats", + sax: "Sax / Metais", + strings: "Cordas", + other: "Outro", + }, + act: { + solo: "Artista Solo", + band: "Banda", + dj: "DJ", + producer: "Produtor", + collective: "Coletivo", + }, + }, + judge: { + format: { + game_of_skate: "Game of S.K.A.T.E.", + best_trick: "Best Trick", + jam: "Formato Jam", + contest: "Contest / Comp", + street_league: "Estilo Street League", + bowl: "Bowl / Vert", + mini_ramp: "Mini Rampa", + park: "Park", + street: "Street", + freestyle: "Freestyle", + world_tour: "World Destruction Tour", + am_series: "Série Am / Qualificatórias", + local_jam: "Jam Local / Grassroots", + online: "Online / Concurso no IG", + }, + specialty: { + head_judge: "Juiz Principal", + scoring: "Pontuação / Tabulação", + mc: "MC / Apresentador", + format_design: "Design de Formato", + rules: "Regras / Arbitragem", + brackets: "Chaves / Baterias", + livestream: "Julgamento por Livestream", + am_scout: "Olheiro Am", + }, + level: { + local: "Local", + regional: "Regional", + national: "Nacional", + international: "Internacional", + pro: "Circuito Pro", + }, + }, + organizer: { + event: { + street_jam: "Street Jam", + best_trick: "Best Trick", + game_of_skate: "Game of S.K.A.T.E.", + contest: "Contest / Comp", + bowl: "Bowl / Vert", + mini_ramp: "Mini Rampa", + park: "Sessão no Park", + demo: "Demo Pro", + clinic: "Clínica / Workshop", + meetup: "Meetup / Rolê", + downhill: "Downhill / Corrida", + slalom: "Slalom", + kids: "Crianças / Jovens", + charity: "Caridade / Arrecadação", + tour_stop: "Parada de Tour", + premiere: "Estreia de Vídeo", + market: "Feira / Exposição de Arte", + }, + service: { + organizing: "Organização Completa", + hosting: "Apresentação / MC", + permits: "Licenças e Prefeitura", + sponsorship: "Patrocínio / Parcerias de Marca", + promotion: "Promoção e Marketing", + livestream: "Livestream / Cobertura", + sound: "Som e Música", + ramps: "Rampas e Obstáculos", + safety: "Segurança e Primeiros Socorros", + vendors: "Comida e Vendedores", + media: "Cobertura de Foto / Vídeo", + registration: "Inscrições e Chaves", + }, + scale: { + grassroots: "Grassroots", + local: "Local", + regional: "Regional", + national: "Nacional", + international: "Internacional", + pro: "Circuito Pro", + }, + }, + barber: { + service: { + haircut: "Corte de Cabelo", + fade: "Fade", + beard: "Aparo de Barba", + lineup: "Line-up / Contorno", + colour: "Coloração e Tinta", + kids: "Cortes Infantis", + }, + serviceDesc: { + haircut: "Um corte clássico — máquina e tesoura.", + fade: "Um degradê gradual — baixo, médio ou alto.", + beard: "Aparo, modelagem e limpeza da barba.", + lineup: "Bordas limpas na linha do cabelo e no pescoço.", + colour: "Coloração, descoloração, tintura e tonalização.", + kids: "Cortes com paciência para skatistas mais novos.", + }, + style: { + skin_fade: "Skin Fade", + taper: "Taper", + buzz: "Buzz Cut", + mohawk: "Moicano", + mullet: "Mullet", + curly: "Cachos / Black Power", + long: "Cabelo Longo / Camadas", + classic: "Corte Clássico na Tesoura", + }, + setting: { + shop: "Loja / Barbearia", + mobile: "Móvel / Atendimento em Casa", + event: "Eventos e Competições de Skate", + }, + }, + tour: { + skill: { + beginner: { + label: "Iniciante", + description: "Novo no skate ou nas manobras básicas", + }, + intermediate: { + label: "Intermediário", + description: "À vontade na maioria dos terrenos", + }, + advanced: { + label: "Avançado", + description: "Skatista experiente, spots pesados", + }, + all: { + label: "Todos os níveis", + description: "Adequado para todos", + }, + }, + }, + }, +}; export default ptBatch6; diff --git a/src/i18n/pt/batch7.ts b/src/i18n/pt/batch7.ts index 009cb43..2e05fb4 100644 --- a/src/i18n/pt/batch7.ts +++ b/src/i18n/pt/batch7.ts @@ -1,4 +1,985 @@ -/** pt — batch 7. Filled by the translation pass; empty until then. */ -const ptBatch7 = {}; +/** pt — batch 7. Filled by the translation pass. */ +const ptBatch7 = { + events: { + title: 'Eventos de Skate', + createEvent: 'Criar Evento', + editEvent: 'Editar Evento', + eventDetails: 'Detalhes do Evento', + eventName: 'Nome do Evento', + eventType: 'Tipo de Evento', + date: 'Data', + time: 'Horário', + startDate: 'Data de Início', + endDate: 'Data de Término', + venue: 'Local', + organizer: 'Organizador', + attendees: 'Participantes', + going: 'Vou', + interested: 'Interessado', + rsvp: 'RSVP', + ticketPrice: 'Preço do Ingresso', + freeEntry: 'Entrada Gratuita', + register: 'Inscrever-se', + moreInfo: 'Mais Informações', + upcomingEvents: 'Próximos', + pastEvents: 'Anteriores', + noEvents: 'Nenhum evento encontrado', + findEvents: 'Encontre campeonatos, demos, sessões e mais', + searchPlaceholder: 'Buscar eventos...', + loginToCreate: 'Entre para criar eventos', + noEventsMatch: 'Nenhum próximo evento corresponde aos seus filtros.', + noUpcoming: 'Nenhum próximo evento encontrado.', + noPast: 'Nenhum evento anterior encontrado.', + types: { + contest: 'Campeonato', + session: 'Sessão', + meetup: 'Encontro', + premiere: 'Pré-estreia de Vídeo', + workshop: 'Oficina', + demo: 'Demo', + jam: 'Jam', + }, + }, + wallet: { + title: 'Carteira', + balance: 'Saldo', + send: 'Enviar', + receive: 'Receber', + transactions: 'Transações', + history: 'Histórico', + noTransactions: 'Nenhuma transação ainda', + sendSats: 'Enviar Sats', + receiveSats: 'Receber Sats', + amount: 'Valor', + recipient: 'Destinatário', + lightning: 'Lightning', + onChain: 'On-chain', + invoice: 'Fatura', + address: 'Endereço', + scanQR: 'Escanear QR', + paste: 'Colar', + payInvoice: 'Pagar Fatura', + createInvoice: 'Criar Fatura', + copied: 'Copiado para a área de transferência!', + insufficientFunds: 'Saldo insuficiente', + paymentSent: 'Pagamento enviado!', + paymentReceived: 'Pagamento recebido!', + cashu: { + title: 'Carteira Cashu', + tokens: 'Tokens', + mint: 'Mint', + mints: 'Mints', + manageMints: 'Gerenciar Mints', + addMint: 'Adicionar Mint', + removeMint: 'Remover Mint', + defaultMint: 'Mint Padrão', + backup: 'Backup', + restore: 'Restaurar', + recoveryPhrase: 'Frase de Recuperação', + viewRecoveryPhrase: 'Ver Frase de Recuperação', + seedWarning: + 'Isso é como seu nsec do Nostr - mantenha em segredo e faça backup!', + }, + }, + spots: { + addSpot: 'Adicionar Spot', + editSpot: 'Editar Spot', + spotDetails: 'Detalhes do Spot', + spotName: 'Nome do Spot', + spotType: 'Tipo de Spot', + description: 'Descrição', + location: 'Localização', + address: 'Endereço', + photos: 'Fotos', + addPhotos: 'Adicionar Fotos', + obstacles: 'Obstáculos', + features: 'Características', + bustLevel: 'Nível de Risco', + bestTime: 'Melhor Horário', + tips: 'Dicas', + reviews: 'Avaliações', + addReview: 'Adicionar Avaliação', + reportSpot: 'Denunciar Spot', + directions: 'Como Chegar', + shareSpot: 'Compartilhar Spot', + createdBy: 'Criado por', + lastUpdated: 'Última atualização', + types: { + park: 'Skatepark', + street: 'Spot de Rua', + diy: 'Spot DIY', + plaza: 'Praça', + indoor: 'Indoor', + bowl: 'Bowl', + vert: 'Vert', + miniramp: 'Mini Ramp', + }, + bustLevels: { + chill: 'Tranquilo', + moderate: 'Moderado', + sketchy: 'Arriscado', + heavy: 'Pesado', + }, + }, + settings: { + title: 'Configurações', + profile: 'Perfil', + editProfile: 'Editar Perfil', + account: 'Conta', + security: 'Segurança', + relays: 'Relays', + appearance: 'Aparência', + language: 'Idioma', + notifications: 'Notificações', + privacy: 'Privacidade', + about: 'Sobre', + help: 'Ajuda', + feedback: 'Feedback', + version: 'Versão', + displayName: 'Nome de Exibição', + username: 'Nome de Usuário', + bio: 'Bio', + website: 'Site', + lightningAddress: 'Endereço Lightning', + profilePicture: 'Foto de Perfil', + banner: 'Banner', + saveProfile: 'Salvar Perfil', + backupKeys: 'Fazer Backup das Chaves', + exportKeys: 'Exportar Chaves', + secretKey: 'Chave Secreta', + publicKey: 'Chave Pública', + showSecretKey: 'Mostrar Chave Secreta', + hideSecretKey: 'Ocultar Chave Secreta', + copyKey: 'Copiar Chave', + keysBackedUp: 'Você confirmou que suas chaves estão salvas em segurança.', + keysNotBackedUp: + 'Não deixe de fazer backup da sua frase de recuperação ou chave secreta!', + selectLanguage: 'Selecionar Idioma', + english: 'Inglês', + spanish: 'Espanhol', + }, + createSpot: { + title: 'Adicionar um Spot de Skate', + subtitle: 'Compartilhe um spot de skate com a comunidade', + backToMap: 'Voltar ao Mapa', + namePlaceholder: 'ex.: Hollywood High School', + descriptionPlaceholder: + 'Descreva o spot, os obstáculos, os melhores horários para andar, informações de segurança, etc.', + addressPlaceholder: 'ex.: 1521 N Highland Ave, Los Angeles, CA', + selectType: 'Selecione o tipo de spot', + selectBustLevel: 'Selecione o nível de risco', + uploadPhotos: 'Enviar', + dragDrop: 'Arraste e solte ou clique para enviar', + maxPhotos: 'Máx. 5 fotos', + publishing: 'Publicando...', + success: 'Spot publicado com sucesso!', + error: 'Falha ao publicar o spot', + locationRequired: 'Selecione uma localização no mapa', + useCurrentLocation: 'Usar minha localização atual', + pickOnMap: 'Escolher Localização no Mapa', + loginToAdd: 'Você precisa entrar para adicionar um spot de skate.', + locationLabel: 'Localização', + tapToPlace: 'Toque no mapa para posicionar o pino, ou arraste-o para ajustar.', + manualCoords: 'Inserir coordenadas manualmente', + moreDetails: 'Mais detalhes (opcional)', + photoHint: 'uma foto é obrigatória para publicar', + nameRequired: 'Digite um nome para este spot.', + descriptionRequired: 'Descreva este spot.', + addressRequired: 'Adicione um endereço ou nome da área.', + photoRequired: 'Adicione pelo menos uma foto.', + draftTitle: 'Você tem um rascunho não salvo', + draftBody: 'Continue de onde parou ou descarte-o.', + draftResume: 'Continuar', + draftDiscard: 'Descartar rascunho', + requiredFields: + 'Conte-nos sobre este spot. Todos os campos marcados com * são obrigatórios.', + coordinates: 'Coordenadas', + latitudePlaceholder: 'Latitude (ex.: 34.1012)', + longitudePlaceholder: 'Longitude (ex.: -118.3389)', + gettingLocation: 'Obtendo localização...', + accessType: 'Tipo de Acesso', + publicTitle: 'Público - Aberto a Todos', + publicDesc: 'Pistas de skate, praças públicas, spots de rua', + privateTitle: 'Propriedade Privada - Precisa de Permissão', + privateDesc: 'Rampas de quintal, terreno privado, spots fechados', + localsTitle: 'Pergunte aos Locais Primeiro', + localsDesc: 'Respeite o spot, não o queime', + contactInfo: 'Informações de Contato', + contactPlaceholder: 'ex.: Telefone, Instagram, e-mail...', + contactHintPrivate: + 'Como as pessoas devem entrar em contato para pedir permissão?', + contactHintLocals: + 'Como as pessoas devem entrar em contato para perguntar sobre o spot?', + }, + marketplace: { + title: 'Marketplace', + subtitle: 'Compre, venda e troque Gear de skate', + addListing: 'Adicionar Anúncio', + condition: 'Condição', + conditions: { + new: 'Novo', + likeNew: 'Seminovo', + good: 'Bom', + fair: 'Razoável', + poor: 'Ruim', + }, + categories: { + all: 'Todos', + decks: 'Decks', + trucks: 'Trucks', + wheels: 'Rodas', + bearings: 'Rolamentos', + shoes: 'Tênis', + clothing: 'Roupas', + protection: 'Proteção', + other: 'Outros', + }, + priceRange: 'Faixa de Preço', + location: 'Localização', + seller: 'Vendedor', + contact: 'Contatar Vendedor', + makeOffer: 'Fazer Oferta', + sold: 'Vendido', + available: 'Disponível', + gear: 'Gear', + sellGear: 'Vender Gear', + wantToBuy: 'Quero Comprar', + }, + auth: { + login: 'Entrar', + logout: 'Sair', + signUp: 'Criar Conta', + signUpTitle: 'Novo no Nostr?', + signUpDesc: 'Crie uma nova conta para começar. É grátis e aberto.', + orLogIn: 'Ou entre', + loginWithExtension: 'Entrar com Extensão', + loginWithAmber: 'Entrar com Amber (Android)', + loginWithKey: 'Chave Secreta (nsec) ou Frase de Recuperação', + loginWithBunker: 'Entrar com Nostr Connect', + bunkerUri: 'String de Conexão do Bunker', + openAmber: 'Abrir Amber', + connectToBunker: 'Conectar ao Bunker', + noExtension: 'Nenhuma extensão detectada.', + extensionHelp: + 'Tente usar o botão Criar Conta acima para criar uma nova conta, ou use as abas Amber, Chave ou Bunker se você já tem credenciais.', + amberDesc: + 'Amber é um aplicativo assinador Nostr seguro para dispositivos Android. Clique no botão abaixo para abrir o Amber e autorizar o acesso.', + bunkerDesc: + 'Acesse sua conta de qualquer dispositivo usando um assinador remoto (bunker). Suas chaves ficam seguras no servidor, nunca expostas a sites.', + keyPlaceholder: 'nsec1... ou sua frase de recuperação de 12 palavras', + keyHint: + 'Você pode colar sua chave nsec ou a frase de recuperação de 12 palavras', + uploadKeyFile: 'Enviar Seu Arquivo de Chave', + loggingIn: 'Entrando...', + connecting: 'Conectando...', + verifying: 'Verificando...', + }, + createEvent: { + title: 'Criar um Evento', + subtitle: 'Organize um evento de skate para a comunidade', + backToEvents: 'Voltar aos Eventos', + namePlaceholder: 'ex.: Sessão de Skate de Verão', + descriptionPlaceholder: + 'Descreva o evento, o que esperar, regras, prêmios, etc.', + selectType: 'Selecione o tipo de evento', + venuePlaceholder: 'ex.: Venice Beach Skatepark, CA', + selectDate: 'Selecionar data', + selectTime: 'Selecionar horário', + ticketPricePlaceholder: 'Deixe vazio para eventos gratuitos', + publishing: 'Publicando...', + success: 'Evento publicado com sucesso!', + error: 'Falha ao publicar o evento', + loginToCreate: 'Você precisa entrar para criar um evento.', + requiredFields: + 'Conte-nos sobre este evento. Todos os campos marcados com * são obrigatórios.', + startDateTime: 'Data e Horário de Início', + endDateTime: 'Data e Horário de Término (opcional)', + coordinatesOptional: 'Coordenadas (opcional)', + coverImage: 'Imagem de Capa', + uploadCover: 'Enviar imagem de capa', + nip05Recommended: 'Verificação NIP-05 Recomendada', + nip05Desc: + 'Adicione um identificador NIP-05 ao seu perfil para verificar sua identidade e gerar confiança com os participantes.', + addNip05: 'Adicionar NIP-05 nas Configurações', + }, + labPage: { + title: 'The Lab', + subtitle: + 'Aprenda manobras. Capture momentos. Conecte-se com outros Skaters', + coachesTab: 'Coaching', + filmersTab: 'Filmagem', + offerCoaching: 'OFEREÇA COACHING', + offerFilming: 'OFEREÇA FILMAGEM', + loginToOffer: 'Entre para oferecer serviços', + whatToLearn: 'O QUE VOCÊ QUER APRENDER?', + whatContent: 'QUE TIPO DE CONTEÚDO?', + selectSkillsDesc: 'Selecione habilidades e nós te conectaremos com coaches', + selectFilmingDesc: 'Selecione os serviços de filmagem que você procura', + searchPlaceholder: 'Buscar por nome, localização ou habilidades...', + noServicesYet: 'AINDA NÃO HÁ SERVIÇOS', + beFirstToOffer: + 'Seja o primeiro a oferecer serviços de coaching ou filmagem para a comunidade!', + skills: 'Habilidades', + rate: 'Valor', + perHour: '/hora', + contact: 'Contato', + viewProfile: 'Ver Perfil', + noProfilesYet: 'Nenhum perfil ainda', + beFirstCoach: 'Seja o primeiro a se registrar como coach!', + beFirstFilmer: 'Seja o primeiro a se registrar como filmer!', + yearsExperience: 'anos de experiência', + }, + 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', + }, + lab: { + title: 'The Lab', + subtitle: 'Evolua seu skate', + coaches: 'Coaches', + filmers: 'Filmers', + findCoach: 'Encontrar um Coach', + becomeCoach: 'Seja um Coach', + findFilmer: 'Encontrar um Filmer', + becomeFilmer: 'Seja um Filmer', + hourlyRate: 'Valor por Hora', + experience: 'Experiência', + specialties: 'Especialidades', + availability: 'Disponibilidade', + bookSession: 'Agendar uma Sessão', + contactCoach: 'Contatar Coach', + noCoaches: 'Nenhum coach encontrado na sua região', + noFilmers: 'Nenhum filmer encontrado na sua região', + }, + shops: { + title: 'Skate Shops', + addShop: 'Adicionar Shop', + editShop: 'Editar Shop', + shopDetails: 'Detalhes do Shop', + shopName: 'Nome do Shop', + hours: 'Horários', + phone: 'Telefone', + website: 'Site', + services: 'Serviços', + brands: 'Marcas', + supportLocal: 'Apoie o Comércio Local', + nip05: 'NIP-05 do Shop', + nip05Hint: + 'Um identificador opcional que você controla para este Shop (ex.: shop@yourdomain.com), verificado com a sua chave. Adicione até 5.', + }, + becomeFilmer: { + title: 'Seja um Filmer', + subtitle: 'Capture os melhores clipes para a comunidade', + bioPlaceholder: + 'Conte-nos sobre sua experiência em filmagem e equipamentos...', + specialtiesPlaceholder: 'ex.: olho de peixe, teleobjetiva, drone, edição', + selectSpecialties: 'Selecione suas especialidades', + hourlyRate: 'Valor por Hora (sats)', + ratePlaceholder: 'ex.: 5000', + locationPlaceholder: 'Sua cidade ou região', + portfolioUrl: 'URL do Portfólio', + portfolioPlaceholder: 'Link para o seu trabalho (YouTube, Instagram, etc.)', + publishing: 'Publicando perfil...', + success: 'Perfil de filmer criado!', + error: 'Falha ao criar o perfil', + }, + food: { + title: 'Spots de Comida', + subtitle: 'Abasteça antes ou depois da sua sessão', + addFood: 'Adicionar Spot de Comida', + categories: { + all: 'Todos', + burgers: 'Hambúrgueres', + pizza: 'Pizza', + tacos: 'Tacos', + coffee: 'Café', + drinks: 'Bebidas', + snacks: 'Lanches', + }, + skaterFriendly: 'Amigável a Skatistas', + nearSpots: 'Perto de Spots de Skate', + }, + profile: { + posts: 'Publicações', + spots: 'Spots', + events: 'Eventos', + following: 'Seguindo', + followers: 'Seguidores', + editProfile: 'Editar Perfil', + follow: 'Seguir', + unfollow: 'Deixar de Seguir', + noPostsYet: 'Nenhuma publicação ainda', + noBio: 'Sem bio ainda', + zapProfile: 'Zapar este skatista', + }, + becomeCoach: { + title: 'Seja um Coach', + subtitle: 'Compartilhe suas habilidades e ajude outros skatistas a evoluir', + bioPlaceholder: + 'Conte-nos sobre sua trajetória no skate e seu estilo de ensino...', + skillsPlaceholder: 'ex.: kickflip, heelflip, grinds, bowls', + selectSkills: 'Selecione as habilidades que você pode ensinar', + hourlyRate: 'Valor por Hora (sats)', + ratePlaceholder: 'ex.: 5000', + locationPlaceholder: 'Sua cidade ou região', + publishing: 'Publicando perfil...', + success: 'Perfil de coach criado!', + error: 'Falha ao criar o perfil', + }, + weather: { + title: 'Clima', + current: 'Condições Atuais', + forecast: 'Previsão', + humidity: 'Umidade', + wind: 'Vento', + feelsLike: 'Sensação de', + goodForSkating: 'Bom para andar de skate!', + notIdeal: 'Condições não ideais', + allWeather: 'Todo Clima', + goodWeather: 'Clima Bom', + perfectWeather: 'Clima Perfeito', + }, + errors: { + somethingWentWrong: 'Algo deu errado', + tryAgainLater: 'Tente novamente mais tarde', + notFound: 'Não encontrado', + pageNotFound: 'Página não encontrada', + unauthorized: 'Não autorizado', + loginRequired: 'Entre para continuar', + networkError: 'Erro de rede', + checkConnection: 'Verifique sua conexão com a internet', + invalidInput: 'Entrada inválida', + requiredField: 'Este campo é obrigatório', + }, + time: { + today: 'Hoje', + yesterday: 'Ontem', + tomorrow: 'Amanhã', + thisWeek: 'Esta semana', + nextWeek: 'Próxima semana', + thisMonth: 'Este mês', + justNow: 'Agora mesmo', + minutesAgo: 'há {{count}} minutos', + hoursAgo: 'há {{count}} horas', + daysAgo: 'há {{count}} dias', + }, + spotDetail: { + postedBy: 'Publicado por', + getDirections: 'Como Chegar', + reviews: 'Avaliações', + noReviews: 'Nenhuma avaliação ainda', + beFirstReview: 'Seja o primeiro a avaliar este spot!', + writeReview: 'Escrever uma Avaliação', + submitReview: 'Enviar Avaliação', + rating: 'Nota', + reviewPlaceholder: 'Compartilhe sua experiência neste spot...', + relatedSpots: 'Spots Próximos', + }, + eventDetail: { + organizedBy: 'Organizado por', + eventInfo: 'Informações do Evento', + location: 'Localização', + dateTime: 'Data e Horário', + price: 'Preço', + attendeeCount: '{{count}} vão', + interested: 'Interessado', + going: 'Vou', + notGoing: 'Não Vou', + share: 'Compartilhar Evento', + }, + venueAccess: { + title: 'Passes de acesso', + desc: 'Emita um passe assinado para um rider para que ele possa provar o acesso na porta — ele mostra o cartão e qualquer pessoa pode escanear o QR para verificar.', + active: '{{count}} ativos', + revoked: '{{count}} revogados', + issue: 'Emitir um passe', + verifyHint: + 'Verificado por escaneamento — não é preciso app nem conta para conferir.', + publicTitle: 'Passes de acesso', + publicDesc: + 'Este local emite passes de acesso. Escaneie o cartão de um rider na porta para verificá-lo.', + badge: 'Passes', + sellerHint: 'O local deste vendedor emite passes de acesso', + }, + zaps: { + zapButton: 'Zap', + sendZap: 'Enviar Zap', + zapAmount: 'Valor do Zap', + customAmount: 'Valor Personalizado', + addMessage: 'Adicione uma mensagem (opcional)', + sending: 'Enviando...', + sent: 'Zap enviado!', + failed: 'Falha no Zap', + received: 'Você recebeu um Zap!', + }, + rewards: { + title: 'Recompensas', + yourPoints: 'Seus Pontos', + earnPoints: 'Ganhe Pontos', + redeemPoints: 'Resgatar Pontos', + leaderboard: 'Ranking', + achievements: 'Conquistas', + dailyTasks: 'Tarefas Diárias', + weeklyTasks: 'Tarefas Semanais', + }, + errorsUi: { + slammedTitle: 'Tomou um tombo', + slammedBody: + 'Algo travou esta tela. Sua conta e seus dados estão seguros — vamos te colocar de volta nos trilhos.', + tryAgain: 'Tentar novamente', + reloadApp: 'Recarregar app', + pageSlammedTitle: 'Esta página tomou um tombo', + pageSlammedBody: + 'Algo nesta tela travou. Sua conta e seus dados estão seguros. Geralmente um recarregamento rápido resolve.', + reload: 'Recarregar', + goBack: 'Voltar', + }, + backup: { + title: 'Salve seu login', + subtitle: 'Leva 10 segundos — faça uma vez', + message: + 'Seu código de recuperação é a única forma de voltar à sua conta. Salve-o e você poderá entrar em qualquer dispositivo.', + warning: + 'Se perder, não há como redefinir — sem e-mail, sem recuperação de senha.', + backupNow: 'Salvar agora', + confirmed: 'Eu salvei', + remindLater: 'Depois', + }, + bootUi: { + ariaLoading: 'Carregando SkateSpots', + ariaReady: 'SkateSpots pronto', + ready: 'Pronto', + statusWaking: 'Despertando a rede', + statusTuning: 'Ajustando os Relays', + statusPulling: 'Buscando spots', + statusDropping: 'Chegando', + }, + footer: { + vibedWith: 'Feito com vibe', + poweredBy: 'Desenvolvido com', + openSource: 'Código Aberto', + contribute: 'Contribua', + decentralized: 'Descentralizado', + communityOwned: 'Propriedade da Comunidade', + }, + role: { + owner: 'Proprietário', + admin: 'Admin', + organiser: 'Organizador', + verifiedOwner: 'Proprietário verificado', + }, + nfc: { + write: 'Gravar na tag NFC', + written: 'Tag gravada', + writtenDesc: 'Encoste a tag em um celular para abrir a página de verificação.', + failed: 'Não foi possível gravar a tag', + }, + collectionUi: { + namePlaceholder: 'Viagem a Barcelona 2024', + descriptionPlaceholder: + 'Meus spots favoritos da minha viagem a Barcelona...', + }, + toastsUi: { + followingSuccess: 'Seguido com sucesso', + followingSuccessDesc: 'Este usuário agora está na sua rede', + followFailed: 'Falha ao seguir', + unfollowSuccess: 'Deixou de seguir com sucesso', + unfollowSuccessDesc: 'Removido da sua rede', + unfollowFailed: 'Falha ao deixar de seguir', + reportThanks: 'Obrigado — enviado para análise', + reportFailed: 'Não foi possível enviar a denúncia', + savedOffline: 'Salvo offline', + savedOfflineDesc: + 'Vamos publicá-lo automaticamente quando você voltar a ficar online.', + cacheCleaned: 'Cache limpo', + cacheCleanedDesc: '{{count}} spots antigos removidos do cache', + cacheCleared: 'Cache esvaziado', + cacheClearedDesc: 'Todos os spots em cache foram removidos', + backOnline: 'Online novamente', + backOnlineDesc: '{{count}} ação(ões) salva(s) enviada(s).', + postQueued: 'Publicação na fila', + postQueuedDesc: + 'Sua publicação será enviada quando você voltar a ficar online', + invalidIdentifier: + 'Identificador inválido. Use npub1..., user@domain.com ou chave pública hex', + notASpotThanks: 'Obrigado — enviado para análise', + notASpotThanksDesc: + 'Sem ressentimentos: isso marca o pino como fora do tema para que as pessoas decidam por si mesmas.', + notASpotFailed: 'Não foi possível enviar a denúncia', + pleaseTryAgain: 'Tente novamente.', + relayUnreachable: + 'Não foi possível alcançar nenhum Relay — verifique sua conexão e tente novamente.', + loginToReport: 'Entre para denunciar um spot.', + zapLoginRequired: 'Login necessário', + zapLoginRequiredDesc: 'Você precisa estar logado para enviar um Zap.', + zapEventNotFound: 'Evento não encontrado', + zapEventNotFoundDesc: 'Não foi possível encontrar o evento para zapar.', + zapAuthorNotFound: 'Autor não encontrado', + zapAuthorNotFoundDesc: 'Não foi possível encontrar o autor deste item.', + zapSuccess: 'Zap enviado com sucesso!', + zapSuccessNwcDesc: 'Você enviou {{amount}} sats via NWC para o autor.', + zapSuccessDesc: 'Você enviou {{amount}} sats para o autor.', + zapStatusUnknown: 'Status do pagamento desconhecido', + zapStatusUnknownDesc: + 'Sua carteira ainda pode estar processando este Zap. Verifique sua carteira antes de tentar de novo — não pague duas vezes.', + zapNwcFailed: 'Falha no pagamento via NWC', + zapWeblnFailed: 'Falha no pagamento via WebLN', + zapFallingBack: '{{error}}. Tentando outros métodos de pagamento...', + zapFailed: 'Falha no Zap', + zapUnknownNwcError: 'Erro NWC desconhecido', + zapUnknownWeblnError: 'Erro WebLN desconhecido', + nwcInvalidUri: 'URI NWC inválida', + nwcInvalidUriDesc: 'Verifique a string de conexão e tente novamente.', + nwcExists: 'Conexão já existe', + nwcExistsDesc: 'Esta carteira já está conectada.', + nwcConnected: 'Carteira conectada', + nwcConnectedDesc: 'Conectado com sucesso a {{alias}}.', + nwcFailed: 'Falha na conexão', + nwcFailedDesc: 'Não foi possível conectar à carteira: {{error}}', + nwcUnknownError: 'Ocorreu um erro desconhecido', + nwcDisconnected: 'Carteira desconectada', + nwcDisconnectedDesc: 'A conexão da carteira foi removida.', + deleteApproveAmber: 'Aprovar no Amber', + deleteApproveAmberDesc: + 'O Amber vai abrir — toque em Aprovar para confirmar a exclusão.', + deleteCancelled: 'Cancelado', + deleteCancelledDesc: 'Você rejeitou a solicitação no Amber.', + deleteCouldntSign: 'Não foi possível assinar', + deletePublishing: 'Etapa 2/2: Publicando…', + deletePublishingDesc: 'Enviando a exclusão para os Relays.', + deleteStuck: 'Travado em PUBLICANDO', + deleteStuckDesc: + 'A etapa do Relay falhou: {{error}}. A assinatura foi feita corretamente; o Relay não confirmou.', + stashMerged: 'Alterações de outro dispositivo mescladas', + stashMergedDesc: + 'Seu Stash foi editado em outro lugar — os dois conjuntos de alterações foram mantidos.', + statusUpdated: 'Status atualizado!', + statusUpdatedDesc: 'Seu status de skate agora está visível para os outros.', + statusFailed: 'Falha ao definir o status', + statusCleared: 'Status limpo', + statusClearedDesc: 'Seu status foi removido.', + statusClearFailed: 'Falha ao limpar o status', + nutzapEnabled: 'Recebimento de Nutzap ativado', + nutzapEnabledDesc: 'Agora você pode receber Zaps em ecash!', + nutzapSetupFailed: 'Falha na configuração', + nutzapUnavailable: 'Envio de Nutzap indisponível', + tokenReceived: 'Token recebido', + tokenReceivedDesc: 'Token Cashu resgatado com sucesso!', + receiveFailed: 'Falha ao receber', + invalidAmount: 'Valor inválido', + invalidAmountDesc: 'Digite um valor válido', + tokenCreated: 'Token criado', + sendFailed: 'Falha ao enviar', + mintAdded: 'Mint adicionado', + mintAddedDesc: 'Mint adicionado e confiado com sucesso', + mintAddFailed: 'Falha ao adicionar Mint', + mintRemoved: 'Mint removido', + mintRemoveFailed: 'Falha ao remover Mint', + paymentReceived: 'Pagamento recebido', + paymentReceivedDesc: '{{amount}} sats recebidos com sucesso!', + paymentSent: 'Pagamento enviado', + paymentSentDesc: 'Pagamento Lightning concluído com sucesso', + loginRequired: 'Login Necessário', + loginToFollowFounder: 'Entre para seguir o fundador', + alreadyFollowing: 'Já Está Seguindo', + alreadyFollowingDesc: 'Você já segue {{name}}!', + couldNotComplete: 'Não foi possível concluir isso', + tryAgainLower: 'Tente novamente.', + couldNotLoadProfile: 'Não foi possível carregar o perfil', + couldNotLoadProfileDesc: + 'Verifique sua conexão com a internet e tente atualizar.', + undone: 'Desfeito', + undoneDesc: 'De volta ao neutro — não ocultado, não endossado.', + confirmed: 'Confirmado', + confirmedDesc: 'Endossado — sai desta fila.', + hiddenToast: 'Ocultado', + couldNotUndo: 'Não foi possível desfazer', + couldNotConfirm: 'Não foi possível confirmar', + deleteFailed: 'Falha ao excluir', + somethingWentWrong: 'Algo deu errado', + }, + seoUi: { + becomeBuilderTitle: 'Seja um Builder - SkateSpots', + becomeBuilderDesc: + 'Anuncie seus serviços de construção de rampas, pistas e DIY — o que você constrói, materiais e escala.', + tradesTitle: 'Minhas Trocas — SkateSpots', + tradesDesc: + 'Gerencie suas trocas no Marketplace, confirmações e reputação.', + eventsTitle: 'Eventos e Turnês de Skate - SkateSpots', + eventsDesc: + 'Descubra eventos, competições, turnês e sessões de skate perto de você.', + editShopDesc: 'Edite seu Skate Shop.', + createTourDesc: + 'Organize turnês de skate — passeios por joias escondidas locais, viagens nacionais, aventuras internacionais ou competições de destruição estilo KOTR.', + deckDesignerTitle: 'Designer de Deck — SkateSpots DIY', + deckDesignerDesc: + 'Desenhe o contorno de um skate ou longboard e exporte um molde 1:1 para imprimir, SVG ou DXF — concave, kicks, distância entre eixos e furos dos trucks incluídos.', + createEventTitle: 'Criar um Evento de Skate - SkateSpots', + createEventDesc: 'Crie um novo evento de skate para a comunidade.', + editTourDesc: 'Edite sua turnê de skate — atualize paradas, datas e detalhes.', + walletTitle: 'Carteira - SkateSpots', + walletDesc: + 'Conecte sua carteira Lightning para enviar Zaps a skatistas e criadores de spots.', + becomePhotographerTitle: 'Seja um Fotógrafo - SkateSpots', + becomePhotographerDesc: + 'Crie seu perfil de fotografia de skate — câmeras, lentes, iluminação e serviços.', + newsletterTitle: 'Newsletter - SkateSpots', + newsletterDesc: + 'Novidades semanais da comunidade SkateSpots. Atualizações do app, novos spots, eventos e as pessoas que mantêm o skate vivo.', + homeTitle: 'SkateSpots - Descubra Locais de Skate no Mundo Todo', + zapLeaderboardTitle: 'Rankings de Zap - SkateSpots', + zapLeaderboardDesc: + 'Os spots de skate mais zapados e os membros da comunidade que os apoiam.', + adminReviewTitle: 'Fila de análise — SkateSpots', + gearSwapTitle: 'Troca de Gear - SkateSpots', + gearSwapDesc: + 'Compre e venda Gear de skate usado com outros skatistas. Decks, trucks, rodas, tênis e mais.', + donateTitle: 'Doar — SkateSpots', + donateDesc: + 'Apoie o SkateSpots — Lightning, on-chain privado (silent payments) ou financie o desenvolvimento no Angor.', + verifyCardTitle: 'Verificar — SkateSpots', + verifyCardDesc: 'Verifique um cartão ou passe de acesso do SkateSpots.', + mapTitle: 'Mapa de Spots de Skate - SkateSpots', + mapDesc: + 'Explore spots de skate pelo mundo no nosso mapa interativo.', + diyTitle: 'DIY — Faça Você Mesmo | SkateSpots', + diyDesc: + 'Guias, ferramentas abertas e projetos para você fazer seus próprios skates, rampas e spots de concreto — e as pessoas e lugares para fazer isso.', + appShopTitle: 'Loja do App — SkateSpots', + becomeSkaterTitle: 'Entre no Diretório de Skatistas - SkateSpots', + becomeSkaterDesc: + 'Crie seu perfil de skatista para que a comunidade possa te encontrar.', + marketplaceTitle: 'Marketplace - SkateSpots', + marketplaceDesc: + 'Compre e venda Gear de skate no Plebeian Market descentralizado.', + becomeEditorTitle: 'Seja um Editor de Vídeo - SkateSpots', + becomeEditorDesc: + 'Crie seu perfil de editor de vídeo de skate no SkateSpots.', + amberCallbackTitle: 'Entrando com Amber - SkateSpots', + amberCallbackDesc: 'Concluindo seu login no Amber (NIP-55).', + supportersTitle: 'Apoiadores - SkateSpots', + supportersDesc: + 'A comunidade que mantém o SkateSpots vivo — apoiadores, colaboradores, parceiros e amigos.', + becomeCoachTitle: 'Seja um Coach - SkateSpots', + becomeCoachDesc: 'Crie seu perfil de coach de skate.', + riderCardTitle: 'Cartão de Skatista — SkateSpots', + riderCardDesc: + 'Crie sua Licença de Skatista ou Cartão de Acesso ao Parque SkateSpots para imprimir.', + editEventDesc: 'Edite seu evento de skate.', + createShopTitle: 'Adicionar um Skate Shop - SkateSpots', + createShopDesc: 'Adicione seu Skate Shop à comunidade.', + deckCostTitle: 'Calculadora de Custo de Deck — SkateSpots DIY', + deckCostDesc: + 'Calcule quanto custa fazer um deck — mão de obra, equipamento, materiais, tempo de processo, embalagem e margem — e um preço de venda justo.', + pyramidTitle: 'Rankings da Pirâmide - SkateSpots', + pyramidDesc: 'Principais contribuidores e líderes da comunidade.', + foodTitle: 'Comida Perto dos Spots - SkateSpots', + foodDesc: + 'Encontre restaurantes, cafés e opções de comida perto de spots de skate.', + createListingTitle: 'Anunciar Gear - SkateSpots', + createListingDesc: + 'Anuncie Gear de skate para venda ou encontre o Gear que você quer comprar.', + becomeFilmerTitle: 'Seja um Filmer - SkateSpots', + becomeFilmerDesc: 'Crie seu perfil de filmagem de skate.', + skatersTitle: 'Skatistas - SkateSpots', + skatersDesc: + 'Descubra skatistas na comunidade SkateSpots. Navegue por estilo, base, nível e localização.', + communityStatsTitle: 'Estatísticas da Comunidade — SkateSpots', + communityStatsDesc: + 'Métricas ao vivo da comunidade SkateSpots — spots, eventos, coaches, filmers, editores, turnês e crescimento ao longo do tempo. Puxadas diretamente do Nostr.', + labTitle: 'The Lab - SkateSpots', + labDesc: + 'Encontre coaches, filmers, fotógrafos e editores de vídeo de skate.', + stashTitle: 'Meu Stash - SkateSpots', + stashDesc: + 'Gerencie seu inventário privado de Gear. Acompanhe o que você tem e o que quer vender ou trocar.', + bountyLeaderboardTitle: 'Mapeie e Ganhe - SkateSpots', + bountyLeaderboardDesc: + 'Mapeie spots e Shops de skate, ganhe Zaps da comunidade. Veja os principais contribuidores.', + spotCollectionsTitle: 'Minhas Coleções de Spots - SkateSpots', + spotCollectionsDesc: + 'Organize seus spots de skate favoritos em coleções personalizadas', + mintsTitle: 'Mints Cashu — SkateSpots', + mintsDesc: + 'Explore Mints Cashu, confira a saúde deles e adicione um à sua carteira.', + }, + miscUi: { + openingCamera: 'Abrindo a câmera…', + usePhoneCamera: 'Use a câmera do seu celular e depois volte aqui', + startingCamera: 'Iniciando a câmera...', + cameraAccessRequired: 'Acesso à Câmera Necessário', + cameraAccessHint: + 'Permita o acesso à câmera nas configurações do navegador ou use o seletor de arquivos abaixo.', + cameraErrorTitle: 'Erro na câmera', + cameraErrorDesc: + 'Não foi possível abrir a câmera. Verifique as permissões do app nas Configurações.', + cameraDeniedTitle: 'Acesso à câmera negado', + cameraDeniedDesc: + 'Permita o acesso à câmera nas configurações do navegador.', + uploadFromGallery: 'Enviar da Galeria', + uploading: 'Enviando...', + usePhoto: 'Usar Foto', + earningPotential: 'Potencial de Ganho', + qualityExcellent: 'Excelente!', + qualityGood: 'Bom', + qualityBasic: 'Básico', + qualityGettingStarted: 'Começando', + qualityLocationAdded: 'Localização adicionada', + qualityOnePhoto: 'Pelo menos 1 foto', + qualityThreePhotos: '3+ fotos', + qualityMoreAngles: 'Mais ângulos = melhor', + qualityDescription: 'Descrição', + qualityDetailedDesc: 'Descrição detalhada (100+ caracteres)', + qualityContact: 'Informações de contato', + qualityPhoneOrWebsite: 'Telefone ou site', + qualityHours: 'Horário de funcionamento', + qualitySpotType: 'Tipo de spot selecionado', + failedToLoadComments: 'Falha ao carregar os comentários', + commentsTitle: 'Comentários', + noCommentsYet: 'Nenhum comentário ainda', + beFirstComment: 'Seja o primeiro a compartilhar o que pensa!', + removeMember: 'Remover membro', + whoIsThisFor: 'Para quem é este perfil?', + individual: 'Individual', + individualDesc: 'Uma única pessoa', + collective: 'Coletivo', + collectiveDesc: 'Crew, estúdio ou empresa', + membersLabel: 'Membros', + dismissReport: 'Descartar denúncia', + reportedBy: 'denunciado por', + completingLoginAmber: 'Concluindo o login com Amber...', + entityMembersHint: + 'Adicione as contas Nostr da sua crew. Cada membro confirma seu próprio spot com a própria chave — até então, aparece como “pendente”.', + entityVerifiedHint: + 'A participação é verificada por membro — ninguém pode ser adicionado à sua crew sem confirmar pela própria conta.', + entityInvalidPubkey: + 'Digite um npub, nprofile ou chave pública hex de 64 caracteres válido.', + entityAlreadyAdded: 'Esse membro já foi adicionado.', + offline: 'Offline', + connected: 'Conectado', + offlineMode: 'Modo Offline', + allFeaturesAvailable: 'Todos os recursos disponíveis', + browsingCachedSpots: 'Navegando por spots em cache', + queuedActions: '{{count}} ação(ões) na fila', + syncing: 'Sincronizando', + publishingWhenStable: 'Publicando quando a conexão se estabilizar...', + willPublishOnline: 'Será publicado quando você voltar a ficar online', + availableOffline: 'Disponível offline:', + offlineBrowseSpots: 'Navegue por spots vistos anteriormente', + offlineViewDetails: 'Veja detalhes de spots em cache', + offlineKeepActing: + 'Continue agindo — publicações, RSVPs, anúncios e mensagens ficam na fila e são enviados quando você se reconectar', + }, + sasquatchGuide: { + homeTitle: 'Bem-vindo ao SkateSpots! 🦧', + homeMessage: + 'E aí, eu sou O Sasquatch. Guardião de shapes, trilhas e rolês selvagens. Bem-vindo ao mundo do skate indomado no Nostr — sem terno, sem anúncio, só skatistas abrindo o próprio caminho. Aqui, você é dono das suas manobras, dos seus dados e ainda ganha Bitcoin por deixar sua marca. Conecte-se com skatistas do seu bairro ou do mundo todo. Sem regras além de andar, sem pegadas além das suas.', + homeQ1: 'Planeje 3 dias em Barcelona para mim', + homeQ2: 'Encontre spots para iniciantes', + homeQ3: 'Algum evento próximo?', + homeQ4: 'Estatísticas da comunidade', + homeQ5: 'Encontre coaches perto de mim', + homeQ6: 'Gear à venda?', + homeQ7: 'O que é Nostr?', + homeQ8: 'Isso é grátis?', + homeLearnMore: 'Saiba Mais', + onboardingTitle: 'Primeiros Passos 🚀', + onboardingMessage: + 'Deixe-me ajudar você a entender o básico! O Nostr é a sua identidade, o Bitcoin Lightning permite ganhar sats por contribuições, e os Zaps são gorjetas instantâneas. Me pergunte qualquer coisa sobre como começar!', + onboardingQ1: 'Como fazer login?', + onboardingQ2: 'O que é Nostr?', + onboardingQ3: 'Como o Nostr funciona?', + onboardingQ4: 'O que é Cashu?', + onboardingQ5: 'Como usar a carteira Cashu?', + onboardingQ6: 'O que são Mints?', + onboardingQ7: 'O que são Zaps?', + onboardingQ8: 'O que é NWC?', + onboardingStart: 'Comece a explorar', + onboardingLogin: 'Entre para começar', + labTitle: 'Bem-vindo ao The Lab! 🎓', + labMessage: + 'É aqui que a mágica acontece! Encontre coaches que podem te ensinar de kickflips a darkslides, ou conecte-se com filmers para capturar suas melhores sessões. Filtre por habilidades, confira a experiência deles e agende uma sessão. Lembre-se — todo mundo começou de algum lugar!', + labQ1: 'Encontrar coaches', + labQ2: 'Encontrar filmers', + labQ3: 'Encontrar fotógrafos', + labQ4: 'Encontrar editores de vídeo', + labQ5: 'Encontrar um construtor de rampas', + labQ6: 'O que é o The Lab?', + labQ7: 'O que é um builder?', + labQ8: 'Como oferecer coaching?', + labLogin: 'Entre para Oferecer Serviços', + crewsTitle: 'Crews 🤘', + crewsMessage: + 'Crews são sua família de skate ancorada no mapa — as pessoas com quem você anda, não quem você contrata. Toda crew tem seu território no mapa, spots de casa, membros e um manifesto. Os membros confirmam com as próprias chaves, então a lista é legítima. Comece a sua ou encontre sua galera!', + crewsQ1: 'O que são crews?', + crewsQ2: 'Como começar uma crew?', + crewsQ3: 'Qual a diferença entre uma crew e o The Lab?', + crewsQ4: 'Como os membros confirmam?', + crewsQ5: 'O que é Nostr?', + crewsQ6: 'Como os Zaps funcionam?', + crewsLogin: 'Entre para Criar uma Crew', + }, + supportUi: { + keepMapFree: 'Mantenha o mapa livre', + keepMapFreeDesc: + 'Sem anúncios, sem rastreamento, sem VC. Seus sats pagam a hospedagem, o nó de IA e o Relay.', + thankYou: 'Obrigado! ⚡', + satsKeepMapFree: 'Seus sats mantêm o mapa livre.', + keptFreeNext: + 'Você acabou de manter o SkateSpots livre para o próximo skatista.', + scanToPay: 'Escaneie para pagar', + zapSkateSpots: 'Enviar Zap ao SkateSpots', + payQuietly: 'Pague em silêncio', + pickAmount: 'Escolha um valor', + enterAmount: 'Digite quantos sats você quer enviar.', + couldNotStartPayment: 'Não foi possível iniciar o pagamento.', + customAmountAria: 'Valor personalizado em sats', + commentPlaceholder: 'Diga algo (opcional — apenas Zaps públicos)', + publicZapTitle: 'Zap público com seu comentário', + loginToZapTitle: 'Entre para enviar um Zap público', + anonymousTitle: 'Anônimo — sem login, sem registro', + copyLightningTitle: 'Copiar o endereço Lightning', + copiedSuffix: '{{label}} copiado', + invoiceLabel: 'Fatura', + addressLabel: 'Endereço', + notAPurchase: + 'É apoio, não uma compra — não dá direito a nada e não há reembolsos. Merchandise e Sasquatch Pro são separados. Sua localização e identidade nunca estão envolvidas em um pagamento silencioso.', + }, + statusUi: { + quickStatus: 'Status Rápido', + skating: 'Andando', + skatingDesc: 'Andando de skate agora', + filming: 'Filmando', + filmingDesc: 'Filmando manobras', + lookingForSesh: 'Procurando Sesh', + lookingForSeshDesc: 'Quer andar com outros', + coaching: 'Coaching', + coachingDesc: 'Ensinando/dando coaching', + chilling: 'Relaxando', + chillingDesc: 'Curtindo no spot', + onMyWay: 'A Caminho', + onMyWayDesc: 'Indo para um spot', + takingABreak: 'Fazendo uma Pausa', + takingABreakDesc: 'Descansando/hidratando', + doneForToday: 'Acabou por Hoje', + doneForTodayDesc: 'Terminou de andar', + }, +}; export default ptBatch7; diff --git a/src/i18n/pt/batch8.ts b/src/i18n/pt/batch8.ts index fc11d4b..a1a9104 100644 --- a/src/i18n/pt/batch8.ts +++ b/src/i18n/pt/batch8.ts @@ -1,4 +1,622 @@ -/** pt — batch 8. Filled by the translation pass; empty until then. */ -const ptBatch8 = {}; +/** pt — batch 8. Namespaces from the hardcoded-string sweep. */ +const ptBatch8 = { + deckCostUi: { + presetPrompt: "Dê um nome a este preset", + presetDefaultName: "Preset {{n}}", + summaryCopied: "Resumo copiado", + couldNotCopy: "Não foi possível copiar", + resetConfirm: "Redefinir tudo para os valores de exemplo?", + logoTooLarge: "Logo muito grande (máx. 500 KB)", + loginToFill: "Faça login para preencher a partir do seu perfil Nostr", + filledFromProfile: "Preenchido a partir do seu perfil Nostr", + warnRetailBelowOne: "O markup de varejo está abaixo de 1× — você venderia com prejuízo.", + warnWholesaleAboveRetail: "O markup de atacado deve ser menor que o markup de varejo.", + warnZeroBoards: "{{count}} linha(s) usam 0 decks — o custo dessa linha é ignorado.", + warnFixedNoBoards: "Os custos fixos mensais estão definidos, mas decks/mês é 0, então o custo operacional é ignorado.", + warnNoMaterials: "Sem custo de materiais — adicione ao menos um material.", + warnEquipmentOverhead: "Equipamento + custos indiretos passam de 60% do custo — este modelo assume alto volume; confira a contagem de decks.", + warnOneBoard: "Parte do equipamento está diluída em um único deck — aumente a contagem de decks para amortizá-lo.", + templateStarterName: "Hobby iniciante", + templateStarterBlurb: "Algumas linhas, sem custos fixos", + templateShopName: "Oficina pequena", + templateShopBlurb: "Planilha completa com aluguel e custos indiretos", + currency: "Moeda", + noCurrencyMatches: "Nenhuma moeda corresponde.", + ratesUnavailable: "Cotações ao vivo indisponíveis — a troca apenas renomeia os valores.", + liveRates: "cotações BTC ao vivo · sats incluídos", + chipCost: "custo", + chipSell: "venda", + chipTotal: "total", + startFrom: "Começar de", + advancedToggleHint: "Mostra as taxas por operação e refugo, configuração do lote, impostos e a curva de custo vs. quantidade", + advanced: "Avançado", + simple: "Simples", + sectionLabor: "Mão de obra", + sectionEquipment: "Equipamento", + sectionOperations: "Despesas operacionais", + sectionMaterials: "Materiais", + sectionProcesses: "Custos de processo", + sectionPackaging: "Embalagem", + sectionMargins: "Margens", + subtotalLoaded: "{{value}}/h carregado", + subtotalPerBoard: "{{value}}/deck", + hourlyRate: "Valor por hora ({{unit}})", + labourBurden: "Encargos trabalhistas (×)", + loadedRate: "Valor carregado", + loadedRateHintBefore: "Valor carregado = salário × encargos (impostos e seguros do empregador sobre a mão de obra). Aluguel e contas entram em ", + loadedRateHintAfter: " — não conte nos dois.", + colEquipment: "Equipamento", + colCostUnit: "Custo ({{unit}})", + colCost: "Custo", + colSetupH: "Configuração (h)", + colLifetimeBoards: "Decks de vida útil", + colPerBoard: "Por deck", + colMaterial: "Material", + colOrderUnit: "Pedido ({{unit}})", + colShipUnit: "Envio ({{unit}})", + colBoardsOrder: "Decks / pedido", + colOrderM: "Pedido (m)", + colUnloadM: "Descarregar (m)", + colOrder: "Pedido", + colShipping: "Frete", + colOrderMin: "Pedido (min)", + colUnloadMin: "Descarregar (min)", + colProcess: "Processo", + colTimeM: "Tempo (m)", + colBoardsRun: "Decks / lote", + colRateHr: "Valor/h (0 = oficina)", + colRateHrShort: "Valor/h", + colScrapPct: "Refugo %", + colTimeMin: "Tempo (min)", + colPackaging: "Embalagem", + colTimeBoardM: "Tempo/deck (m)", + colTimeBoardMin: "Tempo/deck (min)", + colMaterialsBoardUnit: "Materiais/deck ({{unit}})", + colMaterialsBoard: "Materiais/deck", + equipmentPerBoard: "Equipamento por deck:", + materialsPerBoard: "Materiais por deck:", + processesPerBoard: "Processos por deck:", + packagingPerBoard: "Embalagem por deck:", + perBoard: "Por deck:", + addEquipment: "Adicionar equipamento", + addMaterial: "Adicionar material", + addProcess: "Adicionar processo", + addPackagingStep: "Adicionar etapa de embalagem", + duplicate: "Duplicar", + remove: "Remover", + boardsPerMonth: "Decks / mês", + rentPerMonth: "Aluguel / mês", + utilitiesPerMonth: "Contas / mês", + subscriptionsPerMonth: "Assinaturas / mês", + markup: "Markup (×)", + wholesaleMarkup: "Markup de atacado (×)", + scrapWaste: "Refugo / desperdício (%)", + quantityDecks: "Quantidade (decks)", + targetMonthlyProfit: "Lucro mensal desejado ({{unit}})", + costNoPackaging: "Custo / deck (sem embalagem)", + costWithPackaging: "Custo / deck (com embalagem)", + batchSetupHours: "Configuração do lote (h / lote)", + batchSetupCost: "Custo de configuração do lote ({{unit}} / lote)", + taxVat: "Imposto / IVA (%)", + quoteTax: "Imposto do orçamento", + includedInPrice: "Incluído no preço", + addedOnTop: "Adicionado por cima", + setupPerBoard: "Configuração / deck", + marginNoteBefore: "Markup {{markup}}× ≈ ", + grossMargin: "{{pct}}% de margem bruta", + marginNoteAfter: " · o desperdício de {{waste}}% é diluído entre os decks bons.", + sellingPriceNoPackaging: "Preço de venda · sem embalagem", + sellingPriceWithPackaging: "Preço de venda · com embalagem", + profitPerDeck: "Lucro / deck", + wholesalePerDeck: "Atacado / deck", + orderTotalQty: "Total do pedido ({{qty}})", + orderTotal: "Total do pedido", + breakeven: "Ponto de equilíbrio", + breakevenPerMonth: "{{count}}/mês", + targetDecksHint: "Para obter {{amount}}/mês além dos custos fixos, venda {{decks}} decks/mês.", + priceIncludesTax: "O preço inclui {{pct}}% de imposto: {{amount}} do total.", + plusTax: "Mais {{pct}}% de imposto: {{amount}} → {{total}} no total.", + costVsQuantity: "Custo vs. quantidade (configuração amortizada)", + deckOne: "deck", + deckOther: "decks", + perDeckSuffix: "/ deck", + orderSuffix: "pedido {{amount}}", + shippingNotIncluded: "Não inclui frete até o comprador.", + clientQuoteDetails: "Detalhes do orçamento do cliente (para o PDF)", + fillFromProfileTitle: "Preencher nome, site, NIP-05, Lightning e npub a partir do seu perfil Nostr", + fillFromProfile: "Preencher do perfil", + businessName: "Nome da empresa / oficina", + email: "E-mail", + phone: "Telefone", + website: "Site", + address: "Endereço", + quoteNumber: "Orçamento nº", + nextNumber: "Próximo número", + validDays: "Validade (dias)", + nip05: "NIP-05", + lightningAddress: "Endereço Lightning", + nostrNpub: "Nostr (npub)", + depositPct: "Entrada paga antecipadamente (%)", + deliveryTerms: "Condições de entrega (Incoterm, opcional)", + paymentMethods: "Formas de pagamento", + paymentTerms: "Condições de pagamento", + paymentDetails: "Detalhes de pagamento", + notesTerms: "Observações / termos", + changeLogo: "Alterar logo", + addLogo: "Adicionar logo", + incotermNone: "Nenhum", + incotermExw: "EXW — retirada no vendedor", + incotermFca: "FCA — entregue à transportadora do comprador", + incotermDap: "DAP — entregue no endereço do comprador", + incotermDdp: "DDP — entregue, impostos pagos", + payMethodCash: "Dinheiro", + payMethodLightning: "Lightning", + payMethodCashu: "Cashu", + payMethodBank: "Transferência bancária", + payMethodCard: "Cartão", + payMethodOther: "Outro", + listDeckAtPrice: "Anunciar um deck por este preço", + getItMade: "Mande fazer — encontre um construtor", + savePreset: "Salvar preset", + load: "Carregar", + export: "Exportar", + import: "Importar", + reset: "Redefinir", + deletePreset: "Excluir preset", + exportPdfFull: "PDF — planilha completa", + exportPdfQuote: "PDF — orçamento do cliente", + exportPng: "Imagem PNG", + exportXlsx: "Planilha XLSX", + exportCsv: "CSV (planilha)", + exportMarkdown: "Markdown", + exportJson: "JSON (backup)", + exportCopySummary: "Copiar resumo", + }, + becomeRolesUi: { + artist: { + seoTitle: "Seja um Designer / Artista - SkateSpots", + seoDescription: "Anuncie seu design e arte de skate — artes de shape, logos, pôsteres, merch e mais.", + heading: "Designer / Artista", + tagline: "Artes de shape, logos, pôsteres, merch — coloque sua arte na cena", + noun: "artista", + rateLabel: "Valor", + portfolioLabel: "Portfólio / link da loja", + sectionWhatYouMake: "O que você faz", + sectionMedium: "Técnica", + sectionSoftwareTools: "Softwares e ferramentas", + deliverablesPlaceholder: "ex.: arquivos prontos para impressão, arquivos-fonte, artes de shape", + turnaroundPlaceholder: "ex.: 3–5 dias", + }, + graffiti: { + seoTitle: "Ofereça Grafite / Murais - SkateSpots", + seoDescription: "Anuncie seu grafite e seus murais — peças, murais, arte de skatepark e mais.", + heading: "Artista de Grafite / Mural", + tagline: "Peças, murais, arte de skatepark — pinte a cena", + noun: "grafiteiro", + rateLabel: "Valor", + portfolioLabel: "Link do portfólio (IG, site)", + sectionStyle: "Estilo", + sectionMedium: "Técnica", + sectionWorkContext: "Contexto de trabalho", + crewLabel: "Crew de grafite", + crewPlaceholder: "Sua crew de escrita (opcional)", + crewHelper: "Diferente da sua crew de skate — os escritores com quem você pinta.", + surfacesPlaceholder: "ex.: concreto, tijolo, paredes autorizadas", + maxSizePlaceholder: "ex.: até 10 m", + }, + musician: { + seoTitle: "Adicione um Perfil Musical - SkateSpots", + seoDescription: "Anda de skate e faz música? Anuncie sua banda ou projeto solo — gêneros, instrumentos e links.", + heading: "Músico / Banda", + tagline: "Anda de skate e faz música? Seja contratado para demos, jams e after-parties", + noun: "músico", + rateLabel: "Valor de show", + portfolioLabel: "Link do site / EPK", + sectionGenre: "Gênero", + sectionInstruments: "Instrumentos e função", + actLabel: "Tipo de ato", + actPlaceholder: "solo / banda / dj / produtor", + spotifyLabel: "Spotify", + spotifyPlaceholder: "https://open.spotify.com/…", + bandcampLabel: "Bandcamp", + bandcampPlaceholder: "https://…bandcamp.com", + soundcloudLabel: "SoundCloud", + soundcloudPlaceholder: "https://soundcloud.com/…", + youtubeLabel: "YouTube", + youtubePlaceholder: "https://youtube.com/…", + setLengthPlaceholder: "ex.: 30–45 min", + techRiderPlaceholder: "ex.: PA, microfones, backline", + }, + judge: { + seoTitle: "Julgue Eventos de Skate - SkateSpots", + seoDescription: "Anuncie-se como juiz de eventos de skate — Game of S.K.A.T.E., best trick jams, competições, séries amadoras e etapas do world tour. Seja contratado para conduzir eventos justos e confiáveis.", + heading: "Juiz de Eventos de Skate", + tagline: "Do Game of S.K.A.T.E. no plano ao World Destruction Tour — conduza com justiça e credibilidade", + noun: "juiz", + rateLabel: "Diária / valor", + portfolioLabel: "Arquivo de resultados / link do perfil", + sectionEventFormats: "Formatos de evento", + sectionSpecialty: "Especialidade", + sectionLevelCircuit: "Nível / circuito", + eventsJudgedLabel: "Eventos julgados", + eventsJudgedPlaceholder: "ex.: 40+ competições, 3 etapas do World Tour", + eventsJudgedHelper: "Eventos, competições ou turnês notáveis que você já julgou.", + travelPlaceholder: "ex.: regional / nacional / internacional", + certificationsPlaceholder: "ex.: curso nacional de julgamento", + }, + organizer: { + seoTitle: "Organize Eventos de Skate - SkateSpots", + seoDescription: "Anuncie-se como organizador de eventos de skate — sessões de rua, best trick, competições, encontros, demos e etapas de turnê. Seja descoberto e contratado para comandar a sessão.", + heading: "Organizador de Eventos", + tagline: "Jams, competições, encontros e demos — monte a sessão e una a cena", + noun: "organizador", + rateLabel: "Cachê / orçamento do evento", + portfolioLabel: "Eventos anteriores / link de resultados", + sectionEventTypes: "Tipos de evento", + sectionWhatYouHandle: "O que você cuida", + sectionScale: "Escala", + eventsHostedLabel: "Eventos organizados", + eventsHostedPlaceholder: "ex.: 25 jams, 3 competições municipais", + eventsHostedHelper: "Eventos, competições ou encontros notáveis que você já realizou.", + insurancePlaceholder: "ex.: seguro de responsabilidade civil incluído", + permitsPlaceholder: "ex.: licenças municipais providenciadas", + }, + tattoo: { + seoTitle: "Seja um Tatuador - SkateSpots", + seoDescription: "Anuncie seu trabalho de tatuagem para a cena do skate — estilos, flash, personalizadas e mais.", + heading: "Tatuador", + tagline: "Tinta para a cena — flash, personalizada, fine line e mais", + noun: "tatuador", + rateLabel: "Valor / por hora", + portfolioLabel: "Link do portfólio (IG, site)", + sectionStyles: "Estilos", + sectionMethod: "Método", + studioLabel: "Estúdio / loja", + studioPlaceholder: "Nome do estúdio (opcional)", + booksOpenLabel: "Agenda aberta", + booksOpenHelper: "Você está aceitando agendamentos no momento?", + depositPlaceholder: "ex.: 50 EUR não reembolsável", + minimumPlaceholder: "ex.: 80 EUR", + }, + trainer: { + seoTitle: "Seja um Personal / Fisioterapeuta - SkateSpots", + seoDescription: "Ajude skatistas a ficarem fortes e saudáveis — força, mobilidade, prevenção de lesões e recuperação.", + heading: "Personal / Fisioterapeuta", + tagline: "Força, mobilidade, prevenção de lesões e recuperação para skatistas", + noun: "personal trainer", + rateLabel: "Valor / sessão", + portfolioLabel: "Link do perfil / agendamento", + sectionFocus: "Foco", + sectionInjuries: "Lesões com que você trabalha", + sectionCredentialsSetting: "Qualificações e ambiente", + credentialsPlaceholder: "ex.: Bacharelado em Fisioterapia, CSCS…", + credentialsHelper: "Liste qualificações reais — skatistas confiam em credenciais verificáveis.", + remoteLabel: "Remoto / online", + remoteHelper: "Você oferece coaching ou consultas online?", + modalitiesPlaceholder: "ex.: técnicas manuais, preparação física, agulhamento a seco", + }, + barber: { + seoTitle: "Seja um Barbeiro / Cabeleireiro - SkateSpots", + seoDescription: "Anuncie sua barbearia ou cadeira para a cena do skate — cortes, degradês, barba, coloração e mais. Seja agendado por skatistas.", + heading: "Barbeiro / Cabeleireiro", + tagline: "Cortes, degradês e barba para a cena — na loja ou a domicílio", + noun: "barbeiro", + rateLabel: "Preço / corte", + portfolioLabel: "Galeria de cortes / link do IG", + sectionWhatYouOffer: "O que você oferece", + sectionSignatureStyles: "Estilos marcantes", + sectionSetting: "Ambiente", + studioLabel: "Loja / estúdio", + studioPlaceholder: "Nome da loja ou estúdio (opcional)", + booksOpenLabel: "Agenda aberta", + booksOpenHelper: "Você está aceitando agendamentos no momento?", + durationPlaceholder: "ex.: 30–45 min", + }, + }, + weatherUi: { + condition: { + clearSky: "Céu limpo", + mainlyClear: "Predominantemente limpo", + partlyCloudy: "Parcialmente nublado", + overcast: "Encoberto", + foggy: "Nevoeiro", + depositingRimeFog: "Nevoeiro com geada", + lightDrizzle: "Garoa leve", + moderateDrizzle: "Garoa moderada", + denseDrizzle: "Garoa intensa", + lightFreezingDrizzle: "Garoa congelante leve", + denseFreezingDrizzle: "Garoa congelante intensa", + slightRain: "Chuva fraca", + moderateRain: "Chuva moderada", + heavyRain: "Chuva forte", + lightFreezingRain: "Chuva congelante leve", + heavyFreezingRain: "Chuva congelante forte", + slightSnow: "Neve fraca", + moderateSnow: "Neve moderada", + heavySnow: "Neve forte", + snowGrains: "Grãos de neve", + slightRainShowers: "Pancadas de chuva fracas", + moderateRainShowers: "Pancadas de chuva moderadas", + violentRainShowers: "Pancadas de chuva violentas", + slightSnowShowers: "Pancadas de neve fracas", + heavySnowShowers: "Pancadas de neve fortes", + thunderstorm: "Tempestade", + thunderstormSlightHail: "Tempestade com granizo leve", + thunderstormHeavyHail: "Tempestade com granizo forte", + unknown: "Desconhecido", + }, + aqi: { + good: "Bom", + moderate: "Moderado", + unhealthySensitive: "Insalubre para grupos sensíveis", + unhealthy: "Insalubre", + veryUnhealthy: "Muito insalubre", + hazardous: "Perigoso", + }, + skateability: { + perfect: "Perfeito", + good: "Bom", + okay: "Razoável", + poor: "Ruim", + bad: "Péssimo", + unrideable: "Impossível de andar", + }, + reason: { + currentlyRaining: "Chovendo agora", + raining: "Chovendo", + snowing: "Nevando", + thunderstorm: "Tempestade", + freezingTemperature: "Temperatura congelante", + veryCold: "Muito frio", + extremelyHot: "Extremamente quente", + veryHot: "Muito quente", + veryStrongWind: "Vento muito forte", + strongWind: "Vento forte", + moderateWind: "Vento moderado", + veryUnhealthyAir: "Ar muito insalubre", + unhealthyAir: "Ar insalubre", + moderateAirQuality: "Qualidade do ar moderada", + veryHumid: "Muito úmido", + humid: "Úmido", + extremeUv: "UV extremo - use protetor solar", + highUv: "UV alto - proteção solar recomendada", + perfectConditions: "Condições perfeitas para andar de skate", + }, + }, + skaterLabelsUi: { + stance: { + regular: "Regular", + goofy: "Goofy", + }, + style: { + street: "Street", + park: "Park", + vert: "Vert", + transition: "Transition", + bowl: "Bowl", + cruising: "Cruising", + downhill: "Downhill", + freestyle: "Freestyle", + ledges: "Ledges", + stairs: "Stairs", + diy: "DIY", + }, + level: { + grom: "Iniciante", + intermediate: "Intermediário", + advanced: "Avançado", + ripper: "Fera", + }, + sponsor: { + title: "Patrocinador principal", + gold: "Ouro", + silver: "Prata", + partner: "Parceiro", + }, + }, + notifyUi: { + activity: { + zappedWithAmount: "Você recebeu {{sats}} sats de zap", + zapped: "Você recebeu um zap", + liked: "Alguém curtiu seu post", + reposted: "Alguém repostou você", + mentioned: "Alguém mencionou você", + replied: "Alguém respondeu você", + rsvp: "Alguém confirmou presença no seu evento", + eventUpdated: "Um evento que você vai participar foi atualizado", + newActivity: "Nova atividade", + tapToOpen: "Toque para abrir o SkateSpots", + }, + crew: { + inviteTitle: "Convite de crew", + inviteBody: "Você foi convidado para {{crew}}", + addedTitle: "Você foi adicionado a uma crew", + addedBody: "{{crew}} — confirme para entrar", + joinRequestTitle: "Pedido de entrada", + joinRequestBody: "Alguém quer entrar em {{name}}", + }, + dm: { + title: "Nova mensagem direta", + body: "Toque para ler", + }, + trade: { + confirm: "Confirme uma negociação", + confirmed: "Negociação confirmada", + newOffer: "Nova oferta no seu anúncio", + counter: "Contraproposta", + accepted: "Oferta aceita 🎉", + declined: "Oferta recusada", + withdrawn: "Oferta retirada", + }, + newsletter: { + drop: "Novidade do SkateSpots", + }, + summary: { + moreUpdates: "mais {{count}} atualizações", + openToCatchUp: "Abra o SkateSpots para se atualizar", + }, + }, + legacyMiscUi: { + hostingGoing: "{{count}} confirmados", + hostingInterested: "{{count}} interessados", + hostingPostUpdate: "Publicar atualização", + hostingEdit: "Editar", + hostingLoginToSee: "Faça login para ver os eventos que você organiza.", + hostingEmptyTitle: "Você ainda não organiza nada", + hostingEmptyBody: "Faça um jam, uma competição ou uma sessão. Crie um evento e os skatistas podem confirmar presença, receber atualizações e aparecer.", + hostingCreateEvent: "Criar um evento", + hostingUpcoming: "Próximos · {{count}}", + hostingPast: "Passados · {{count}}", + sponsorPartners: "Parceiros", + sponsorTitleSponsor: "Patrocinador principal", + sponsorPlatformPartners: "Parceiros da plataforma", + reportsUntitled: "(sem título)", + reportsResolveFailed: "Não foi possível resolver o evento denunciado (ele pode ter sido excluído, ou a denúncia se refere a um perfil em vez de um post).", + reportsLookAtIt: "Ver", + reportsNoReports: "Nenhuma denúncia ainda. Ou está tudo bem, ou ninguém achou o botão.", + statusSetYourStatus: "Defina seu status", + statusSetDesc: "Mostre aos outros o que você está fazendo. Seu status aparece no seu perfil e nos spots vinculados.", + statusClear: "Limpar", + statusOrWriteOwn: "Ou escreva o seu", + statusCustomPlaceholder: "O que você está fazendo?", + statusLinkToSpot: "Vincular a um Spot (opcional)", + statusSpotSelected: "Spot selecionado", + statusSearchSpots: "Buscar spots...", + statusNoSpotsFound: "Nenhum spot encontrado.", + statusSelectSpot: "Selecione um spot", + statusAutoClearAfter: "Limpar automaticamente após: {{time}}", + statusExpMin: "{{count}} min", + statusExpOneHour: "1 hora", + statusExpHours: "{{count}} horas", + statusExpOneDay: "1 dia", + statusExpDays: "{{count}} dias", + statusSlider15: "15 min", + statusSlider1h: "1 h", + statusSlider4h: "4 h", + statusSlider24h: "24 h", + statusSetting: "Definindo status...", + statusSet: "Definir status", + statusSomethingWrong: "Algo deu errado", + seoProfileTitle: "Perfil - SkateSpots", + seoViewProfile: "Ver perfil.", + bannerAlt: "Banner", + openInCordn: "Abrir no Cordn", + modHelp: "Ocultar publica org.skatespots.moderation / hidden; Confirmar publica … / verified; Desfazer publica … / cleared (de volta ao neutro). Os três são rótulos públicos e reversíveis — nada é jamais excluído dos relays.", + zapNoActiveMint: "Nenhuma mint Cashu ativa encontrada.", + altProfile: "Perfil", + altCardPreview: "Prévia do cartão", + altCard: "Cartão", + altCaptured: "Capturado", + ariaPrevPhoto: "Foto anterior", + ariaNextPhoto: "Próxima foto", + ariaCommentOptions: "Opções de comentário", + ariaMessageConversation: "Conversa de mensagem", + exportTitle: "SkateSpots — Calculadora de custo de deck", + exportQuoteTitle: "ORÇAMENTO", + exportPngTitle: "Custo do deck", + exportMarkdownTitle: "Calculadora de custo de deck", + exportSectionLabor: "Mão de obra", + exportSectionEquipment: "Equipamento", + exportSectionOperations: "Despesas operacionais", + exportSectionMaterials: "Materiais", + exportSectionProcesses: "Custos de processo", + exportSectionPackaging: "Embalagem", + exportSectionResult: "Resultado", + exportLabelOperations: "Operações", + exportLabelProcesses: "Processos", + exportKvHourlyRate: "Valor por hora", + exportKvLabourBurden: "Encargos trabalhistas", + exportKvLoadedRate: "Valor carregado", + exportKvEquipmentPerBoard: "Equipamento por deck", + exportKvBoardsPerMonth: "Decks / mês", + exportKvRentPerMonth: "Aluguel / mês", + exportKvUtilitiesPerMonth: "Contas / mês", + exportKvSubscriptionsPerMonth: "Assinaturas / mês", + exportKvPerBoard: "Por deck", + exportKvMaterialsPerBoard: "Materiais por deck", + exportKvProcessesPerBoard: "Processos por deck", + exportKvPackagingPerBoard: "Embalagem por deck", + exportKvMarkup: "Markup", + exportMarkupValue: "{{markup}}× (≈ {{pct}}% de margem bruta)", + exportKvWasteEffective: "Desperdício (efetivo)", + exportKvCostNoPack: "Custo / deck (sem embalagem)", + exportKvCostWithPack: "Custo / deck (com embalagem)", + exportKvBatchSetupPerBoard: "Configuração do lote / deck", + exportKvTax: "Imposto ({{pct}}%)", + exportKvTaxIncluded: "Imposto ({{pct}}%, incluído)", + exportKvSellingNoPack: "Preço de venda (sem embalagem)", + exportKvSellingWithPack: "Preço de venda (com embalagem)", + exportShippingNote: "Não inclui frete até o comprador.", + exportGeneratedBy: "Gerado pelo SkateSpots · skate-spots.org", + exportGeneratedWith: "Gerado com o SkateSpots · skate-spots.org", + exportDetailSetup: "+ {{hours}}h de configuração", + exportDetailBoards: "{{boards}} decks", + exportDetailShip: "+ {{amount}} de frete", + exportDetailMinutes: "{{minutes}} min", + exportDetailPerBoards: "/ {{boards}} decks", + exportDetailScrap: "{{pct}}% de refugo", + exportDetailMaterials: "{{materials}} materiais", + exportQuoteRef: "Ref. {{ref}}", + exportQuoteLineItem: "Deck de skate personalizado", + exportQuoteLineItemQty: "Deck de skate personalizado × {{qty}}", + exportQuoteLineDesc: "Feito à mão, acabado e embalado. Quantidade 1.", + exportQuoteLineDescQty: "Feito à mão, acabado e embalado. {{price}} cada.", + exportQuoteSubtotal: "Subtotal", + exportQuoteSubtotalQty: "Subtotal ({{qty}} decks)", + exportQuoteTax: "Imposto / IVA ({{pct}}%)", + exportQuoteTotal: "Total", + exportQuoteTotalQty: "Total ({{qty}} decks)", + exportQuoteIncludesTax: "Inclui {{pct}}% de imposto ({{amount}})", + exportQuoteDeposit: "Entrada paga agora ({{pct}}%)", + exportQuoteBalance: "Saldo na entrega", + exportQuotePayment: "Pagamento: {{value}}", + exportQuoteLightning: "Lightning: {{value}}", + exportQuoteDetails: "Detalhes: {{value}}", + exportQuoteTerms: "Termos: {{value}}", + exportQuoteDelivery: "Entrega: {{value}}", + exportQuoteValidUntil: "Não inclui frete. Orçamento válido até {{date}}.", + exportPngSellingWith: "PREÇO DE VENDA · COM EMBALAGEM", + exportPngSellingNo: "PREÇO DE VENDA · SEM EMBALAGEM", + exportPngCostWith: "CUSTO / DECK (COM EMBALAGEM)", + exportPngDeposit: "Entrada {{pct}}%: {{amount}}", + exportXlsxSummary: "Resumo", + exportXlsxCurrency: "Moeda", + exportXlsxDate: "Data", + exportXlsxOperationsPerBoard: "Operações por deck", + exportColCost: "Custo", + exportColSetupH: "Configuração (h)", + exportColBoards: "Decks", + exportColPerBoard: "Por deck", + exportColMaterial: "Material", + exportColOrderCost: "Custo do pedido", + exportColShipping: "Frete", + exportColOrderMin: "Pedido (min)", + exportColUnloadMin: "Descarregar (min)", + exportColProcess: "Processo", + exportColTimeMin: "Tempo (min)", + exportColTimeBoardMin: "Tempo/deck (min)", + exportColMaterialsBoard: "Materiais/deck", + exportCopyTitle: "Custo do deck — {{currency}}", + exportCopyCostWith: "Custo / deck (com embalagem): {{amount}}", + exportCopySellingNo: "Preço de venda (sem embalagem): {{amount}}", + exportCopySellingWith: "Preço de venda (com embalagem): {{amount}}", + exportCopyBreakdown: "Equipamento {{equipment}} · Operações {{operations}} · Materiais {{materials}} · Processos {{processes}} · Embalagem {{packaging}}", + exportMdHourlyRate: "Valor por hora: {{value}}", + exportMdLabourBurden: "Encargos trabalhistas: {{value}}", + exportMdLoadedRate: "Valor carregado: {{value}}", + exportMdBoardsPerMonth: "Decks/mês: {{value}}", + exportMdRent: "Aluguel: {{value}}", + exportMdUtilities: "Contas: {{value}}", + exportMdSubscriptions: "Assinaturas: {{value}}", + exportMdPerBoard: "Por deck: {{value}}", + exportMdMarkupWaste: "Markup: {{markup}}× (≈ {{pct}}% de margem bruta) · Desperdício: {{waste}}%", + exportMdCostNoPack: "Custo/deck (sem embalagem): {{value}}", + exportMdCostWithPack: "Custo/deck (com embalagem): {{value}}", + exportMdBatchSetup: "Configuração do lote/deck: {{value}}", + exportMdSellingNo: "Preço de venda (sem embalagem): {{value}}", + exportMdSellingWith: "Preço de venda (com embalagem): {{value}}", + exportMdDisclaimer: "Não inclui frete até o comprador. Gerado pelo SkateSpots.", + }, +}; export default ptBatch8;