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

@ -280,8 +280,8 @@ class _Translations$backup$es extends Translations$backup$en {
// Translations
@override String get title => 'Copia de seguridad';
@override String get autoBackupTitle => 'Copias automáticas';
@override String autoBackupLast({required Object date}) => 'Última copia guardada el ${date}';
@override String get autoBackupNone => 'Se guarda una copia automáticamente en segundo plano';
@override String autoBackupLast({required Object date, required Object days}) => 'Última copia el ${date} · cada ${days} días';
@override String autoBackupNone({required Object days}) => 'Se guarda una copia automáticamente cada ${days} días';
@override String get exportJson => 'Guardar una copia de seguridad';
@override String get exportJsonSubtitle => 'Una copia completa para guardar a salvo, restaurar luego o pasar a otro dispositivo';
@override String get importJson => 'Restaurar una copia';
@ -773,8 +773,10 @@ class _Translations$market$es extends Translations$market$en {
@override String get areaCodeLabel => 'Código de zona';
@override String get areaCodeHint => 'Un código corto como sp3e9 — no un nombre de lugar';
@override String get serversLabel => 'Servidores de la comunidad';
@override String get serversHelp => 'Una dirección por línea (wss://…). Déjalo así si no sabes.';
@override String get serversHelp => 'Elige qué servidores usar. Déjalo así si no sabes.';
@override String get serversAdvanced => 'Añadir otro servidor';
@override String get serverAddress => 'Dirección del servidor';
@override String get serverInvalid => 'Introduce una dirección válida (wss://…)';
@override String get save => 'Guardar';
@override String get saved => 'Guardado';
@override String get wanted => 'Busco';
@ -1034,8 +1036,8 @@ class _Translations$legal$es extends Translations$legal$en {
@override String get privacyBody => 'Tane funciona sin cuenta, y todo lo que registras se queda en tu dispositivo, cifrado. No hay publicidad, ni rastreadores, ni servidor de Tane.\n\nNo se comparte nada salvo que tú quieras: cuando publicas una oferta o tu perfil, o envías un mensaje, viaja por servidores comunitarios. Las ofertas solo llevan una zona aproximada — nunca tu dirección.\n\nLo que publicas es público, y pueden quedar copias incluso después de retirarlo — así que comparte con cuidado.';
@override String get rulesTitle => 'Las reglas del juego';
@override String get rulesBody => 'Tane es una herramienta, no una tienda: los intercambios se acuerdan directamente entre personas y nadie se lleva comisión. Eso también significa que tú respondes de lo que ofreces y envías.\n\nEn el mercado: sé honesto con tus semillas, ofrece solo lo que puedas compartir, trata bien a la gente y no hagas spam. Puedes bloquear a cualquiera y denunciar ofertas o personas que incumplan las normas — las denuncias se atienden en los servidores comunitarios.';
@override String get seedsTitle => 'Sobre compartir semillas';
@override String get seedsBody => 'Regalar e intercambiar semillas entre aficionados está ampliamente reconocido en la mayoría de países. Vender puede ser distinto: en muchos sitios, vender semilla de variedades no registradas oficialmente está restringido — consulta tu normativa antes de pedir un precio.\n\nEnviar semillas a otro país también suele estar restringido, y las variedades protegidas comercialmente no pueden propagarse sin permiso. Ante la duda, mejor local y mejor regalo.';
@override String get seedsTitle => 'Sobre compartir semillas y plantones';
@override String get seedsBody => 'Regalar e intercambiar semillas entre aficionados está ampliamente reconocido en la mayoría de países. Vender puede ser distinto: en muchos sitios, vender semilla de variedades no registradas oficialmente está restringido — consulta tu normativa antes de pedir un precio.\n\nEnviar semillas a otro país también suele estar restringido, y las variedades protegidas comercialmente no pueden propagarse sin permiso. Ante la duda, mejor local y mejor regalo.\n\nLo mismo vale para plantones y plantas jóvenes, pero la planta viva puede tener reglas de transporte y fitosanitarias más estrictas que la semilla: moverla entre regiones o países puede requerir controles adicionales.';
@override String get readFull => 'Leer los documentos completos en la web';
}
@ -1520,8 +1522,8 @@ extension on TranslationsEs {
'settings.aboutOpen' => 'Acerca de Tane',
'backup.title' => 'Copia de seguridad',
'backup.autoBackupTitle' => 'Copias automáticas',
'backup.autoBackupLast' => ({required Object date}) => 'Última copia guardada el ${date}',
'backup.autoBackupNone' => 'Se guarda una copia automáticamente en segundo plano',
'backup.autoBackupLast' => ({required Object date, required Object days}) => 'Última copia el ${date} · cada ${days} días',
'backup.autoBackupNone' => ({required Object days}) => 'Se guarda una copia automáticamente cada ${days} días',
'backup.exportJson' => 'Guardar una copia de seguridad',
'backup.exportJsonSubtitle' => 'Una copia completa para guardar a salvo, restaurar luego o pasar a otro dispositivo',
'backup.importJson' => 'Restaurar una copia',
@ -1828,8 +1830,10 @@ extension on TranslationsEs {
'market.areaCodeLabel' => 'Código de zona',
'market.areaCodeHint' => 'Un código corto como sp3e9 — no un nombre de lugar',
'market.serversLabel' => 'Servidores de la comunidad',
'market.serversHelp' => 'Una dirección por línea (wss://…). Déjalo así si no sabes.',
'market.serversHelp' => 'Elige qué servidores usar. Déjalo así si no sabes.',
'market.serversAdvanced' => 'Añadir otro servidor',
'market.serverAddress' => 'Dirección del servidor',
'market.serverInvalid' => 'Introduce una dirección válida (wss://…)',
'market.save' => 'Guardar',
'market.saved' => 'Guardado',
'market.wanted' => 'Busco',
@ -1947,10 +1951,10 @@ extension on TranslationsEs {
'plantare.workHoursLabel' => '¿Cuántas horas?',
'plantare.proposalsSection' => 'Esperando tu respuesta',
'plantare.incomingFrom' => ({required Object name}) => '${name} te propone un Plantaré',
'plantare.accept' => 'Aceptar y firmar',
'plantare.declineAction' => 'Rechazar',
_ => null,
} ?? switch (path) {
'plantare.accept' => 'Aceptar y firmar',
'plantare.declineAction' => 'Rechazar',
'plantare.declineReasonHint' => 'Motivo (opcional)',
'plantare.acceptedToast' => 'Firmado — ahora lo guardáis los dos',
'plantare.declinedToast' => 'Rechazado',
@ -1992,8 +1996,8 @@ extension on TranslationsEs {
'legal.privacyBody' => 'Tane funciona sin cuenta, y todo lo que registras se queda en tu dispositivo, cifrado. No hay publicidad, ni rastreadores, ni servidor de Tane.\n\nNo se comparte nada salvo que tú quieras: cuando publicas una oferta o tu perfil, o envías un mensaje, viaja por servidores comunitarios. Las ofertas solo llevan una zona aproximada — nunca tu dirección.\n\nLo que publicas es público, y pueden quedar copias incluso después de retirarlo — así que comparte con cuidado.',
'legal.rulesTitle' => 'Las reglas del juego',
'legal.rulesBody' => 'Tane es una herramienta, no una tienda: los intercambios se acuerdan directamente entre personas y nadie se lleva comisión. Eso también significa que tú respondes de lo que ofreces y envías.\n\nEn el mercado: sé honesto con tus semillas, ofrece solo lo que puedas compartir, trata bien a la gente y no hagas spam. Puedes bloquear a cualquiera y denunciar ofertas o personas que incumplan las normas — las denuncias se atienden en los servidores comunitarios.',
'legal.seedsTitle' => 'Sobre compartir semillas',
'legal.seedsBody' => 'Regalar e intercambiar semillas entre aficionados está ampliamente reconocido en la mayoría de países. Vender puede ser distinto: en muchos sitios, vender semilla de variedades no registradas oficialmente está restringido — consulta tu normativa antes de pedir un precio.\n\nEnviar semillas a otro país también suele estar restringido, y las variedades protegidas comercialmente no pueden propagarse sin permiso. Ante la duda, mejor local y mejor regalo.',
'legal.seedsTitle' => 'Sobre compartir semillas y plantones',
'legal.seedsBody' => 'Regalar e intercambiar semillas entre aficionados está ampliamente reconocido en la mayoría de países. Vender puede ser distinto: en muchos sitios, vender semilla de variedades no registradas oficialmente está restringido — consulta tu normativa antes de pedir un precio.\n\nEnviar semillas a otro país también suele estar restringido, y las variedades protegidas comercialmente no pueden propagarse sin permiso. Ante la duda, mejor local y mejor regalo.\n\nLo mismo vale para plantones y plantas jóvenes, pero la planta viva puede tener reglas de transporte y fitosanitarias más estrictas que la semilla: moverla entre regiones o países puede requerir controles adicionales.',
'legal.readFull' => 'Leer los documentos completos en la web',
'marketGate.title' => 'Antes de entrar al mercado',
'marketGate.intro' => 'El mercado es un espacio compartido entre vecinas y vecinos. Al continuar, aceptas unas pocas normas sencillas:',