diff --git a/apps/app_seeds/lib/i18n/ast.i18n.json b/apps/app_seeds/lib/i18n/ast.i18n.json index 87aa385..0b81ab7 100644 --- a/apps/app_seeds/lib/i18n/ast.i18n.json +++ b/apps/app_seeds/lib/i18n/ast.i18n.json @@ -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": { diff --git a/apps/app_seeds/lib/i18n/de.i18n.json b/apps/app_seeds/lib/i18n/de.i18n.json index a65e1a6..2a8ac83 100644 --- a/apps/app_seeds/lib/i18n/de.i18n.json +++ b/apps/app_seeds/lib/i18n/de.i18n.json @@ -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": { diff --git a/apps/app_seeds/lib/i18n/en.i18n.json b/apps/app_seeds/lib/i18n/en.i18n.json index cf52914..6c25692 100644 --- a/apps/app_seeds/lib/i18n/en.i18n.json +++ b/apps/app_seeds/lib/i18n/en.i18n.json @@ -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": { diff --git a/apps/app_seeds/lib/i18n/es.i18n.json b/apps/app_seeds/lib/i18n/es.i18n.json index d4742b6..53260c5 100644 --- a/apps/app_seeds/lib/i18n/es.i18n.json +++ b/apps/app_seeds/lib/i18n/es.i18n.json @@ -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": { diff --git a/apps/app_seeds/lib/i18n/fr.i18n.json b/apps/app_seeds/lib/i18n/fr.i18n.json index 7855a9d..ca21157 100644 --- a/apps/app_seeds/lib/i18n/fr.i18n.json +++ b/apps/app_seeds/lib/i18n/fr.i18n.json @@ -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": { diff --git a/apps/app_seeds/lib/i18n/pt.i18n.json b/apps/app_seeds/lib/i18n/pt.i18n.json index 07ebc8b..4d9146f 100644 --- a/apps/app_seeds/lib/i18n/pt.i18n.json +++ b/apps/app_seeds/lib/i18n/pt.i18n.json @@ -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": { diff --git a/apps/app_seeds/lib/i18n/strings.g.dart b/apps/app_seeds/lib/i18n/strings.g.dart index 9bde9e5..77bc0c6 100644 --- a/apps/app_seeds/lib/i18n/strings.g.dart +++ b/apps/app_seeds/lib/i18n/strings.g.dart @@ -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 diff --git a/apps/app_seeds/lib/i18n/strings_ast.g.dart b/apps/app_seeds/lib/i18n/strings_ast.g.dart index 2167666..1017383 100644 --- a/apps/app_seeds/lib/i18n/strings_ast.g.dart +++ b/apps/app_seeds/lib/i18n/strings_ast.g.dart @@ -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:', diff --git a/apps/app_seeds/lib/i18n/strings_de.g.dart b/apps/app_seeds/lib/i18n/strings_de.g.dart index b959d59..829b964 100644 --- a/apps/app_seeds/lib/i18n/strings_de.g.dart +++ b/apps/app_seeds/lib/i18n/strings_de.g.dart @@ -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:', diff --git a/apps/app_seeds/lib/i18n/strings_en.g.dart b/apps/app_seeds/lib/i18n/strings_en.g.dart index 3f028ed..ed46930 100644 --- a/apps/app_seeds/lib/i18n/strings_en.g.dart +++ b/apps/app_seeds/lib/i18n/strings_en.g.dart @@ -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:', diff --git a/apps/app_seeds/lib/i18n/strings_es.g.dart b/apps/app_seeds/lib/i18n/strings_es.g.dart index 991d83b..1c3dfcf 100644 --- a/apps/app_seeds/lib/i18n/strings_es.g.dart +++ b/apps/app_seeds/lib/i18n/strings_es.g.dart @@ -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:', diff --git a/apps/app_seeds/lib/i18n/strings_fr.g.dart b/apps/app_seeds/lib/i18n/strings_fr.g.dart index 9cc3259..a48c861 100644 --- a/apps/app_seeds/lib/i18n/strings_fr.g.dart +++ b/apps/app_seeds/lib/i18n/strings_fr.g.dart @@ -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 :', diff --git a/apps/app_seeds/lib/i18n/strings_pt.g.dart b/apps/app_seeds/lib/i18n/strings_pt.g.dart index b65a307..a242b50 100644 --- a/apps/app_seeds/lib/i18n/strings_pt.g.dart +++ b/apps/app_seeds/lib/i18n/strings_pt.g.dart @@ -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:', diff --git a/apps/app_seeds/lib/services/auto_backup_service.dart b/apps/app_seeds/lib/services/auto_backup_service.dart index 28f1407..b8e1746 100644 --- a/apps/app_seeds/lib/services/auto_backup_service.dart +++ b/apps/app_seeds/lib/services/auto_backup_service.dart @@ -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 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 runIfDue({Duration interval = const Duration(days: 7)}) async { + Future runIfDue({Duration interval = backupInterval}) async { try { final last = await _store.lastBackupAt(); if (last != null && _now().difference(last) < interval) return false; diff --git a/apps/app_seeds/lib/ui/backup_section.dart b/apps/app_seeds/lib/ui/backup_section.dart index 09521bc..3a4dc28 100644 --- a/apps/app_seeds/lib/ui/backup_section.dart +++ b/apps/app_seeds/lib/ui/backup_section.dart @@ -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), diff --git a/apps/app_seeds/lib/ui/market_screen.dart b/apps/app_seeds/lib/ui/market_screen.dart index f66ffe1..ffe310a 100644 --- a/apps/app_seeds/lib/ui/market_screen.dart +++ b/apps/app_seeds/lib/ui/market_screen.dart @@ -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 _knownRelays = const []; + Set _selectedRelays = {}; bool _loading = true; bool _locationBusy = false; String? _locationError; @@ -670,18 +674,93 @@ class _ConfigSheetState extends State<_ConfigSheet> { Future _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 = {...SocialSettings.defaultRelays, ...saved}.toList(); _precision = await widget.settings.searchPrecision(); if (mounted) setState(() => _loading = false); } Future _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 _addServer() async { + final t = context.t; + final controller = TextEditingController(); + final url = await showDialog( + 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 _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( diff --git a/apps/app_seeds/test/ui/legal_screen_test.dart b/apps/app_seeds/test/ui/legal_screen_test.dart index 7ffa5d9..a5d9964 100644 --- a/apps/app_seeds/test/ui/legal_screen_test.dart +++ b/apps/app_seeds/test/ui/legal_screen_test.dart @@ -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 { diff --git a/apps/app_seeds/test/ui/market_screen_test.dart b/apps/app_seeds/test/ui/market_screen_test.dart index c158194..b063201 100644 --- a/apps/app_seeds/test/ui/market_screen_test.dart +++ b/apps/app_seeds/test/ui/market_screen_test.dart @@ -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(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(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); diff --git a/docs/legal/community-rules.md b/docs/legal/community-rules.md index e0c37e4..61ece57 100644 --- a/docs/legal/community-rules.md +++ b/docs/legal/community-rules.md @@ -16,8 +16,9 @@ content that can be reported and removed from the servers we operate. unless you are authorized; - **invasive or protected species** where their exchange is prohibited; - anything else that is illegal to share or sell where you or the recipient live. -3. **Seeds, not anything else.** The market is for seeds and plant reproductive - material in the spirit of the app. It is not a general classifieds board. +3. **Seeds and seedlings, not anything else.** The market is for seeds, seedlings and + other plant reproductive material (cuttings, bulbs, tubers) in the spirit of the app. + It is not a general classifieds board. 4. **Respect people.** No harassment, threats, hate, or discrimination — in offers, profiles, ratings, or messages. 5. **No spam or scams.** No repeated postings, misleading offers, phishing, or diff --git a/docs/legal/es/aviso-sobre-semillas.md b/docs/legal/es/aviso-sobre-semillas.md index 3c762fe..c5d1b90 100644 --- a/docs/legal/es/aviso-sobre-semillas.md +++ b/docs/legal/es/aviso-sobre-semillas.md @@ -1,11 +1,12 @@ -# Tane — Aviso sobre la legalidad del intercambio de semillas +# Tane — Aviso sobre la legalidad del intercambio de semillas y plantones **Versión 1.0 — 13 de julio de 2026** -Tane ayuda a conservar y compartir semillas tradicionales. Las leyes sobre semillas -varían mucho entre países, y distinguen con claridad entre **regalar o intercambiar** -semillas y **venderlas**. Este aviso es información general, no asesoramiento jurídico; -eres responsable de cumplir la ley allí donde vives y allí donde van tus semillas. +Tane ayuda a conservar y compartir semillas y plantones tradicionales. Las leyes sobre +semillas varían mucho entre países, y distinguen con claridad entre **regalar o +intercambiar** y **vender**. Este aviso es información general, no asesoramiento +jurídico; eres responsable de cumplir la ley allí donde vives y allí donde van tus +semillas o plantas. ## Regalar e intercambiar entre aficionados @@ -52,6 +53,15 @@ UE para ciertas especies (pasaporte fitosanitario). Antes de enviar semillas a o país, consulta las normas del país de destino. Los intercambios más seguros son los locales — que es justo para lo que está pensada Tane. +## Plantones y plantas vivas + +Los mismos principios valen para plantones, esquejes, bulbos y otro material vegetal +vivo — pero la planta viva suele estar regulada **con más rigor** que la semilla. Las +normas fitosanitarias, el pasaporte fitosanitario dentro de la UE y la cuarentena en la +importación se aplican a menudo a las plantas vivas aunque la semilla equivalente esté +exenta. Mantén los intercambios de plantón locales y consulta las normas fitosanitarias +antes de mover plantas vivas entre regiones o países. + ## Especies invasoras y protegidas Algunas especies no pueden intercambiarse en absoluto en ciertas regiones, bien porque diff --git a/docs/legal/es/condiciones-de-uso.md b/docs/legal/es/condiciones-de-uso.md index 6ef9b89..70c148e 100644 --- a/docs/legal/es/condiciones-de-uso.md +++ b/docs/legal/es/condiciones-de-uso.md @@ -10,7 +10,7 @@ y las [Normas de la comunidad](normas-de-la-comunidad.md). ## 1. Qué es Tane — y qué no es Tane es una **herramienta personal**: un inventario de semillas que vive en tu -dispositivo, más una forma de descubrir personas cercanas que comparten semillas. Tane +dispositivo, más una forma de descubrir personas cercanas que comparten semillas y plantones. Tane **no es un operador de mercado, ni una tienda, ni parte de ningún intercambio**: - No alojamos anuncios — las ofertas las publicas tú, con tu propia clave, en relés @@ -42,7 +42,7 @@ Eres la única persona responsable de: Tane se ofrece **"tal cual"**, sin garantía de ningún tipo, como software libre bajo la [licencia AGPL-3.0](https://www.gnu.org/licenses/agpl-3.0.html). En particular, nadie — ni Comunes, ni las personas con las que intercambias a través de la aplicación — -garantiza la **identidad, pureza, germinación, sanidad o legalidad** de ninguna semilla +garantiza la **identidad, pureza, germinación, sanidad o legalidad** de ninguna semilla o planta intercambiada. La información de cultivo que muestra la aplicación (calendarios, consejos para extraer semilla, estimaciones de viabilidad) es orientación general, no asesoramiento profesional. diff --git a/docs/legal/es/normas-de-la-comunidad.md b/docs/legal/es/normas-de-la-comunidad.md index 6a5cf6c..436229b 100644 --- a/docs/legal/es/normas-de-la-comunidad.md +++ b/docs/legal/es/normas-de-la-comunidad.md @@ -18,9 +18,9 @@ servidores que operamos. - **especies invasoras o protegidas** allí donde su intercambio esté prohibido; - cualquier otra cosa que sea ilegal compartir o vender donde vives tú o donde vive quien la recibe. -3. **Semillas, no cualquier cosa.** El mercado es para semillas y material de - reproducción vegetal, en el espíritu de la aplicación. No es un tablón de anuncios - general. +3. **Semillas y plantones, no cualquier cosa.** El mercado es para semillas, plantones + y otro material de reproducción vegetal (esquejes, bulbos, tubérculos), en el + espíritu de la aplicación. No es un tablón de anuncios general. 4. **Respeta a las personas.** Nada de acoso, amenazas, odio o discriminación — ni en ofertas, ni en perfiles, ni en valoraciones, ni en mensajes. 5. **Sin spam ni engaños.** Nada de publicaciones repetidas, ofertas engañosas, diff --git a/docs/legal/es/politica-de-privacidad.md b/docs/legal/es/politica-de-privacidad.md index 1c3940b..323cfc3 100644 --- a/docs/legal/es/politica-de-privacidad.md +++ b/docs/legal/es/politica-de-privacidad.md @@ -36,7 +36,7 @@ eliges dónde guardarlas y nunca pasan por nosotros. Nada se publica automáticamente. Cada una de estas cosas ocurre solo por tu acción explícita: -- **Ofertas.** Cuando ofreces semillas, la aplicación publica el título, la +- **Ofertas.** Cuando ofreces semillas o plantones, la aplicación publica el título, la descripción, una foto opcional, un precio opcional y una **zona aproximada** (un área de entre 2 y 80 km, según la configures — nunca tu dirección ni tu ubicación precisa). Las ofertas son públicas. diff --git a/docs/legal/privacy-policy.md b/docs/legal/privacy-policy.md index 5e84cac..6c8926b 100644 --- a/docs/legal/privacy-policy.md +++ b/docs/legal/privacy-policy.md @@ -34,7 +34,7 @@ they never pass through us. Nothing is published automatically. Each of these happens only by your explicit action: -- **Offers.** When you offer seeds, the app publishes the offer's title, description, +- **Offers.** When you offer seeds or seedlings, the app publishes the offer's title, description, optional photo, optional price, and an **approximate area** (a zone of roughly 2–80 km, as you configure it — never your address or precise location). Offers are public. - **Profile.** If you fill it in, your chosen name, bio, and avatar are public. diff --git a/docs/legal/seed-legality-notice.md b/docs/legal/seed-legality-notice.md index 81af057..4fe68fd 100644 --- a/docs/legal/seed-legality-notice.md +++ b/docs/legal/seed-legality-notice.md @@ -1,11 +1,12 @@ -# Tane — Notice on the Legality of Exchanging Seeds +# Tane — Notice on the Legality of Exchanging Seeds and Seedlings **Version 1.0 — 13 July 2026** -Tane helps people keep and share traditional seeds. Laws about seeds differ a lot -between countries, and they distinguish sharply between **giving or swapping** seeds -and **selling** them. This notice is general information, not legal advice; you are -responsible for following the law where you live and where your seeds are going. +Tane helps people keep and share traditional seeds and seedlings. Laws about seeds +differ a lot between countries, and they distinguish sharply between **giving or +swapping** and **selling**. This notice is general information, not legal advice; you +are responsible for following the law where you live and where your seeds or plants +are going. ## Gifting and swapping between amateurs @@ -47,6 +48,15 @@ individuals, and also **within** the EU for certain species (plant passport rule Before mailing seeds to another country, check the rules of the destination country. The safest exchanges are local ones — which is what Tane is designed for. +## Seedlings and live plants + +The same principles apply to seedlings, cuttings, bulbs and other live plant material — +but live plants are usually regulated **more strictly** than seed. Plant-health +(phytosanitary) rules, plant-passport requirements inside the EU, and quarantine on +import commonly apply to living plants even when the equivalent seed is exempt. Keep +seedling exchanges local, and check plant-health rules before moving live plants +between regions or across borders. + ## Invasive and protected species Some species may not be exchanged at all in some regions, either because they are diff --git a/docs/legal/terms-of-use.md b/docs/legal/terms-of-use.md index 8334f80..fac45ea 100644 --- a/docs/legal/terms-of-use.md +++ b/docs/legal/terms-of-use.md @@ -10,7 +10,7 @@ features (the market and messaging) you accept these terms and the ## 1. What Tane is — and what it is not Tane is a **personal tool**: a seed inventory that lives on your device, plus a way to -discover people near you who share seeds. Tane is **not a marketplace operator, not a +discover people near you who share seeds and seedlings. Tane is **not a marketplace operator, not a shop, and not a party to any exchange**: - We host no listings — offers are published by you, under your own key, to @@ -41,7 +41,7 @@ You are solely responsible for: Tane is provided **"as is"**, without warranty of any kind, as free software under the [AGPL-3.0 license](https://www.gnu.org/licenses/agpl-3.0.html). In particular, nobody — not Comunes, not the people you exchange with through the app — guarantees the -**identity, purity, germination, health, or legality** of any seed exchanged. Growing +**identity, purity, germination, health, or legality** of any seed or plant exchanged. Growing information shown in the app (calendars, seed-saving tips, viability estimates) is general guidance, not professional advice. diff --git a/site/content/_index.en.md b/site/content/_index.en.md index fdfdf09..4fb8556 100644 --- a/site/content/_index.en.md +++ b/site/content/_index.en.md @@ -1,9 +1,9 @@ --- title: "Your seed bank in your pocket" -description: "A local-first, decentralized app for keeping and sharing traditional seeds. Offline, encrypted, no account." +description: "A local-first, decentralized app for keeping and sharing traditional seeds and seedlings. Offline, encrypted, no account." hero: title: "Your seed bank in your pocket" - tagline: "Keep and share traditional seeds — offline, encrypted, no account." + tagline: "Keep and share traditional seeds and seedlings — offline, encrypted, no account." lead: > Every traditional seed is a letter written by thousands of generations, passed from hand to hand. Tane helps people and seed-saver collectives keep @@ -13,7 +13,7 @@ hero: pillars: - icon: "🌱" title: "Manage your bank" - body: "Add a seed with just a photo and a name — no Latin required. Note the year, how much you have, where it came from, germination tests. Search, filter, snap now and name later." + body: "Add a seed or seedling with just a photo and a name — no Latin required. Note the year, how much you have, where it came from, germination tests. Search, filter, snap now and name later." - icon: "🔒" title: "Yours, and only yours" body: "Works fully offline. No account, no server, no trackers. Everything is encrypted on your device. Keep an encrypted backup and a printed recovery sheet to restore your whole bank on a new device." @@ -30,5 +30,6 @@ values: --- Tane (種, "seed"; from *tanemaki* 種まき, "to sow seeds") is a local-first, -decentralized app for keeping and sharing traditional seeds. It works with zero -network — and connects you to a neighborly seed-sharing network when you want it. +decentralized app for keeping and sharing traditional seeds and seedlings. It +works with zero network — and connects you to a neighborly seed-sharing network +when you want it. diff --git a/site/content/_index.es.md b/site/content/_index.es.md index 277faac..fff15b4 100644 --- a/site/content/_index.es.md +++ b/site/content/_index.es.md @@ -1,9 +1,9 @@ --- title: "Tu banco de semillas en el bolsillo" -description: "Una app local-first y descentralizada para guardar y compartir semillas tradicionales. Sin conexión, cifrada, sin cuenta." +description: "Una app local-first y descentralizada para guardar y compartir semillas y plantones tradicionales. Sin conexión, cifrada, sin cuenta." hero: title: "Tu banco de semillas en el bolsillo" - tagline: "Guarda y comparte semillas tradicionales: sin conexión, cifrado, sin cuenta." + tagline: "Guarda y comparte semillas y plantones tradicionales: sin conexión, cifrado, sin cuenta." lead: > Cada semilla tradicional es una carta escrita por miles de generaciones, que pasa de mano en mano. Tane ayuda a personas y colectivos de guardianas de @@ -13,7 +13,7 @@ hero: pillars: - icon: "🌱" title: "Gestiona tu banco" - body: "Añade una semilla con solo una foto y un nombre; sin latín. Anota el año, cuánta tienes, de dónde viene, pruebas de germinación. Busca, filtra, haz la foto ahora y ponle nombre después." + body: "Añade una semilla o plantón con solo una foto y un nombre; sin latín. Anota el año, cuánta tienes, de dónde viene, pruebas de germinación. Busca, filtra, haz la foto ahora y ponle nombre después." - icon: "🔒" title: "Tuyo, y solo tuyo" body: "Funciona totalmente sin conexión. Sin cuenta, sin servidor, sin rastreadores. Todo va cifrado en tu dispositivo. Guarda una copia cifrada y una hoja de recuperación impresa para restaurar todo tu banco en un dispositivo nuevo." @@ -30,6 +30,6 @@ values: --- Tane (種, "semilla"; de *tanemaki* 種まき, "sembrar semillas") es una app -local-first y descentralizada para guardar y compartir semillas tradicionales. -Funciona sin ninguna red, y te conecta a una red vecinal de intercambio de -semillas cuando tú quieras. +local-first y descentralizada para guardar y compartir semillas y plantones +tradicionales. Funciona sin ninguna red, y te conecta a una red vecinal de +intercambio de semillas cuando tú quieras. diff --git a/site/content/legal/privacy.en.md b/site/content/legal/privacy.en.md index 5c21aa7..6d86628 100644 --- a/site/content/legal/privacy.en.md +++ b/site/content/legal/privacy.en.md @@ -40,7 +40,7 @@ they never pass through us. Nothing is published automatically. Each of these happens only by your explicit action: -- **Offers.** When you offer seeds, the app publishes the offer's title, description, +- **Offers.** When you offer seeds or seedlings, the app publishes the offer's title, description, optional photo, optional price, and an **approximate area** (a zone of roughly 2–80 km, as you configure it — never your address or precise location). Offers are public. - **Profile.** If you fill it in, your chosen name, bio, and avatar are public. diff --git a/site/content/legal/privacy.es.md b/site/content/legal/privacy.es.md index 3e89154..2cc92da 100644 --- a/site/content/legal/privacy.es.md +++ b/site/content/legal/privacy.es.md @@ -42,7 +42,7 @@ eliges dónde guardarlas y nunca pasan por nosotros. Nada se publica automáticamente. Cada una de estas cosas ocurre solo por tu acción explícita: -- **Ofertas.** Cuando ofreces semillas, la aplicación publica el título, la +- **Ofertas.** Cuando ofreces semillas o plantones, la aplicación publica el título, la descripción, una foto opcional, un precio opcional y una **zona aproximada** (un área de entre 2 y 80 km, según la configures — nunca tu dirección ni tu ubicación precisa). Las ofertas son públicas. diff --git a/site/content/legal/rules.en.md b/site/content/legal/rules.en.md index 7261fed..9c309e0 100644 --- a/site/content/legal/rules.en.md +++ b/site/content/legal/rules.en.md @@ -22,8 +22,9 @@ content that can be reported and removed from the servers we operate. unless you are authorized; - **invasive or protected species** where their exchange is prohibited; - anything else that is illegal to share or sell where you or the recipient live. -3. **Seeds, not anything else.** The market is for seeds and plant reproductive - material in the spirit of the app. It is not a general classifieds board. +3. **Seeds and seedlings, not anything else.** The market is for seeds, seedlings and + other plant reproductive material (cuttings, bulbs, tubers) in the spirit of the + app. It is not a general classifieds board. 4. **Respect people.** No harassment, threats, hate, or discrimination — in offers, profiles, ratings, or messages. 5. **No spam or scams.** No repeated postings, misleading offers, phishing, or diff --git a/site/content/legal/rules.es.md b/site/content/legal/rules.es.md index ec33f95..53d0be6 100644 --- a/site/content/legal/rules.es.md +++ b/site/content/legal/rules.es.md @@ -24,9 +24,9 @@ servidores que operamos. - **especies invasoras o protegidas** allí donde su intercambio esté prohibido; - cualquier otra cosa que sea ilegal compartir o vender donde vives tú o donde vive quien la recibe. -3. **Semillas, no cualquier cosa.** El mercado es para semillas y material de - reproducción vegetal, en el espíritu de la aplicación. No es un tablón de anuncios - general. +3. **Semillas y plantones, no cualquier cosa.** El mercado es para semillas, plantones + y otro material de reproducción vegetal (esquejes, bulbos, tubérculos), en el + espíritu de la aplicación. No es un tablón de anuncios general. 4. **Respeta a las personas.** Nada de acoso, amenazas, odio o discriminación — ni en ofertas, ni en perfiles, ni en valoraciones, ni en mensajes. 5. **Sin spam ni engaños.** Nada de publicaciones repetidas, ofertas engañosas, diff --git a/site/content/legal/seeds.en.md b/site/content/legal/seeds.en.md index b7269e1..a729278 100644 --- a/site/content/legal/seeds.en.md +++ b/site/content/legal/seeds.en.md @@ -1,5 +1,5 @@ --- -title: "Notice on the Legality of Exchanging Seeds" +title: "Notice on the Legality of Exchanging Seeds and Seedlings" slug: "seeds" weight: 4 translationKey: "legal-seeds" @@ -8,10 +8,11 @@ translationKey: "legal-seeds" **Version 1.0 — 13 July 2026** -Tane helps people keep and share traditional seeds. Laws about seeds differ a lot -between countries, and they distinguish sharply between **giving or swapping** seeds -and **selling** them. This notice is general information, not legal advice; you are -responsible for following the law where you live and where your seeds are going. +Tane helps people keep and share traditional seeds and seedlings. Laws about seeds +differ a lot between countries, and they distinguish sharply between **giving or +swapping** and **selling**. This notice is general information, not legal advice; you +are responsible for following the law where you live and where your seeds or plants +are going. ## Gifting and swapping between amateurs @@ -53,6 +54,15 @@ individuals, and also **within** the EU for certain species (plant passport rule Before mailing seeds to another country, check the rules of the destination country. The safest exchanges are local ones — which is what Tane is designed for. +## Seedlings and live plants + +The same principles apply to seedlings, cuttings, bulbs and other live plant material — +but live plants are usually regulated **more strictly** than seed. Plant-health +(phytosanitary) rules, plant-passport requirements inside the EU, and quarantine on +import commonly apply to living plants even when the equivalent seed is exempt. Keep +seedling exchanges local, and check plant-health rules before moving live plants +between regions or across borders. + ## Invasive and protected species Some species may not be exchanged at all in some regions, either because they are diff --git a/site/content/legal/seeds.es.md b/site/content/legal/seeds.es.md index 3724d12..ae0b6de 100644 --- a/site/content/legal/seeds.es.md +++ b/site/content/legal/seeds.es.md @@ -1,5 +1,5 @@ --- -title: "Aviso sobre la legalidad del intercambio de semillas" +title: "Aviso sobre la legalidad del intercambio de semillas y plantones" slug: "seeds" weight: 4 translationKey: "legal-seeds" @@ -8,10 +8,11 @@ translationKey: "legal-seeds" **Versión 1.0 — 13 de julio de 2026** -Tane ayuda a conservar y compartir semillas tradicionales. Las leyes sobre semillas -varían mucho entre países, y distinguen con claridad entre **regalar o intercambiar** -semillas y **venderlas**. Este aviso es información general, no asesoramiento jurídico; -eres responsable de cumplir la ley allí donde vives y allí donde van tus semillas. +Tane ayuda a conservar y compartir semillas y plantones tradicionales. Las leyes sobre +semillas varían mucho entre países, y distinguen con claridad entre **regalar o +intercambiar** y **vender**. Este aviso es información general, no asesoramiento +jurídico; eres responsable de cumplir la ley allí donde vives y allí donde van tus +semillas o plantas. ## Regalar e intercambiar entre aficionados @@ -58,6 +59,15 @@ UE para ciertas especies (pasaporte fitosanitario). Antes de enviar semillas a o país, consulta las normas del país de destino. Los intercambios más seguros son los locales — que es justo para lo que está pensada Tane. +## Plantones y plantas vivas + +Los mismos principios valen para plantones, esquejes, bulbos y otro material vegetal +vivo — pero la planta viva suele estar regulada **con más rigor** que la semilla. Las +normas fitosanitarias, el pasaporte fitosanitario dentro de la UE y la cuarentena en la +importación se aplican a menudo a las plantas vivas aunque la semilla equivalente esté +exenta. Mantén los intercambios de plantón locales y consulta las normas fitosanitarias +antes de mover plantas vivas entre regiones o países. + ## Especies invasoras y protegidas Algunas especies no pueden intercambiarse en absoluto en ciertas regiones, bien porque diff --git a/site/content/legal/terms.en.md b/site/content/legal/terms.en.md index faf6a69..3443b3b 100644 --- a/site/content/legal/terms.en.md +++ b/site/content/legal/terms.en.md @@ -16,7 +16,7 @@ features (the market and messaging) you accept these terms and the ## 1. What Tane is — and what it is not Tane is a **personal tool**: a seed inventory that lives on your device, plus a way to -discover people near you who share seeds. Tane is **not a marketplace operator, not a +discover people near you who share seeds and seedlings. Tane is **not a marketplace operator, not a shop, and not a party to any exchange**: - We host no listings — offers are published by you, under your own key, to @@ -47,7 +47,7 @@ You are solely responsible for: Tane is provided **"as is"**, without warranty of any kind, as free software under the [AGPL-3.0 license](https://www.gnu.org/licenses/agpl-3.0.html). In particular, nobody — not Comunes, not the people you exchange with through the app — guarantees the -**identity, purity, germination, health, or legality** of any seed exchanged. Growing +**identity, purity, germination, health, or legality** of any seed or plant exchanged. Growing information shown in the app (calendars, seed-saving tips, viability estimates) is general guidance, not professional advice. diff --git a/site/content/legal/terms.es.md b/site/content/legal/terms.es.md index e3c11d6..e9f955b 100644 --- a/site/content/legal/terms.es.md +++ b/site/content/legal/terms.es.md @@ -16,7 +16,7 @@ y las [Normas de la comunidad](normas-de-la-comunidad.md). ## 1. Qué es Tane — y qué no es Tane es una **herramienta personal**: un inventario de semillas que vive en tu -dispositivo, más una forma de descubrir personas cercanas que comparten semillas. Tane +dispositivo, más una forma de descubrir personas cercanas que comparten semillas y plantones. Tane **no es un operador de mercado, ni una tienda, ni parte de ningún intercambio**: - No alojamos anuncios — las ofertas las publicas tú, con tu propia clave, en relés @@ -49,7 +49,7 @@ Tane se ofrece **"tal cual"**, sin garantía de ningún tipo, como software libr [licencia AGPL-3.0](https://www.gnu.org/licenses/agpl-3.0.html). En particular, nadie — ni Comunes, ni las personas con las que intercambias a través de la aplicación — garantiza la **identidad, pureza, germinación, sanidad o legalidad** de ninguna semilla -intercambiada. La información de cultivo que muestra la aplicación (calendarios, +o planta intercambiada. La información de cultivo que muestra la aplicación (calendarios, consejos para extraer semilla, estimaciones de viabilidad) es orientación general, no asesoramiento profesional.