SkateSpots/src/i18n/pt/drift.ts
SkateSpots fe3d9bae22 ui(auth): compact, scroll-safe sign-in dialog
- Fix the real bug: the dialog clipped its bottom links (flex column + max-h
  calc(100dvh-2rem), content min-h-0 flex-1 overflow-y-auto).
- One dominant action per state: 'New here' is a compact row, not a second hero.
- Plain card labels (Browser extension / Signer app / Sign in with your phone)
  with tiny NIP-07/46/55 hints; protocol jargon out of the main labels.
- Bunker: input + Connect with instructions collapsed under 'Where do I get a
  bunker?'; no duplicate heading/divider.
- Secret key moved to a quiet bottom link; subtitle says 'or keep browsing'.
- 8px spacing grid (px-5 gutters, space-y-4 sections, gap-2 cards, p-2.5 cards,
  448px max width). New strings backfilled into all 20 locales.
Verified with headless 1280x900 + 390x844 screenshots.
2026-10-26 12:12:36 +07:00

331 lines
16 KiB
TypeScript

/**
* pt — translation drift fragment. Keys added after the main batches
* (language picker search, trust, marketplace guidelines, clothing craft,
* weather additions, Cordn MLS chat). Composed LAST in `index.ts` via a deep
* merge so these nested keys complement — never replace — the batch namespaces.
*/
const drift = {
nav: {
searchLanguages: "Buscar idiomas…",
noLanguages: "Nenhum idioma encontrado",
},
mapPage: {
searchSuggestPlaces: "Lugares",
},
mapUi: {
firstRunTitle: "Comece agora",
firstRunAddSpot: "Adicione seu primeiro spot",
firstRunJoinCrew: "Entrar em uma crew",
firstRunStartCrew: "Comece sua crew",
firstRunWallet: "Configure sua carteira",
forecastDays: "Previsão de {{count}} dias",
},
spotUi: {
forecastDays: "Previsão de {{count}} dias",
},
marketUi: {
trades: {
stateRevoked: "revogado",
stateVerifying: "verificando",
},
loadFailed: "Não foi possível alcançar os relays. Verifique sua conexão e tente novamente.",
statusPending: "pendente",
offers: {
closeDeal: "Fechar negócio",
loadFailed: "Não foi possível carregar as ofertas. Verifique sua conexão e tente novamente.",
},
pay: {
nonSats: "Esta oferta está em {{currency}}. O pagamento no app é apenas em sats. Acerte diretamente com o vendedor.",
unsupported: "Este código de pagamento (uma solicitação Cashu) ainda não é suportado. Peça ao vendedor uma fatura ou um endereço Lightning.",
},
escrowRequest: {
lockedNotSent: "Os fundos estão bloqueados no escrow e salvos neste dispositivo, mas a solicitação não foi enviada. Reabra o anúncio para tentar de novo. Não pague novamente.",
mintLabel: "Mint (onde os fundos estão bloqueados)",
sellerMintHint: "O vendedor prefere este mint; fundos bloqueados aqui são os mais fáceis de ele resgatar.",
mintHint: "O escrow fica neste mint. O vendedor resgata aqui, então escolha um em que vocês dois confiem.",
noMints: "Nenhum mint disponível",
p2pkUnsupported: "Este mint não anuncia suporte a P2PK (NUT-11), então o escrow não pode ser bloqueado aqui. Escolha outro mint.",
},
},
labUi: {
offerClothing: "Oferecer roupas",
tabClothing: "Roupas",
empty: {
clothingTitle: "Ainda sem designers de roupas",
clothingBody: "Seja o primeiro a oferecer roupas personalizadas, kits de time e apparel para a cena.",
},
craftFields: {
sizing: "Faixa de tamanhos",
samples: "Amostras / protótipos",
customization: "Personalização",
},
},
socialUi: {
coordinator: {
ourDefaultTitle: "Coordenador do SkateSpots",
ourDefaultDesc: "O SkateSpots mantém um coordenador em relay.skate-spots.org. Use-o por padrão, ou rode o seu — um coordenador só vê texto cifrado e metadados, nunca suas mensagens.",
useOurs: "Usar o coordenador do SkateSpots",
},
crewCoordinator: {
encryptedChat: "Chat criptografado",
privateChatName: "Chat privado",
privateChatDesc: "Chat de grupo com sigilo persistente (MLS) por meio de um coordenador.",
privateChatDescFull: "O chat privado é criado uma vez por um admin, depois os membros entram.",
chatRowDesc: "Todos na crew — selado com a chave de cada membro (NIP-17).",
openChat: "Abrir",
setUpChat: "Configurar",
joinChat: "Entrar",
checking: "Verificando…",
openInAnotherApp: "Abrir em outro app",
openInCordnWeb: "Cordn (web)",
openCordnGroup: "Abrir o chat da crew",
copyForStaircase: "Copiar para o Staircase",
},
dms: {
refresh: "Atualizar",
crews: "Crews",
crewFounder: "Fundador",
crewMember: "Membro",
crewOpen: "Abrir",
crewSetUp: "Configurar",
},
form: {
cordnGroup: "Grupo Cordn",
cordnGroupHint: "Opcional: cole o link do grupo do Staircase ou do Cordn web. Sua crew passa a ter um chat MLS real de ponta a ponta, hospedado no nosso coordenador.",
},
},
settingsUi: {
loginDialog: {
welcomeSubtitleBrowse: "Cadastre-se ou entre — ou continue explorando.",
extensionCard: "Extensão do navegador",
signerCard: "App assinador",
secretKeyLink: "Usar uma chave secreta",
whereBunker: "Onde consigo um bunker?",
},
settingsPage: {
trust: "Confiança",
trustSub: "Fontes e exibição",
},
},
walletUi: {
trust: {
mute: "Silenciar",
muted: "Silenciado",
mutedDesc: "Você não verá o conteúdo dela.",
muteFailed: "Não foi possível silenciar. Tente novamente.",
loginToMute: "Faça login para silenciar.",
attributedNetwork: "De pessoas da sua rede",
attributedProviderHouse: "Do provedor de confiança da comunidade",
attributedProviderCustom: "Do provedor que você escolheu",
howItWorks: "Como funciona a confiança",
flaggedNoticeTitle: "Sinalizado por skatistas de confiança",
flaggedNoticeDesc: "Cuidado. Pessoas de confiança na rede sinalizaram esta conta.",
flaggedReporterFollow: "{{count}} que você segue",
flaggedReporterNetwork: "{{count}} na sua rede",
flaggedReporterOther: "{{count}} outras contas",
flaggedReport: "Denunciar",
flaggedDismiss: "Dispensar",
bucketVerified: "Verificado",
bucketUnknown: "Desconhecido",
bucketFlagged: "Sinalizado",
bucketVerifiedDesc: "Alguém da sua rede atesta por esta conta.",
bucketUnknownDesc: "Ninguém da sua rede atestou por esta conta ainda.",
bucketFlaggedDesc: "Pessoas de confiança sinalizaram esta conta.",
reportedByTrusted: "Sinalizado por {{count}} pessoas de confiança",
},
},
trustUi: {
alertsTitle: "Alertas de rede",
alertsDesc: "Contas que você segue e que pessoas de confiança sinalizaram ou silenciaram.",
alertsEmpty: "Nenhum alerta. Verificamos as contas que você segue em busca de denúncias confiáveis.",
alertsReported: "Sinalizado por {{count}} pessoas de confiança",
alertsMuted: "Silenciado por {{count}} pessoas de confiança",
alertsIgnore: "Ignorar",
alertsUnfollow: "Deixar de seguir",
alertsLogin: "Faça login para ver alertas das contas que você segue.",
providerTitle: "Provedor",
providerDesc: "As pontuações vêm de um provedor que você escolhe. O provedor da comunidade é o padrão.",
useCommunity: "Usar o provedor da comunidade",
setProvider: "Definir um provedor",
customPubkeyPlaceholder: "npub ou chave pública hex do provedor",
customRelayPlaceholder: "wss://relay.exemplo.com",
invalidProvider: "Informe um npub válido ou chave pública hex de 64 caracteres, e um relay wss://.",
publishFailed: "Não foi possível publicar o provedor. Tente novamente.",
providerSaved: "Provedor atualizado.",
loggedOutProvider: "Faça login para escolher um provedor.",
showMarks: "Mostrar marcas de confiança",
showMarksDesc: "Marcas verificadas e desconhecidas. As denúncias sempre aparecem.",
sourceLabel: "Fonte",
sourceHouse: "Provedor de confiança da comunidade",
sourceCustom: "Seu provedor",
loggedOut: "Faça login para escolher seu próprio provedor de confiança.",
seoTitle: "Como funciona a confiança",
seoDescription: "Como o SkateSpots mostra a confiança: três estados, de onde vêm as pontuações e por que a ausência não é desconfiança.",
title: "Como funciona a confiança",
intro: "Aqui a confiança é um sinal, não um veredito. Ela vem de quem você conhece, ou de um provedor que você escolhe. Não classificamos pessoas globalmente.",
statesTitle: "Três estados",
verifiedTitle: "Verificado",
verifiedDesc: "Alguém da sua rede atesta por esta conta: um amigo de um amigo, ou o provedor que você escolheu.",
unknownTitle: "Desconhecido",
unknownDesc: "Ninguém atestou ainda. É aqui que toda conta nova começa.",
flaggedTitle: "Sinalizado",
flaggedDesc: "Pessoas de confiança sinalizaram esta conta. É um aviso para olhar com atenção, não uma prova.",
absenceTitle: "Não ter selo não é desconfiança",
absenceDesc: "A maioria das contas não mostra nada. Isso significa que ninguém da sua rede atestou ainda, não que algo esteja errado. Nunca leia uma marca ausente como negativa.",
sourceTitle: "Quem calcula",
sourceDesc: "Por padrão, usamos a sua própria rede. Você também pode escolher um provedor de confiança que publica pontuações assinadas no Nostr (NIP-85), ou desativar a exibição. Denúncias sempre aparecem, porque são um sinal de segurança.",
endorsementTitle: "Presença não é endosso",
endorsementDesc: "Uma marca verificada significa que alguém atestou, não que a pessoa seja boa. Uma sinalização significa que pessoas de confiança a denunciaram, não que ela seja culpada. Confira os detalhes antes de decidir.",
povTitle: "Depende do ponto de vista",
povDesc: "Uma pontuação é relativa a quem olha. Um ranking de um provedor ou de uma pessoa não é comparável a outro, e nunca apresentamos um como fato objetivo.",
settingsCta: "Gerenciar nas configurações",
},
marketTerms: {
link: "Diretrizes do Marketplace",
seoTitle: "Diretrizes do Marketplace",
seoDescription: "Como funcionam os anúncios de equipamentos do SkateSpots: entre pessoas, comprador atento, e as regras.",
title: "Diretrizes do Marketplace",
intro: "O SkateSpots é um mural de equipamentos entre pessoas. Você negocia direto com a outra pessoa: não retemos fundos, não enviamos itens nem resolvemos disputas.",
howTitle: "Como funciona",
howBody: "Publique equipamentos, fale com o vendedor por mensagem privada e acerte direto (dinheiro, Lightning ou troca). Não há carrinho nem checkout.",
rulesTitle: "O que não é permitido",
rulesBody: "Nada de conteúdo ilegal, perigoso ou adulto; nada de drogas, armas, falsificações ou itens roubados. Mantenha os anúncios sobre equipamentos de skate e itens relacionados.",
respectTitle: "Seja respeitoso",
respectBody: "Nada de abuso, assédio, ameaças ou ódio. Moderadores podem ocultar anúncios ou contas.",
trustTitle: "Confiança é um guia, não uma garantia",
trustBody: "Marcas de verificação e reputação de trocas são sinais da rede, não promessas. Faça suas próprias verificações antes de negociar.",
trustLink: "Como funciona a confiança",
privacyLink: "O que sai do seu dispositivo",
safetyTitle: "Negocie com segurança",
safetyBody: "Encontre-se em local público para as entregas, use escrow ou um depósito de boa-fé em negócios enviados, e nunca envie dinheiro fora do app.",
moderationTitle: "A moderação é leve e reversível",
moderationBody: "Conteúdo oculto permanece nos relays e pode ser restaurado; disputas entre pessoas são vocês que resolvem.",
},
labOptions: {
clothing: {
service: {
tees: "Camisetas",
hoodies: "Moletons e blusas",
pants: "Calças e shorts",
jackets: "Jaquetas e agasalhos",
kits: "Kits de time e camisas",
caps: "Bonés e gorros",
socks: "Meias",
accessories: "Bolsas e acessórios",
footwear: "Calçados",
patches: "Patches e aplicações",
griptape: "Vestuário de griptape e shape",
onepiece: "Peças únicas / upcycled",
},
serviceDesc: {
tees: "Camisetas e tops personalizados",
hoodies: "Moletons, blusões e calças de moletom",
pants: "Calças de trabalho, cargos e shorts",
jackets: "Jaquetas de coach, corta-vento e de trabalho",
kits: "Kits de time, camisas e uniformes",
caps: "Bonés, gorros e chapéus",
socks: "Meias de crew e malhas",
accessories: "Bolsas, cintos e pequenos itens",
footwear: "Calçados personalizados",
patches: "Patches bordados e aplicações",
griptape: "Arte em griptape e vestuário de shape",
onepiece: "Peças únicas e roupas upcycled",
},
method: {
screenprint: "Serigrafia",
dtg: "DTG / impressão direta em tecido",
embroidery: "Bordado",
cutsew: "Corte e costura",
sublimation: "Sublimação",
heattransfer: "Transfer térmico / vinil",
garmentdye: "Tingimento da peça",
knit: "Malharia",
patchwork: "Patchwork",
allover: "Estampa all-over",
},
material: {
cotton: "Algodão",
heavyweight: "Peso pesado",
organic: "Orgânico / sustentável",
fleece: "Fleece",
denim: "Denim",
canvas: "Canvas",
nylon: "Nylon / técnico",
wool: "Merino / lã",
leather: "Couro",
recycled: "Reciclado / deadstock",
},
},
},
becomeRolesUi: {
clothing: {
seoTitle: "Seja designer de roupas - SkateSpots",
seoDescription: "Roupas personalizadas, kits de time e apparel para a cena.",
heading: "Designer de roupas",
tagline: "Roupas personalizadas, kits de time e apparel para a cena",
noun: "designer de roupas",
rateLabel: "Tarifa",
portfolioLabel: "Link da loja / portfólio",
sectionWhatYouMake: "O que você faz",
sectionHowYouMake: "Como você faz",
sectionMaterials: "Materiais",
minimumPlaceholder: "ex.: 10 peças",
turnaroundPlaceholder: "ex.: 2-3 semanas",
sizingPlaceholder: "ex.: XS-3XL / sob medida",
samplesHelper: "Você oferece amostras ou protótipos antes de uma produção completa?",
customizationPlaceholder: "ex.: nomes, números, gráficos",
},
},
weatherUi: {
updated: "Atualizado",
refresh: "Atualizar",
unavailable: "Clima indisponível.",
retry: "Tentar novamente",
sunrise: "Nascer do sol",
sunset: "Pôr do sol",
legendTitle: "Pontuação do clima",
legendWeatherOnly: "Apenas clima",
},
cordnUi: {
shareInvite: 'Convidar',
shareInviteText: 'Entre em {{crew}} — chat privado do crew',
inviteCopied: 'Link de convite copiado',
title: "Chat privado",
subtitle: "Criptografado de ponta a ponta (MLS) entre os membros da crew. O coordenador roteia apenas texto cifrado e metadados — nunca vê o conteúdo das mensagens.",
notLoggedIn: "Faça login para usar o chat privado da crew.",
membersOnly: "Apenas membros da crew podem abrir o chat privado.",
connecting: "Conectando…",
noCoordinator: "Nenhum coordenador está configurado para esta crew ainda.",
noGroupAdmin: "O chat privado desta crew ainda não foi criado.",
noGroupMember: "Você ainda não está no chat privado desta crew.",
create: "Criar o chat privado",
requestJoin: "Pedir para entrar",
checkInvite: "Verificar convite",
requested: "Solicitação enviada — um admin da crew vai aprovar.",
noInvite: "Nenhum convite aguardando. Peça a um admin para aprovar sua solicitação.",
placeholder: "Mensagem para a crew…",
send: "Enviar",
refresh: "Atualizar",
requests: "Pedidos de entrada",
checkRequests: "Verificar pedidos",
approve: "Adicionar",
noRequests: "Nenhum pedido de entrada pendente.",
inviteHint: "Por enquanto só você está neste chat — os membros da crew podem tocar em “Pedir para entrar”, e você os aprova aqui.",
memberCount: "{{count}} no grupo",
you: "Você",
groupRef: "Link do grupo",
copyRef: "Copiar",
copied: "Copiado",
attachImage: "Anexar imagem",
uploading: "Enviando…",
uploadFailed: "Não foi possível enviar a imagem.",
bannerTitle: "Esta crew ainda não tem chat privado",
bannerBody: "Configure um chat criptografado de ponta a ponta (MLS) para sua crew — os membros entram pela aba.",
bannerCta: "Configurar",
ready: "Conectado · MLS",
errorPrefix: "Não foi possível alcançar o coordenador",
interactiveHint: "Seu signer pede aprovação a cada ação — use Atualizar e Enviar conforme necessário.",
},
};
export default drift;