Compare commits
No commits in common. "ea17ced152ddcc0ad9ddbcc1800c6dcfd169801d" and "05947e03eee8490ddb458ba8be9894291d34a6db" have entirely different histories.
ea17ced152
...
05947e03ee
|
Before Width: | Height: | Size: 349 KiB After Width: | Height: | Size: 163 KiB |
|
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 389 KiB After Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 348 KiB After Width: | Height: | Size: 165 KiB |
|
Before Width: | Height: | Size: 178 KiB After Width: | Height: | Size: 179 KiB |
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 396 KiB After Width: | Height: | Size: 184 KiB |
|
|
@ -105,8 +105,8 @@
|
|||
"backup": {
|
||||
"title": "Copia de seguranza",
|
||||
"autoBackupTitle": "Copies automátiques",
|
||||
"autoBackupLast": "Cabera copia'l {date} · cada {days} díes",
|
||||
"autoBackupNone": "Guárdase una copia automáticamente cada {days} díes",
|
||||
"autoBackupLast": "Cabera copia guardada'l {date}",
|
||||
"autoBackupNone": "Guárdase una copia automáticamente en segundu planu",
|
||||
"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,10 +521,8 @@
|
|||
"areaCodeLabel": "Códigu de zona",
|
||||
"areaCodeHint": "Un códigu curtiu como sp3e9 — non un nome de llugar",
|
||||
"serversLabel": "Servidores de la comunidá",
|
||||
"serversHelp": "Escueyi qué servidores usar. Déxalo asina si nun sabes.",
|
||||
"serversHelp": "Una direición per llinia (wss://…). 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",
|
||||
|
|
@ -684,8 +682,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 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.",
|
||||
"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.",
|
||||
"readFull": "Lleer los documentos completos na web"
|
||||
},
|
||||
"marketGate": {
|
||||
|
|
|
|||
|
|
@ -106,8 +106,8 @@
|
|||
"backup": {
|
||||
"title": "Sicherung und Wiederherstellung",
|
||||
"autoBackupTitle": "Automatische Sicherungen",
|
||||
"autoBackupLast": "Letzte Sicherung {date} · alle {days} Tage",
|
||||
"autoBackupNone": "Eine Kopie wird automatisch alle {days} Tage gespeichert",
|
||||
"autoBackupLast": "Letzte Sicherung {date}",
|
||||
"autoBackupNone": "Eine Kopie wird automatisch im Hintergrund 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,10 +524,8 @@
|
|||
"areaCodeLabel": "Gebiets-Code",
|
||||
"areaCodeHint": "Ein kurzer Code wie sp3e9 - kein Ortsname",
|
||||
"serversLabel": "Gemeinschaftsserver",
|
||||
"serversHelp": "Wähle, welche Server verwendet werden. Lass die Standardwerte, wenn du dir nicht sicher bist.",
|
||||
"serversHelp": "Eine Adresse pro Zeile (wss://…). 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",
|
||||
|
|
@ -680,8 +678,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 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.",
|
||||
"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.",
|
||||
"readFull": "Lese die vollständigen Dokumente online"
|
||||
},
|
||||
"marketGate": {
|
||||
|
|
|
|||
|
|
@ -106,8 +106,8 @@
|
|||
"backup": {
|
||||
"title": "Backup & restore",
|
||||
"autoBackupTitle": "Automatic backups",
|
||||
"autoBackupLast": "Last copy saved {date} · every {days} days",
|
||||
"autoBackupNone": "A copy is kept automatically every {days} days",
|
||||
"autoBackupLast": "Last copy saved {date}",
|
||||
"autoBackupNone": "A copy is kept automatically in the background",
|
||||
"exportJson": "Save a backup",
|
||||
"exportJsonSubtitle": "A complete copy to keep safe, restore later or move to another device",
|
||||
"importJson": "Restore a backup",
|
||||
|
|
@ -524,10 +524,8 @@
|
|||
"areaCodeLabel": "Area code",
|
||||
"areaCodeHint": "A short code like sp3e9 — not a place name",
|
||||
"serversLabel": "Community servers",
|
||||
"serversHelp": "Choose which servers to use. Leave the defaults if unsure.",
|
||||
"serversHelp": "One address per line (wss://…). Leave the defaults if unsure.",
|
||||
"serversAdvanced": "Add another server",
|
||||
"serverAddress": "Server address",
|
||||
"serverInvalid": "Enter a valid address (wss://…)",
|
||||
"save": "Save",
|
||||
"saved": "Saved",
|
||||
"wanted": "Wanted",
|
||||
|
|
@ -710,8 +708,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 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.",
|
||||
"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.",
|
||||
"readFull": "Read the full documents online"
|
||||
},
|
||||
"marketGate": {
|
||||
|
|
|
|||
|
|
@ -105,8 +105,8 @@
|
|||
"backup": {
|
||||
"title": "Copia de seguridad",
|
||||
"autoBackupTitle": "Copias automáticas",
|
||||
"autoBackupLast": "Última copia el {date} · cada {days} días",
|
||||
"autoBackupNone": "Se guarda una copia automáticamente cada {days} días",
|
||||
"autoBackupLast": "Última copia guardada el {date}",
|
||||
"autoBackupNone": "Se guarda una copia automáticamente en segundo plano",
|
||||
"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,10 +523,8 @@
|
|||
"areaCodeLabel": "Código de zona",
|
||||
"areaCodeHint": "Un código corto como sp3e9 — no un nombre de lugar",
|
||||
"serversLabel": "Servidores de la comunidad",
|
||||
"serversHelp": "Elige qué servidores usar. Déjalo así si no sabes.",
|
||||
"serversHelp": "Una dirección por línea (wss://…). 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",
|
||||
|
|
@ -709,8 +707,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 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.",
|
||||
"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.",
|
||||
"readFull": "Leer los documentos completos en la web"
|
||||
},
|
||||
"marketGate": {
|
||||
|
|
|
|||
|
|
@ -106,8 +106,8 @@
|
|||
"backup": {
|
||||
"title": "Sauvegarde & restauration",
|
||||
"autoBackupTitle": "Sauvegardes automatiques",
|
||||
"autoBackupLast": "Dernière copie {date} · tous les {days} jours",
|
||||
"autoBackupNone": "Une copie est conservée automatiquement tous les {days} jours",
|
||||
"autoBackupLast": "Dernière copie sauvegardée {date}",
|
||||
"autoBackupNone": "Une copie est conservée automatiquement en arrière-plan",
|
||||
"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,10 +524,8 @@
|
|||
"areaCodeLabel": "Code de zone",
|
||||
"areaCodeHint": "Un code court comme sp3e9 — pas un nom de lieu",
|
||||
"serversLabel": "Serveurs communautaires",
|
||||
"serversHelp": "Choisissez les serveurs à utiliser. Laissez les valeurs par défaut si vous n'êtes pas sûr.",
|
||||
"serversHelp": "Une adresse par ligne (wss://…). 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é",
|
||||
|
|
@ -680,8 +678,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 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.",
|
||||
"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.",
|
||||
"readFull": "Lire les documents complets en ligne"
|
||||
},
|
||||
"marketGate": {
|
||||
|
|
|
|||
|
|
@ -106,8 +106,8 @@
|
|||
"backup": {
|
||||
"title": "Cópia de segurança",
|
||||
"autoBackupTitle": "Cópias automáticas",
|
||||
"autoBackupLast": "Última cópia em {date} · a cada {days} dias",
|
||||
"autoBackupNone": "Uma cópia é guardada automaticamente a cada {days} dias",
|
||||
"autoBackupLast": "Última cópia guardada em {date}",
|
||||
"autoBackupNone": "Uma cópia é guardada automaticamente em segundo plano",
|
||||
"exportJson": "Guardar uma cópia de segurança",
|
||||
"exportJsonSubtitle": "Uma cópia completa para guardar em segurança, restaurar depois ou levar para outro aparelho",
|
||||
"importJson": "Restaurar uma cópia",
|
||||
|
|
@ -520,10 +520,8 @@
|
|||
"areaCodeLabel": "Código de zona",
|
||||
"areaCodeHint": "Um código curto como sp3e9 — não um nome de lugar",
|
||||
"serversLabel": "Servidores da comunidade",
|
||||
"serversHelp": "Escolhe que servidores usar. Deixa assim se não souberes.",
|
||||
"serversHelp": "Um endereço por linha (wss://…). 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",
|
||||
|
|
@ -683,8 +681,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 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.",
|
||||
"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.",
|
||||
"readFull": "Ler os documentos completos na web"
|
||||
},
|
||||
"marketGate": {
|
||||
|
|
|
|||
|
|
@ -4,9 +4,9 @@
|
|||
/// To regenerate, run: `dart run slang`
|
||||
///
|
||||
/// Locales: 7
|
||||
/// Strings: 3454 (493 per locale)
|
||||
/// Strings: 3442 (491 per locale)
|
||||
///
|
||||
/// Built on 2026-07-15 at 13:17 UTC
|
||||
/// Built on 2026-07-14 at 09:22 UTC
|
||||
|
||||
// coverage:ignore-file
|
||||
// ignore_for_file: type=lint, unused_import
|
||||
|
|
|
|||
|
|
@ -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, 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 autoBackupLast({required Object date}) => 'Cabera copia guardada\'l ${date}';
|
||||
@override String get autoBackupNone => 'Guárdase una copia automáticamente en segundu planu';
|
||||
@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,10 +771,8 @@ 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 => 'Escueyi qué servidores usar. Déxalo asina si nun sabes.';
|
||||
@override String get serversHelp => 'Una direición per llinia (wss://…). 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';
|
||||
|
|
@ -1011,8 +1009,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 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 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 readFull => 'Lleer los documentos completos na web';
|
||||
}
|
||||
|
||||
|
|
@ -1497,8 +1495,8 @@ extension on TranslationsAst {
|
|||
'settings.aboutOpen' => 'Tocante a Tane',
|
||||
'backup.title' => 'Copia de seguranza',
|
||||
'backup.autoBackupTitle' => 'Copies automátiques',
|
||||
'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.autoBackupLast' => ({required Object date}) => 'Cabera copia guardada\'l ${date}',
|
||||
'backup.autoBackupNone' => 'Guárdase una copia automáticamente en segundu planu',
|
||||
'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',
|
||||
|
|
@ -1803,10 +1801,8 @@ 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' => 'Escueyi qué servidores usar. Déxalo asina si nun sabes.',
|
||||
'market.serversHelp' => 'Una direición per llinia (wss://…). 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',
|
||||
|
|
@ -1926,10 +1922,10 @@ extension on TranslationsAst {
|
|||
'sale.add' => 'Rexistrar venta',
|
||||
'sale.empty' => 'Entá nun hai ventes. Anota equí lo que vendes o merques.',
|
||||
'sale.iSold' => 'Vendí',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'sale.iBought' => 'Mercué',
|
||||
'sale.direction' => '¿Vendes o merques?',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'sale.counterparty' => '¿Con quién?',
|
||||
'sale.counterpartyHint' => 'Una persona o un coleutivu (opcional)',
|
||||
'sale.amount' => 'Importe',
|
||||
|
|
@ -1946,8 +1942,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 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.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.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:',
|
||||
|
|
|
|||
|
|
@ -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, 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 autoBackupLast({required Object date}) => 'Letzte Sicherung ${date}';
|
||||
@override String get autoBackupNone => 'Eine Kopie wird automatisch im Hintergrund 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,10 +774,8 @@ 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 => 'Wähle, welche Server verwendet werden. Lass die Standardwerte, wenn du dir nicht sicher bist.';
|
||||
@override String get serversHelp => 'Eine Adresse pro Zeile (wss://…). 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';
|
||||
|
|
@ -1007,8 +1005,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 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 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 readFull => 'Lese die vollständigen Dokumente online';
|
||||
}
|
||||
|
||||
|
|
@ -1494,8 +1492,8 @@ extension on TranslationsDe {
|
|||
'settings.langJa' => '日本語',
|
||||
'backup.title' => 'Sicherung und Wiederherstellung',
|
||||
'backup.autoBackupTitle' => 'Automatische Sicherungen',
|
||||
'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.autoBackupLast' => ({required Object date}) => 'Letzte Sicherung ${date}',
|
||||
'backup.autoBackupNone' => 'Eine Kopie wird automatisch im Hintergrund 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',
|
||||
|
|
@ -1802,10 +1800,8 @@ extension on TranslationsDe {
|
|||
'market.areaCodeLabel' => 'Gebiets-Code',
|
||||
'market.areaCodeHint' => 'Ein kurzer Code wie sp3e9 - kein Ortsname',
|
||||
'market.serversLabel' => 'Gemeinschaftsserver',
|
||||
'market.serversHelp' => 'Wähle, welche Server verwendet werden. Lass die Standardwerte, wenn du dir nicht sicher bist.',
|
||||
'market.serversHelp' => 'Eine Adresse pro Zeile (wss://…). 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',
|
||||
|
|
@ -1922,10 +1918,10 @@ extension on TranslationsDe {
|
|||
'sale.direction' => 'Verkauft oder gekauft?',
|
||||
'sale.counterparty' => 'Mit wem?',
|
||||
'sale.counterpartyHint' => 'Eine Person oder ein Kollektiv (optional)',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'sale.amount' => 'Betrag',
|
||||
'sale.currency' => 'Währung',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'sale.currencyHint' => '€, Ğ1, Stunden… (optional)',
|
||||
'sale.hours' => 'Stunden',
|
||||
'sale.note' => 'Notiz (optional)',
|
||||
|
|
@ -1938,8 +1934,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 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.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.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:',
|
||||
|
|
|
|||
|
|
@ -451,11 +451,11 @@ class Translations$backup$en {
|
|||
/// en: 'Automatic backups'
|
||||
String get autoBackupTitle => 'Automatic backups';
|
||||
|
||||
/// en: 'Last copy saved {date} · every {days} days'
|
||||
String autoBackupLast({required Object date, required Object days}) => 'Last copy saved ${date} · every ${days} days';
|
||||
/// en: 'Last copy saved {date}'
|
||||
String autoBackupLast({required Object date}) => 'Last copy saved ${date}';
|
||||
|
||||
/// en: 'A copy is kept automatically every {days} days'
|
||||
String autoBackupNone({required Object days}) => 'A copy is kept automatically every ${days} days';
|
||||
/// en: 'A copy is kept automatically in the background'
|
||||
String get autoBackupNone => 'A copy is kept automatically in the background';
|
||||
|
||||
/// en: 'Save a backup'
|
||||
String get exportJson => 'Save a backup';
|
||||
|
|
@ -1423,18 +1423,12 @@ class Translations$market$en {
|
|||
/// en: 'Community servers'
|
||||
String get serversLabel => 'Community servers';
|
||||
|
||||
/// 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: 'One address per line (wss://…). Leave the defaults if unsure.'
|
||||
String get serversHelp => 'One address per line (wss://…). 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';
|
||||
|
||||
|
|
@ -2014,11 +2008,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 and seedlings'
|
||||
String get seedsTitle => 'About sharing seeds and seedlings';
|
||||
/// en: 'About sharing seeds'
|
||||
String get seedsTitle => 'About sharing seeds';
|
||||
|
||||
/// 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: '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: 'Read the full documents online'
|
||||
String get readFull => 'Read the full documents online';
|
||||
|
|
@ -2682,8 +2676,8 @@ extension on Translations {
|
|||
'settings.aboutOpen' => 'About Tane',
|
||||
'backup.title' => 'Backup & restore',
|
||||
'backup.autoBackupTitle' => 'Automatic backups',
|
||||
'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.autoBackupLast' => ({required Object date}) => 'Last copy saved ${date}',
|
||||
'backup.autoBackupNone' => 'A copy is kept automatically in the background',
|
||||
'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',
|
||||
|
|
@ -2990,10 +2984,8 @@ extension on Translations {
|
|||
'market.areaCodeLabel' => 'Area code',
|
||||
'market.areaCodeHint' => 'A short code like sp3e9 — not a place name',
|
||||
'market.serversLabel' => 'Community servers',
|
||||
'market.serversHelp' => 'Choose which servers to use. Leave the defaults if unsure.',
|
||||
'market.serversHelp' => 'One address per line (wss://…). 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',
|
||||
|
|
@ -3110,10 +3102,10 @@ extension on Translations {
|
|||
'plantare.returnOther' => 'Something else',
|
||||
'plantare.workHoursLabel' => 'How many hours?',
|
||||
'plantare.proposalsSection' => 'Waiting for your reply',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'plantare.incomingFrom' => ({required Object name}) => '${name} proposes a Plantaré',
|
||||
'plantare.accept' => 'Accept & sign',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'plantare.declineAction' => 'Decline',
|
||||
'plantare.declineReasonHint' => 'Reason (optional)',
|
||||
'plantare.acceptedToast' => 'Signed — you both hold it now',
|
||||
|
|
@ -3156,8 +3148,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 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.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.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:',
|
||||
|
|
|
|||
|
|
@ -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, 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 autoBackupLast({required Object date}) => 'Última copia guardada el ${date}';
|
||||
@override String get autoBackupNone => 'Se guarda una copia automáticamente en segundo plano';
|
||||
@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,10 +773,8 @@ 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 => 'Elige qué servidores usar. Déjalo así si no sabes.';
|
||||
@override String get serversHelp => 'Una dirección por línea (wss://…). 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';
|
||||
|
|
@ -1036,8 +1034,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 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 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 readFull => 'Leer los documentos completos en la web';
|
||||
}
|
||||
|
||||
|
|
@ -1522,8 +1520,8 @@ extension on TranslationsEs {
|
|||
'settings.aboutOpen' => 'Acerca de Tane',
|
||||
'backup.title' => 'Copia de seguridad',
|
||||
'backup.autoBackupTitle' => 'Copias automáticas',
|
||||
'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.autoBackupLast' => ({required Object date}) => 'Última copia guardada el ${date}',
|
||||
'backup.autoBackupNone' => 'Se guarda una copia automáticamente en segundo plano',
|
||||
'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',
|
||||
|
|
@ -1830,10 +1828,8 @@ 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' => 'Elige qué servidores usar. Déjalo así si no sabes.',
|
||||
'market.serversHelp' => 'Una dirección por línea (wss://…). 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',
|
||||
|
|
@ -1951,10 +1947,10 @@ extension on TranslationsEs {
|
|||
'plantare.workHoursLabel' => '¿Cuántas horas?',
|
||||
'plantare.proposalsSection' => 'Esperando tu respuesta',
|
||||
'plantare.incomingFrom' => ({required Object name}) => '${name} te propone un Plantaré',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'plantare.accept' => 'Aceptar y firmar',
|
||||
'plantare.declineAction' => 'Rechazar',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'plantare.declineReasonHint' => 'Motivo (opcional)',
|
||||
'plantare.acceptedToast' => 'Firmado — ahora lo guardáis los dos',
|
||||
'plantare.declinedToast' => 'Rechazado',
|
||||
|
|
@ -1996,8 +1992,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 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.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.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:',
|
||||
|
|
|
|||
|
|
@ -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, 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 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 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,10 +774,8 @@ 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 => 'Choisissez les serveurs à utiliser. Laissez les valeurs par défaut si vous n\'êtes pas sûr.';
|
||||
@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 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é';
|
||||
|
|
@ -1007,8 +1005,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 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 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 readFull => 'Lire les documents complets en ligne';
|
||||
}
|
||||
|
||||
|
|
@ -1494,8 +1492,8 @@ extension on TranslationsFr {
|
|||
'settings.aboutOpen' => 'À propos de Tane',
|
||||
'backup.title' => 'Sauvegarde & restauration',
|
||||
'backup.autoBackupTitle' => 'Sauvegardes automatiques',
|
||||
'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.autoBackupLast' => ({required Object date}) => 'Dernière copie sauvegardée ${date}',
|
||||
'backup.autoBackupNone' => 'Une copie est conservée automatiquement en arrière-plan',
|
||||
'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',
|
||||
|
|
@ -1802,10 +1800,8 @@ 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' => 'Choisissez les serveurs à utiliser. Laissez les valeurs par défaut si vous n\'êtes pas sûr.',
|
||||
'market.serversHelp' => 'Une adresse par ligne (wss://…). 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é',
|
||||
|
|
@ -1922,10 +1918,10 @@ extension on TranslationsFr {
|
|||
'sale.direction' => 'Vendu ou acheté ?',
|
||||
'sale.counterparty' => 'Avec qui ?',
|
||||
'sale.counterpartyHint' => 'Une personne ou un collectif (optionnel)',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'sale.amount' => 'Montant',
|
||||
'sale.currency' => 'Monnaie',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'sale.currencyHint' => '€, Ğ1, heures… (optionnel)',
|
||||
'sale.hours' => 'heures',
|
||||
'sale.note' => 'Note (optionnel)',
|
||||
|
|
@ -1938,8 +1934,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 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.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.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 :',
|
||||
|
|
|
|||
|
|
@ -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, 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 autoBackupLast({required Object date}) => 'Última cópia guardada em ${date}';
|
||||
@override String get autoBackupNone => 'Uma cópia é guardada automaticamente em segundo plano';
|
||||
@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,10 +770,8 @@ 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 => 'Escolhe que servidores usar. Deixa assim se não souberes.';
|
||||
@override String get serversHelp => 'Um endereço por linha (wss://…). 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';
|
||||
|
|
@ -1010,8 +1008,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 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 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 readFull => 'Ler os documentos completos na web';
|
||||
}
|
||||
|
||||
|
|
@ -1497,8 +1495,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, 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.autoBackupLast' => ({required Object date}) => 'Última cópia guardada em ${date}',
|
||||
'backup.autoBackupNone' => 'Uma cópia é guardada automaticamente em segundo plano',
|
||||
'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',
|
||||
|
|
@ -1801,10 +1799,8 @@ 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' => 'Escolhe que servidores usar. Deixa assim se não souberes.',
|
||||
'market.serversHelp' => 'Um endereço por linha (wss://…). 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',
|
||||
|
|
@ -1925,10 +1921,10 @@ extension on TranslationsPt {
|
|||
'sale.empty' => 'Ainda não há vendas. Anota aqui o que vendes ou compras.',
|
||||
'sale.iSold' => 'Vendi',
|
||||
'sale.iBought' => 'Comprei',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'sale.direction' => 'Vendes ou compras?',
|
||||
'sale.counterparty' => 'Com quem?',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'sale.counterpartyHint' => 'Uma pessoa ou um coletivo (opcional)',
|
||||
'sale.amount' => 'Montante',
|
||||
'sale.currency' => 'Moeda',
|
||||
|
|
@ -1944,8 +1940,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 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.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.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:',
|
||||
|
|
|
|||
|
|
@ -36,11 +36,6 @@ class AutoBackupService {
|
|||
/// so a corrupt copy can't overwrite the only backup.
|
||||
static const _keep = 3;
|
||||
|
||||
/// How often an automatic copy is made. The single source of truth for both
|
||||
/// the schedule ([runIfDue]'s default) and the reassurance copy in Settings,
|
||||
/// so the two can never drift apart.
|
||||
static const Duration backupInterval = Duration(days: 7);
|
||||
|
||||
/// When the last automatic copy was made, or null if none has run yet. For a
|
||||
/// reassurance line in Settings.
|
||||
Future<DateTime?> lastBackupAt() => _store.lastBackupAt();
|
||||
|
|
@ -48,7 +43,7 @@ class AutoBackupService {
|
|||
/// Makes a fresh copy when at least [interval] has passed since the last one.
|
||||
/// Returns true when it wrote a copy, false when not due (or on any failure —
|
||||
/// a backup must never crash startup or the move to the background).
|
||||
Future<bool> runIfDue({Duration interval = backupInterval}) async {
|
||||
Future<bool> runIfDue({Duration interval = const Duration(days: 7)}) async {
|
||||
try {
|
||||
final last = await _store.lastBackupAt();
|
||||
if (last != null && _now().difference(last) < interval) return false;
|
||||
|
|
|
|||
|
|
@ -357,9 +357,8 @@ 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(days: days)
|
||||
? t.backup.autoBackupNone
|
||||
: t.backup.autoBackupLast(
|
||||
// Format via the Localizations locale, not the raw app locale:
|
||||
// Asturian (`ast`) has no `intl` date symbols and would throw,
|
||||
|
|
@ -367,7 +366,6 @@ class _AutoBackupTileState extends State<_AutoBackupTile> {
|
|||
date: DateFormat.yMMMd(
|
||||
Localizations.localeOf(context).languageCode,
|
||||
).format(last),
|
||||
days: days,
|
||||
);
|
||||
return ListTile(
|
||||
leading: const Icon(Icons.shield_outlined),
|
||||
|
|
|
|||
|
|
@ -27,10 +27,12 @@ class HomeScreen extends StatelessWidget {
|
|||
// Badge the hamburger so unread messages are visible from home, without
|
||||
// opening the drawer. Total count across conversations.
|
||||
leading: Builder(
|
||||
builder: (context) => IconButton(
|
||||
icon: const UnreadBadge(child: Icon(Icons.menu)),
|
||||
tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip,
|
||||
onPressed: () => Scaffold.of(context).openDrawer(),
|
||||
builder: (context) => UnreadBadge(
|
||||
child: IconButton(
|
||||
icon: const Icon(Icons.menu),
|
||||
tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip,
|
||||
onPressed: () => Scaffold.of(context).openDrawer(),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -656,11 +656,7 @@ class _ConfigSheet extends StatefulWidget {
|
|||
|
||||
class _ConfigSheetState extends State<_ConfigSheet> {
|
||||
final _area = TextEditingController();
|
||||
|
||||
/// Servers offered as toggles: the built-in defaults plus any the user has
|
||||
/// saved or added. [_selectedRelays] is the subset currently switched on.
|
||||
List<String> _knownRelays = const [];
|
||||
Set<String> _selectedRelays = <String>{};
|
||||
final _servers = TextEditingController();
|
||||
bool _loading = true;
|
||||
bool _locationBusy = false;
|
||||
String? _locationError;
|
||||
|
|
@ -674,93 +670,18 @@ class _ConfigSheetState extends State<_ConfigSheet> {
|
|||
|
||||
Future<void> _load() async {
|
||||
_area.text = await widget.settings.areaGeohash();
|
||||
final saved = await widget.settings.relayUrls();
|
||||
_selectedRelays = saved.toSet();
|
||||
// Show the defaults plus anything the user saved, defaults first.
|
||||
_knownRelays = <String>{...SocialSettings.defaultRelays, ...saved}.toList();
|
||||
_servers.text = (await widget.settings.relayUrls()).join('\n');
|
||||
_precision = await widget.settings.searchPrecision();
|
||||
if (mounted) setState(() => _loading = false);
|
||||
}
|
||||
|
||||
Future<void> _save() async {
|
||||
await widget.settings.setAreaGeohash(_area.text);
|
||||
await widget.settings.setRelayUrls(_selectedRelays.toList());
|
||||
await widget.settings.setRelayUrls(_servers.text.split('\n'));
|
||||
await widget.settings.setSearchPrecision(_precision);
|
||||
if (mounted) Navigator.of(context).pop(true);
|
||||
}
|
||||
|
||||
/// The human-friendly server name — just the host, no `wss://` scheme or
|
||||
/// trailing slash (jargon stays out of the UI).
|
||||
String _relayLabel(String url) => url
|
||||
.trim()
|
||||
.replaceFirst(RegExp(r'^wss?://'), '')
|
||||
.replaceFirst(RegExp(r'/+$'), '');
|
||||
|
||||
/// Coerces user input into a `wss://` address, or null if it can't be one.
|
||||
/// Bare hosts get a `wss://` prefix so people needn't type the scheme.
|
||||
String? _normalizeRelay(String raw) {
|
||||
var s = raw.trim();
|
||||
if (s.isEmpty) return null;
|
||||
if (!s.contains('://')) s = 'wss://$s';
|
||||
final uri = Uri.tryParse(s);
|
||||
if (uri == null ||
|
||||
(uri.scheme != 'wss' && uri.scheme != 'ws') ||
|
||||
uri.host.isEmpty) {
|
||||
return null;
|
||||
}
|
||||
return s.replaceFirst(RegExp(r'/+$'), '');
|
||||
}
|
||||
|
||||
Future<void> _addServer() async {
|
||||
final t = context.t;
|
||||
final controller = TextEditingController();
|
||||
final url = await showDialog<String>(
|
||||
context: context,
|
||||
builder: (dialogContext) {
|
||||
String? error;
|
||||
return StatefulBuilder(
|
||||
builder: (dialogContext, setLocal) => AlertDialog(
|
||||
title: Text(t.market.serversAdvanced),
|
||||
content: TextField(
|
||||
key: const Key('market.serverField'),
|
||||
controller: controller,
|
||||
autofocus: true,
|
||||
keyboardType: TextInputType.url,
|
||||
decoration: InputDecoration(
|
||||
labelText: t.market.serverAddress,
|
||||
hintText: 'wss://…',
|
||||
errorText: error,
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(dialogContext),
|
||||
child: Text(t.common.cancel),
|
||||
),
|
||||
FilledButton(
|
||||
key: const Key('market.serverConfirm'),
|
||||
onPressed: () {
|
||||
final value = _normalizeRelay(controller.text);
|
||||
if (value == null) {
|
||||
setLocal(() => error = t.market.serverInvalid);
|
||||
} else {
|
||||
Navigator.pop(dialogContext, value);
|
||||
}
|
||||
},
|
||||
child: Text(t.market.save),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
if (url == null || !mounted) return;
|
||||
setState(() {
|
||||
if (!_knownRelays.contains(url)) _knownRelays = [..._knownRelays, url];
|
||||
_selectedRelays.add(url);
|
||||
});
|
||||
}
|
||||
|
||||
/// Fills the area from the device's approximate location, reduced to a coarse
|
||||
/// geohash so no precise fix is stored.
|
||||
Future<void> _useLocation() async {
|
||||
|
|
@ -785,6 +706,7 @@ class _ConfigSheetState extends State<_ConfigSheet> {
|
|||
@override
|
||||
void dispose() {
|
||||
_area.dispose();
|
||||
_servers.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
|
@ -913,46 +835,15 @@ class _ConfigSheetState extends State<_ConfigSheet> {
|
|||
),
|
||||
),
|
||||
const SizedBox(height: 14),
|
||||
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),
|
||||
TextField(
|
||||
key: const Key('market.servers'),
|
||||
controller: _servers,
|
||||
minLines: 1,
|
||||
maxLines: 3,
|
||||
decoration: InputDecoration(
|
||||
labelText: t.market.serversLabel,
|
||||
helperText: t.market.serversHelp,
|
||||
helperMaxLines: 2,
|
||||
),
|
||||
),
|
||||
ListTile(
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
|||
|
||||
import '../di/injector.dart';
|
||||
import '../services/unread_service.dart';
|
||||
import 'theme.dart';
|
||||
|
||||
/// Wraps [child] with a small live unread-count badge. It listens to the
|
||||
/// app-wide [UnreadService] and rebuilds whenever a count changes: on a new
|
||||
|
|
@ -78,7 +79,7 @@ class _UnreadBadgeState extends State<UnreadBadge> {
|
|||
return Badge(
|
||||
isLabelVisible: _count > 0,
|
||||
label: Text('$_count'),
|
||||
backgroundColor: Theme.of(context).colorScheme.error,
|
||||
backgroundColor: seedGreen,
|
||||
child: widget.child,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,13 +0,0 @@
|
|||
# Example inventory photos — credits
|
||||
|
||||
CC0 / public-domain images used as example variety photos in the screenshot
|
||||
harness only (to generate store/landing screenshots). They are **not** bundled
|
||||
in the app. Square-cropped and re-compressed from the originals below.
|
||||
|
||||
| Fixture | Subject | Author | License | Source |
|
||||
|---|---|---|---|---|
|
||||
| maize.jpg | Red & white flint corn | vjrj (Tane project) | own photo | — |
|
||||
| buckwheat.jpg | Fagopyrum esculentum (buckwheat) | Daderot | CC0 | https://commons.wikimedia.org/wiki/File:Fagopyrum_esculentum_-_Osaka_Museum_of_Natural_History_-_DSC07737.JPG |
|
||||
| tomato.jpg | Ripe red tomatoes | Glenda Green | CC0 | https://commons.wikimedia.org/wiki/File:Ripe_Red_Tomatoes.jpg |
|
||||
| pepper.jpg | Capsicum annuum (Guajillo), dried | ZooFari | Public domain | https://commons.wikimedia.org/wiki/File:Capsicum_annuum_(Guajillo)_-_dried.jpg |
|
||||
| raspberry.jpg | Rubus idaeus (raspberry) | Vassil | Public domain | https://commons.wikimedia.org/wiki/File:Framboise_Margy_3.jpg |
|
||||
|
Before Width: | Height: | Size: 162 KiB |
|
Before Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 128 KiB |
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 400 KiB After Width: | Height: | Size: 180 KiB |
|
Before Width: | Height: | Size: 344 KiB After Width: | Height: | Size: 164 KiB |
|
Before Width: | Height: | Size: 186 KiB After Width: | Height: | Size: 185 KiB |
|
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 389 KiB After Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 349 KiB After Width: | Height: | Size: 163 KiB |
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 396 KiB After Width: | Height: | Size: 184 KiB |
|
Before Width: | Height: | Size: 348 KiB After Width: | Height: | Size: 165 KiB |
|
Before Width: | Height: | Size: 178 KiB After Width: | Height: | Size: 179 KiB |
|
Before Width: | Height: | Size: 136 KiB After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 402 KiB After Width: | Height: | Size: 181 KiB |
|
Before Width: | Height: | Size: 354 KiB After Width: | Height: | Size: 167 KiB |
|
Before Width: | Height: | Size: 183 KiB After Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 142 KiB |
|
Before Width: | Height: | Size: 389 KiB After Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 349 KiB After Width: | Height: | Size: 163 KiB |
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 399 KiB After Width: | Height: | Size: 185 KiB |
|
Before Width: | Height: | Size: 350 KiB After Width: | Height: | Size: 166 KiB |
|
Before Width: | Height: | Size: 174 KiB After Width: | Height: | Size: 172 KiB |
|
Before Width: | Height: | Size: 351 KiB After Width: | Height: | Size: 165 KiB |
|
|
@ -1,6 +1,4 @@
|
|||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:commons_core/commons_core.dart';
|
||||
import 'package:drift/drift.dart' show Value;
|
||||
|
|
@ -71,31 +69,6 @@ Future<void> loadScreenshotFonts() async {
|
|||
_fontsLoaded = true;
|
||||
}
|
||||
|
||||
/// Localized sample labels so each screenshot reads in its own language. Family
|
||||
/// names stay botanical Latin; only the human variety/offer names are localized.
|
||||
/// English is the fallback (e.g. for `ja`, whose UI is itself partly English).
|
||||
const sampleLabels = <String, Map<AppLocale, String>>{
|
||||
// Inventory varieties
|
||||
'maize': {AppLocale.en: 'Painted flint corn', AppLocale.es: 'Maíz rojo', AppLocale.fr: 'Maïs corné rouge', AppLocale.de: 'Roter Hartmais', AppLocale.pt: 'Milho pintado'},
|
||||
'buckwheat': {AppLocale.en: 'Common buckwheat', AppLocale.es: 'Trigo sarraceno', AppLocale.fr: 'Sarrasin', AppLocale.de: 'Buchweizen', AppLocale.pt: 'Trigo-mourisco'},
|
||||
'raspberry': {AppLocale.en: 'Wild raspberry', AppLocale.es: 'Frambuesa', AppLocale.fr: 'Framboise sauvage', AppLocale.de: 'Wilde Himbeere', AppLocale.pt: 'Framboesa'},
|
||||
'tomato': {AppLocale.en: 'Slicing tomato', AppLocale.es: 'Tomate de ensalada', AppLocale.fr: 'Tomate à trancher', AppLocale.de: 'Fleischtomate', AppLocale.pt: 'Tomate para salada'},
|
||||
'chilli': {AppLocale.en: 'Guajillo chilli', AppLocale.es: 'Chile guajillo', AppLocale.fr: 'Piment guajillo', AppLocale.de: 'Guajillo-Chili', AppLocale.pt: 'Pimenta guajillo'},
|
||||
'origin': {AppLocale.en: 'Community seed swap', AppLocale.es: 'Intercambio de semillas', AppLocale.fr: 'Troc de graines', AppLocale.de: 'Saatgut-Tausch', AppLocale.pt: 'Troca de sementes'},
|
||||
// Market offers
|
||||
'cherryTomato': {AppLocale.en: 'Cherry tomato', AppLocale.es: 'Tomate cherry', AppLocale.fr: 'Tomate cerise', AppLocale.de: 'Kirschtomate', AppLocale.pt: 'Tomate-cereja'},
|
||||
'bean': {AppLocale.en: 'Climbing bean', AppLocale.es: 'Judía de enrame', AppLocale.fr: 'Haricot à rames', AppLocale.de: 'Stangenbohne', AppLocale.pt: 'Feijão-trepador'},
|
||||
'sunflower': {AppLocale.en: 'Sunflower', AppLocale.es: 'Girasol', AppLocale.fr: 'Tournesol', AppLocale.de: 'Sonnenblume', AppLocale.pt: 'Girassol'},
|
||||
'basil': {AppLocale.en: 'Sweet basil', AppLocale.es: 'Albahaca', AppLocale.fr: 'Basilic', AppLocale.de: 'Basilikum', AppLocale.pt: 'Manjericão'},
|
||||
'carrot': {AppLocale.en: 'Purple carrot', AppLocale.es: 'Zanahoria morada', AppLocale.fr: 'Carotte violette', AppLocale.de: 'Violette Karotte', AppLocale.pt: 'Cenoura roxa'},
|
||||
};
|
||||
|
||||
/// The sample label for [key] in [locale], falling back to English.
|
||||
String labelFor(String key, AppLocale locale) {
|
||||
final m = sampleLabels[key]!;
|
||||
return m[locale] ?? m[AppLocale.en]!;
|
||||
}
|
||||
|
||||
const _fontFallbacks = <String>['Noto Sans JP', 'Noto Sans Arabic'];
|
||||
|
||||
/// The real app theme, but with every text style pinned to the bundled
|
||||
|
|
@ -171,21 +144,15 @@ class SeededInventory {
|
|||
Future<SeededInventory> seedShowcase(
|
||||
AppDatabase db,
|
||||
VarietyRepository repo,
|
||||
AppLocale locale,
|
||||
) async {
|
||||
String l(String key) => labelFor(key, locale);
|
||||
// Sow in spring, harvest seed in late summer — visible in the calendar.
|
||||
final sow = monthsToMask(const [3, 4, 5]);
|
||||
final harvest = monthsToMask(const [8, 9]);
|
||||
|
||||
// Most varieties use the app's default coloured-initial disc avatar; the hero
|
||||
// (maize) carries a real photo (below).
|
||||
Future<String> add(String label, String family, {Uint8List? photo}) async {
|
||||
final id = await repo.addQuickVariety(
|
||||
label: label,
|
||||
category: family,
|
||||
photoBytes: photo,
|
||||
);
|
||||
// Varieties render with the app's default coloured-initial disc avatar —
|
||||
// the on-brand default when no photo is set — so no image decoding is needed.
|
||||
Future<String> add(String label, String family) async {
|
||||
final id = await repo.addQuickVariety(label: label, category: family);
|
||||
await (db.update(db.varieties)..where((v) => v.id.equals(id))).write(
|
||||
VarietiesCompanion(
|
||||
sowMonths: Value(sow),
|
||||
|
|
@ -195,34 +162,27 @@ Future<SeededInventory> seedShowcase(
|
|||
return id;
|
||||
}
|
||||
|
||||
// Example photos are CC0 / public domain (see fixtures/CREDITS.md), except the
|
||||
// maize which is vjrj's own; loaded from the committed fixtures (CWD is the
|
||||
// package root under `flutter test`). The maize is the hero for the detail shot.
|
||||
Future<Uint8List> photo(String name) =>
|
||||
File('test/screenshots/fixtures/$name.jpg').readAsBytes();
|
||||
|
||||
final maize = await add(l('maize'), 'Poaceae', photo: await photo('maize'));
|
||||
final tomato = await add('Cherry tomato', 'Solanaceae');
|
||||
await repo.addLot(
|
||||
varietyId: maize,
|
||||
varietyId: tomato,
|
||||
harvestYear: 2024,
|
||||
quantity: const Quantity(kind: QuantityKind.cob, count: 6),
|
||||
originName: l('origin'),
|
||||
quantity: const Quantity(kind: QuantityKind.handful),
|
||||
originName: 'Community seed swap',
|
||||
abundance: Abundance.plentyToShare,
|
||||
offerStatus: OfferStatus.shared,
|
||||
);
|
||||
await repo.addLot(
|
||||
varietyId: maize,
|
||||
varietyId: tomato,
|
||||
harvestYear: 2023,
|
||||
quantity: const Quantity(kind: QuantityKind.packet, count: 1),
|
||||
offerStatus: OfferStatus.exchange,
|
||||
);
|
||||
|
||||
// The rest sit in families that sort at/after Poaceae, so the maize stays the
|
||||
// first, top-of-list group in the inventory shot. Each carries a CC0/PD photo.
|
||||
await add(l('buckwheat'), 'Polygonaceae', photo: await photo('buckwheat'));
|
||||
await add(l('raspberry'), 'Rosaceae', photo: await photo('raspberry'));
|
||||
await add(l('tomato'), 'Solanaceae', photo: await photo('tomato'));
|
||||
await add(l('chilli'), 'Solanaceae', photo: await photo('pepper'));
|
||||
await add('Climbing bean', 'Fabaceae');
|
||||
await add('Sunflower', 'Asteraceae');
|
||||
await add('Sweet basil', 'Lamiaceae');
|
||||
await add('Rainbow chard', 'Amaranthaceae');
|
||||
await add('Purple carrot', 'Apiaceae');
|
||||
|
||||
return SeededInventory(maize);
|
||||
return SeededInventory(tomato);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,11 +45,13 @@ void main() {
|
|||
late AppDatabase db;
|
||||
late VarietyRepository repo;
|
||||
late SpeciesRepository species;
|
||||
late SeededInventory seeded;
|
||||
|
||||
setUp(() async {
|
||||
db = newTestDatabase();
|
||||
repo = newTestRepository(db);
|
||||
species = newTestSpeciesRepository(db);
|
||||
seeded = await seedShowcase(db, repo);
|
||||
});
|
||||
tearDown(() => db.close());
|
||||
|
||||
|
|
@ -77,52 +79,45 @@ void main() {
|
|||
|
||||
// A POPULATED market: a seeded OffersCubit (no transport) feeding MarketBody,
|
||||
// so the offer list renders with no live discovery stream to hang
|
||||
// pumpAndSettle. Offer names are localized. (Live discovery is exercised by
|
||||
// offers_cubit_test.dart; see market_screen_test.dart on why not via widgets.)
|
||||
Widget marketWidget(AppLocale locale) => Builder(
|
||||
// pumpAndSettle. (Live discovery is exercised by offers_cubit_test.dart; see
|
||||
// the note in market_screen_test.dart on why we don't drive it via widgets.)
|
||||
Future<Widget> market() async => Builder(
|
||||
builder: (context) => Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text(context.t.market.title),
|
||||
actions: [IconButton(icon: const Icon(Icons.tune), onPressed: () {})],
|
||||
),
|
||||
body: BlocProvider<OffersCubit>(
|
||||
create: (_) => _SeededOffersCubit(_sampleOffers(locale)),
|
||||
create: (_) => _SeededOffersCubit(_sampleOffers()),
|
||||
child: MarketBody(onConfigure: () {}),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
const screenNames = ['home', 'inventory', 'market', 'calendar', 'detail'];
|
||||
/// Each entry renders one screen; the runner re-seeds and re-locales per shot.
|
||||
final screens = <String, Future<Widget> Function()>{
|
||||
'home': () async => const HomeScreen(marketEnabled: true),
|
||||
'inventory': () async => const InventoryListScreen(),
|
||||
'market': market,
|
||||
'calendar': () async => const CalendarScreen(initialMonth: 4),
|
||||
'detail': () async => BlocProvider(
|
||||
create: (_) => VarietyDetailCubit(repo, seeded.heroVarietyId),
|
||||
child: const VarietyDetailScreen(),
|
||||
),
|
||||
};
|
||||
|
||||
for (final locale in screenshotLocales) {
|
||||
for (final name in screenNames) {
|
||||
testWidgets('${locale.languageCode}/$name', (tester) async {
|
||||
// Re-seed per shot so the sample variety names are in the shot's
|
||||
// language. Drift writes must run in REAL async (runAsync), not the
|
||||
// testWidgets fake clock, or they hang.
|
||||
late final SeededInventory seeded;
|
||||
await tester.runAsync(() async {
|
||||
seeded = await seedShowcase(db, repo, locale);
|
||||
});
|
||||
final child = switch (name) {
|
||||
'home' => const HomeScreen(marketEnabled: true),
|
||||
'inventory' => const InventoryListScreen(),
|
||||
'market' => marketWidget(locale),
|
||||
'calendar' => const CalendarScreen(initialMonth: 4),
|
||||
_ => BlocProvider(
|
||||
create: (_) => VarietyDetailCubit(repo, seeded.heroVarietyId),
|
||||
child: const VarietyDetailScreen(),
|
||||
),
|
||||
};
|
||||
for (final entry in screens.entries) {
|
||||
testWidgets('${locale.languageCode}/${entry.key}', (tester) async {
|
||||
await tester.pumpWidget(
|
||||
screenshotApp(
|
||||
repository: repo,
|
||||
species: species,
|
||||
locale: locale,
|
||||
child: child,
|
||||
child: await entry.value(),
|
||||
),
|
||||
);
|
||||
await capture(tester, locale.languageCode, name);
|
||||
await capture(tester, locale.languageCode, entry.key);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -130,7 +125,6 @@ void main() {
|
|||
// RTL layout demo: base (English) strings, forced right-to-left, so the
|
||||
// mirrored inventory proves the design is RTL-safe. Not a translated locale.
|
||||
testWidgets('rtl/inventory', (tester) async {
|
||||
await tester.runAsync(() => seedShowcase(db, repo, AppLocale.en));
|
||||
await tester.pumpWidget(
|
||||
screenshotApp(
|
||||
repository: repo,
|
||||
|
|
@ -165,12 +159,12 @@ class _NoopOfferTransport implements OfferTransport {
|
|||
Future<void> close() async {}
|
||||
}
|
||||
|
||||
/// A small set of nearby offers across gift / swap / sale and colour-coded
|
||||
/// botanical families, with names localized to [l].
|
||||
List<Offer> _sampleOffers(AppLocale l) => [
|
||||
Offer(id: 'o1', authorPubkeyHex: 'a1' * 32, summary: labelFor('cherryTomato', l), type: OfferType.gift, category: 'Solanaceae', approxGeohash: 'sp3e9', isOrganic: true),
|
||||
Offer(id: 'o2', authorPubkeyHex: 'a2' * 32, summary: labelFor('bean', l), type: OfferType.exchange, category: 'Fabaceae', approxGeohash: 'sp3e8'),
|
||||
Offer(id: 'o3', authorPubkeyHex: 'a3' * 32, summary: labelFor('sunflower', l), type: OfferType.sale, category: 'Asteraceae', approxGeohash: 'sp3ec', priceAmount: 2, priceCurrency: '€'),
|
||||
Offer(id: 'o4', authorPubkeyHex: 'a4' * 32, summary: labelFor('basil', l), type: OfferType.gift, category: 'Lamiaceae', approxGeohash: 'sp3e2', isOrganic: true),
|
||||
Offer(id: 'o5', authorPubkeyHex: 'a5' * 32, summary: labelFor('carrot', l), type: OfferType.exchange, category: 'Apiaceae', approxGeohash: 'sp3ef'),
|
||||
/// A small, internationally-neutral set of nearby offers across gift / swap /
|
||||
/// sale and colour-coded botanical families.
|
||||
List<Offer> _sampleOffers() => [
|
||||
Offer(id: 'o1', authorPubkeyHex: 'a1' * 32, summary: 'Cherry tomato', type: OfferType.gift, category: 'Solanaceae', approxGeohash: 'sp3e9', isOrganic: true),
|
||||
Offer(id: 'o2', authorPubkeyHex: 'a2' * 32, summary: 'Climbing bean', type: OfferType.exchange, category: 'Fabaceae', approxGeohash: 'sp3e8'),
|
||||
Offer(id: 'o3', authorPubkeyHex: 'a3' * 32, summary: 'Sunflower', type: OfferType.sale, category: 'Asteraceae', approxGeohash: 'sp3ec', priceAmount: 2, priceCurrency: '€'),
|
||||
Offer(id: 'o4', authorPubkeyHex: 'a4' * 32, summary: 'Sweet basil', type: OfferType.gift, category: 'Lamiaceae', approxGeohash: 'sp3e2', isOrganic: true),
|
||||
Offer(id: 'o5', authorPubkeyHex: 'a5' * 32, summary: 'Purple carrot', type: OfferType.exchange, category: 'Apiaceae', approxGeohash: 'sp3ef'),
|
||||
];
|
||||
|
|
|
|||
|
|
@ -25,12 +25,9 @@ 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 and seedlings'),
|
||||
300,
|
||||
);
|
||||
await tester.scrollUntilVisible(find.text('About sharing seeds'), 300);
|
||||
expect(find.text('Rules of the road'), findsOneWidget);
|
||||
expect(find.text('About sharing seeds and seedlings'), findsOneWidget);
|
||||
expect(find.text('About sharing seeds'), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets('renders under RTL without overflowing', (tester) async {
|
||||
|
|
|
|||
|
|
@ -119,35 +119,6 @@ void main() {
|
|||
expect(await settings.searchPrecision(), 3);
|
||||
});
|
||||
|
||||
testWidgets('community servers are offered as toggles, not a URL box',
|
||||
(tester) async {
|
||||
final social = await SocialService.fromRootSeedHex('00' * 32);
|
||||
final settings = SocialSettings(InMemorySecretStore());
|
||||
await settings.setRelayUrls(const []); // offline + nothing selected
|
||||
|
||||
await tester.pumpWidget(_wrapMarket(social, settings));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.tap(find.byKey(const Key('market.config')));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.byKey(const Key('market.advanced')));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Every built-in server shows as a checkbox instead of a wss:// text field.
|
||||
for (final url in SocialSettings.defaultRelays) {
|
||||
expect(find.byKey(Key('market.server.$url')), findsOneWidget);
|
||||
}
|
||||
final firstKey = Key('market.server.${SocialSettings.defaultRelays.first}');
|
||||
await tester.ensureVisible(find.byKey(firstKey));
|
||||
await tester.pumpAndSettle();
|
||||
expect(tester.widget<CheckboxListTile>(find.byKey(firstKey)).value, isFalse);
|
||||
|
||||
// Tapping the toggle selects it (no wss:// typing required).
|
||||
await tester.tap(find.byKey(firstKey));
|
||||
await tester.pumpAndSettle();
|
||||
expect(tester.widget<CheckboxListTile>(find.byKey(firstKey)).value, isTrue);
|
||||
});
|
||||
|
||||
testWidgets('"use my location" fills the area with a coarse geohash',
|
||||
(tester) async {
|
||||
final social = await SocialService.fromRootSeedHex('00' * 32);
|
||||
|
|
|
|||
|
|
@ -16,9 +16,8 @@ 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 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.
|
||||
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.
|
||||
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
|
||||
|
|
|
|||
|
|
@ -1,12 +1,11 @@
|
|||
# Tane — Aviso sobre la legalidad del intercambio de semillas y plantones
|
||||
# Tane — Aviso sobre la legalidad del intercambio de semillas
|
||||
|
||||
**Versión 1.0 — 13 de julio de 2026**
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
## Regalar e intercambiar entre aficionados
|
||||
|
||||
|
|
@ -53,15 +52,6 @@ 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
|
||||
|
|
|
|||
|
|
@ -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 y plantones. Tane
|
||||
dispositivo, más una forma de descubrir personas cercanas que comparten semillas. 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 o planta
|
||||
garantiza la **identidad, pureza, germinación, sanidad o legalidad** de ninguna semilla
|
||||
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.
|
||||
|
|
|
|||
|
|
@ -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 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.
|
||||
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.
|
||||
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,
|
||||
|
|
|
|||
|
|
@ -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 o plantones, la aplicación publica el título, la
|
||||
- **Ofertas.** Cuando ofreces semillas, 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.
|
||||
|
|
|
|||
|
|
@ -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 or seedlings, the app publishes the offer's title, description,
|
||||
- **Offers.** When you offer seeds, 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.
|
||||
|
|
|
|||
|
|
@ -1,12 +1,11 @@
|
|||
# Tane — Notice on the Legality of Exchanging Seeds and Seedlings
|
||||
# Tane — Notice on the Legality of Exchanging Seeds
|
||||
|
||||
**Version 1.0 — 13 July 2026**
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
## Gifting and swapping between amateurs
|
||||
|
||||
|
|
@ -48,15 +47,6 @@ 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
|
||||
|
|
|
|||
|
|
@ -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 and seedlings. Tane is **not a marketplace operator, not a
|
||||
discover people near you who share seeds. 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 or plant exchanged. Growing
|
||||
**identity, purity, germination, health, or legality** of any seed exchanged. Growing
|
||||
information shown in the app (calendars, seed-saving tips, viability estimates) is
|
||||
general guidance, not professional advice.
|
||||
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ para poner el arroz a circular. Siglos después, esa misma idea inspiró redes m
|
|||
el *WAT* japonés (2000): un vale que cualquiera imprime y pone a circular, sin banco ni
|
||||
centro.
|
||||
|
||||
Tane hereda ese espíritu. Cuando compartes semillas puedes acompañarlas de un [**Plantare**](https://plantare.ourproject.org).
|
||||
Tane hereda ese espíritu. Cuando compartes semillas puedes acompañarlas de un **Plantare**.
|
||||
El nombre juega con *pagaré* —la promesa de pago de toda la vida—, pero cambiando *pagar*
|
||||
por *plantar*: aquí no firmas un «pagaré», sino un «plantaré». Es la promesa de devolver,
|
||||
cuando puedas, una cantidad parecida de semilla libre. No es una compra ni una obligación:
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ An exchange network with no centre, held together by trust, where a scrap of pap
|
|||
enough to set rice in motion. Centuries later, that same idea inspired modern networks such
|
||||
as Japan's *WAT system* (2000): a note anyone can print and pass on, with no bank or centre.
|
||||
|
||||
Tane inherits that spirit. When you share seeds you can attach a [**Plantare**](https://plantare.ourproject.org). The name
|
||||
Tane inherits that spirit. When you share seeds you can attach a **Plantare**. The name
|
||||
plays on the Spanish *pagaré* — an IOU, literally "I will pay" — with *pay* swapped for
|
||||
*plant*: not "I will pay" but "I will plant". It's a promise to return, when you can, a
|
||||
similar amount of free seed. It isn't a purchase or an obligation — it's a commitment to
|
||||
|
|
|
|||
107
site/DEPLOY.md
|
|
@ -1,107 +0,0 @@
|
|||
# Deploying the Tane landing site (tane.comunes.org)
|
||||
|
||||
Runbook for publishing changes to the landing page. Written so another agent (or
|
||||
a human) can reproduce it without prior context.
|
||||
|
||||
## Architecture (what actually runs)
|
||||
|
||||
```
|
||||
browser ── Cloudflare ── assange (nginx reverse proxy, TLS) ── groucho:8082 ── nginx container (static Hugo site)
|
||||
```
|
||||
|
||||
- The site source lives in this repo under `site/` (Hugo). It is **built into a
|
||||
static nginx image on the host** by Ansible — no Hugo on the control node, no
|
||||
registry.
|
||||
- `site/` builds legal + about pages from `docs/` (single source of truth) and
|
||||
serves screenshots generated by the Flutter golden harness.
|
||||
- Two separate git repos are involved:
|
||||
- **Tane repo** (this one): the `site/` source, docs, and the screenshot harness.
|
||||
- **Ansible repo**: `~/proyectos/sync/comunes/shared-l2/ansible` — the deploy
|
||||
playbook and the reverse-proxy vhost.
|
||||
|
||||
## One-time setup (already done; only if starting fresh)
|
||||
|
||||
```sh
|
||||
cd ~/proyectos/sync/comunes/shared-l2/ansible
|
||||
ansible-galaxy collection install -r collections/requirements.yml # community.docker + ansible.posix
|
||||
# Publish the vhost on the proxy (adds tane.comunes.org). NOT needed for content updates:
|
||||
ansible-playbook -i comunes_inventory.ini proxies.yml --tags proxy-loop
|
||||
```
|
||||
DNS `tane.comunes.org` and the `comunes.org` TLS cert (must cover the subdomain)
|
||||
are already in place.
|
||||
|
||||
## Routine deploy (the common case)
|
||||
|
||||
### 1. Regenerate derived content (only if you changed the sources)
|
||||
|
||||
Legal / About text (edited under `docs/legal/**`, `docs/que-es-tane.md`,
|
||||
`docs/what-is-tane.md`):
|
||||
```sh
|
||||
cd <tane-repo>/site && ./build-legal.sh # regenerates content/legal/*.md + content/about.*.md
|
||||
```
|
||||
|
||||
Screenshots (edited the harness or want fresh app shots):
|
||||
```sh
|
||||
cd <tane-repo>/apps/app_seeds
|
||||
flutter test --update-goldens --run-skipped --tags screenshots test/screenshots/screenshots_test.dart
|
||||
tool/collect_screenshots.sh # copies PNGs into site/assets/screenshots + fastlane
|
||||
```
|
||||
(The OG social cards `site/static/og-*.png` are regenerated by hand when the
|
||||
inventory shot changes — see the `og-tpl.sh` step in git history; optional.)
|
||||
|
||||
### 2. Commit & land on main
|
||||
|
||||
The deploy syncs from the **main checkout** by default, so commit first:
|
||||
```sh
|
||||
cd <tane-repo> && git add -A && git commit -m "..."
|
||||
git -C ~/proyectos/dev/tane merge --ff-only <your-branch> # land on main
|
||||
git -C ~/proyectos/dev/tane push origin main
|
||||
```
|
||||
|
||||
### 3. Deploy
|
||||
|
||||
```sh
|
||||
cd ~/proyectos/sync/comunes/shared-l2/ansible
|
||||
ansible-playbook -i comunes_inventory.ini tane-landing.yml
|
||||
```
|
||||
This rsyncs `site/` to `groucho:/data/tane-landing/src`, rebuilds the
|
||||
Hugo→nginx image there, and recreates the container (only when the source
|
||||
changed). `proxies.yml` does **not** need re-running for content changes.
|
||||
|
||||
### 4. Verify
|
||||
|
||||
```sh
|
||||
curl -sI https://tane.comunes.org/ | head -1 # 200
|
||||
curl -s https://tane.comunes.org/es/about/ | grep -o '<title>[^<]*</title>'
|
||||
```
|
||||
|
||||
## Deploying from a git worktree (not the main checkout)
|
||||
|
||||
`tane_site_src` defaults to `$HOME/proyectos/dev/tane/site`. To deploy uncommitted
|
||||
work from a worktree, point it at that worktree's `site/`:
|
||||
```sh
|
||||
ansible-playbook -i comunes_inventory.ini tane-landing.yml \
|
||||
-e tane_site_src=/abs/path/to/worktree/site
|
||||
```
|
||||
Prefer landing on main and deploying from the main checkout for reproducibility.
|
||||
|
||||
## Gotchas
|
||||
|
||||
- **Cloudflare + assange cache static assets ~16 days by stable URL.** The
|
||||
screenshots and CSS are **fingerprinted** (`… | fingerprint` in the Hugo
|
||||
templates), so their URLs change with content and bust the cache automatically.
|
||||
Fixed-URL assets — `og-*.png`, `favicon*`, `site.webmanifest`, `/logo.png` — are
|
||||
NOT fingerprinted: if you change one, either purge Cloudflare or add a `?v=N`.
|
||||
Symptom of a stale asset: `curl <url>` returns old bytes but `curl <url>?v=1`
|
||||
returns the new ones, and the container file (`docker exec tane-landing ls -l
|
||||
/usr/share/nginx/html/...`) is already correct.
|
||||
- **Screenshot golden test is skip-by-default** (`dart_test.yaml`), so CI stays
|
||||
green; you must pass `--run-skipped --tags screenshots` to run/update it.
|
||||
- **main can diverge** (other sessions commit to it). If `merge --ff-only` fails,
|
||||
rebase your branch onto main first: `git rebase main` (site changes rarely
|
||||
conflict), then FF.
|
||||
- **`--check` (dry-run) fails at the compose step** ("/data/tane-landing is not a
|
||||
directory") because check mode doesn't create the synced dir — that's expected,
|
||||
not a real error; do a real run.
|
||||
- Container port is **8082** on groucho, bound `0.0.0.0` (firewall restricts it to
|
||||
assange). The proxy vhost lives in `proxies.yml` under `citems` (cert `comunes.org`).
|
||||
|
|
@ -62,7 +62,7 @@ a { color: var(--green); }
|
|||
font-size: 1.25rem;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.brand img { height: 36px; width: auto; object-fit: contain; }
|
||||
.brand img { border-radius: 8px; }
|
||||
.site-nav {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 400 KiB After Width: | Height: | Size: 180 KiB |
|
Before Width: | Height: | Size: 344 KiB After Width: | Height: | Size: 164 KiB |
|
Before Width: | Height: | Size: 186 KiB After Width: | Height: | Size: 185 KiB |
|
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 389 KiB After Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 349 KiB After Width: | Height: | Size: 163 KiB |
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 396 KiB After Width: | Height: | Size: 184 KiB |
|
Before Width: | Height: | Size: 348 KiB After Width: | Height: | Size: 165 KiB |
|
Before Width: | Height: | Size: 178 KiB After Width: | Height: | Size: 179 KiB |
|
Before Width: | Height: | Size: 136 KiB After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 402 KiB After Width: | Height: | Size: 181 KiB |
|
Before Width: | Height: | Size: 354 KiB After Width: | Height: | Size: 167 KiB |
|
Before Width: | Height: | Size: 183 KiB After Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 142 KiB |
|
Before Width: | Height: | Size: 389 KiB After Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 349 KiB After Width: | Height: | Size: 163 KiB |
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 399 KiB After Width: | Height: | Size: 185 KiB |
|
Before Width: | Height: | Size: 350 KiB After Width: | Height: | Size: 166 KiB |
|
Before Width: | Height: | Size: 174 KiB After Width: | Height: | Size: 172 KiB |
|
Before Width: | Height: | Size: 351 KiB After Width: | Height: | Size: 165 KiB |
|
|
@ -1,9 +1,9 @@
|
|||
---
|
||||
title: "Your seed bank in your pocket"
|
||||
description: "A local-first, decentralized app for keeping and sharing traditional seeds and seedlings. Offline, encrypted, no account."
|
||||
description: "A local-first, decentralized app for keeping and sharing traditional seeds. Offline, encrypted, no account."
|
||||
hero:
|
||||
title: "Your seed bank in your pocket"
|
||||
tagline: "Keep and share traditional seeds and seedlings — offline, encrypted, no account."
|
||||
tagline: "Keep and share traditional seeds — 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 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."
|
||||
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."
|
||||
- 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,6 +30,5 @@ values:
|
|||
---
|
||||
|
||||
Tane (種, "seed"; from *tanemaki* 種まき, "to sow seeds") is a local-first,
|
||||
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.
|
||||
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.
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
---
|
||||
title: "Tu banco de semillas en el bolsillo"
|
||||
description: "Una app local-first y descentralizada para guardar y compartir semillas y plantones tradicionales. Sin conexión, cifrada, sin cuenta."
|
||||
description: "Una app local-first y descentralizada para guardar y compartir semillas tradicionales. Sin conexión, cifrada, sin cuenta."
|
||||
hero:
|
||||
title: "Tu banco de semillas en el bolsillo"
|
||||
tagline: "Guarda y comparte semillas y plantones tradicionales: sin conexión, cifrado, sin cuenta."
|
||||
tagline: "Guarda y comparte semillas 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 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."
|
||||
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."
|
||||
- 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 y plantones
|
||||
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 tradicionales.
|
||||
Funciona sin ninguna red, y te conecta a una red vecinal de intercambio de
|
||||
semillas cuando tú quieras.
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ An exchange network with no centre, held together by trust, where a scrap of pap
|
|||
enough to set rice in motion. Centuries later, that same idea inspired modern networks such
|
||||
as Japan's *WAT system* (2000): a note anyone can print and pass on, with no bank or centre.
|
||||
|
||||
Tane inherits that spirit. When you share seeds you can attach a [**Plantare**](https://plantare.ourproject.org). The name
|
||||
Tane inherits that spirit. When you share seeds you can attach a **Plantare**. The name
|
||||
plays on the Spanish *pagaré* — an IOU, literally "I will pay" — with *pay* swapped for
|
||||
*plant*: not "I will pay" but "I will plant". It's a promise to return, when you can, a
|
||||
similar amount of free seed. It isn't a purchase or an obligation — it's a commitment to
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ para poner el arroz a circular. Siglos después, esa misma idea inspiró redes m
|
|||
el *WAT* japonés (2000): un vale que cualquiera imprime y pone a circular, sin banco ni
|
||||
centro.
|
||||
|
||||
Tane hereda ese espíritu. Cuando compartes semillas puedes acompañarlas de un [**Plantare**](https://plantare.ourproject.org).
|
||||
Tane hereda ese espíritu. Cuando compartes semillas puedes acompañarlas de un **Plantare**.
|
||||
El nombre juega con *pagaré* —la promesa de pago de toda la vida—, pero cambiando *pagar*
|
||||
por *plantar*: aquí no firmas un «pagaré», sino un «plantaré». Es la promesa de devolver,
|
||||
cuando puedas, una cantidad parecida de semilla libre. No es una compra ni una obligación:
|
||||
|
|
|
|||
|
|
@ -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 or seedlings, the app publishes the offer's title, description,
|
||||
- **Offers.** When you offer seeds, 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.
|
||||
|
|
|
|||
|
|
@ -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 o plantones, la aplicación publica el título, la
|
||||
- **Ofertas.** Cuando ofreces semillas, 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.
|
||||
|
|
|
|||
|
|
@ -22,9 +22,8 @@ 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 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.
|
||||
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.
|
||||
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
|
||||
|
|
|
|||