- 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.
331 lines
16 KiB
TypeScript
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;
|