tane/apps/app_seeds/lib/i18n/pt.i18n.json
vjrj 68b04ea409 feat(chat): usable 1:1 chat — bottom-anchored, Drift-backed, dated
- Anchor the message list to the bottom (`reverse: true`) so new messages
  stay in view instead of landing below the fold.
- Move chat history from the OS keystore (O(n²) JSON blob, silent 200-msg
  cap) to a separate encrypted Drift/SQLCipher DB (`ChatDatabase`):
  indexed append, uncapped history, dedup as a unique-key invariant. It's
  an ephemeral per-device cache, isolated from the inventory schema, its
  migrations, and its sync. No data migration (pre-release).
- Add day separators (Today/Yesterday/locale date) and a per-bubble time,
  all via ICU (12/24h per locale; Localizations locale maps Asturian →
  Spanish for intl date symbols).
- Add peer avatars (deterministic colour from the pubkey + name initial),
  surface send failures that were previously silent, and make bubble text
  selectable (addresses, links).
- New i18n keys in en/es/pt/ast; tests for grouping, formatting, avatars,
  scroll anchoring, storage and send errors.

Docs: docs/design/chat-storage.md + open-decisions.md.
2026-07-11 06:40:50 +02:00

610 lines
22 KiB
JSON

{
"calendar": {
"title": "Este mês",
"homeSubtitle": "O que semear e fazer agora",
"filterChip": "Este mês",
"nothing": "Nada anotado para {month}."
},
"app": {
"title": "Tanemaki"
},
"bootstrap": {
"failed": "O Tanemaki não conseguiu iniciar",
"retry": "Tentar de novo"
},
"common": {
"save": "Guardar",
"cancel": "Cancelar",
"delete": "Eliminar",
"edit": "Editar",
"type": "Tipo",
"comingSoon": "Em breve",
"offline": "Sem ligação — a partilha está em pausa"
},
"home": {
"tagline": "Partilha e cultiva sementes locais",
"openMarket": "Mercado",
"openMarketSubtitle": "Descobre e partilha sementes por perto",
"yourInventory": "O teu inventário",
"yourInventorySubtitle": "Gere as tuas sementes"
},
"photo": {
"camera": "Tirar uma foto",
"gallery": "Escolher da galeria",
"setAsCover": "Usar como capa",
"isCover": "Foto de capa",
"deleteConfirm": "Eliminar esta foto?"
},
"menu": {
"tagline": "o teu banco de sementes",
"inventory": "Inventário",
"market": "Mercado",
"profile": "O teu perfil",
"chat": "Conversas",
"wishlist": "Lista de desejos",
"following": "A seguir",
"plantares": "Plantares",
"sales": "Vendas",
"calendar": "Calendário",
"settings": "Definições"
},
"settings": {
"language": "Idioma",
"systemLanguage": "Idioma do sistema",
"langEs": "Español",
"langEn": "English",
"langPt": "Português",
"langAst": "Asturianu",
"about": "Acerca de",
"aboutText": "Inventário local e cifrado para sementes tradicionais. AGPL-3.0.",
"aboutOpen": "Acerca do Tanemaki"
},
"backup": {
"title": "Cópia de segurança",
"autoBackupTitle": "Cópias automáticas",
"autoBackupLast": "Última cópia guardada em {date}",
"autoBackupNone": "Uma cópia é guardada automaticamente em segundo plano",
"exportJson": "Guardar uma cópia de segurança",
"exportJsonSubtitle": "Uma cópia completa para guardar em segurança, restaurar depois ou levar para outro aparelho",
"importJson": "Restaurar uma cópia",
"importJsonSubtitle": "Recupera uma cópia guardada — nada fica duplicado",
"exportCsv": "Exportar para uma folha de cálculo",
"exportCsvSubtitle": "Uma lista simples para Excel ou LibreOffice — sem fotos",
"importCsv": "Importar uma lista",
"importCsvSubtitle": "Acrescenta entradas a partir de uma folha de cálculo",
"importConfirmTitle": "Restaurar uma cópia?",
"importConfirmBody": "As entradas fundem-se com o teu inventário; quando a mesma entrada existe dos dois lados, vence a versão mais recente. Nada fica duplicado.",
"importCsvConfirmTitle": "Importar uma lista?",
"importCsvConfirmBody": "Cada linha é acrescentada como uma entrada nova. Não funde nem substitui, por isso importar o mesmo ficheiro duas vezes acrescenta-o duas vezes.",
"importAction": "Importar",
"exportSaved": "Cópia guardada",
"cancelled": "Cancelado",
"importDone": "Importado: {added} novas, {updated} atualizadas",
"importCsvDone": "{count} entradas acrescentadas",
"importFailed": "Este ficheiro não pôde ser lido como uma cópia do Tanemaki",
"failed": "Algo correu mal",
"recoveryTitle": "O teu código de recuperação",
"recoverySubtitle": "Imprime-o e guarda-o bem: abre as tuas cópias noutro aparelho",
"recoveryIntro": "Este código abre as tuas cópias guardadas e recupera o teu banco em qualquer aparelho. Guarda duas cópias em papel em sítios seguros, como a tua melhor semente. Quem o tiver pode ler as tuas cópias, por isso não o partilhes com ninguém.",
"recoveryCopy": "Copiar",
"recoverySave": "Guardar a folha",
"recoverySheetTitle": "Tanemaki — a tua folha de recuperação",
"recoveryPromptTitle": "Escreve o teu código de recuperação",
"recoveryPromptBody": "Esta cópia foi guardada com outro código. Escreve o código da tua folha de recuperação para a abrir.",
"recoveryWrongCode": "Esse código não abre esta cópia"
},
"about": {
"title": "Acerca de",
"kanji": "種まき",
"tagline": "Uma aplicação local e descentralizada para gerir e partilhar sementes e plântulas tradicionais.",
"intro": "O Tanemaki (種まき, \"semear / espalhar sementes\" em japonês; nome curto Tane, 種 \"semente\") ajuda pessoas e coletivos a manter um inventário amigável do seu banco de sementes, decidir o que oferecem e partilhá-lo localmente — sem um intermediário central que possa controlar, censurar ou ser multado por isso. O objetivo é prático e político ao mesmo tempo: apoiar as variedades tradicionais e fazer frente ao monopólio das sementes.",
"heritage": "O nome honra as antigas tradições japonesas de ajuda mútua à volta do arroz — yui (trabalho comunitário partilhado) e tanomoshi (fundos de reciprocidade) — que inspiraram o Plantare em papel, a \"moeda comunitária de troca de sementes\" (BAH-Semillero, 2009, CC-BY-SA). O Tanemaki é o Plantare digital.",
"version": "Versão",
"license": "Licença",
"licenseValue": "AGPL-3.0",
"website": "Sítio web",
"openSourceLicenses": "Licenças de código aberto",
"openSourceLicensesSubtitle": "Bibliotecas de terceiros e as suas licenças",
"copyright": "© {years} Associação Comunes, sob AGPLv3"
},
"intro": {
"skip": "Saltar",
"next": "Seguinte",
"start": "Começar",
"menuEntry": "Como funciona o Tanemaki",
"slides": {
"welcome": {
"title": "A semente que te trouxe até aqui",
"body": "Cada semente tradicional é uma carta escrita por milhares de gerações, passada de mão em mão. Somos o que somos graças a essa partilha."
},
"inventory": {
"title": "O teu banco de sementes, no bolso",
"body": "Anota o que tens, de que ano, quanto e de onde veio — com o nome que tu usas. Uma foto e um nome chegam para começar."
},
"privacy": {
"title": "Teu, e só teu",
"body": "Sem conta, sem internet, sem rastreadores. Os teus dados vivem cifrados no teu aparelho, e só o que tu escolheres é partilhado."
},
"share": {
"title": "Partilhar, como sempre se fez",
"body": "Oferece o que te sobra — dar, trocar ou vender — e deixa que alguém perto de ti o encontre. Só se mostra uma distância aproximada, nunca a tua morada; o acordo fecha-se em pessoa."
},
"plantare": {
"title": "Semear é multiplicar",
"body": "Com um Plantare, quem recebe semente promete devolver uma parte mais tarde. E como devolvê-la implica cultivá-la, cada empréstimo multiplica o comum."
}
}
},
"inventory": {
"title": "Inventário",
"searchHint": "Procurar sementes",
"empty": "Ainda não há sementes. Toca em + para adicionar a primeira.",
"noMatches": "Nenhuma semente corresponde aos teus filtros.",
"clearFilters": "Limpar filtros",
"uncategorized": "Sem categoria",
"needsReproductionFilter": "Para reproduzir"
},
"draft": {
"capture": "Capturar fotos",
"captured": "{n} capturadas para catalogar",
"triageTitle": "Para catalogar",
"triageCount": "{n} para catalogar",
"untitled": "Sem nome",
"nameField": "Dá um nome a esta semente",
"nameHint": "O que é?",
"suggestFromPhoto": "Sugerir nome a partir da foto",
"discard": "Descartar"
},
"quickAdd": {
"title": "Adicionar uma semente",
"labelField": "Nome",
"labelRequired": "Dá-lhe um nome",
"addPhoto": "Adicionar foto",
"quantity": "Quanto?",
"more": "Adicionar mais…",
"save": "Guardar",
"saveAndAddAnother": "Guardar e adicionar outra",
"addedCount": "{n} adicionadas",
"cancel": "Cancelar"
},
"detail": {
"notFound": "Esta semente já não está aqui.",
"lots": "Lotes",
"noLots": "Ainda não há lotes.",
"names": "Também conhecida como",
"addName": "Adicionar nome",
"links": "Ligações",
"addLink": "Adicionar ligação",
"linkUrl": "URL",
"linkTitle": "Título (opcional)",
"notes": "Notas",
"addLot": "Adicionar lote",
"editLot": "Editar lote",
"deleteConfirm": "Eliminar esta semente?",
"year": "Ano {year}",
"noYear": "Ano desconhecido"
},
"germination": {
"title": "Germinação",
"add": "Adicionar teste",
"sampleSize": "Tamanho da amostra",
"germinated": "Germinadas",
"none": "Ainda não há testes de germinação.",
"result": "{percent}%"
},
"viability": {
"expiringSoon": "Usa ou reproduz nesta época",
"expiringSoonYears": "Usa ou reproduz nesta época · dura ~{years} anos",
"expired": "Passou a viabilidade típica — reproduzir",
"expiredYears": "Passou a viabilidade típica (~{years} anos) — reproduzir"
},
"editVariety": {
"title": "Editar semente",
"name": "Nome",
"category": "Categoria",
"notes": "Notas",
"species": "Espécie (do catálogo)",
"speciesHint": "Procura uma espécie…",
"speciesSuggested": "Sugerida pelo nome",
"organic": "Biológica",
"organicHint": "Cultivada em modo biológico"
},
"addLot": {
"title": "Adicionar lote",
"year": "Data de colheita",
"quantity": "Quanto?",
"amount": "Quantidade"
},
"harvest": {
"pickTitle": "Escolhe mês / ano",
"anyMonth": "Qualquer mês",
"noDate": "Definir data de colheita",
"monthNames": [
"janeiro",
"fevereiro",
"março",
"abril",
"maio",
"junho",
"julho",
"agosto",
"setembro",
"outubro",
"novembro",
"dezembro"
]
},
"lotType": {
"seed": "Sementes",
"plant": "Planta",
"seedling": "Plântula",
"tree": "Árvore / arbusto",
"bulb": "Bolbo / tubérculo",
"cutting": "Estaca"
},
"presentation": {
"title": "Apresentação",
"none": "Sem indicar",
"pot": "Vaso",
"tray": "Tabuleiro",
"plug": "Alvéolo",
"bareRoot": "Raiz nua",
"rootBall": "Torrão"
},
"provenance": {
"section": "De onde vem",
"seedsFrom": "Sementes de",
"seedsFromHint": "Quem as cultivou ou ofereceu",
"place": "Lugar",
"placeHint": "De onde vêm (com a região)",
"addSeedsFrom": "Sementes de",
"addPlace": "Lugar"
},
"abundance": {
"add": "Quanta tenho",
"title": "Quanta tenho",
"none": "Sem indicar",
"plentyToShare": "De sobra para partilhar",
"enoughToShare": "Bastante, para partilhar com moderação",
"enoughForMe": "Suficiente para mim",
"runningLow": "Resta pouca"
},
"share": {
"add": "Partilhas esta?",
"title": "Partilhas esta?",
"nudge": "Tens de sobra: podias partilhar um pouco.",
"private": "Só para mim",
"gift": "Para dar",
"exchange": "Para trocar",
"sell": "À venda",
"filterChip": "Partilho",
"printCatalog": "Imprimir o que partilho",
"catalogTitle": "O que partilho",
"catalogSaved": "Catálogo guardado",
"cancelled": "Cancelado"
},
"printLabels": {
"action": "Imprimir etiquetas",
"title": "Imprimir etiquetas",
"selectHint": "Escolhe as sementes para imprimir as etiquetas",
"selectAll": "Selecionar tudo",
"selected": "{n} selecionadas",
"none": "Seleciona sementes primeiro",
"format": "Tamanho da etiqueta",
"formatStickers": "Autocolantes pequenos",
"formatStickersHint": "Muitas etiquetas pequenas por folha — para colar em envelopes",
"formatCards": "Cartões grandes",
"formatCardsHint": "Menos etiquetas, maiores — para frascos e caixas",
"count": "{n} etiquetas",
"save": "Guardar etiquetas",
"saved": "Etiquetas guardadas",
"cancelled": "Cancelado"
},
"cropCalendar": {
"add": "Calendário de cultivo",
"title": "Calendário de cultivo",
"sow": "Sementeira",
"transplant": "Transplante",
"flowering": "Floração",
"fruiting": "Frutificação",
"seedHarvest": "Colheita de semente",
"unset": "—"
},
"needsReproduction": {
"label": "Reproduzir nesta época",
"hint": "Cultiva-a antes que a semente acabe",
"badge": "Por reproduzir"
},
"preservation": {
"add": "Como está guardada",
"title": "Como está guardada",
"none": "Sem indicar",
"jarWithDesiccant": "Frasco com agente secante",
"glassJar": "Frasco de vidro",
"paperEnvelope": "Envelope de papel",
"paperBag": "Saco de papel",
"plasticBag": "Saco de plástico"
},
"conditionCheck": {
"advanced": "Armazenamento e detalhes de banco de sementes",
"title": "Verificações de armazenamento",
"add": "Adicionar verificação",
"containers": "Frascos / recipientes",
"desiccant": "Agente secante",
"none": "Ainda não há verificações de armazenamento.",
"summary": "{count} frasco(s) · {state}"
},
"desiccant": {
"none": "Nenhum",
"add": "Adicionar",
"replace": "Substituir",
"dry": "Azul — seco",
"fresh": "Acabado de renovar"
},
"unit": {
"aFew": "algumas",
"some": "bastantes",
"plenty": "muitas",
"pinch": "uma pitada",
"handful": {
"singular": "mão-cheia",
"plural": "mãos-cheias"
},
"teaspoon": {
"singular": "colher de chá",
"plural": "colheres de chá"
},
"spoon": {
"singular": "colher",
"plural": "colheres"
},
"cup": {
"singular": "chávena",
"plural": "chávenas"
},
"jar": {
"singular": "frasco",
"plural": "frascos"
},
"sack": {
"singular": "saco",
"plural": "sacos"
},
"packet": {
"singular": "pacote",
"plural": "pacotes"
},
"cob": {
"singular": "maçaroca",
"plural": "maçarocas"
},
"pod": {
"singular": "vagem",
"plural": "vagens"
},
"ear": {
"singular": "espiga",
"plural": "espigas"
},
"head": {
"singular": "cabeça",
"plural": "cabeças"
},
"fruit": {
"singular": "fruto",
"plural": "frutos"
},
"bulb": {
"singular": "bolbo",
"plural": "bolbos"
},
"tuber": {
"singular": "tubérculo",
"plural": "tubérculos"
},
"seedHead": {
"singular": "capítulo",
"plural": "capítulos"
},
"bunch": {
"singular": "molho",
"plural": "molhos"
},
"plant": {
"singular": "planta",
"plural": "plantas"
},
"pot": {
"singular": "vaso",
"plural": "vasos"
},
"tray": {
"singular": "tabuleiro",
"plural": "tabuleiros"
},
"seedling": {
"singular": "plântula",
"plural": "plântulas"
},
"tree": {
"singular": "árvore",
"plural": "árvores"
},
"cutting": {
"singular": "estaca",
"plural": "estacas"
},
"grams": {
"singular": "grama",
"plural": "gramas"
},
"count": {
"singular": "semente",
"plural": "sementes"
}
},
"market": {
"title": "Sementes perto de ti",
"subtitle": "O que outras pessoas partilham por perto",
"notSetUp": "Ainda não configuraste a partilha",
"notSetUpBody": "Ativa a partilha para ver e dar sementes a pessoas por perto. Mantém-se aproximado — a tua zona, nunca a tua morada exata.",
"setUp": "Configurar a partilha",
"cantReach": "Não é possível ligar aos servidores neste momento",
"cantReachBody": "Tenta de novo, ou verifica os servidores na configuração avançada.",
"retry": "Tentar de novo",
"setArea": "Indica a tua zona",
"setAreaBody": "Diz ao mercado a tua zona aproximada para ver sementes por perto.",
"searching": "A procurar pela tua zona…",
"empty": "Ainda não há sementes partilhadas perto de ti",
"searchHint": "Procurar nestas sementes",
"noMatches": "Nenhuma semente partilhada corresponde à procura",
"near": "Perto de ti",
"contact": "Mensagem",
"mine": "Tu",
"configTitle": "Configuração de partilha",
"setupIntro": "Partilhar com pessoas por perto é opcional. Basta indicar a tua zona aproximada — já estás ligado a servidores comunitários partilhados para que outras pessoas encontrem o que ofereces, sem nenhuma empresa no meio.",
"areaLabel": "A tua zona",
"areaHelp": "Mantém-se aproximado de propósito — a tua zona, nunca um ponto exato.",
"areaSet": "A tua zona está definida — aproximada, nunca o teu ponto exato",
"areaNotSet": "Zona por definir — usa a tua localização, ou adiciona um código em Avançado",
"advanced": "Avançado",
"areaCodeLabel": "Código de zona",
"areaCodeHint": "Um código curto como sp3e9 — não um nome de lugar",
"serversLabel": "Servidores da comunidade",
"serversHelp": "Um endereço por linha (wss://…). Deixa assim se não souberes.",
"serversAdvanced": "Adicionar outro servidor",
"save": "Guardar",
"saved": "Guardado",
"wanted": "Procuro",
"shareMine": "Partilhar as minhas sementes",
"sharedCount": "Partilhadas {n} sementes",
"nothingToShare": "Marca primeiro algumas sementes para dar, trocar ou vender",
"useLocation": "Usar a minha localização aproximada",
"locationFailed": "Não foi possível obter a tua localização — verifica se a localização está ativa e a permissão concedida",
"queued": "Guardado — vamos partilhá-las quando tiveres ligação",
"shareFailed": "Não foi possível contactar os servidores — as tuas sementes não foram partilhadas. Tenta de novo daqui a pouco.",
"rangeLabel": "Até onde procurar",
"rangeNear": "Muito perto",
"rangeArea": "Pela minha zona",
"rangeRegion": "A minha região",
"sharedBy": "Partilhado por",
"noProfile": "Esta pessoa ainda não partilhou o seu perfil",
"copyId": "Copiar código",
"idCopied": "Código copiado",
"photo": "Foto"
},
"profile": {
"title": "O teu perfil",
"name": "Nome",
"nameHint": "Como os outros te veem",
"about": "Sobre ti",
"aboutHint": "Uma linha — o que cultivas, onde",
"g1": "Endereço Ğ1 (opcional)",
"g1Hint": "Para que te paguem em Ğ1 — separado da tua chave",
"yourId": "A tua identidade",
"idHelp": "Partilha-a para que te reconheçam",
"copy": "Copiar",
"copied": "Copiado",
"save": "Guardar",
"saved": "Perfil guardado",
"identities": "As tuas identidades",
"identitiesHelp": "Mantém identidades separadas — cada uma com as suas mensagens e contactos. Todas vêm da tua única cópia de segurança, por isso mudar não acrescenta nada para lembrar.",
"identityLabel": "Identidade {n}",
"current": "Em uso",
"newIdentity": "Nova identidade",
"switchTitle": "Mudar de identidade?",
"switchBody": "As mensagens e contactos são guardados separadamente para cada identidade. Podes voltar quando quiseres.",
"switchAction": "Mudar"
},
"chatList": {
"title": "Mensagens",
"empty": "Ainda não há conversas. Escreve a alguém a partir do mercado."
},
"chat": {
"title": "Conversa",
"hint": "Escreve uma mensagem…",
"send": "Enviar",
"empty": "Ainda não há mensagens — diz olá",
"offline": "Configura a partilha para enviar mensagens",
"payG1": "Pagar em Ğ1",
"g1Copied": "Endereço Ğ1 copiado — cola-o na tua carteira",
"today": "Hoje",
"yesterday": "Ontem",
"sendError": "Não foi possível enviar — verifica a tua ligação"
},
"trust": {
"none": "Ainda ninguém os avaliza",
"count": "Avalizada por {n}",
"vouch": "Conheço esta pessoa",
"vouched": "Avalizas esta pessoa",
"circle": "No teu círculo",
"member": "Membro de confiança da rede"
},
"wot": {
"title": "Rede de confiança",
"open": "Rede de confiança",
"help": "Como se decide quem é membro de confiança: as pessoas avalizam-se entre si, e a confiança estende-se a partir de um conjunto de raízes fundadoras.",
"roots": "Raízes de confiança",
"rootsHelp": "As identidades fundadoras que ancoram a rede. Adiciona quem confias (cola o seu código de identidade); a filiação mede-se para fora a partir delas.",
"noRoots": "Ainda não há raízes de confiança — não se pode calcular a filiação até semear a rede.",
"addRoot": "Adicionar uma raiz de confiança",
"rootHint": "Cola um código de identidade (npub…)",
"add": "Adicionar",
"rootAdded": "Raiz de confiança adicionada",
"rootInvalid": "Esse não é um código de identidade válido",
"remove": "Remover",
"params": "Parâmetros avançados",
"paramsHelp": "Regras Duniter. Afrouxa-as para uma rede jovem; aperta-as à medida que cresce.",
"sigQty": "Avais para ser membro",
"stepMax": "Distância máxima a uma raiz",
"validityDays": "Validade do aval (dias)",
"reset": "Repor para valores Duniter",
"saved": "Guardado"
},
"notifications": {
"newMessageFrom": "Nova mensagem de {name}"
},
"plantare": {
"title": "Plantares",
"help": "Um Plantare é o compromisso de reproduzir uma semente e devolver uma parte — assim uma variedade continua a viajar de mão em mão. Não é uma venda.",
"add": "Adicionar compromisso",
"empty": "Ainda não há compromissos. Quando partilhares ou receberes semente com o compromisso de a reproduzir e devolver algo, anota-o aqui.",
"iReturn": "Reproduzo e devolvo eu",
"owedToMe": "Devolvem-me a mim",
"direction": "Quem reproduz e devolve",
"counterparty": "Com quem?",
"counterpartyHint": "Uma pessoa ou um coletivo (opcional)",
"owed": "O que é devolvido?",
"owedHint": "p. ex. um punhado na próxima temporada (opcional)",
"note": "Nota (opcional)",
"save": "Guardar",
"markReturned": "Marcar devolvido",
"markForgiven": "Dar por saldado",
"reopen": "Reabrir",
"delete": "Remover",
"statusReturned": "Devolvido",
"statusForgiven": "Saldado",
"openSection": "Pendentes",
"settledSection": "Feitos",
"removeConfirm": "Remover este compromisso?"
},
"sale": {
"title": "Vendas",
"help": "Regista semente vendida ou comprada — dinheiro, Ğ1 ou qualquer moeda. Um modelo separado do presente e do Plantare. Nunca se cobra comissão pelas sementes.",
"add": "Registar venda",
"empty": "Ainda não há vendas. Anota aqui o que vendes ou compras.",
"iSold": "Vendi",
"iBought": "Comprei",
"direction": "Vendes ou compras?",
"counterparty": "Com quem?",
"counterpartyHint": "Uma pessoa ou um coletivo (opcional)",
"amount": "Montante",
"currency": "Moeda",
"currencyHint": "€, Ğ1, horas… (opcional)",
"hours": "horas",
"note": "Nota (opcional)",
"save": "Guardar",
"delete": "Remover",
"removeConfirm": "Remover esta venda?"
}
}