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

@ -105,8 +105,8 @@
"backup": {
"title": "Copia de seguranza",
"autoBackupTitle": "Copies automátiques",
"autoBackupLast": "Cabera copia guardada'l {date}",
"autoBackupNone": "Guárdase una copia automáticamente en segundu planu",
"autoBackupLast": "Cabera copia'l {date} · cada {days} díes",
"autoBackupNone": "Guárdase una copia automáticamente cada {days} díes",
"exportJson": "Guardar una copia de seguranza",
"exportJsonSubtitle": "Una copia completa pa guardar a salvo, restaurar dempués o pasar a otru preséu",
"importJson": "Restaurar una copia",
@ -521,8 +521,10 @@
"areaCodeLabel": "Códigu de zona",
"areaCodeHint": "Un códigu curtiu como sp3e9 — non un nome de llugar",
"serversLabel": "Servidores de la comunidá",
"serversHelp": "Una direición per llinia (wss://…). Déxalo asina si nun sabes.",
"serversHelp": "Escueyi qué servidores usar. Déxalo asina si nun sabes.",
"serversAdvanced": "Amestar otru servidor",
"serverAddress": "Direición del servidor",
"serverInvalid": "Introduz una direición válida (wss://…)",
"save": "Guardar",
"saved": "Guardáu",
"wanted": "Gueto",
@ -682,8 +684,8 @@
"privacyBody": "Tane funciona ensin cuenta, y tolo que rexistres queda nel to preséu, cifrao. Nun hai publicidá, nin rastreadores, nin sirvidor de Tane.\n\nNun se comparte nada sacantes que tu quieras: cuando espublices una ofierta o'l to perfil, o unvíes un mensaxe, viaxa per sirvidores comuñales. Les ofiertes namái lleven una zona averada — enxamás la to direición.\n\nLo qu'espubliques ye público, y puen quedar copies mesmo dempués de retiralo — asina que comparte con procuru.",
"rulesTitle": "Les regles del xuegu",
"rulesBody": "Tane ye una ferramienta, non una tienda: los intercambeos alcuérdense direutamente ente persones y naide lleva comisión. Eso tamién quier dicir que tu respuendes de lo qu'ufiertes y unvíes.\n\nNel mercáu: sé honestu cola to simiente, ufierta namái lo que puedas compartir, trata bien a la xente y nun faigas spam. Puedes bloquiar a cualquiera y denunciar ofiertes o persones qu'incumplan les normes — les denuncies atiéndense nos sirvidores comuñales.",
"seedsTitle": "Tocante a compartir simiente",
"seedsBody": "Regalar ya intercambiar simiente ente aficionaos ta reconocío ampliamente na mayoría de países. Vender pue ser distinto: en munchos sitios, vender simiente de variedaes non rexistraes oficialmente ta restrinxío — consulta la to normativa enantes de pidir un preciu.\n\nUnviar simiente a otru país tamién suel tar restrinxío, y les variedaes protexíes comercialmente nun puen propagase ensin permisu. Ante la dulda, meyor local y meyor regalu.",
"seedsTitle": "Tocante a compartir simiente y plantones",
"seedsBody": "Regalar ya intercambiar simiente ente aficionaos ta reconocío ampliamente na mayoría de países. Vender pue ser distinto: en munchos sitios, vender simiente de variedaes non rexistraes oficialmente ta restrinxío — consulta la to normativa enantes de pidir un preciu.\n\nUnviar simiente a otru país tamién suel tar restrinxío, y les variedaes protexíes comercialmente nun puen propagase ensin permisu. Ante la dulda, meyor local y meyor regalu.\n\nLo mesmo val pa plantones y plantes moces, pero la planta viva pue tener regles de tresporte y fitosanitaries más estrictes que la simiente: movela ente rexones o países pue requerir controles adicionales.",
"readFull": "Lleer los documentos completos na web"
},
"marketGate": {

View file

@ -106,8 +106,8 @@
"backup": {
"title": "Sicherung und Wiederherstellung",
"autoBackupTitle": "Automatische Sicherungen",
"autoBackupLast": "Letzte Sicherung {date}",
"autoBackupNone": "Eine Kopie wird automatisch im Hintergrund gespeichert",
"autoBackupLast": "Letzte Sicherung {date} · alle {days} Tage",
"autoBackupNone": "Eine Kopie wird automatisch alle {days} Tage gespeichert",
"exportJson": "Sicherung speichern",
"exportJsonSubtitle": "Eine komplette Kopie zum sicheren Aufbewahren, später wiederherstellen oder auf ein anderes Gerät übertragen",
"importJson": "Sicherung wiederherstellen",
@ -524,8 +524,10 @@
"areaCodeLabel": "Gebiets-Code",
"areaCodeHint": "Ein kurzer Code wie sp3e9 - kein Ortsname",
"serversLabel": "Gemeinschaftsserver",
"serversHelp": "Eine Adresse pro Zeile (wss://…). Lass die Standardwerte, wenn du dir nicht sicher bist.",
"serversHelp": "Wähle, welche Server verwendet werden. Lass die Standardwerte, wenn du dir nicht sicher bist.",
"serversAdvanced": "Füge einen weiteren Server hinzu",
"serverAddress": "Serveradresse",
"serverInvalid": "Gib eine gültige Adresse ein (wss://…)",
"save": "Speichern",
"saved": "Gespeichert",
"wanted": "Gesucht",
@ -678,8 +680,8 @@
"privacyBody": "Tane funktioniert ohne Konto, und alles, das du notierst, bleibt auf deinem Gerät, verschlüsselt. Es gibt keine Werbung, keine Tracker und keinen Tane-Server.\n\nNichts wird geteilt, es sei denn, du wählst es: Wenn du ein Angebot oder dein Profil veröffentlichst oder eine Nachricht sendest, reist es durch Gemeinschaftsserver. Angebote tragen nur eine ungefähre Zone - nie deine Adresse.\n\nWas du veröffentlichst, ist öffentlich, und Kopien können bleiben, selbst nachdem du es entfernt hast - teile also mit Bedacht.",
"rulesTitle": "Die Spielregeln",
"rulesBody": "Tane ist ein Werkzeug, kein Laden: Austausch wird direkt zwischen Menschen vereinbart, und niemand nimmt eine Provision. Das bedeutet auch, dass du verantwortlich bist für das, das du anbietest und sendest.\n\nAuf dem Markt: Sei ehrlich mit deinen Samen, biete nur an, was du teilen darfst, behandle Menschen gut und spamme nicht. Du kannst jeden blockieren und Angebote oder Menschen melden, die die Regeln brechen - Meldungen werden auf den Gemeinschaftsservern bearbeitet.",
"seedsTitle": "Über das Teilen von Samen",
"seedsBody": "Das Verschenken und Tauschen von Samen zwischen Hobbyisten ist in den meisten Ländern weit verbreitet. Verkaufen kann anders sein: An vielen Orten ist der Verkauf von Samen nicht offiziell registrierter Sorten eingeschränkt - überprüfe deine örtlichen Vorschriften, bevor du einen Preis fragst.\n\nSamen in ein anderes Land zu schicken ist auch oft eingeschränkt, und kommerziell geschützte Sorten dürfen nicht ohne Genehmigung vermehrt werden. Im Zweifelsfall lieber lokal und lieber Geschenk.",
"seedsTitle": "Über das Teilen von Samen und Setzlingen",
"seedsBody": "Das Verschenken und Tauschen von Samen zwischen Hobbyisten ist in den meisten Ländern weit verbreitet. Verkaufen kann anders sein: An vielen Orten ist der Verkauf von Samen nicht offiziell registrierter Sorten eingeschränkt - überprüfe deine örtlichen Vorschriften, bevor du einen Preis fragst.\n\nSamen in ein anderes Land zu schicken ist auch oft eingeschränkt, und kommerziell geschützte Sorten dürfen nicht ohne Genehmigung vermehrt werden. Im Zweifelsfall lieber lokal und lieber Geschenk.\n\nDasselbe gilt für Setzlinge und Jungpflanzen, aber lebende Pflanzen können strengeren Transport- und Pflanzenschutzregeln unterliegen als Samen — sie über Regionen oder Grenzen zu bewegen kann zusätzliche Kontrollen erfordern.",
"readFull": "Lese die vollständigen Dokumente online"
},
"marketGate": {

View file

@ -106,8 +106,8 @@
"backup": {
"title": "Backup & restore",
"autoBackupTitle": "Automatic backups",
"autoBackupLast": "Last copy saved {date}",
"autoBackupNone": "A copy is kept automatically in the background",
"autoBackupLast": "Last copy saved {date} · every {days} days",
"autoBackupNone": "A copy is kept automatically every {days} days",
"exportJson": "Save a backup",
"exportJsonSubtitle": "A complete copy to keep safe, restore later or move to another device",
"importJson": "Restore a backup",
@ -524,8 +524,10 @@
"areaCodeLabel": "Area code",
"areaCodeHint": "A short code like sp3e9 — not a place name",
"serversLabel": "Community servers",
"serversHelp": "One address per line (wss://…). Leave the defaults if unsure.",
"serversHelp": "Choose which servers to use. Leave the defaults if unsure.",
"serversAdvanced": "Add another server",
"serverAddress": "Server address",
"serverInvalid": "Enter a valid address (wss://…)",
"save": "Save",
"saved": "Saved",
"wanted": "Wanted",
@ -708,8 +710,8 @@
"privacyBody": "Tane works without an account, and everything you record stays on your device, encrypted. There are no ads, no trackers, and no Tane server.\n\nNothing is shared unless you choose to: when you publish an offer or your profile, or send a message, it travels through community-run servers. Offers only ever carry a rough zone — never your address.\n\nWhat you publish is public, and copies may remain even after you remove it — so share with care.",
"rulesTitle": "Rules of the road",
"rulesBody": "Tane is a tool, not a shop: exchanges are agreed directly between people, and nobody takes a cut. That also means you are responsible for what you offer and send.\n\nIn the market: be honest about your seeds, only offer what you may share, treat people well, and don't spam. You can block anyone, and report offers or people that break the rules — reports are acted on in the community servers.",
"seedsTitle": "About sharing seeds",
"seedsBody": "Gifting and swapping seeds between amateurs is broadly recognized in most countries. Selling can be different: in many places, selling seed of varieties that aren't officially registered is restricted — check your local rules before asking a price.\n\nSending seeds to another country is often restricted too, and commercially protected varieties must not be propagated without permission. When in doubt, keep it local and keep it a gift.",
"seedsTitle": "About sharing seeds and seedlings",
"seedsBody": "Gifting and swapping seeds between amateurs is broadly recognized in most countries. Selling can be different: in many places, selling seed of varieties that aren't officially registered is restricted — check your local rules before asking a price.\n\nSending seeds to another country is often restricted too, and commercially protected varieties must not be propagated without permission. When in doubt, keep it local and keep it a gift.\n\nThe same spirit applies to seedlings and young plants, but live plants can carry stricter transport and plant-health rules than seeds — moving them across regions or borders may need extra checks.",
"readFull": "Read the full documents online"
},
"marketGate": {

View file

@ -105,8 +105,8 @@
"backup": {
"title": "Copia de seguridad",
"autoBackupTitle": "Copias automáticas",
"autoBackupLast": "Última copia guardada el {date}",
"autoBackupNone": "Se guarda una copia automáticamente en segundo plano",
"autoBackupLast": "Última copia el {date} · cada {days} días",
"autoBackupNone": "Se guarda una copia automáticamente cada {days} días",
"exportJson": "Guardar una copia de seguridad",
"exportJsonSubtitle": "Una copia completa para guardar a salvo, restaurar luego o pasar a otro dispositivo",
"importJson": "Restaurar una copia",
@ -523,8 +523,10 @@
"areaCodeLabel": "Código de zona",
"areaCodeHint": "Un código corto como sp3e9 — no un nombre de lugar",
"serversLabel": "Servidores de la comunidad",
"serversHelp": "Una dirección por línea (wss://…). Déjalo así si no sabes.",
"serversHelp": "Elige qué servidores usar. Déjalo así si no sabes.",
"serversAdvanced": "Añadir otro servidor",
"serverAddress": "Dirección del servidor",
"serverInvalid": "Introduce una dirección válida (wss://…)",
"save": "Guardar",
"saved": "Guardado",
"wanted": "Busco",
@ -707,8 +709,8 @@
"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.",
"rulesTitle": "Las reglas del juego",
"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.",
"seedsTitle": "Sobre compartir semillas",
"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.",
"seedsTitle": "Sobre compartir semillas y plantones",
"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.",
"readFull": "Leer los documentos completos en la web"
},
"marketGate": {

View file

@ -106,8 +106,8 @@
"backup": {
"title": "Sauvegarde & restauration",
"autoBackupTitle": "Sauvegardes automatiques",
"autoBackupLast": "Dernière copie sauvegardée {date}",
"autoBackupNone": "Une copie est conservée automatiquement en arrière-plan",
"autoBackupLast": "Dernière copie {date} · tous les {days} jours",
"autoBackupNone": "Une copie est conservée automatiquement tous les {days} jours",
"exportJson": "Enregistrer une sauvegarde",
"exportJsonSubtitle": "Une copie complète à conserver précieusement, restaurer plus tard ou transférer sur un autre appareil",
"importJson": "Restaurer une sauvegarde",
@ -524,8 +524,10 @@
"areaCodeLabel": "Code de zone",
"areaCodeHint": "Un code court comme sp3e9 — pas un nom de lieu",
"serversLabel": "Serveurs communautaires",
"serversHelp": "Une adresse par ligne (wss://…). Laissez les valeurs par défaut si vous n'êtes pas sûr.",
"serversHelp": "Choisissez les serveurs à utiliser. Laissez les valeurs par défaut si vous n'êtes pas sûr.",
"serversAdvanced": "Ajouter un autre serveur",
"serverAddress": "Adresse du serveur",
"serverInvalid": "Entrez une adresse valide (wss://…)",
"save": "Enregistrer",
"saved": "Enregistré",
"wanted": "Recherché",
@ -678,8 +680,8 @@
"privacyBody": "Tane fonctionne sans compte, et tout ce que vous enregistrez reste sur votre appareil, chiffré. Il n'y a pas de publicités, pas de trackers, et pas de serveur Tane.\n\nRien n'est partagé sauf si vous le choisissez : quand vous publiez une offre ou votre profil, ou envoyez un message, cela passe par des serveurs gérés par la communauté. Les offres ne portent qu'une zone approximative — jamais votre adresse.\n\nCe que vous publiez est public, et des copies peuvent rester même après l'avoir retiré — alors partagez avec prudence.",
"rulesTitle": "Les règles du jeu",
"rulesBody": "Tane est un outil, pas un magasin : les échanges sont convenus directement entre les gens, et personne ne prend de commission. Cela signifie aussi que vous êtes responsable de ce que vous offrez et envoyez.\n\nSur le marché : soyez honnête avec vos graines, n'offrez que ce que vous pouvez partager, traitez les gens bien et ne faites pas de spam. Vous pouvez bloquer n'importe qui et signaler les offres ou les gens qui enfreignent les règles — les signalements sont traités sur les serveurs communautaires.",
"seedsTitle": "À propos du partage de semences",
"seedsBody": "Donner et échanger des graines entre amateurs est largement reconnu dans la plupart des pays. La vente peut être différente : dans de nombreux endroits, vendre des graines de variétés non officiellement enregistrées est restreint — vérifiez votre législation locale avant de demander un prix.\n\nEnvoyer des graines dans un autre pays est souvent restreint aussi, et les variétés protégées commercialement ne peuvent pas être reproduites sans permission. En cas de doute, gardez-le local et faites-en un cadeau.",
"seedsTitle": "À propos du partage de semences et de plants",
"seedsBody": "Donner et échanger des graines entre amateurs est largement reconnu dans la plupart des pays. La vente peut être différente : dans de nombreux endroits, vendre des graines de variétés non officiellement enregistrées est restreint — vérifiez votre législation locale avant de demander un prix.\n\nEnvoyer des graines dans un autre pays est souvent restreint aussi, et les variétés protégées commercialement ne peuvent pas être reproduites sans permission. En cas de doute, gardez-le local et faites-en un cadeau.\n\nCela vaut aussi pour les plants et jeunes plantes, mais une plante vivante peut être soumise à des règles de transport et phytosanitaires plus strictes que les graines : la déplacer entre régions ou pays peut nécessiter des contrôles supplémentaires.",
"readFull": "Lire les documents complets en ligne"
},
"marketGate": {

View file

@ -106,8 +106,8 @@
"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",
"autoBackupLast": "Última cópia em {date} · a cada {days} dias",
"autoBackupNone": "Uma cópia é guardada automaticamente a cada {days} dias",
"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",
@ -520,8 +520,10 @@
"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.",
"serversHelp": "Escolhe que servidores usar. Deixa assim se não souberes.",
"serversAdvanced": "Adicionar outro servidor",
"serverAddress": "Endereço do servidor",
"serverInvalid": "Introduz um endereço válido (wss://…)",
"save": "Guardar",
"saved": "Guardado",
"wanted": "Procuro",
@ -681,8 +683,8 @@
"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.",
"rulesTitle": "As regras do jogo",
"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.",
"seedsTitle": "Sobre partilhar sementes",
"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.",
"seedsTitle": "Sobre partilhar sementes e mudas",
"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.",
"readFull": "Ler os documentos completos na web"
},
"marketGate": {

View file

@ -4,9 +4,9 @@
/// To regenerate, run: `dart run slang`
///
/// Locales: 7
/// Strings: 3442 (491 per locale)
/// Strings: 3454 (493 per locale)
///
/// Built on 2026-07-14 at 09:22 UTC
/// Built on 2026-07-15 at 13:17 UTC
// coverage:ignore-file
// ignore_for_file: type=lint, unused_import

View file

@ -280,8 +280,8 @@ class _Translations$backup$ast extends Translations$backup$en {
// Translations
@override String get title => 'Copia de seguranza';
@override String get autoBackupTitle => 'Copies automátiques';
@override String autoBackupLast({required Object date}) => 'Cabera copia guardada\'l ${date}';
@override String get autoBackupNone => 'Guárdase una copia automáticamente en segundu planu';
@override String autoBackupLast({required Object date, required Object days}) => 'Cabera copia\'l ${date} · cada ${days} díes';
@override String autoBackupNone({required Object days}) => 'Guárdase una copia automáticamente cada ${days} díes';
@override String get exportJson => 'Guardar una copia de seguranza';
@override String get exportJsonSubtitle => 'Una copia completa pa guardar a salvo, restaurar dempués o pasar a otru preséu';
@override String get importJson => 'Restaurar una copia';
@ -771,8 +771,10 @@ class _Translations$market$ast extends Translations$market$en {
@override String get areaCodeLabel => 'Códigu de zona';
@override String get areaCodeHint => 'Un códigu curtiu como sp3e9 — non un nome de llugar';
@override String get serversLabel => 'Servidores de la comunidá';
@override String get serversHelp => 'Una direición per llinia (wss://…). Déxalo asina si nun sabes.';
@override String get serversHelp => 'Escueyi qué servidores usar. Déxalo asina si nun sabes.';
@override String get serversAdvanced => 'Amestar otru servidor';
@override String get serverAddress => 'Direición del servidor';
@override String get serverInvalid => 'Introduz una direición válida (wss://…)';
@override String get save => 'Guardar';
@override String get saved => 'Guardáu';
@override String get wanted => 'Gueto';
@ -1009,8 +1011,8 @@ class _Translations$legal$ast extends Translations$legal$en {
@override String get privacyBody => 'Tane funciona ensin cuenta, y tolo que rexistres queda nel to preséu, cifrao. Nun hai publicidá, nin rastreadores, nin sirvidor de Tane.\n\nNun se comparte nada sacantes que tu quieras: cuando espublices una ofierta o\'l to perfil, o unvíes un mensaxe, viaxa per sirvidores comuñales. Les ofiertes namái lleven una zona averada — enxamás la to direición.\n\nLo qu\'espubliques ye público, y puen quedar copies mesmo dempués de retiralo — asina que comparte con procuru.';
@override String get rulesTitle => 'Les regles del xuegu';
@override String get rulesBody => 'Tane ye una ferramienta, non una tienda: los intercambeos alcuérdense direutamente ente persones y naide lleva comisión. Eso tamién quier dicir que tu respuendes de lo qu\'ufiertes y unvíes.\n\nNel mercáu: sé honestu cola to simiente, ufierta namái lo que puedas compartir, trata bien a la xente y nun faigas spam. Puedes bloquiar a cualquiera y denunciar ofiertes o persones qu\'incumplan les normes — les denuncies atiéndense nos sirvidores comuñales.';
@override String get seedsTitle => 'Tocante a compartir simiente';
@override String get seedsBody => 'Regalar ya intercambiar simiente ente aficionaos ta reconocío ampliamente na mayoría de países. Vender pue ser distinto: en munchos sitios, vender simiente de variedaes non rexistraes oficialmente ta restrinxío — consulta la to normativa enantes de pidir un preciu.\n\nUnviar simiente a otru país tamién suel tar restrinxío, y les variedaes protexíes comercialmente nun puen propagase ensin permisu. Ante la dulda, meyor local y meyor regalu.';
@override String get seedsTitle => 'Tocante a compartir simiente y plantones';
@override String get seedsBody => 'Regalar ya intercambiar simiente ente aficionaos ta reconocío ampliamente na mayoría de países. Vender pue ser distinto: en munchos sitios, vender simiente de variedaes non rexistraes oficialmente ta restrinxío — consulta la to normativa enantes de pidir un preciu.\n\nUnviar simiente a otru país tamién suel tar restrinxío, y les variedaes protexíes comercialmente nun puen propagase ensin permisu. Ante la dulda, meyor local y meyor regalu.\n\nLo mesmo val pa plantones y plantes moces, pero la planta viva pue tener regles de tresporte y fitosanitaries más estrictes que la simiente: movela ente rexones o países pue requerir controles adicionales.';
@override String get readFull => 'Lleer los documentos completos na web';
}
@ -1495,8 +1497,8 @@ extension on TranslationsAst {
'settings.aboutOpen' => 'Tocante a Tane',
'backup.title' => 'Copia de seguranza',
'backup.autoBackupTitle' => 'Copies automátiques',
'backup.autoBackupLast' => ({required Object date}) => 'Cabera copia guardada\'l ${date}',
'backup.autoBackupNone' => 'Guárdase una copia automáticamente en segundu planu',
'backup.autoBackupLast' => ({required Object date, required Object days}) => 'Cabera copia\'l ${date} · cada ${days} díes',
'backup.autoBackupNone' => ({required Object days}) => 'Guárdase una copia automáticamente cada ${days} díes',
'backup.exportJson' => 'Guardar una copia de seguranza',
'backup.exportJsonSubtitle' => 'Una copia completa pa guardar a salvo, restaurar dempués o pasar a otru preséu',
'backup.importJson' => 'Restaurar una copia',
@ -1801,8 +1803,10 @@ extension on TranslationsAst {
'market.areaCodeLabel' => 'Códigu de zona',
'market.areaCodeHint' => 'Un códigu curtiu como sp3e9 — non un nome de llugar',
'market.serversLabel' => 'Servidores de la comunidá',
'market.serversHelp' => 'Una direición per llinia (wss://…). Déxalo asina si nun sabes.',
'market.serversHelp' => 'Escueyi qué servidores usar. Déxalo asina si nun sabes.',
'market.serversAdvanced' => 'Amestar otru servidor',
'market.serverAddress' => 'Direición del servidor',
'market.serverInvalid' => 'Introduz una direición válida (wss://…)',
'market.save' => 'Guardar',
'market.saved' => 'Guardáu',
'market.wanted' => 'Gueto',
@ -1922,10 +1926,10 @@ extension on TranslationsAst {
'sale.add' => 'Rexistrar venta',
'sale.empty' => 'Entá nun hai ventes. Anota equí lo que vendes o merques.',
'sale.iSold' => 'Vendí',
'sale.iBought' => 'Mercué',
'sale.direction' => '¿Vendes o merques?',
_ => null,
} ?? switch (path) {
'sale.iBought' => 'Mercué',
'sale.direction' => '¿Vendes o merques?',
'sale.counterparty' => '¿Con quién?',
'sale.counterpartyHint' => 'Una persona o un coleutivu (opcional)',
'sale.amount' => 'Importe',
@ -1942,8 +1946,8 @@ extension on TranslationsAst {
'legal.privacyBody' => 'Tane funciona ensin cuenta, y tolo que rexistres queda nel to preséu, cifrao. Nun hai publicidá, nin rastreadores, nin sirvidor de Tane.\n\nNun se comparte nada sacantes que tu quieras: cuando espublices una ofierta o\'l to perfil, o unvíes un mensaxe, viaxa per sirvidores comuñales. Les ofiertes namái lleven una zona averada — enxamás la to direición.\n\nLo qu\'espubliques ye público, y puen quedar copies mesmo dempués de retiralo — asina que comparte con procuru.',
'legal.rulesTitle' => 'Les regles del xuegu',
'legal.rulesBody' => 'Tane ye una ferramienta, non una tienda: los intercambeos alcuérdense direutamente ente persones y naide lleva comisión. Eso tamién quier dicir que tu respuendes de lo qu\'ufiertes y unvíes.\n\nNel mercáu: sé honestu cola to simiente, ufierta namái lo que puedas compartir, trata bien a la xente y nun faigas spam. Puedes bloquiar a cualquiera y denunciar ofiertes o persones qu\'incumplan les normes — les denuncies atiéndense nos sirvidores comuñales.',
'legal.seedsTitle' => 'Tocante a compartir simiente',
'legal.seedsBody' => 'Regalar ya intercambiar simiente ente aficionaos ta reconocío ampliamente na mayoría de países. Vender pue ser distinto: en munchos sitios, vender simiente de variedaes non rexistraes oficialmente ta restrinxío — consulta la to normativa enantes de pidir un preciu.\n\nUnviar simiente a otru país tamién suel tar restrinxío, y les variedaes protexíes comercialmente nun puen propagase ensin permisu. Ante la dulda, meyor local y meyor regalu.',
'legal.seedsTitle' => 'Tocante a compartir simiente y plantones',
'legal.seedsBody' => 'Regalar ya intercambiar simiente ente aficionaos ta reconocío ampliamente na mayoría de países. Vender pue ser distinto: en munchos sitios, vender simiente de variedaes non rexistraes oficialmente ta restrinxío — consulta la to normativa enantes de pidir un preciu.\n\nUnviar simiente a otru país tamién suel tar restrinxío, y les variedaes protexíes comercialmente nun puen propagase ensin permisu. Ante la dulda, meyor local y meyor regalu.\n\nLo mesmo val pa plantones y plantes moces, pero la planta viva pue tener regles de tresporte y fitosanitaries más estrictes que la simiente: movela ente rexones o países pue requerir controles adicionales.',
'legal.readFull' => 'Lleer los documentos completos na web',
'marketGate.title' => 'Enantes d\'entrar al mercáu',
'marketGate.intro' => 'El mercáu ye un espaciu compartíu ente vecines y vecinos. Al siguir, aceptes unes poques normes cencielles:',

View file

@ -281,8 +281,8 @@ class _Translations$backup$de extends Translations$backup$en {
// Translations
@override String get title => 'Sicherung und Wiederherstellung';
@override String get autoBackupTitle => 'Automatische Sicherungen';
@override String autoBackupLast({required Object date}) => 'Letzte Sicherung ${date}';
@override String get autoBackupNone => 'Eine Kopie wird automatisch im Hintergrund gespeichert';
@override String autoBackupLast({required Object date, required Object days}) => 'Letzte Sicherung ${date} · alle ${days} Tage';
@override String autoBackupNone({required Object days}) => 'Eine Kopie wird automatisch alle ${days} Tage gespeichert';
@override String get exportJson => 'Sicherung speichern';
@override String get exportJsonSubtitle => 'Eine komplette Kopie zum sicheren Aufbewahren, später wiederherstellen oder auf ein anderes Gerät übertragen';
@override String get importJson => 'Sicherung wiederherstellen';
@ -774,8 +774,10 @@ class _Translations$market$de extends Translations$market$en {
@override String get areaCodeLabel => 'Gebiets-Code';
@override String get areaCodeHint => 'Ein kurzer Code wie sp3e9 - kein Ortsname';
@override String get serversLabel => 'Gemeinschaftsserver';
@override String get serversHelp => 'Eine Adresse pro Zeile (wss://…). Lass die Standardwerte, wenn du dir nicht sicher bist.';
@override String get serversHelp => 'Wähle, welche Server verwendet werden. Lass die Standardwerte, wenn du dir nicht sicher bist.';
@override String get serversAdvanced => 'Füge einen weiteren Server hinzu';
@override String get serverAddress => 'Serveradresse';
@override String get serverInvalid => 'Gib eine gültige Adresse ein (wss://…)';
@override String get save => 'Speichern';
@override String get saved => 'Gespeichert';
@override String get wanted => 'Gesucht';
@ -1005,8 +1007,8 @@ class _Translations$legal$de extends Translations$legal$en {
@override String get privacyBody => 'Tane funktioniert ohne Konto, und alles, das du notierst, bleibt auf deinem Gerät, verschlüsselt. Es gibt keine Werbung, keine Tracker und keinen Tane-Server.\n\nNichts wird geteilt, es sei denn, du wählst es: Wenn du ein Angebot oder dein Profil veröffentlichst oder eine Nachricht sendest, reist es durch Gemeinschaftsserver. Angebote tragen nur eine ungefähre Zone - nie deine Adresse.\n\nWas du veröffentlichst, ist öffentlich, und Kopien können bleiben, selbst nachdem du es entfernt hast - teile also mit Bedacht.';
@override String get rulesTitle => 'Die Spielregeln';
@override String get rulesBody => 'Tane ist ein Werkzeug, kein Laden: Austausch wird direkt zwischen Menschen vereinbart, und niemand nimmt eine Provision. Das bedeutet auch, dass du verantwortlich bist für das, das du anbietest und sendest.\n\nAuf dem Markt: Sei ehrlich mit deinen Samen, biete nur an, was du teilen darfst, behandle Menschen gut und spamme nicht. Du kannst jeden blockieren und Angebote oder Menschen melden, die die Regeln brechen - Meldungen werden auf den Gemeinschaftsservern bearbeitet.';
@override String get seedsTitle => 'Über das Teilen von Samen';
@override String get seedsBody => 'Das Verschenken und Tauschen von Samen zwischen Hobbyisten ist in den meisten Ländern weit verbreitet. Verkaufen kann anders sein: An vielen Orten ist der Verkauf von Samen nicht offiziell registrierter Sorten eingeschränkt - überprüfe deine örtlichen Vorschriften, bevor du einen Preis fragst.\n\nSamen in ein anderes Land zu schicken ist auch oft eingeschränkt, und kommerziell geschützte Sorten dürfen nicht ohne Genehmigung vermehrt werden. Im Zweifelsfall lieber lokal und lieber Geschenk.';
@override String get seedsTitle => 'Über das Teilen von Samen und Setzlingen';
@override String get seedsBody => 'Das Verschenken und Tauschen von Samen zwischen Hobbyisten ist in den meisten Ländern weit verbreitet. Verkaufen kann anders sein: An vielen Orten ist der Verkauf von Samen nicht offiziell registrierter Sorten eingeschränkt - überprüfe deine örtlichen Vorschriften, bevor du einen Preis fragst.\n\nSamen in ein anderes Land zu schicken ist auch oft eingeschränkt, und kommerziell geschützte Sorten dürfen nicht ohne Genehmigung vermehrt werden. Im Zweifelsfall lieber lokal und lieber Geschenk.\n\nDasselbe gilt für Setzlinge und Jungpflanzen, aber lebende Pflanzen können strengeren Transport- und Pflanzenschutzregeln unterliegen als Samen — sie über Regionen oder Grenzen zu bewegen kann zusätzliche Kontrollen erfordern.';
@override String get readFull => 'Lese die vollständigen Dokumente online';
}
@ -1492,8 +1494,8 @@ extension on TranslationsDe {
'settings.langJa' => '日本語',
'backup.title' => 'Sicherung und Wiederherstellung',
'backup.autoBackupTitle' => 'Automatische Sicherungen',
'backup.autoBackupLast' => ({required Object date}) => 'Letzte Sicherung ${date}',
'backup.autoBackupNone' => 'Eine Kopie wird automatisch im Hintergrund gespeichert',
'backup.autoBackupLast' => ({required Object date, required Object days}) => 'Letzte Sicherung ${date} · alle ${days} Tage',
'backup.autoBackupNone' => ({required Object days}) => 'Eine Kopie wird automatisch alle ${days} Tage gespeichert',
'backup.exportJson' => 'Sicherung speichern',
'backup.exportJsonSubtitle' => 'Eine komplette Kopie zum sicheren Aufbewahren, später wiederherstellen oder auf ein anderes Gerät übertragen',
'backup.importJson' => 'Sicherung wiederherstellen',
@ -1800,8 +1802,10 @@ extension on TranslationsDe {
'market.areaCodeLabel' => 'Gebiets-Code',
'market.areaCodeHint' => 'Ein kurzer Code wie sp3e9 - kein Ortsname',
'market.serversLabel' => 'Gemeinschaftsserver',
'market.serversHelp' => 'Eine Adresse pro Zeile (wss://…). Lass die Standardwerte, wenn du dir nicht sicher bist.',
'market.serversHelp' => 'Wähle, welche Server verwendet werden. Lass die Standardwerte, wenn du dir nicht sicher bist.',
'market.serversAdvanced' => 'Füge einen weiteren Server hinzu',
'market.serverAddress' => 'Serveradresse',
'market.serverInvalid' => 'Gib eine gültige Adresse ein (wss://…)',
'market.save' => 'Speichern',
'market.saved' => 'Gespeichert',
'market.wanted' => 'Gesucht',
@ -1918,10 +1922,10 @@ extension on TranslationsDe {
'sale.direction' => 'Verkauft oder gekauft?',
'sale.counterparty' => 'Mit wem?',
'sale.counterpartyHint' => 'Eine Person oder ein Kollektiv (optional)',
'sale.amount' => 'Betrag',
'sale.currency' => 'Währung',
_ => null,
} ?? switch (path) {
'sale.amount' => 'Betrag',
'sale.currency' => 'Währung',
'sale.currencyHint' => '€, Ğ1, Stunden… (optional)',
'sale.hours' => 'Stunden',
'sale.note' => 'Notiz (optional)',
@ -1934,8 +1938,8 @@ extension on TranslationsDe {
'legal.privacyBody' => 'Tane funktioniert ohne Konto, und alles, das du notierst, bleibt auf deinem Gerät, verschlüsselt. Es gibt keine Werbung, keine Tracker und keinen Tane-Server.\n\nNichts wird geteilt, es sei denn, du wählst es: Wenn du ein Angebot oder dein Profil veröffentlichst oder eine Nachricht sendest, reist es durch Gemeinschaftsserver. Angebote tragen nur eine ungefähre Zone - nie deine Adresse.\n\nWas du veröffentlichst, ist öffentlich, und Kopien können bleiben, selbst nachdem du es entfernt hast - teile also mit Bedacht.',
'legal.rulesTitle' => 'Die Spielregeln',
'legal.rulesBody' => 'Tane ist ein Werkzeug, kein Laden: Austausch wird direkt zwischen Menschen vereinbart, und niemand nimmt eine Provision. Das bedeutet auch, dass du verantwortlich bist für das, das du anbietest und sendest.\n\nAuf dem Markt: Sei ehrlich mit deinen Samen, biete nur an, was du teilen darfst, behandle Menschen gut und spamme nicht. Du kannst jeden blockieren und Angebote oder Menschen melden, die die Regeln brechen - Meldungen werden auf den Gemeinschaftsservern bearbeitet.',
'legal.seedsTitle' => 'Über das Teilen von Samen',
'legal.seedsBody' => 'Das Verschenken und Tauschen von Samen zwischen Hobbyisten ist in den meisten Ländern weit verbreitet. Verkaufen kann anders sein: An vielen Orten ist der Verkauf von Samen nicht offiziell registrierter Sorten eingeschränkt - überprüfe deine örtlichen Vorschriften, bevor du einen Preis fragst.\n\nSamen in ein anderes Land zu schicken ist auch oft eingeschränkt, und kommerziell geschützte Sorten dürfen nicht ohne Genehmigung vermehrt werden. Im Zweifelsfall lieber lokal und lieber Geschenk.',
'legal.seedsTitle' => 'Über das Teilen von Samen und Setzlingen',
'legal.seedsBody' => 'Das Verschenken und Tauschen von Samen zwischen Hobbyisten ist in den meisten Ländern weit verbreitet. Verkaufen kann anders sein: An vielen Orten ist der Verkauf von Samen nicht offiziell registrierter Sorten eingeschränkt - überprüfe deine örtlichen Vorschriften, bevor du einen Preis fragst.\n\nSamen in ein anderes Land zu schicken ist auch oft eingeschränkt, und kommerziell geschützte Sorten dürfen nicht ohne Genehmigung vermehrt werden. Im Zweifelsfall lieber lokal und lieber Geschenk.\n\nDasselbe gilt für Setzlinge und Jungpflanzen, aber lebende Pflanzen können strengeren Transport- und Pflanzenschutzregeln unterliegen als Samen — sie über Regionen oder Grenzen zu bewegen kann zusätzliche Kontrollen erfordern.',
'legal.readFull' => 'Lese die vollständigen Dokumente online',
'marketGate.title' => 'Bevor du den Markt betrittst',
'marketGate.intro' => 'Der Markt ist ein gemeinsamer Raum zwischen Nachbarn. Wenn du fortfährst, akzeptierst du einige einfache Regeln:',

View file

@ -451,11 +451,11 @@ class Translations$backup$en {
/// en: 'Automatic backups'
String get autoBackupTitle => 'Automatic backups';
/// en: 'Last copy saved {date}'
String autoBackupLast({required Object date}) => 'Last copy saved ${date}';
/// en: 'Last copy saved {date} · every {days} days'
String autoBackupLast({required Object date, required Object days}) => 'Last copy saved ${date} · every ${days} days';
/// en: 'A copy is kept automatically in the background'
String get autoBackupNone => 'A copy is kept automatically in the background';
/// en: 'A copy is kept automatically every {days} days'
String autoBackupNone({required Object days}) => 'A copy is kept automatically every ${days} days';
/// en: 'Save a backup'
String get exportJson => 'Save a backup';
@ -1423,12 +1423,18 @@ class Translations$market$en {
/// en: 'Community servers'
String get serversLabel => 'Community servers';
/// en: 'One address per line (wss://…). Leave the defaults if unsure.'
String get serversHelp => 'One address per line (wss://…). Leave the defaults if unsure.';
/// en: 'Choose which servers to use. Leave the defaults if unsure.'
String get serversHelp => 'Choose which servers to use. Leave the defaults if unsure.';
/// en: 'Add another server'
String get serversAdvanced => 'Add another server';
/// en: 'Server address'
String get serverAddress => 'Server address';
/// en: 'Enter a valid address (wss://…)'
String get serverInvalid => 'Enter a valid address (wss://…)';
/// en: 'Save'
String get save => 'Save';
@ -2008,11 +2014,11 @@ class Translations$legal$en {
/// en: 'Tane is a tool, not a shop: exchanges are agreed directly between people, and nobody takes a cut. That also means you are responsible for what you offer and send. In the market: be honest about your seeds, only offer what you may share, treat people well, and don't spam. You can block anyone, and report offers or people that break the rules reports are acted on in the community servers.'
String get rulesBody => 'Tane is a tool, not a shop: exchanges are agreed directly between people, and nobody takes a cut. That also means you are responsible for what you offer and send.\n\nIn the market: be honest about your seeds, only offer what you may share, treat people well, and don\'t spam. You can block anyone, and report offers or people that break the rules — reports are acted on in the community servers.';
/// en: 'About sharing seeds'
String get seedsTitle => 'About sharing seeds';
/// en: 'About sharing seeds and seedlings'
String get seedsTitle => 'About sharing seeds and seedlings';
/// en: 'Gifting and swapping seeds between amateurs is broadly recognized in most countries. Selling can be different: in many places, selling seed of varieties that aren't officially registered is restricted check your local rules before asking a price. Sending seeds to another country is often restricted too, and commercially protected varieties must not be propagated without permission. When in doubt, keep it local and keep it a gift.'
String get seedsBody => 'Gifting and swapping seeds between amateurs is broadly recognized in most countries. Selling can be different: in many places, selling seed of varieties that aren\'t officially registered is restricted — check your local rules before asking a price.\n\nSending seeds to another country is often restricted too, and commercially protected varieties must not be propagated without permission. When in doubt, keep it local and keep it a gift.';
/// en: 'Gifting and swapping seeds between amateurs is broadly recognized in most countries. Selling can be different: in many places, selling seed of varieties that aren't officially registered is restricted check your local rules before asking a price. Sending seeds to another country is often restricted too, and commercially protected varieties must not be propagated without permission. When in doubt, keep it local and keep it a gift. The same spirit applies to seedlings and young plants, but live plants can carry stricter transport and plant-health rules than seeds moving them across regions or borders may need extra checks.'
String get seedsBody => 'Gifting and swapping seeds between amateurs is broadly recognized in most countries. Selling can be different: in many places, selling seed of varieties that aren\'t officially registered is restricted — check your local rules before asking a price.\n\nSending seeds to another country is often restricted too, and commercially protected varieties must not be propagated without permission. When in doubt, keep it local and keep it a gift.\n\nThe same spirit applies to seedlings and young plants, but live plants can carry stricter transport and plant-health rules than seeds — moving them across regions or borders may need extra checks.';
/// en: 'Read the full documents online'
String get readFull => 'Read the full documents online';
@ -2676,8 +2682,8 @@ extension on Translations {
'settings.aboutOpen' => 'About Tane',
'backup.title' => 'Backup & restore',
'backup.autoBackupTitle' => 'Automatic backups',
'backup.autoBackupLast' => ({required Object date}) => 'Last copy saved ${date}',
'backup.autoBackupNone' => 'A copy is kept automatically in the background',
'backup.autoBackupLast' => ({required Object date, required Object days}) => 'Last copy saved ${date} · every ${days} days',
'backup.autoBackupNone' => ({required Object days}) => 'A copy is kept automatically every ${days} days',
'backup.exportJson' => 'Save a backup',
'backup.exportJsonSubtitle' => 'A complete copy to keep safe, restore later or move to another device',
'backup.importJson' => 'Restore a backup',
@ -2984,8 +2990,10 @@ extension on Translations {
'market.areaCodeLabel' => 'Area code',
'market.areaCodeHint' => 'A short code like sp3e9 — not a place name',
'market.serversLabel' => 'Community servers',
'market.serversHelp' => 'One address per line (wss://…). Leave the defaults if unsure.',
'market.serversHelp' => 'Choose which servers to use. Leave the defaults if unsure.',
'market.serversAdvanced' => 'Add another server',
'market.serverAddress' => 'Server address',
'market.serverInvalid' => 'Enter a valid address (wss://…)',
'market.save' => 'Save',
'market.saved' => 'Saved',
'market.wanted' => 'Wanted',
@ -3102,10 +3110,10 @@ extension on Translations {
'plantare.returnOther' => 'Something else',
'plantare.workHoursLabel' => 'How many hours?',
'plantare.proposalsSection' => 'Waiting for your reply',
'plantare.incomingFrom' => ({required Object name}) => '${name} proposes a Plantaré',
'plantare.accept' => 'Accept & sign',
_ => null,
} ?? switch (path) {
'plantare.incomingFrom' => ({required Object name}) => '${name} proposes a Plantaré',
'plantare.accept' => 'Accept & sign',
'plantare.declineAction' => 'Decline',
'plantare.declineReasonHint' => 'Reason (optional)',
'plantare.acceptedToast' => 'Signed — you both hold it now',
@ -3148,8 +3156,8 @@ extension on Translations {
'legal.privacyBody' => 'Tane works without an account, and everything you record stays on your device, encrypted. There are no ads, no trackers, and no Tane server.\n\nNothing is shared unless you choose to: when you publish an offer or your profile, or send a message, it travels through community-run servers. Offers only ever carry a rough zone — never your address.\n\nWhat you publish is public, and copies may remain even after you remove it — so share with care.',
'legal.rulesTitle' => 'Rules of the road',
'legal.rulesBody' => 'Tane is a tool, not a shop: exchanges are agreed directly between people, and nobody takes a cut. That also means you are responsible for what you offer and send.\n\nIn the market: be honest about your seeds, only offer what you may share, treat people well, and don\'t spam. You can block anyone, and report offers or people that break the rules — reports are acted on in the community servers.',
'legal.seedsTitle' => 'About sharing seeds',
'legal.seedsBody' => 'Gifting and swapping seeds between amateurs is broadly recognized in most countries. Selling can be different: in many places, selling seed of varieties that aren\'t officially registered is restricted — check your local rules before asking a price.\n\nSending seeds to another country is often restricted too, and commercially protected varieties must not be propagated without permission. When in doubt, keep it local and keep it a gift.',
'legal.seedsTitle' => 'About sharing seeds and seedlings',
'legal.seedsBody' => 'Gifting and swapping seeds between amateurs is broadly recognized in most countries. Selling can be different: in many places, selling seed of varieties that aren\'t officially registered is restricted — check your local rules before asking a price.\n\nSending seeds to another country is often restricted too, and commercially protected varieties must not be propagated without permission. When in doubt, keep it local and keep it a gift.\n\nThe same spirit applies to seedlings and young plants, but live plants can carry stricter transport and plant-health rules than seeds — moving them across regions or borders may need extra checks.',
'legal.readFull' => 'Read the full documents online',
'marketGate.title' => 'Before you join the market',
'marketGate.intro' => 'The market is a shared space between neighbours. By continuing, you agree to a few simple rules:',

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:',

View file

@ -281,8 +281,8 @@ class _Translations$backup$fr extends Translations$backup$en {
// Translations
@override String get title => 'Sauvegarde & restauration';
@override String get autoBackupTitle => 'Sauvegardes automatiques';
@override String autoBackupLast({required Object date}) => 'Dernière copie sauvegardée ${date}';
@override String get autoBackupNone => 'Une copie est conservée automatiquement en arrière-plan';
@override String autoBackupLast({required Object date, required Object days}) => 'Dernière copie ${date} · tous les ${days} jours';
@override String autoBackupNone({required Object days}) => 'Une copie est conservée automatiquement tous les ${days} jours';
@override String get exportJson => 'Enregistrer une sauvegarde';
@override String get exportJsonSubtitle => 'Une copie complète à conserver précieusement, restaurer plus tard ou transférer sur un autre appareil';
@override String get importJson => 'Restaurer une sauvegarde';
@ -774,8 +774,10 @@ class _Translations$market$fr extends Translations$market$en {
@override String get areaCodeLabel => 'Code de zone';
@override String get areaCodeHint => 'Un code court comme sp3e9 — pas un nom de lieu';
@override String get serversLabel => 'Serveurs communautaires';
@override String get serversHelp => 'Une adresse par ligne (wss://…). Laissez les valeurs par défaut si vous n\'êtes pas sûr.';
@override String get serversHelp => 'Choisissez les serveurs à utiliser. Laissez les valeurs par défaut si vous n\'êtes pas sûr.';
@override String get serversAdvanced => 'Ajouter un autre serveur';
@override String get serverAddress => 'Adresse du serveur';
@override String get serverInvalid => 'Entrez une adresse valide (wss://…)';
@override String get save => 'Enregistrer';
@override String get saved => 'Enregistré';
@override String get wanted => 'Recherché';
@ -1005,8 +1007,8 @@ class _Translations$legal$fr extends Translations$legal$en {
@override String get privacyBody => 'Tane fonctionne sans compte, et tout ce que vous enregistrez reste sur votre appareil, chiffré. Il n\'y a pas de publicités, pas de trackers, et pas de serveur Tane.\n\nRien n\'est partagé sauf si vous le choisissez : quand vous publiez une offre ou votre profil, ou envoyez un message, cela passe par des serveurs gérés par la communauté. Les offres ne portent qu\'une zone approximative — jamais votre adresse.\n\nCe que vous publiez est public, et des copies peuvent rester même après l\'avoir retiré — alors partagez avec prudence.';
@override String get rulesTitle => 'Les règles du jeu';
@override String get rulesBody => 'Tane est un outil, pas un magasin : les échanges sont convenus directement entre les gens, et personne ne prend de commission. Cela signifie aussi que vous êtes responsable de ce que vous offrez et envoyez.\n\nSur le marché : soyez honnête avec vos graines, n\'offrez que ce que vous pouvez partager, traitez les gens bien et ne faites pas de spam. Vous pouvez bloquer n\'importe qui et signaler les offres ou les gens qui enfreignent les règles — les signalements sont traités sur les serveurs communautaires.';
@override String get seedsTitle => 'À propos du partage de semences';
@override String get seedsBody => 'Donner et échanger des graines entre amateurs est largement reconnu dans la plupart des pays. La vente peut être différente : dans de nombreux endroits, vendre des graines de variétés non officiellement enregistrées est restreint — vérifiez votre législation locale avant de demander un prix.\n\nEnvoyer des graines dans un autre pays est souvent restreint aussi, et les variétés protégées commercialement ne peuvent pas être reproduites sans permission. En cas de doute, gardez-le local et faites-en un cadeau.';
@override String get seedsTitle => 'À propos du partage de semences et de plants';
@override String get seedsBody => 'Donner et échanger des graines entre amateurs est largement reconnu dans la plupart des pays. La vente peut être différente : dans de nombreux endroits, vendre des graines de variétés non officiellement enregistrées est restreint — vérifiez votre législation locale avant de demander un prix.\n\nEnvoyer des graines dans un autre pays est souvent restreint aussi, et les variétés protégées commercialement ne peuvent pas être reproduites sans permission. En cas de doute, gardez-le local et faites-en un cadeau.\n\nCela vaut aussi pour les plants et jeunes plantes, mais une plante vivante peut être soumise à des règles de transport et phytosanitaires plus strictes que les graines : la déplacer entre régions ou pays peut nécessiter des contrôles supplémentaires.';
@override String get readFull => 'Lire les documents complets en ligne';
}
@ -1492,8 +1494,8 @@ extension on TranslationsFr {
'settings.aboutOpen' => 'À propos de Tane',
'backup.title' => 'Sauvegarde & restauration',
'backup.autoBackupTitle' => 'Sauvegardes automatiques',
'backup.autoBackupLast' => ({required Object date}) => 'Dernière copie sauvegardée ${date}',
'backup.autoBackupNone' => 'Une copie est conservée automatiquement en arrière-plan',
'backup.autoBackupLast' => ({required Object date, required Object days}) => 'Dernière copie ${date} · tous les ${days} jours',
'backup.autoBackupNone' => ({required Object days}) => 'Une copie est conservée automatiquement tous les ${days} jours',
'backup.exportJson' => 'Enregistrer une sauvegarde',
'backup.exportJsonSubtitle' => 'Une copie complète à conserver précieusement, restaurer plus tard ou transférer sur un autre appareil',
'backup.importJson' => 'Restaurer une sauvegarde',
@ -1800,8 +1802,10 @@ extension on TranslationsFr {
'market.areaCodeLabel' => 'Code de zone',
'market.areaCodeHint' => 'Un code court comme sp3e9 — pas un nom de lieu',
'market.serversLabel' => 'Serveurs communautaires',
'market.serversHelp' => 'Une adresse par ligne (wss://…). Laissez les valeurs par défaut si vous n\'êtes pas sûr.',
'market.serversHelp' => 'Choisissez les serveurs à utiliser. Laissez les valeurs par défaut si vous n\'êtes pas sûr.',
'market.serversAdvanced' => 'Ajouter un autre serveur',
'market.serverAddress' => 'Adresse du serveur',
'market.serverInvalid' => 'Entrez une adresse valide (wss://…)',
'market.save' => 'Enregistrer',
'market.saved' => 'Enregistré',
'market.wanted' => 'Recherché',
@ -1918,10 +1922,10 @@ extension on TranslationsFr {
'sale.direction' => 'Vendu ou acheté ?',
'sale.counterparty' => 'Avec qui ?',
'sale.counterpartyHint' => 'Une personne ou un collectif (optionnel)',
'sale.amount' => 'Montant',
'sale.currency' => 'Monnaie',
_ => null,
} ?? switch (path) {
'sale.amount' => 'Montant',
'sale.currency' => 'Monnaie',
'sale.currencyHint' => '€, Ğ1, heures… (optionnel)',
'sale.hours' => 'heures',
'sale.note' => 'Note (optionnel)',
@ -1934,8 +1938,8 @@ extension on TranslationsFr {
'legal.privacyBody' => 'Tane fonctionne sans compte, et tout ce que vous enregistrez reste sur votre appareil, chiffré. Il n\'y a pas de publicités, pas de trackers, et pas de serveur Tane.\n\nRien n\'est partagé sauf si vous le choisissez : quand vous publiez une offre ou votre profil, ou envoyez un message, cela passe par des serveurs gérés par la communauté. Les offres ne portent qu\'une zone approximative — jamais votre adresse.\n\nCe que vous publiez est public, et des copies peuvent rester même après l\'avoir retiré — alors partagez avec prudence.',
'legal.rulesTitle' => 'Les règles du jeu',
'legal.rulesBody' => 'Tane est un outil, pas un magasin : les échanges sont convenus directement entre les gens, et personne ne prend de commission. Cela signifie aussi que vous êtes responsable de ce que vous offrez et envoyez.\n\nSur le marché : soyez honnête avec vos graines, n\'offrez que ce que vous pouvez partager, traitez les gens bien et ne faites pas de spam. Vous pouvez bloquer n\'importe qui et signaler les offres ou les gens qui enfreignent les règles — les signalements sont traités sur les serveurs communautaires.',
'legal.seedsTitle' => 'À propos du partage de semences',
'legal.seedsBody' => 'Donner et échanger des graines entre amateurs est largement reconnu dans la plupart des pays. La vente peut être différente : dans de nombreux endroits, vendre des graines de variétés non officiellement enregistrées est restreint — vérifiez votre législation locale avant de demander un prix.\n\nEnvoyer des graines dans un autre pays est souvent restreint aussi, et les variétés protégées commercialement ne peuvent pas être reproduites sans permission. En cas de doute, gardez-le local et faites-en un cadeau.',
'legal.seedsTitle' => 'À propos du partage de semences et de plants',
'legal.seedsBody' => 'Donner et échanger des graines entre amateurs est largement reconnu dans la plupart des pays. La vente peut être différente : dans de nombreux endroits, vendre des graines de variétés non officiellement enregistrées est restreint — vérifiez votre législation locale avant de demander un prix.\n\nEnvoyer des graines dans un autre pays est souvent restreint aussi, et les variétés protégées commercialement ne peuvent pas être reproduites sans permission. En cas de doute, gardez-le local et faites-en un cadeau.\n\nCela vaut aussi pour les plants et jeunes plantes, mais une plante vivante peut être soumise à des règles de transport et phytosanitaires plus strictes que les graines : la déplacer entre régions ou pays peut nécessiter des contrôles supplémentaires.',
'legal.readFull' => 'Lire les documents complets en ligne',
'marketGate.title' => 'Avant de rejoindre le marché',
'marketGate.intro' => 'Le marché est un espace partagé entre voisins. En continuant, vous acceptez quelques règles simples :',

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:',

View file

@ -36,6 +36,11 @@ class AutoBackupService {
/// so a corrupt copy can't overwrite the only backup.
static const _keep = 3;
/// How often an automatic copy is made. The single source of truth for both
/// the schedule ([runIfDue]'s default) and the reassurance copy in Settings,
/// so the two can never drift apart.
static const Duration backupInterval = Duration(days: 7);
/// When the last automatic copy was made, or null if none has run yet. For a
/// reassurance line in Settings.
Future<DateTime?> lastBackupAt() => _store.lastBackupAt();
@ -43,7 +48,7 @@ class AutoBackupService {
/// Makes a fresh copy when at least [interval] has passed since the last one.
/// Returns true when it wrote a copy, false when not due (or on any failure
/// a backup must never crash startup or the move to the background).
Future<bool> runIfDue({Duration interval = const Duration(days: 7)}) async {
Future<bool> runIfDue({Duration interval = backupInterval}) async {
try {
final last = await _store.lastBackupAt();
if (last != null && _now().difference(last) < interval) return false;

View file

@ -357,8 +357,9 @@ class _AutoBackupTileState extends State<_AutoBackupTile> {
future: _lastBackup,
builder: (context, snapshot) {
final last = snapshot.data;
final days = AutoBackupService.backupInterval.inDays;
final subtitle = last == null
? t.backup.autoBackupNone
? t.backup.autoBackupNone(days: days)
: t.backup.autoBackupLast(
// Format via the Localizations locale, not the raw app locale:
// Asturian (`ast`) has no `intl` date symbols and would throw,
@ -366,6 +367,7 @@ class _AutoBackupTileState extends State<_AutoBackupTile> {
date: DateFormat.yMMMd(
Localizations.localeOf(context).languageCode,
).format(last),
days: days,
);
return ListTile(
leading: const Icon(Icons.shield_outlined),

View file

@ -656,7 +656,11 @@ class _ConfigSheet extends StatefulWidget {
class _ConfigSheetState extends State<_ConfigSheet> {
final _area = TextEditingController();
final _servers = TextEditingController();
/// Servers offered as toggles: the built-in defaults plus any the user has
/// saved or added. [_selectedRelays] is the subset currently switched on.
List<String> _knownRelays = const [];
Set<String> _selectedRelays = <String>{};
bool _loading = true;
bool _locationBusy = false;
String? _locationError;
@ -670,18 +674,93 @@ class _ConfigSheetState extends State<_ConfigSheet> {
Future<void> _load() async {
_area.text = await widget.settings.areaGeohash();
_servers.text = (await widget.settings.relayUrls()).join('\n');
final saved = await widget.settings.relayUrls();
_selectedRelays = saved.toSet();
// Show the defaults plus anything the user saved, defaults first.
_knownRelays = <String>{...SocialSettings.defaultRelays, ...saved}.toList();
_precision = await widget.settings.searchPrecision();
if (mounted) setState(() => _loading = false);
}
Future<void> _save() async {
await widget.settings.setAreaGeohash(_area.text);
await widget.settings.setRelayUrls(_servers.text.split('\n'));
await widget.settings.setRelayUrls(_selectedRelays.toList());
await widget.settings.setSearchPrecision(_precision);
if (mounted) Navigator.of(context).pop(true);
}
/// The human-friendly server name just the host, no `wss://` scheme or
/// trailing slash (jargon stays out of the UI).
String _relayLabel(String url) => url
.trim()
.replaceFirst(RegExp(r'^wss?://'), '')
.replaceFirst(RegExp(r'/+$'), '');
/// Coerces user input into a `wss://` address, or null if it can't be one.
/// Bare hosts get a `wss://` prefix so people needn't type the scheme.
String? _normalizeRelay(String raw) {
var s = raw.trim();
if (s.isEmpty) return null;
if (!s.contains('://')) s = 'wss://$s';
final uri = Uri.tryParse(s);
if (uri == null ||
(uri.scheme != 'wss' && uri.scheme != 'ws') ||
uri.host.isEmpty) {
return null;
}
return s.replaceFirst(RegExp(r'/+$'), '');
}
Future<void> _addServer() async {
final t = context.t;
final controller = TextEditingController();
final url = await showDialog<String>(
context: context,
builder: (dialogContext) {
String? error;
return StatefulBuilder(
builder: (dialogContext, setLocal) => AlertDialog(
title: Text(t.market.serversAdvanced),
content: TextField(
key: const Key('market.serverField'),
controller: controller,
autofocus: true,
keyboardType: TextInputType.url,
decoration: InputDecoration(
labelText: t.market.serverAddress,
hintText: 'wss://…',
errorText: error,
),
),
actions: [
TextButton(
onPressed: () => Navigator.pop(dialogContext),
child: Text(t.common.cancel),
),
FilledButton(
key: const Key('market.serverConfirm'),
onPressed: () {
final value = _normalizeRelay(controller.text);
if (value == null) {
setLocal(() => error = t.market.serverInvalid);
} else {
Navigator.pop(dialogContext, value);
}
},
child: Text(t.market.save),
),
],
),
);
},
);
if (url == null || !mounted) return;
setState(() {
if (!_knownRelays.contains(url)) _knownRelays = [..._knownRelays, url];
_selectedRelays.add(url);
});
}
/// Fills the area from the device's approximate location, reduced to a coarse
/// geohash so no precise fix is stored.
Future<void> _useLocation() async {
@ -706,7 +785,6 @@ class _ConfigSheetState extends State<_ConfigSheet> {
@override
void dispose() {
_area.dispose();
_servers.dispose();
super.dispose();
}
@ -835,15 +913,46 @@ class _ConfigSheetState extends State<_ConfigSheet> {
),
),
const SizedBox(height: 14),
TextField(
key: const Key('market.servers'),
controller: _servers,
minLines: 1,
maxLines: 3,
decoration: InputDecoration(
labelText: t.market.serversLabel,
helperText: t.market.serversHelp,
helperMaxLines: 2,
Align(
alignment: AlignmentDirectional.centerStart,
child: Text(
t.market.serversLabel,
style: const TextStyle(
fontSize: 13, color: seedMuted),
),
),
Padding(
padding: const EdgeInsetsDirectional.only(
top: 2, bottom: 4),
child: Text(
t.market.serversHelp,
style: const TextStyle(
fontSize: 12, color: seedMuted, height: 1.3),
),
),
for (final url in _knownRelays)
CheckboxListTile(
key: Key('market.server.$url'),
contentPadding: EdgeInsets.zero,
dense: true,
controlAffinity: ListTileControlAffinity.leading,
value: _selectedRelays.contains(url),
title: Text(_relayLabel(url)),
onChanged: (on) => setState(() {
if (on ?? false) {
_selectedRelays.add(url);
} else {
_selectedRelays.remove(url);
}
}),
),
Align(
alignment: AlignmentDirectional.centerStart,
child: TextButton.icon(
key: const Key('market.addServer'),
onPressed: _addServer,
icon: const Icon(Icons.add, size: 18),
label: Text(t.market.serversAdvanced),
),
),
ListTile(

View file

@ -25,9 +25,12 @@ void main() {
expect(find.text('Read the full documents online'), findsWidgets);
// The later sections start below the fold of the test viewport.
await tester.scrollUntilVisible(find.text('About sharing seeds'), 300);
await tester.scrollUntilVisible(
find.text('About sharing seeds and seedlings'),
300,
);
expect(find.text('Rules of the road'), findsOneWidget);
expect(find.text('About sharing seeds'), findsOneWidget);
expect(find.text('About sharing seeds and seedlings'), findsOneWidget);
});
testWidgets('renders under RTL without overflowing', (tester) async {

View file

@ -119,6 +119,35 @@ void main() {
expect(await settings.searchPrecision(), 3);
});
testWidgets('community servers are offered as toggles, not a URL box',
(tester) async {
final social = await SocialService.fromRootSeedHex('00' * 32);
final settings = SocialSettings(InMemorySecretStore());
await settings.setRelayUrls(const []); // offline + nothing selected
await tester.pumpWidget(_wrapMarket(social, settings));
await tester.pumpAndSettle();
await tester.tap(find.byKey(const Key('market.config')));
await tester.pumpAndSettle();
await tester.tap(find.byKey(const Key('market.advanced')));
await tester.pumpAndSettle();
// Every built-in server shows as a checkbox instead of a wss:// text field.
for (final url in SocialSettings.defaultRelays) {
expect(find.byKey(Key('market.server.$url')), findsOneWidget);
}
final firstKey = Key('market.server.${SocialSettings.defaultRelays.first}');
await tester.ensureVisible(find.byKey(firstKey));
await tester.pumpAndSettle();
expect(tester.widget<CheckboxListTile>(find.byKey(firstKey)).value, isFalse);
// Tapping the toggle selects it (no wss:// typing required).
await tester.tap(find.byKey(firstKey));
await tester.pumpAndSettle();
expect(tester.widget<CheckboxListTile>(find.byKey(firstKey)).value, isTrue);
});
testWidgets('"use my location" fills the area with a coarse geohash',
(tester) async {
final social = await SocialService.fromRootSeedHex('00' * 32);