feat: cover seedlings (plantón) in copy + legal, backup cadence, server picker

Beta-tester feedback triage. The data model already had LotType.seedling as
first class; the gaps were copy and UX.

- Seedlings/plantones: broaden landing hero (EN/ES), in-app legal notice, and
  all legal texts (site + docs masters) from seeds-only to "seeds and
  seedlings", with a live-plant phytosanitary/transport caveat. Seeds stay the
  hero — targeted, not a blanket rename.
- Backups: settings line now states the 7-day cadence explicitly; cadence lives
  in AutoBackupService.backupInterval as the single source for text and schedule.
- Community servers: replace the manual wss:// text box with a checklist of the
  known servers (defaults visible/toggleable) plus an "add server" affordance
  with basic validation. No jargon in the UI.

i18n across en/es/pt/fr/de/ast (ja falls back). Tests updated + a new
server-picker widget test.
This commit is contained in:
vjrj 2026-07-15 15:57:23 +02:00
parent ab027a8779
commit 15385a26cf
36 changed files with 410 additions and 179 deletions

View file

@ -281,8 +281,8 @@ class _Translations$backup$pt extends Translations$backup$en {
// Translations
@override String get title => 'Cópia de segurança';
@override String get autoBackupTitle => 'Cópias automáticas';
@override String autoBackupLast({required Object date}) => 'Última cópia guardada em ${date}';
@override String get autoBackupNone => 'Uma cópia é guardada automaticamente em segundo plano';
@override String autoBackupLast({required Object date, required Object days}) => 'Última cópia em ${date} · a cada ${days} dias';
@override String autoBackupNone({required Object days}) => 'Uma cópia é guardada automaticamente a cada ${days} dias';
@override String get exportJson => 'Guardar uma cópia de segurança';
@override String get exportJsonSubtitle => 'Uma cópia completa para guardar em segurança, restaurar depois ou levar para outro aparelho';
@override String get importJson => 'Restaurar uma cópia';
@ -770,8 +770,10 @@ class _Translations$market$pt extends Translations$market$en {
@override String get areaCodeLabel => 'Código de zona';
@override String get areaCodeHint => 'Um código curto como sp3e9 — não um nome de lugar';
@override String get serversLabel => 'Servidores da comunidade';
@override String get serversHelp => 'Um endereço por linha (wss://…). Deixa assim se não souberes.';
@override String get serversHelp => 'Escolhe que servidores usar. Deixa assim se não souberes.';
@override String get serversAdvanced => 'Adicionar outro servidor';
@override String get serverAddress => 'Endereço do servidor';
@override String get serverInvalid => 'Introduz um endereço válido (wss://…)';
@override String get save => 'Guardar';
@override String get saved => 'Guardado';
@override String get wanted => 'Procuro';
@ -1008,8 +1010,8 @@ class _Translations$legal$pt extends Translations$legal$en {
@override String get privacyBody => 'O Tane funciona sem conta, e tudo o que registas fica no teu dispositivo, cifrado. Não há publicidade, nem rastreadores, nem servidor do Tane.\n\nNada é partilhado a não ser que tu queiras: quando publicas uma oferta ou o teu perfil, ou envias uma mensagem, viaja por servidores comunitários. As ofertas levam apenas uma zona aproximada — nunca a tua morada.\n\nO que publicas é público, e podem ficar cópias mesmo depois de o retirares — por isso partilha com cuidado.';
@override String get rulesTitle => 'As regras do jogo';
@override String get rulesBody => 'O Tane é uma ferramenta, não uma loja: as trocas são acordadas diretamente entre pessoas e ninguém fica com comissão. Isso também significa que és responsável pelo que ofereces e envias.\n\nNo mercado: sê honesto com as tuas sementes, oferece apenas o que podes partilhar, trata bem as pessoas e não faças spam. Podes bloquear qualquer pessoa e denunciar ofertas ou pessoas que quebrem as regras — as denúncias são tratadas nos servidores comunitários.';
@override String get seedsTitle => 'Sobre partilhar sementes';
@override String get seedsBody => 'Oferecer e trocar sementes entre amadores é amplamente reconhecido na maioria dos países. Vender pode ser diferente: em muitos lugares, vender sementes de variedades não registadas oficialmente é restrito — consulta as regras locais antes de pedir um preço.\n\nEnviar sementes para outro país também costuma ser restrito, e as variedades protegidas comercialmente não podem ser propagadas sem autorização. Na dúvida, melhor local e melhor oferta.';
@override String get seedsTitle => 'Sobre partilhar sementes e mudas';
@override String get seedsBody => 'Oferecer e trocar sementes entre amadores é amplamente reconhecido na maioria dos países. Vender pode ser diferente: em muitos lugares, vender sementes de variedades não registadas oficialmente é restrito — consulta as regras locais antes de pedir um preço.\n\nEnviar sementes para outro país também costuma ser restrito, e as variedades protegidas comercialmente não podem ser propagadas sem autorização. Na dúvida, melhor local e melhor oferta.\n\nO mesmo se aplica a mudas e plantas jovens, mas a planta viva pode ter regras de transporte e fitossanitárias mais rígidas do que a semente: movê-la entre regiões ou países pode exigir controlos adicionais.';
@override String get readFull => 'Ler os documentos completos na web';
}
@ -1495,8 +1497,8 @@ extension on TranslationsPt {
'settings.aboutOpen' => 'Acerca do Tane',
'backup.title' => 'Cópia de segurança',
'backup.autoBackupTitle' => 'Cópias automáticas',
'backup.autoBackupLast' => ({required Object date}) => 'Última cópia guardada em ${date}',
'backup.autoBackupNone' => 'Uma cópia é guardada automaticamente em segundo plano',
'backup.autoBackupLast' => ({required Object date, required Object days}) => 'Última cópia em ${date} · a cada ${days} dias',
'backup.autoBackupNone' => ({required Object days}) => 'Uma cópia é guardada automaticamente a cada ${days} dias',
'backup.exportJson' => 'Guardar uma cópia de segurança',
'backup.exportJsonSubtitle' => 'Uma cópia completa para guardar em segurança, restaurar depois ou levar para outro aparelho',
'backup.importJson' => 'Restaurar uma cópia',
@ -1799,8 +1801,10 @@ extension on TranslationsPt {
'market.areaCodeLabel' => 'Código de zona',
'market.areaCodeHint' => 'Um código curto como sp3e9 — não um nome de lugar',
'market.serversLabel' => 'Servidores da comunidade',
'market.serversHelp' => 'Um endereço por linha (wss://…). Deixa assim se não souberes.',
'market.serversHelp' => 'Escolhe que servidores usar. Deixa assim se não souberes.',
'market.serversAdvanced' => 'Adicionar outro servidor',
'market.serverAddress' => 'Endereço do servidor',
'market.serverInvalid' => 'Introduz um endereço válido (wss://…)',
'market.save' => 'Guardar',
'market.saved' => 'Guardado',
'market.wanted' => 'Procuro',
@ -1921,10 +1925,10 @@ extension on TranslationsPt {
'sale.empty' => 'Ainda não há vendas. Anota aqui o que vendes ou compras.',
'sale.iSold' => 'Vendi',
'sale.iBought' => 'Comprei',
'sale.direction' => 'Vendes ou compras?',
'sale.counterparty' => 'Com quem?',
_ => null,
} ?? switch (path) {
'sale.direction' => 'Vendes ou compras?',
'sale.counterparty' => 'Com quem?',
'sale.counterpartyHint' => 'Uma pessoa ou um coletivo (opcional)',
'sale.amount' => 'Montante',
'sale.currency' => 'Moeda',
@ -1940,8 +1944,8 @@ extension on TranslationsPt {
'legal.privacyBody' => 'O Tane funciona sem conta, e tudo o que registas fica no teu dispositivo, cifrado. Não há publicidade, nem rastreadores, nem servidor do Tane.\n\nNada é partilhado a não ser que tu queiras: quando publicas uma oferta ou o teu perfil, ou envias uma mensagem, viaja por servidores comunitários. As ofertas levam apenas uma zona aproximada — nunca a tua morada.\n\nO que publicas é público, e podem ficar cópias mesmo depois de o retirares — por isso partilha com cuidado.',
'legal.rulesTitle' => 'As regras do jogo',
'legal.rulesBody' => 'O Tane é uma ferramenta, não uma loja: as trocas são acordadas diretamente entre pessoas e ninguém fica com comissão. Isso também significa que és responsável pelo que ofereces e envias.\n\nNo mercado: sê honesto com as tuas sementes, oferece apenas o que podes partilhar, trata bem as pessoas e não faças spam. Podes bloquear qualquer pessoa e denunciar ofertas ou pessoas que quebrem as regras — as denúncias são tratadas nos servidores comunitários.',
'legal.seedsTitle' => 'Sobre partilhar sementes',
'legal.seedsBody' => 'Oferecer e trocar sementes entre amadores é amplamente reconhecido na maioria dos países. Vender pode ser diferente: em muitos lugares, vender sementes de variedades não registadas oficialmente é restrito — consulta as regras locais antes de pedir um preço.\n\nEnviar sementes para outro país também costuma ser restrito, e as variedades protegidas comercialmente não podem ser propagadas sem autorização. Na dúvida, melhor local e melhor oferta.',
'legal.seedsTitle' => 'Sobre partilhar sementes e mudas',
'legal.seedsBody' => 'Oferecer e trocar sementes entre amadores é amplamente reconhecido na maioria dos países. Vender pode ser diferente: em muitos lugares, vender sementes de variedades não registadas oficialmente é restrito — consulta as regras locais antes de pedir um preço.\n\nEnviar sementes para outro país também costuma ser restrito, e as variedades protegidas comercialmente não podem ser propagadas sem autorização. Na dúvida, melhor local e melhor oferta.\n\nO mesmo se aplica a mudas e plantas jovens, mas a planta viva pode ter regras de transporte e fitossanitárias mais rígidas do que a semente: movê-la entre regiões ou países pode exigir controlos adicionais.',
'legal.readFull' => 'Ler os documentos completos na web',
'marketGate.title' => 'Antes de entrares no mercado',
'marketGate.intro' => 'O mercado é um espaço partilhado entre vizinhas e vizinhos. Ao continuar, aceitas umas poucas regras simples:',