From b04d45c4b8f526f6b6706c1c2e1d74780224622f Mon Sep 17 00:00:00 2001 From: vjrj Date: Mon, 13 Jul 2026 17:45:39 +0200 Subject: [PATCH] feat(i18n): add French and German translations Full fr/de translations of the app (625 keys each), wired into the Settings language picker and the small-screen overflow test. Material ships fr/de localizations, so chrome resolves natively. --- apps/app_seeds/lib/i18n/ast.i18n.json | 2 + apps/app_seeds/lib/i18n/de.i18n.json | 720 ++++++ apps/app_seeds/lib/i18n/en.i18n.json | 2 + apps/app_seeds/lib/i18n/es.i18n.json | 2 + apps/app_seeds/lib/i18n/fr.i18n.json | 720 ++++++ apps/app_seeds/lib/i18n/pt.i18n.json | 2 + apps/app_seeds/lib/i18n/strings.g.dart | 22 +- apps/app_seeds/lib/i18n/strings_ast.g.dart | 8 +- apps/app_seeds/lib/i18n/strings_de.g.dart | 1971 +++++++++++++++++ apps/app_seeds/lib/i18n/strings_en.g.dart | 12 +- apps/app_seeds/lib/i18n/strings_es.g.dart | 8 +- apps/app_seeds/lib/i18n/strings_fr.g.dart | 1971 +++++++++++++++++ apps/app_seeds/lib/i18n/strings_pt.g.dart | 8 +- apps/app_seeds/lib/ui/settings_screen.dart | 10 + .../test/ui/small_screen_overflow_test.dart | 9 +- 15 files changed, 5455 insertions(+), 12 deletions(-) create mode 100644 apps/app_seeds/lib/i18n/de.i18n.json create mode 100644 apps/app_seeds/lib/i18n/fr.i18n.json create mode 100644 apps/app_seeds/lib/i18n/strings_de.g.dart create mode 100644 apps/app_seeds/lib/i18n/strings_fr.g.dart diff --git a/apps/app_seeds/lib/i18n/ast.i18n.json b/apps/app_seeds/lib/i18n/ast.i18n.json index 87e871b..4f4b26b 100644 --- a/apps/app_seeds/lib/i18n/ast.i18n.json +++ b/apps/app_seeds/lib/i18n/ast.i18n.json @@ -95,6 +95,8 @@ "langEn": "English", "langPt": "Português", "langAst": "Asturianu", + "langFr": "Français", + "langDe": "Deutsch", "about": "Tocante a", "aboutText": "Inventariu llocal y cifráu pa simiente tradicional. AGPL-3.0.", "aboutOpen": "Tocante a Tane" diff --git a/apps/app_seeds/lib/i18n/de.i18n.json b/apps/app_seeds/lib/i18n/de.i18n.json new file mode 100644 index 0000000..2bac6b1 --- /dev/null +++ b/apps/app_seeds/lib/i18n/de.i18n.json @@ -0,0 +1,720 @@ +{ + "avatar": { + "title": "Dein Foto oder Avatar", + "fromPhoto": "Foto machen oder auswählen", + "illustration": "Oder wähle eine Illustration", + "remove": "Entfernen" + }, + "favorites": { + "title": "Favoriten", + "empty": "Noch keine Favoriten. Speichere Angebote, die dir auf dem Markt gefallen.", + "save": "Zu Favoriten speichern", + "remove": "Aus Favoriten entfernen", + "unavailable": "Nicht mehr verfügbar" + }, + "seedSaving": { + "title": "Samen vervielfältigen", + "subtitle": "Was nötig ist, um die Sorte echt zu erhalten", + "lifeCycle": "Zyklus", + "cycleAnnual": "Einjährig", + "cycleBiennial": "Zweijährig - Samen im 2. Jahr", + "cyclePerennial": "Mehrjährig", + "pollination": "Bestäubung", + "pollSelf": "Selbstbestäubend", + "pollCross": "Kreuzt mit anderen", + "pollMixed": "Selbstbestäubend, manchmal Fremdbefruchtung", + "byInsect": "durch Insekten", + "byWind": "durch Wind", + "isolation": "Abstand halten", + "isolationRange": "{min}–{max} m zu anderen Sorten", + "isolationSingle": "{min} m zu anderen Sorten", + "plants": "Samen von mehreren Pflanzen sammeln", + "plantsValue": "Von mindestens {n} Pflanzen", + "processing": "Samen reinigen", + "procDry": "Trockensamen (ausdreschen)", + "procWet": "Feuchtsamen (fermentieren und spülen)", + "difficulty": "Schwierigkeit", + "diffEasy": "Leicht", + "diffMedium": "Mittel", + "diffHard": "Schwer", + "advisory": "Allgemeine Hinweise - passe sie an dein Klima und deine Sorte an.", + "sourcePrefix": "Quelle" + }, + "calendar": { + "title": "Dieser Monat", + "filterChip": "Dieser Monat", + "selfNote": "Was du in deinen Sorten notiert hast.", + "nothing": "Nichts für {month} notiert." + }, + "app": { + "title": "Tane" + }, + "bootstrap": { + "failed": "Tane konnte nicht starten", + "retry": "Versuchen" + }, + "common": { + "save": "Speichern", + "cancel": "Abbrechen", + "delete": "Löschen", + "edit": "Bearbeiten", + "type": "Typ", + "comingSoon": "Bald", + "offline": "Offline - Teilen ist unterbrochen" + }, + "home": { + "tagline": "Teile und baue lokale Samen an", + "openMarket": "Markt", + "openMarketSubtitle": "Entdecke und teile Samen in deiner Nähe", + "yourInventory": "Dein Bestand", + "yourInventorySubtitle": "Verwalte deine Samen" + }, + "photo": { + "camera": "Foto machen", + "gallery": "Aus Galerie wählen", + "setAsCover": "Als Deckblatt setzen", + "isCover": "Deckblatt-Foto", + "deleteConfirm": "Dieses Foto löschen?" + }, + "menu": { + "tagline": "deine Saatgutbank", + "inventory": "Bestand", + "market": "Markt", + "profile": "Dein Profil", + "chat": "Chat", + "wishlist": "Favoriten", + "following": "Gefolgt", + "plantares": "Plantares", + "sales": "Verkäufe", + "calendar": "Kalender", + "settings": "Einstellungen" + }, + "settings": { + "language": "Sprache", + "systemLanguage": "Systemsprache", + "langEs": "Español", + "langEn": "English", + "langPt": "Português", + "langAst": "Asturianu", + "about": "Über", + "aboutText": "Lokale, verschlüsselte Saatgutbank für traditionelle Samen. AGPL-3.0.", + "aboutOpen": "Über Tane", + "langDe": "Deutsch", + "langFr": "Français" + }, + "backup": { + "title": "Sicherung und Wiederherstellung", + "autoBackupTitle": "Automatische Sicherungen", + "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", + "importJsonSubtitle": "Bringe eine gespeicherte Kopie zurück - nichts wird dupliziert", + "exportCsv": "In eine Tabelle exportieren", + "exportCsvSubtitle": "Eine einfache Liste für Excel oder LibreOffice - ohne Fotos", + "importCsv": "Eine Liste importieren", + "importCsvSubtitle": "Einträge aus einer Tabelle hinzufügen", + "importConfirmTitle": "Sicherung wiederherstellen?", + "importConfirmBody": "Einträge werden mit deinem Bestand zusammengeführt; wenn ein Eintrag auf beiden Seiten existiert, gewinnt die neuere Version. Nichts wird dupliziert.", + "importCsvConfirmTitle": "Liste importieren?", + "importCsvConfirmBody": "Jede Zeile wird als neuer Eintrag hinzugefügt. Dies führt nicht zusammen und ersetzt nicht, also bringt zweimaliger Import dieselbe Datei zweimal ein.", + "importAction": "Importieren", + "exportSaved": "Kopie gespeichert", + "cancelled": "Abgebrochen", + "importDone": "Importiert: {added} neu, {updated} aktualisiert", + "importCsvDone": "{count} Einträge hinzugefügt", + "importFailed": "Diese Datei konnte nicht als Tane-Kopie gelesen werden", + "failed": "Etwas ist schief gelaufen", + "recoveryTitle": "Dein Wiederherstellungscode", + "recoverySubtitle": "Drucke ihn und bewahre ihn auf - er öffnet deine Kopien auf einem neuen Gerät", + "recoveryIntro": "Dieser Code öffnet deine gespeicherten Kopien und stellt deine Bank auf jedem Gerät wieder her. Bewahre zwei Papierkopien an sicheren Orten auf, wie dein bestes Saatgut. Jeder, der ihn hat, kann deine Kopien lesen, also teile ihn mit niemandem.", + "recoveryCopy": "Kopieren", + "recoverySave": "Blatt speichern", + "recoverySheetTitle": "Tane - dein Wiederherstellungsblatt", + "recoveryPromptTitle": "Gib deinen Wiederherstellungscode ein", + "recoveryPromptBody": "Diese Kopie wurde mit einem anderen Code gespeichert. Gib den Code von deinem Wiederherstellungsblatt ein, um sie zu öffnen.", + "recoveryWrongCode": "Dieser Code öffnet diese Kopie nicht" + }, + "about": { + "title": "Über", + "kanji": "種", + "tagline": "Eine lokal speichernde, dezentralisierte App zum Verwalten und Teilen traditioneller Samen und Setzlinge.", + "intro": "Tane (種, 'Samen' auf Japanisch) hilft Menschen und Gemeinschaften, eine freundliche Saatgutbank zu führen, zu entscheiden, was sie anbieten, und es lokal zu teilen - ohne einen zentralen Vermittler, der es kontrollieren, zensieren oder dafür bestraft werden könnte. Der Name kommt von tanemaki (種まき), 'säen / Samen verstreuen'. Das Ziel ist praktisch und politisch zugleich: traditionelle Samensorten unterstützen und gegen das Saatgutmonopol angehen.", + "heritage": "Der Name würdigt alte japanische Traditionen der gegenseitigen Hilfe rund um Reis - yui (gemeinsame Gemeinschaftsarbeit) und tanomoshi (Gegenseitigkeitsfonds) - die das Papier Plantare inspiriert haben, die 'Gemeinschaftswährung für Samenaustausch' (BAH-Semillero, 2009, CC-BY-SA). Tane ist das digitale Plantare.", + "version": "Version", + "license": "Lizenz", + "licenseValue": "AGPL-3.0", + "website": "Webseite", + "openSourceLicenses": "Open-Source-Lizenzen", + "openSourceLicensesSubtitle": "Bibliotheken von Drittanbietern und ihre Lizenzen", + "copyright": "© {years} Comunes Association, unter AGPLv3" + }, + "intro": { + "skip": "Überspringen", + "next": "Nächste", + "start": "Anfangen", + "menuEntry": "Wie Tane funktioniert", + "slides": { + "welcome": { + "title": "Der Samen, der dich hierher brachte", + "body": "Jeder traditionelle Samen ist ein Brief, geschrieben von Tausenden von Generationen, weitergegeben von Hand zu Hand. Wir sind, was wir sind, dank dieses Teilens." + }, + "inventory": { + "title": "Deine Saatgutbank in deiner Tasche", + "body": "Notiere, was du hast, von welchem Jahr, wie viel und woher es kam - mit dem Namen, den du verwendest. Ein Foto und ein Name reichen aus, um zu beginnen." + }, + "privacy": { + "title": "Deins und nur deins", + "body": "Kein Konto, kein Internet, keine Tracker. Deine Daten leben verschlüsselt auf deinem Gerät, und nur das, das du wählst, wird je geteilt." + }, + "share": { + "title": "Teilen, wie es immer gemacht wurde", + "body": "Biete an, was du übrig hast - Geschenk, Tausch oder Verkauf - und lass jemanden in deiner Nähe es finden. Nur ein ungefährer Abstand wird gezeigt, nie deine Adresse; du schließt das Geschäft von Angesicht zu Angesicht." + }, + "plantare": { + "title": "Säen ist vervielfältigen", + "body": "Bei einem Plantare verspricht, wer einen Samen erhält, später etwas zurückzugeben. Und da Zurückgeben bedeutet, es anzubauen, vervielfältigt jede Leihe das Gemeingut." + } + } + }, + "inventory": { + "title": "Bestand", + "searchHint": "Samen suchen", + "empty": "Noch keine Samen. Tippe +, um deine erste hinzuzufügen.", + "noMatches": "Keine Samen passen zu deinen Filtern.", + "clearFilters": "Filter löschen", + "uncategorized": "Unkategorisiert", + "needsReproductionFilter": "Zu vermehren", + "loadError": "Konnte deine Saatgutbank nicht öffnen. Sie war vielleicht beschäftigt - versuche es erneut.", + "retry": "Versuchen" + }, + "draft": { + "capture": "Fotos erfassen", + "captured": "{n} erfasst zum Katalogisieren", + "triageTitle": "Zum Katalogisieren", + "triageCount": "{n} zum Katalogisieren", + "untitled": "Unbenannt", + "nameField": "Benenne diesen Samen", + "nameHint": "Was ist es?", + "suggestFromPhoto": "Namen aus Foto vorschlagen", + "discard": "Verwerfen" + }, + "quickAdd": { + "title": "Einen Samen hinzufügen", + "labelField": "Name", + "labelRequired": "Gib ihm einen Namen", + "addPhoto": "Foto hinzufügen", + "quantity": "Wie viel?", + "more": "Mehr hinzufügen…", + "save": "Speichern", + "saveAndAddAnother": "Speichern und noch einen hinzufügen", + "addedCount": "{n} hinzugefügt", + "cancel": "Abbrechen" + }, + "detail": { + "notFound": "Dieser Samen ist nicht mehr hier.", + "lots": "Partien", + "noLots": "Noch keine Partien.", + "names": "Auch bekannt als", + "addName": "Namen hinzufügen", + "links": "Links", + "addLink": "Link hinzufügen", + "linkUrl": "URL", + "linkTitle": "Titel (optional)", + "reference": "Mehr erfahren", + "refGbif": "GBIF", + "refWikipedia": "Wikipedia", + "refWikispecies": "Wikispecies", + "notes": "Notizen", + "addLot": "Partie hinzufügen", + "editLot": "Partie bearbeiten", + "deleteConfirm": "Diesen Samen löschen?", + "year": "Jahr {year}", + "noYear": "Jahr unbekannt" + }, + "germination": { + "title": "Keimung", + "add": "Test hinzufügen", + "sampleSize": "Stichprobengröße", + "germinated": "Gekeimt", + "none": "Noch keine Keimtests.", + "result": "{percent}%" + }, + "viability": { + "expiringSoon": "Verwende oder vervielfältige diese Saison", + "expiringSoonYears": "Verwende oder vervielfältige diese Saison · hält ~{years} Jahre", + "expired": "Über typische Keimfähigkeit hinaus - zu vervielfältigen", + "expiredYears": "Über typische Keimfähigkeit (~{years} Jahre) - zu vervielfältigen" + }, + "editVariety": { + "title": "Samen bearbeiten", + "name": "Name", + "category": "Kategorie", + "notes": "Notizen", + "species": "Art (aus Katalog)", + "speciesHint": "Durchsuche eine Art…", + "speciesSuggested": "Aus dem Namen vorgeschlagen", + "organic": "Bio", + "organicHint": "Biologisch angebaut (Öko)" + }, + "addLot": { + "title": "Partie hinzufügen", + "year": "Erntedate", + "quantity": "Wie viel?", + "amount": "Menge" + }, + "harvest": { + "pickTitle": "Wähle Monat / Jahr", + "anyMonth": "Jeder Monat", + "noDate": "Erntedate setzen", + "monthNames": [ + "Januar", + "Februar", + "März", + "April", + "Mai", + "Juni", + "Juli", + "August", + "September", + "Oktober", + "November", + "Dezember" + ] + }, + "lotType": { + "seed": "Samen", + "plant": "Pflanze", + "seedling": "Setzling", + "tree": "Baum / Strauch", + "bulb": "Zwiebel / Knolle", + "cutting": "Steckling" + }, + "presentation": { + "title": "Verpackung", + "none": "Unspezifisch", + "pot": "Topf", + "tray": "Tablett", + "plug": "Topfplatte", + "bareRoot": "Nacktwurzel", + "rootBall": "Wurzelballen" + }, + "provenance": { + "section": "Woher es kommt", + "seedsFrom": "Samen von", + "seedsFromHint": "Wer sie anbaute oder gab", + "place": "Ort", + "placeHint": "Woher sie kommen (mit Gegend)", + "addSeedsFrom": "Samen von", + "addPlace": "Ort" + }, + "abundance": { + "add": "Wie viel ich habe", + "title": "Wie viel ich habe", + "none": "Nicht gesetzt", + "plentyToShare": "Reichlich zum Teilen", + "enoughToShare": "Genug zum etwas Teilen", + "enoughForMe": "Genug für mich", + "runningLow": "Wird knapp" + }, + "share": { + "add": "Teilst du es?", + "title": "Teilst du es?", + "nudge": "Du hast reichlich - du könntest etwas teilen.", + "price": "Preis", + "priceHint": "Lass es leer, um es später zu vereinbaren", + "private": "Nur für mich", + "gift": "Zum Verschenken", + "exchange": "Zum Tauschen", + "sell": "Zum Verkauf", + "filterChip": "Ich teile", + "printCatalog": "Drucke, was ich teile", + "catalogTitle": "Was ich teile", + "catalogSaved": "Katalog gespeichert", + "cancelled": "Abgebrochen" + }, + "printLabels": { + "action": "Etiketten drucken", + "title": "Etiketten drucken", + "selectHint": "Wähle die Samen, für die du Etiketten drucken möchtest", + "selectAll": "Alles auswählen", + "selected": "{n} ausgewählt", + "none": "Wähle zuerst Samen aus", + "format": "Etikettengröße", + "formatStickers": "Kleine Aufkleber", + "formatStickersHint": "Viele kleine Etiketten pro Seite - zum Aufkleben auf Päckchen", + "formatCards": "Große Karten", + "formatCardsHint": "Weniger, größere Etiketten - für Gläser und Boxen", + "count": "{n} Etiketten", + "save": "Etiketten speichern", + "saved": "Etiketten gespeichert", + "cancelled": "Abgebrochen" + }, + "cropCalendar": { + "add": "Anbaukalender", + "title": "Anbaukalender", + "sow": "Säen", + "transplant": "Pflanzen", + "flowering": "Blüte", + "fruiting": "Fruchtbildung", + "seedHarvest": "Samenernte", + "editorHint": "Notiere die typischen Monate für diese Sorte in deinem Gebiet - das sind deine eigenen Notizen.", + "unset": "—" + }, + "needsReproduction": { + "label": "Diese Saison vermehren", + "hint": "Baue es an, bevor der Samen ausgeht", + "badge": "Zu vermehren" + }, + "preservation": { + "add": "Wie es aufbewahrt wird", + "title": "Wie es aufbewahrt wird", + "none": "Unspezifisch", + "jarWithDesiccant": "Glas mit Trockenmittel", + "glassJar": "Glasgefäß", + "paperEnvelope": "Papierumschlag", + "paperBag": "Papierbeutel", + "plasticBag": "Plastikbeutel" + }, + "conditionCheck": { + "advanced": "Lagerung und Saatgutbank-Details", + "title": "Lagerchecks", + "add": "Check hinzufügen", + "containers": "Gläser / Behälter", + "desiccant": "Trockenmittel", + "none": "Noch keine Lagerchecks.", + "summary": "{count} Glas(gläser) · {state}" + }, + "desiccant": { + "none": "Keine", + "add": "Eine hinzufügen", + "replace": "Austauschen", + "dry": "Blau - trocken", + "fresh": "Gerade erneuert" + }, + "unit": { + "aFew": "einige", + "some": "einige", + "plenty": "viele", + "pinch": "eine Prise", + "handful": { + "singular": "Handvoll", + "plural": "Handvoll" + }, + "teaspoon": { + "singular": "Teelöffel", + "plural": "Teelöffel" + }, + "spoon": { + "singular": "Löffel", + "plural": "Löffel" + }, + "cup": { + "singular": "Tasse", + "plural": "Tassen" + }, + "jar": { + "singular": "Glas", + "plural": "Gläser" + }, + "sack": { + "singular": "Sack", + "plural": "Säcke" + }, + "packet": { + "singular": "Päckchen", + "plural": "Päckchen" + }, + "cob": { + "singular": "Kolben", + "plural": "Kolben" + }, + "pod": { + "singular": "Schote", + "plural": "Schoten" + }, + "ear": { + "singular": "Ähre", + "plural": "Ähren" + }, + "head": { + "singular": "Kopf", + "plural": "Köpfe" + }, + "fruit": { + "singular": "Frucht", + "plural": "Früchte" + }, + "bulb": { + "singular": "Zwiebel", + "plural": "Zwiebeln" + }, + "tuber": { + "singular": "Knolle", + "plural": "Knollen" + }, + "seedHead": { + "singular": "Samenkopf", + "plural": "Samenköpfe" + }, + "bunch": { + "singular": "Bund", + "plural": "Bunde" + }, + "plant": { + "singular": "Pflanze", + "plural": "Pflanzen" + }, + "pot": { + "singular": "Topf", + "plural": "Töpfe" + }, + "tray": { + "singular": "Tablett", + "plural": "Tabletts" + }, + "seedling": { + "singular": "Setzling", + "plural": "Setzlinge" + }, + "tree": { + "singular": "Baum", + "plural": "Bäume" + }, + "cutting": { + "singular": "Steckling", + "plural": "Stecklinge" + }, + "grams": { + "singular": "Gramm", + "plural": "Gramm" + }, + "count": { + "singular": "Samen", + "plural": "Samen" + } + }, + "market": { + "title": "Samen in deiner Nähe", + "subtitle": "Was andere in der Nähe teilen", + "notSetUp": "Teilen ist noch nicht eingerichtet", + "notSetUpBody": "Aktiviere Teilen, um Samen zu sehen und mit Menschen in der Nähe zu teilen. Es bleibt ungefähr - deine Zone, nie deine genaue Adresse.", + "setUp": "Teilen einrichten", + "cantReach": "Kann die Gemeinschaftsserver gerade nicht erreichen", + "cantReachBody": "Versuche es erneut, oder überprüfe die Server unter Erweiterte Einrichtung.", + "retry": "Erneut versuchen", + "setArea": "Stelle dein Gebiet ein", + "setAreaBody": "Teile dem Markt ungefähr mit, wo du bist, um Samen in deiner Nähe zu sehen.", + "searching": "Schaue nach deinem Gebiet…", + "empty": "Noch keine Samen in deiner Nähe geteilt", + "searchHint": "Suche nach diesen Samen", + "noMatches": "Keine geteilten Samen passen zu deiner Suche", + "near": "In deiner Nähe", + "contact": "Nachricht", + "mine": "Du", + "configTitle": "Teilen-Einrichtung", + "setupIntro": "Teilen mit Menschen in der Nähe ist optional. Gib einfach dein ungefähres Gebiet an - du bist bereits mit freigegebenen Gemeinschaftsservern verbunden, damit Leute das finden können, das du anbietest, ohne ein Unternehmen dazwischen.", + "areaLabel": "Dein Gebiet", + "areaHelp": "Absichtlich grob gehalten - deine Zone, nie ein genauer Punkt.", + "areaSet": "Dein Gebiet ist gesetzt - grob, nie dein genauer Punkt", + "areaNotSet": "Gebiet noch nicht gesetzt - verwende deinen Standort oder füge einen Code unter Erweiterte hinzu", + "advanced": "Erweiterte", + "areaCodeLabel": "Gebiets-Code", + "areaCodeHint": "Ein kurzer Code wie sp3e9 - kein Ortsname", + "serversLabel": "Gemeinschaftsserver", + "serversHelp": "Eine Adresse pro Zeile (wss://…). Lass die Standardwerte, wenn du dir nicht sicher bist.", + "serversAdvanced": "Füge einen weiteren Server hinzu", + "save": "Speichern", + "saved": "Gespeichert", + "wanted": "Gesucht", + "shareMine": "Meine Samen teilen", + "sharedCount": "{n} Samen in der Nähe geteilt", + "nothingToShare": "Markiere zuerst einige Samen zum Verschenken, Tauschen oder Verkaufen", + "useLocation": "Meinen ungefähren Standort verwenden", + "locationFailed": "Konnte deinen Standort nicht ermitteln - überprüfe, dass Standort aktiviert ist und die Berechtigung erteilt wurde", + "queued": "Gespeichert - wir werden diese teilen, wenn du verbunden bist", + "shareFailed": "Konnte die Gemeinschaftsserver nicht erreichen - deine Samen wurden nicht geteilt. Versuche es gleich erneut.", + "rangeLabel": "Wie weit zum Suchen", + "rangeNear": "Sehr nah", + "rangeArea": "Um mich herum", + "rangeRegion": "Meine Region", + "sharedBy": "Geteilt von", + "noProfile": "Diese Person hat noch kein Profil geteilt", + "copyId": "Code kopieren", + "idCopied": "Code kopiert", + "photo": "Foto" + }, + "profile": { + "title": "Dein Profil", + "name": "Anzeigename", + "nameHint": "Wie dich andere sehen", + "about": "Über", + "aboutHint": "Eine kurze Zeile - was du anbaust, wo", + "g1": "Ğ1-Adresse (optional)", + "g1Hint": "Damit dich Leute in Ğ1 bezahlen können - getrennt von deinem Schlüssel", + "yourId": "Deine Identität", + "idHelp": "Teile dies, damit dich Leute erkennen", + "copy": "Kopieren", + "copied": "Kopiert", + "save": "Speichern", + "saved": "Profil gespeichert", + "identities": "Deine Identitäten", + "identitiesHelp": "Halte separate Identitäten - jede mit ihren eigenen Nachrichten und Kontakten. Alle kommen aus deiner einen Sicherung, also Wechsel fügt nichts hinzu, das man sich merken muss.", + "identityLabel": "Identität {n}", + "current": "In Gebrauch", + "newIdentity": "Neue Identität", + "switchTitle": "Identität wechseln?", + "switchBody": "Nachrichten und Kontakte werden für jede Identität getrennt aufbewahrt. Du kannst jederzeit zurückwechseln.", + "switchAction": "Wechsel" + }, + "chatList": { + "title": "Nachrichten", + "empty": "Noch keine Gespräche. Schreibe jemanden vom Markt an." + }, + "chat": { + "title": "Chat", + "hint": "Schreibe eine Nachricht…", + "send": "Senden", + "empty": "Noch keine Nachrichten - sag hallo", + "offline": "Richte Teilen ein, um Nachrichten zu senden", + "payG1": "In Ğ1 bezahlen", + "g1Copied": "Ğ1-Adresse kopiert - füge sie in dein Portemonnaie ein", + "today": "Heute", + "yesterday": "Gestern", + "sendError": "Konnte nicht senden - überprüfe deine Verbindung", + "noLinks": "Links sind in Nachrichten nicht erlaubt" + }, + "trust": { + "none": "Noch niemand bürgt für sie", + "count": "Von {n} bestätigt", + "vouch": "Ich kenne diese Person", + "vouched": "Du bürgst für sie", + "circle": "In deinem Kreis" + }, + "yourPeople": { + "title": "Deine Leute", + "help": "Menschen, die du kennst und für die du einstehst, und Menschen, die für dich einstehen.", + "youVouchFor": "Du stehst ein für", + "vouchesForYou": "Sie stehen für dich ein", + "youVouchForEmpty": "Du stehst noch für niemanden ein. Wenn du jemanden triffst, öffne deinen Chat mit ihnen und tippe 'Ich kenne diese Person'.", + "vouchesForYouEmpty": "Noch niemand steht für dich ein", + "revoke": "Nicht mehr einstehen", + "revokeConfirm": "Nicht mehr für diese Person einstehen?", + "offline": "Du bist offline - versuche es, wenn du verbunden bist" + }, + "ratings": { + "rate": "Bewerte diese Person", + "edit": "Bearbeite deine Bewertung", + "commentHint": "Wie war es? (optional)", + "fromYourCircle": "{n} von Leuten, die du kennst", + "retract": "Entferne deine Bewertung", + "saved": "Bewertung gespeichert" + }, + "notifications": { + "newMessageFrom": "Neue Nachricht von {name}" + }, + "plantare": { + "title": "Plantares", + "help": "Ein Plantare ist ein Versprechen, einen Samen zu vervielfältigen und etwas zurückzugeben - wie eine Sorte von Hand zu Hand reist. Es ist kein Verkauf.", + "add": "Verpflichtung hinzufügen", + "empty": "Noch keine Verpflichtungen. Wenn du einen Samen mit dem Versprechen teilst oder erhältst, ihn anzubauen und etwas zurückzugeben, notiere es hier.", + "iReturn": "Ich baue es an und gebe es zurück", + "owedToMe": "Sie geben mir etwas zurück", + "direction": "Wer baut an und gibt zurück", + "counterparty": "Mit wem?", + "counterpartyHint": "Eine Person oder ein Kollektiv (optional)", + "owed": "Was kommt zurück?", + "owedHint": "z.B. eine Handvoll nächste Saison (optional)", + "note": "Notiz (optional)", + "save": "Speichern", + "markReturned": "Als zurückgegeben markieren", + "markForgiven": "Absehen lassen", + "reopen": "Erneut öffnen", + "delete": "Entfernen", + "statusReturned": "Zurückgegeben", + "statusForgiven": "Erledigt", + "openSection": "Offen", + "settledSection": "Erledigt", + "removeConfirm": "Diese Verpflichtung entfernen?" + }, + "handover": { + "title": "Samen wechselten den Besitzer", + "help": "Ein Geschenk, ein Tausch oder ein Verkauf - notiere es auf, mit oder ohne Rückgabeversprechen.", + "iGave": "Ich gab Samen", + "iReceived": "Ich erhielt Samen", + "whichLot": "Welche Partie?", + "howMuch": "Wie viel?", + "allOfIt": "Alles", + "partOfIt": "Ein Teil", + "paymentChip": "Geld wechselte den Besitzer", + "promiseGave": "Sie geben mir Samen zurück", + "promiseReceived": "Ich gebe Samen zurück" + }, + "sale": { + "title": "Verkäufe", + "help": "Notiere Samen, die du verkauft oder gekauft hast - Geld, Ğ1 oder jede Währung. Ein eigenes Modell abseits Geschenk und Plantare. Es wird nie eine Kommission auf Samen erhoben.", + "add": "Verkauf notieren", + "empty": "Noch keine Verkäufe. Notiere hier, was du verkaufst oder kaufst.", + "iSold": "Ich verkaufte", + "iBought": "Ich kaufte", + "direction": "Verkauft oder gekauft?", + "counterparty": "Mit wem?", + "counterpartyHint": "Eine Person oder ein Kollektiv (optional)", + "amount": "Betrag", + "currency": "Währung", + "currencyHint": "€, Ğ1, Stunden… (optional)", + "hours": "Stunden", + "note": "Notiz (optional)", + "save": "Speichern", + "delete": "Entfernen", + "removeConfirm": "Diesen Verkauf entfernen?" + }, + "legal": { + "title": "Datenschutz und Regeln", + "subtitle": "Dein Datenschutz, die Marktregeln und die Legalität von Samen", + "privacyTitle": "Dein Datenschutz", + "privacyBody": "Tane funktioniert ohne Konto, und alles, das du notierst, bleibt auf deinem Gerät, verschlüsselt. Es gibt keine Werbung, keine Tracker und keinen Tane-Server.\n\nNichts wird geteilt, es sei denn, du wählst es: Wenn du ein Angebot oder dein Profil veröffentlichst oder eine Nachricht sendest, reist es durch Gemeinschaftsserver. Angebote tragen nur eine ungefähre Zone - nie deine Adresse.\n\nWas du veröffentlichst, ist öffentlich, und Kopien können bleiben, selbst nachdem du es entfernt hast - teile also mit Bedacht.", + "rulesTitle": "Die Spielregeln", + "rulesBody": "Tane ist ein Werkzeug, kein Laden: Austausch wird direkt zwischen Menschen vereinbart, und niemand nimmt eine Provision. Das bedeutet auch, dass du verantwortlich bist für das, das du anbietest und sendest.\n\nAuf dem Markt: Sei ehrlich mit deinen Samen, biete nur an, was du teilen darfst, behandle Menschen gut und spamme nicht. Du kannst jeden blockieren und Angebote oder Menschen melden, die die Regeln brechen - Meldungen werden auf den Gemeinschaftsservern bearbeitet.", + "seedsTitle": "Über das Teilen von Samen", + "seedsBody": "Das Verschenken und Tauschen von Samen zwischen Hobbyisten ist in den meisten Ländern weit verbreitet. Verkaufen kann anders sein: An vielen Orten ist der Verkauf von Samen nicht offiziell registrierter Sorten eingeschränkt - überprüfe deine örtlichen Vorschriften, bevor du einen Preis fragst.\n\nSamen in ein anderes Land zu schicken ist auch oft eingeschränkt, und kommerziell geschützte Sorten dürfen nicht ohne Genehmigung vermehrt werden. Im Zweifelsfall lieber lokal und lieber Geschenk.", + "readFull": "Lese die vollständigen Dokumente online" + }, + "marketGate": { + "title": "Bevor du den Markt betrittst", + "intro": "Der Markt ist ein gemeinsamer Raum zwischen Nachbarn. Wenn du fortfährst, akzeptierst du einige einfache Regeln:", + "ruleHonest": "Sei ehrlich mit den Samen, die du anbietest", + "ruleLegal": "Teile nur, was du teilen darfst, wo du lebst", + "ruleRespect": "Behandle Menschen gut - kein Spam, kein Missbrauch", + "publicNote": "Was du hier veröffentlichst, ist öffentlich, und Kopien können bleiben, selbst wenn du es später entfernst.", + "viewLegal": "Datenschutz und Regeln", + "accept": "Ich akzeptiere", + "decline": "Nicht jetzt" + }, + "report": { + "offer": "Melde dieses Angebot", + "person": "Melde diese Person", + "title": "Melden", + "prompt": "Was ist falsch?", + "reasonSpam": "Spam oder Betrug", + "reasonAbuse": "Beleidigend oder respektlos", + "reasonIllegal": "Samen, die nicht angeboten werden sollten", + "reasonOther": "Etwas anderes", + "detailsHint": "Füge Details hinzu (optional)", + "send": "Meldung senden", + "sentHidden": "Meldung gesendet - du wirst dies nicht mehr sehen", + "failed": "Konnte die Meldung nicht senden - überprüfe deine Verbindung", + "alsoBlock": "Diese Person auch blockieren" + }, + "block": { + "action": "Diese Person blockieren", + "confirmTitle": "Diese Person blockieren?", + "confirmBody": "Du wirst ihre Angebote und Nachrichten nicht mehr sehen. Du kannst sie später unter Blockierte Leute in der Teilen-Einrichtung entsperren.", + "confirm": "Blockieren", + "blockedToast": "Blockiert - ihre Angebote und Nachrichten sind verborgen", + "manageTitle": "Blockierte Leute", + "manageEmpty": "Du hast niemanden blockiert", + "unblock": "Entsperren" + } +} \ No newline at end of file diff --git a/apps/app_seeds/lib/i18n/en.i18n.json b/apps/app_seeds/lib/i18n/en.i18n.json index 809a794..ea1bd75 100644 --- a/apps/app_seeds/lib/i18n/en.i18n.json +++ b/apps/app_seeds/lib/i18n/en.i18n.json @@ -96,6 +96,8 @@ "langEn": "English", "langPt": "Português", "langAst": "Asturianu", + "langFr": "Français", + "langDe": "Deutsch", "about": "About", "aboutText": "Local-first, encrypted inventory for traditional seeds. AGPL-3.0.", "aboutOpen": "About Tane" diff --git a/apps/app_seeds/lib/i18n/es.i18n.json b/apps/app_seeds/lib/i18n/es.i18n.json index b755a61..9b38efd 100644 --- a/apps/app_seeds/lib/i18n/es.i18n.json +++ b/apps/app_seeds/lib/i18n/es.i18n.json @@ -95,6 +95,8 @@ "langEs": "Español", "langEn": "English", "langPt": "Português", + "langFr": "Français", + "langDe": "Deutsch", "about": "Acerca de", "aboutText": "Inventario local y cifrado para semillas tradicionales. AGPL-3.0.", "aboutOpen": "Acerca de Tane" diff --git a/apps/app_seeds/lib/i18n/fr.i18n.json b/apps/app_seeds/lib/i18n/fr.i18n.json new file mode 100644 index 0000000..8984454 --- /dev/null +++ b/apps/app_seeds/lib/i18n/fr.i18n.json @@ -0,0 +1,720 @@ +{ + "avatar": { + "title": "Votre photo ou avatar", + "fromPhoto": "Prendre ou choisir une photo", + "illustration": "Ou choisir une illustration", + "remove": "Supprimer" + }, + "favorites": { + "title": "Favoris", + "empty": "Pas encore de favoris. Enregistrez les offres que vous aimez du marché.", + "save": "Ajouter aux favoris", + "remove": "Retirer des favoris", + "unavailable": "Plus disponible" + }, + "seedSaving": { + "title": "Conserver sa semence", + "subtitle": "Ce qu'il faut pour garder la variété fidèle", + "lifeCycle": "Cycle", + "cycleAnnual": "Annuelle", + "cycleBiennial": "Bisannuelle — graines la 2e année", + "cyclePerennial": "Vivace", + "pollination": "Pollinisation", + "pollSelf": "Autoféconde", + "pollCross": "Se croise avec d'autres", + "pollMixed": "S'autoféconde, parfois se croise", + "byInsect": "par les insectes", + "byWind": "par le vent", + "isolation": "À isoler", + "isolationRange": "{min}–{max} m des autres variétés", + "isolationSingle": "{min} m des autres variétés", + "plants": "Préserver plusieurs plantes", + "plantsValue": "D'au moins {n} plantes", + "processing": "Nettoyer la semence", + "procDry": "Semence sèche (dépiquage)", + "procWet": "Semence humide (fermentation et rinçage)", + "difficulty": "Difficulté", + "diffEasy": "Facile", + "diffMedium": "Moyen", + "diffHard": "Difficile", + "advisory": "Guide général — adaptez-le à votre climat et à votre variété.", + "sourcePrefix": "Source" + }, + "calendar": { + "title": "Ce mois", + "filterChip": "Ce mois", + "selfNote": "Ce que vous avez noté dans vos variétés.", + "nothing": "Rien noté pour {month}." + }, + "app": { + "title": "Tane" + }, + "bootstrap": { + "failed": "Tane n'a pas pu démarrer", + "retry": "Réessayer" + }, + "common": { + "save": "Enregistrer", + "cancel": "Annuler", + "delete": "Supprimer", + "edit": "Modifier", + "type": "Type", + "comingSoon": "À venir", + "offline": "Vous êtes hors ligne — le partage est en pause" + }, + "home": { + "tagline": "Partagez et cultivez des graines locales", + "openMarket": "Marché", + "openMarketSubtitle": "Découvrez et partagez des graines à proximité", + "yourInventory": "Votre inventaire", + "yourInventorySubtitle": "Gérez vos graines" + }, + "photo": { + "camera": "Prendre une photo", + "gallery": "Choisir de la galerie", + "setAsCover": "Mettre en couverture", + "isCover": "Photo de couverture", + "deleteConfirm": "Supprimer cette photo ?" + }, + "menu": { + "tagline": "votre grainothèque", + "inventory": "Inventaire", + "market": "Marché", + "profile": "Votre profil", + "chat": "Messages", + "wishlist": "Favoris", + "following": "Abonnements", + "plantares": "Plantares", + "sales": "Ventes", + "calendar": "Calendrier", + "settings": "Paramètres" + }, + "settings": { + "language": "Langue", + "systemLanguage": "Langue du système", + "langEs": "Español", + "langEn": "English", + "langPt": "Português", + "langAst": "Asturianu", + "langFr": "Français", + "langDe": "Deutsch", + "about": "À propos", + "aboutText": "Inventaire local-first et chiffré pour les semences traditionnelles. AGPL-3.0.", + "aboutOpen": "À propos de Tane" + }, + "backup": { + "title": "Sauvegarde & restauration", + "autoBackupTitle": "Sauvegardes automatiques", + "autoBackupLast": "Dernière copie sauvegardée {date}", + "autoBackupNone": "Une copie est conservée automatiquement en arrière-plan", + "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", + "importJsonSubtitle": "Récupérez une copie enregistrée — rien ne sera dupliqué", + "exportCsv": "Exporter vers un tableur", + "exportCsvSubtitle": "Une liste simple pour Excel ou LibreOffice — sans photos", + "importCsv": "Importer une liste", + "importCsvSubtitle": "Ajoutez des entrées depuis un tableur", + "importConfirmTitle": "Restaurer une sauvegarde ?", + "importConfirmBody": "Les entrées fusionnent avec votre inventaire ; si une entrée existe des deux côtés, c'est la version la plus récente qui gagne. Rien ne sera dupliqué.", + "importCsvConfirmTitle": "Importer une liste ?", + "importCsvConfirmBody": "Chaque ligne est ajoutée comme une nouvelle entrée. Cela ne fusionne ni ne remplace, donc importer le même fichier deux fois l'ajoute deux fois.", + "importAction": "Importer", + "exportSaved": "Copie enregistrée", + "cancelled": "Annulé", + "importDone": "Importé : {added} nouvelles, {updated} actualisées", + "importCsvDone": "Ajoutées {count} entrées", + "importFailed": "Ce fichier n'a pas pu être lu comme une sauvegarde Tane", + "failed": "Quelque chose s'est mal passé", + "recoveryTitle": "Votre code de récupération", + "recoverySubtitle": "Imprimez-le et gardez-le en sécurité — il ouvre vos sauvegardes sur un nouvel appareil", + "recoveryIntro": "Ce code ouvre vos sauvegardes et retrouve votre grainothèque sur n'importe quel appareil. Conservez deux copies imprimées en lieux sûrs, comme votre meilleure graine. Quiconque l'obtient peut lire vos sauvegardes, alors ne le partagez avec personne.", + "recoveryCopy": "Copier", + "recoverySave": "Enregistrer la feuille", + "recoverySheetTitle": "Tane — votre feuille de récupération", + "recoveryPromptTitle": "Entrez votre code de récupération", + "recoveryPromptBody": "Cette sauvegarde a été enregistrée avec un autre code. Entrez le code de votre feuille de récupération pour l'ouvrir.", + "recoveryWrongCode": "Ce code n'ouvre pas cette sauvegarde" + }, + "about": { + "title": "À propos", + "kanji": "種", + "tagline": "Une app local-first et décentralisée pour gérer et partager des semences et plantules traditionnelles.", + "intro": "Tane (種, « graine » en japonais) aide les gens et les collectifs à gérer un inventaire bienveillant de leur grainothèque, décider ce qu'ils offrent et le partager localement — sans intermédiaire central qui pourrait contrôler, censurer ou être poursuivi pour cela. Son nom vient de tanemaki (種まき), « semer / disperser des graines ». L'objectif est à la fois pratique et politique : soutenir les variétés de semences traditionnelles et résister au monopole des semenciers.", + "heritage": "Le nom honore les anciennes traditions d'entraide japonaises autour du riz — yui (travail communautaire partagé) et tanomoshi (caisses de secours mutuel) — qui ont inspiré le document Plantare, la « monnaie communautaire pour l'échange de semences » (BAH-Semillero, 2009, CC-BY-SA). Tane est le Plantare numérique.", + "version": "Version", + "license": "Licence", + "licenseValue": "AGPL-3.0", + "website": "Site web", + "openSourceLicenses": "Licences open source", + "openSourceLicensesSubtitle": "Bibliothèques tiers et leurs licences", + "copyright": "© {years} Association Comunes, sous AGPLv3" + }, + "intro": { + "skip": "Passer", + "next": "Suivant", + "start": "Commencer", + "menuEntry": "Comment fonctionne Tane", + "slides": { + "welcome": { + "title": "La graine qui vous a menés ici", + "body": "Chaque semence traditionnelle est une lettre écrite par des milliers de générations, passée de main en main. Nous sommes ce que nous sommes grâce à ce partage." + }, + "inventory": { + "title": "Votre grainothèque, dans votre poche", + "body": "Notez ce que vous avez, de quelle année, combien et d'où ça vient — avec le nom que vous utilisez. Une photo et un nom suffisent pour commencer." + }, + "privacy": { + "title": "Vôtre, et uniquement vôtre", + "body": "Pas de compte, pas d'internet, pas de trackers. Vos données vivent chiffrées sur votre appareil, et seul ce que vous choisissez est partagé." + }, + "share": { + "title": "Partager, comme cela s'est toujours fait", + "body": "Offrez ce que vous avez en excédent — cadeau, échange ou vente — et laissez quelqu'un à proximité le trouver. Seule la distance approximative est affichée, jamais votre adresse ; vous fermez le marché en personne." + }, + "plantare": { + "title": "Semer c'est multiplier", + "body": "Avec un Plantare, celui qui reçoit la graine promet d'en renvoyer plus tard. Et comme renvoyer signifie la cultiver, chaque prêt multiplie le bien commun." + } + } + }, + "inventory": { + "title": "Inventaire", + "searchHint": "Rechercher des graines", + "empty": "Pas encore de graines. Appuyez sur + pour ajouter votre première.", + "noMatches": "Aucune graine ne correspond à vos filtres.", + "clearFilters": "Effacer les filtres", + "uncategorized": "Non catégorisé", + "needsReproductionFilter": "À multiplier", + "loadError": "Impossible d'ouvrir votre grainothèque. Elle était peut-être occupée — réessayez.", + "retry": "Réessayer" + }, + "draft": { + "capture": "Capturer des photos", + "captured": "{n} capturée(s) à cataloguer", + "triageTitle": "À cataloguer", + "triageCount": "{n} à cataloguer", + "untitled": "Sans titre", + "nameField": "Nommez cette graine", + "nameHint": "Qu'est-ce que c'est ?", + "suggestFromPhoto": "Suggérer un nom depuis la photo", + "discard": "Abandonner" + }, + "quickAdd": { + "title": "Ajouter une graine", + "labelField": "Nom", + "labelRequired": "Donnez-lui un nom", + "addPhoto": "Ajouter une photo", + "quantity": "Combien ?", + "more": "Ajouter plus…", + "save": "Enregistrer", + "saveAndAddAnother": "Enregistrer et ajouter une autre", + "addedCount": "{n} ajoutée(s)", + "cancel": "Annuler" + }, + "detail": { + "notFound": "Cette graine n'est plus ici.", + "lots": "Lots", + "noLots": "Pas encore de lots.", + "names": "Aussi connue sous le nom de", + "addName": "Ajouter un nom", + "links": "Liens", + "addLink": "Ajouter un lien", + "linkUrl": "URL", + "linkTitle": "Titre (optionnel)", + "reference": "En savoir plus", + "refGbif": "GBIF", + "refWikipedia": "Wikipedia", + "refWikispecies": "Wikispecies", + "notes": "Notes", + "addLot": "Ajouter un lot", + "editLot": "Modifier le lot", + "deleteConfirm": "Supprimer cette graine ?", + "year": "Année {year}", + "noYear": "Année inconnue" + }, + "germination": { + "title": "Germination", + "add": "Ajouter un test", + "sampleSize": "Échantillon", + "germinated": "Germinées", + "none": "Pas encore de tests de germination.", + "result": "{percent}%" + }, + "viability": { + "expiringSoon": "Utilisez-la ou multipliez-la cette saison", + "expiringSoonYears": "Utilisez-la ou multipliez-la cette saison · se garde ~{years} an(s)", + "expired": "Au-delà de la viabilité typique — à multiplier", + "expiredYears": "Au-delà de la viabilité typique (~{years} an(s)) — à multiplier" + }, + "editVariety": { + "title": "Modifier la graine", + "name": "Nom", + "category": "Catégorie", + "notes": "Notes", + "species": "Espèce (du catalogue)", + "speciesHint": "Rechercher une espèce…", + "speciesSuggested": "Suggérée par le nom", + "organic": "Biologique", + "organicHint": "Cultivée de manière biologique (bio)" + }, + "addLot": { + "title": "Ajouter un lot", + "year": "Date de récolte", + "quantity": "Combien ?", + "amount": "Quantité" + }, + "harvest": { + "pickTitle": "Sélectionnez le mois / l'année", + "anyMonth": "N'importe quel mois", + "noDate": "Définir la date de récolte", + "monthNames": [ + "janvier", + "février", + "mars", + "avril", + "mai", + "juin", + "juillet", + "août", + "septembre", + "octobre", + "novembre", + "décembre" + ] + }, + "lotType": { + "seed": "Graines", + "plant": "Plante", + "seedling": "Plantule", + "tree": "Arbre / arbuste", + "bulb": "Bulbe / tubercule", + "cutting": "Bouture" + }, + "presentation": { + "title": "Emballage", + "none": "Non spécifié", + "pot": "Pot", + "tray": "Plateau", + "plug": "Alvéole", + "bareRoot": "Racines nues", + "rootBall": "Motte" + }, + "provenance": { + "section": "D'où elle vient", + "seedsFrom": "Graines de", + "seedsFromHint": "Qui les a cultivées ou données", + "place": "Lieu", + "placeHint": "D'où elles viennent (avec région)", + "addSeedsFrom": "Graines de", + "addPlace": "Lieu" + }, + "abundance": { + "add": "Combien j'en ai", + "title": "Combien j'en ai", + "none": "Non défini", + "plentyToShare": "De quoi partager généreusement", + "enoughToShare": "Assez pour partager un peu", + "enoughForMe": "Assez pour moi", + "runningLow": "Ça commence à manquer" + }, + "share": { + "add": "La partagez-vous ?", + "title": "La partagez-vous ?", + "nudge": "Vous en avez beaucoup — vous pourriez en partager.", + "price": "Prix", + "priceHint": "Laissez vide pour en discuter plus tard", + "private": "Juste pour moi", + "gift": "À donner", + "exchange": "À échanger", + "sell": "À vendre", + "filterChip": "Je partage", + "printCatalog": "Imprimer ce que je partage", + "catalogTitle": "Ce que je partage", + "catalogSaved": "Catalogue enregistré", + "cancelled": "Annulé" + }, + "printLabels": { + "action": "Imprimer les étiquettes", + "title": "Imprimer les étiquettes", + "selectHint": "Choisissez les graines pour lesquelles imprimer les étiquettes", + "selectAll": "Tout sélectionner", + "selected": "{n} sélectionnée(s)", + "none": "Sélectionnez d'abord les graines", + "format": "Taille d'étiquette", + "formatStickers": "Petits autocollants", + "formatStickersHint": "Beaucoup de petites étiquettes par page — à coller sur les sachets", + "formatCards": "Grandes cartes", + "formatCardsHint": "Moins d'étiquettes, plus grandes — pour les pots et boîtes", + "count": "{n} étiquette(s)", + "save": "Enregistrer les étiquettes", + "saved": "Étiquettes enregistrées", + "cancelled": "Annulé" + }, + "cropCalendar": { + "add": "Calendrier de culture", + "title": "Calendrier de culture", + "sow": "Semis", + "transplant": "Repiquage", + "flowering": "Floraison", + "fruiting": "Fructification", + "seedHarvest": "Récolte de semences", + "editorHint": "Notez les mois typiques pour cette variété dans votre région — ce sont vos propres notes.", + "unset": "—" + }, + "needsReproduction": { + "label": "À multiplier cette saison", + "hint": "Cultivez-la avant que la semence ne manque", + "badge": "À multiplier" + }, + "preservation": { + "add": "Comment c'est conservé", + "title": "Comment c'est conservé", + "none": "Non spécifié", + "jarWithDesiccant": "Pot avec dessiccant", + "glassJar": "Pot en verre", + "paperEnvelope": "Enveloppe en papier", + "paperBag": "Sac en papier", + "plasticBag": "Sac en plastique" + }, + "conditionCheck": { + "advanced": "Conservation et détails de la grainothèque", + "title": "Contrôles de conservation", + "add": "Ajouter un contrôle", + "containers": "Pots / récipients", + "desiccant": "Dessiccant", + "none": "Pas encore de contrôles.", + "summary": "{count} pot(s) · {state}" + }, + "desiccant": { + "none": "Aucun", + "add": "En ajouter", + "replace": "À changer", + "dry": "Bleu — sec", + "fresh": "Fraîchement mis" + }, + "unit": { + "aFew": "quelques", + "some": "quelques", + "plenty": "beaucoup", + "pinch": "une pincée", + "handful": { + "singular": "poignée", + "plural": "poignées" + }, + "teaspoon": { + "singular": "cuillère à café", + "plural": "cuillères à café" + }, + "spoon": { + "singular": "cuillère", + "plural": "cuillères" + }, + "cup": { + "singular": "tasse", + "plural": "tasses" + }, + "jar": { + "singular": "pot", + "plural": "pots" + }, + "sack": { + "singular": "sac", + "plural": "sacs" + }, + "packet": { + "singular": "sachet", + "plural": "sachets" + }, + "cob": { + "singular": "épi", + "plural": "épis" + }, + "pod": { + "singular": "gousse", + "plural": "gousses" + }, + "ear": { + "singular": "épi", + "plural": "épis" + }, + "head": { + "singular": "capitule", + "plural": "capitules" + }, + "fruit": { + "singular": "fruit", + "plural": "fruits" + }, + "bulb": { + "singular": "bulbe", + "plural": "bulbes" + }, + "tuber": { + "singular": "tubercule", + "plural": "tubercules" + }, + "seedHead": { + "singular": "tête de graines", + "plural": "têtes de graines" + }, + "bunch": { + "singular": "botte", + "plural": "bottes" + }, + "plant": { + "singular": "plante", + "plural": "plantes" + }, + "pot": { + "singular": "pot", + "plural": "pots" + }, + "tray": { + "singular": "plateau", + "plural": "plateaux" + }, + "seedling": { + "singular": "plantule", + "plural": "plantules" + }, + "tree": { + "singular": "arbre", + "plural": "arbres" + }, + "cutting": { + "singular": "bouture", + "plural": "boutures" + }, + "grams": { + "singular": "gramme", + "plural": "grammes" + }, + "count": { + "singular": "graine", + "plural": "graines" + } + }, + "market": { + "title": "Graines près de vous", + "subtitle": "Ce que les autres partagent à proximité", + "notSetUp": "Le partage n'est pas encore configuré", + "notSetUpBody": "Activez le partage pour voir et donner des graines aux gens à proximité. C'est volontairement approximatif — votre zone, jamais votre adresse exacte.", + "setUp": "Configurer le partage", + "cantReach": "Impossible de se connecter aux serveurs communautaires en ce moment", + "cantReachBody": "Réessayez, ou vérifiez les serveurs sous Configuration avancée.", + "retry": "Réessayer", + "setArea": "Définir votre zone", + "setAreaBody": "Dites au marché approximativement où vous êtes pour voir les graines à proximité.", + "searching": "Recherche autour de votre zone…", + "empty": "Aucune graine n'est encore partagée près de vous", + "searchHint": "Rechercher parmi ces graines", + "noMatches": "Aucune graine partagée ne correspond à votre recherche", + "near": "Près de vous", + "contact": "Message", + "mine": "Vous", + "configTitle": "Configuration du partage", + "setupIntro": "Le partage avec les gens à proximité est optionnel. Définissez simplement votre zone approximative — vous êtes déjà connectés aux serveurs communautaires partagés pour que les gens trouvent ce que vous offrez, sans aucune entreprise au milieu.", + "areaLabel": "Votre zone", + "areaHelp": "Gardée approximative volontairement — votre zone, jamais un point exact.", + "areaSet": "Votre zone est définie — approximative, jamais votre point exact", + "areaNotSet": "Zone non définie — utilisez votre position, ou ajoutez un code sous Avancé", + "advanced": "Avancé", + "areaCodeLabel": "Code de zone", + "areaCodeHint": "Un code court comme sp3e9 — pas un nom de lieu", + "serversLabel": "Serveurs communautaires", + "serversHelp": "Une adresse par ligne (wss://…). Laissez les valeurs par défaut si vous n'êtes pas sûr.", + "serversAdvanced": "Ajouter un autre serveur", + "save": "Enregistrer", + "saved": "Enregistré", + "wanted": "Recherché", + "shareMine": "Partager mes graines", + "sharedCount": "{n} graines partagées", + "nothingToShare": "Marquez d'abord certaines graines à donner, échanger ou vendre", + "useLocation": "Utiliser ma position approximative", + "locationFailed": "Impossible d'obtenir votre position — vérifiez que la localisation est activée et la permission accordée", + "queued": "Enregistré — nous partagerons cela quand vous serez connecté", + "shareFailed": "Impossible de se connecter aux serveurs communautaires — vos graines n'ont pas été partagées. Réessayez dans un instant.", + "rangeLabel": "Jusqu'où chercher", + "rangeNear": "Très proche", + "rangeArea": "Autour d'ici", + "rangeRegion": "Ma région", + "sharedBy": "Partagé par", + "noProfile": "Cette personne n'a pas encore partagé son profil", + "copyId": "Copier le code", + "idCopied": "Code copié", + "photo": "Photo" + }, + "profile": { + "title": "Votre profil", + "name": "Nom d'affichage", + "nameHint": "Comment les autres vous voient", + "about": "À propos", + "aboutHint": "Une courte ligne — ce que vous cultivez, où", + "g1": "Adresse Ğ1 (optionnel)", + "g1Hint": "Pour que les gens puissent vous payer en Ğ1 — séparé de votre clé", + "yourId": "Votre identité", + "idHelp": "Partagez-la pour que les gens vous reconnaissent", + "copy": "Copier", + "copied": "Copié", + "save": "Enregistrer", + "saved": "Profil enregistré", + "identities": "Vos identités", + "identitiesHelp": "Gardez des identités séparées — chacune avec ses propres messages et contacts. Elles proviennent toutes de votre unique sauvegarde, donc changer n'ajoute rien à retenir.", + "identityLabel": "Identité {n}", + "current": "En cours d'utilisation", + "newIdentity": "Nouvelle identité", + "switchTitle": "Changer d'identité ?", + "switchBody": "Les messages et contacts sont conservés séparément pour chaque identité. Vous pouvez revenir en arrière à tout moment.", + "switchAction": "Changer" + }, + "chatList": { + "title": "Messages", + "empty": "Pas encore de conversations. Envoyez un message à quelqu'un depuis le marché." + }, + "chat": { + "title": "Messages", + "hint": "Écrivez un message…", + "send": "Envoyer", + "empty": "Pas encore de messages — dites bonjour", + "offline": "Configurez le partage pour envoyer des messages", + "payG1": "Payer en Ğ1", + "g1Copied": "Adresse Ğ1 copiée — collez-la dans votre portefeuille", + "today": "Aujourd'hui", + "yesterday": "Hier", + "sendError": "Impossible d'envoyer — vérifiez votre connexion", + "noLinks": "Les liens ne sont pas autorisés dans les messages" + }, + "trust": { + "none": "Personne ne les cautionne encore", + "count": "Cautionnée par {n}", + "vouch": "Je connais cette personne", + "vouched": "Vous la cautionnez", + "circle": "Dans votre cercle" + }, + "yourPeople": { + "title": "Vos contacts", + "help": "Les gens que vous connaissez et cautionnez, et les gens qui vous cautionnent.", + "youVouchFor": "Vous cautionnez", + "vouchesForYou": "Ils vous cautionnent", + "youVouchForEmpty": "Vous ne cautionnez personne pour l'instant. Quand vous rencontrez quelqu'un, ouvrez votre conversation avec lui et appuyez sur « Je connais cette personne ».", + "vouchesForYouEmpty": "Personne ne vous cautionne pour l'instant", + "revoke": "Arrêter de cautionner", + "revokeConfirm": "Arrêter de cautionner cette personne ?", + "offline": "Vous êtes hors ligne — réessayez quand vous êtes connecté" + }, + "ratings": { + "rate": "Évaluer cette personne", + "edit": "Modifier votre évaluation", + "commentHint": "Comment ça s'est passé ? (optionnel)", + "fromYourCircle": "{n} de gens que vous connaissez", + "retract": "Retirer votre évaluation", + "saved": "Évaluation enregistrée" + }, + "notifications": { + "newMessageFrom": "Nouveau message de {name}" + }, + "plantare": { + "title": "Plantares", + "help": "Un Plantare est un engagement à multiplier une semence et en rendre une partie — comment une variété continue son voyage de main en main. Ce n'est pas une vente.", + "add": "Ajouter un engagement", + "empty": "Pas encore d'engagements. Quand vous partagez ou recevez une graine avec la promesse de la cultiver et d'en renvoyer une partie, notez-le ici.", + "iReturn": "Je la multiplie et la rends", + "owedToMe": "Ils m'en renvoient", + "direction": "Qui multiplie et rend", + "counterparty": "Avec qui ?", + "counterpartyHint": "Une personne ou un collectif (optionnel)", + "owed": "Qu'est-ce qui revient ?", + "owedHint": "p. ex. une poignée la saison prochaine (optionnel)", + "note": "Note (optionnel)", + "save": "Enregistrer", + "markReturned": "Marquer comme rendu", + "markForgiven": "Clore l'engagement", + "reopen": "Rouvrir", + "delete": "Retirer", + "statusReturned": "Rendu", + "statusForgiven": "Clôturé", + "openSection": "En attente", + "settledSection": "Fermés", + "removeConfirm": "Retirer cet engagement ?" + }, + "handover": { + "title": "Graines échangées", + "help": "Un cadeau, un échange ou une vente — notez-le, avec une promesse de retour ou pas.", + "iGave": "J'ai donné des graines", + "iReceived": "J'ai reçu des graines", + "whichLot": "Quel lot ?", + "howMuch": "Combien ?", + "allOfIt": "Tout", + "partOfIt": "Une partie", + "paymentChip": "Il y a eu un échange d'argent", + "promiseGave": "Ils me renverront de la graine", + "promiseReceived": "Je rendrai de la graine" + }, + "sale": { + "title": "Ventes", + "help": "Enregistrez les graines que vous avez vendues ou achetées — argent, Ğ1, ou n'importe quelle monnaie. Un modèle distinct d'un cadeau ou d'un Plantare. Aucune commission n'est jamais prélevée sur les graines.", + "add": "Enregistrer une vente", + "empty": "Pas encore de ventes. Notez ici ce que vous vendez ou achetez.", + "iSold": "J'ai vendu", + "iBought": "J'ai acheté", + "direction": "Vendu ou acheté ?", + "counterparty": "Avec qui ?", + "counterpartyHint": "Une personne ou un collectif (optionnel)", + "amount": "Montant", + "currency": "Monnaie", + "currencyHint": "€, Ğ1, heures… (optionnel)", + "hours": "heures", + "note": "Note (optionnel)", + "save": "Enregistrer", + "delete": "Retirer", + "removeConfirm": "Retirer cette vente ?" + }, + "legal": { + "title": "Confidentialité & règles", + "subtitle": "Votre confidentialité, les règles du marché et le partage légal de semences", + "privacyTitle": "Votre confidentialité", + "privacyBody": "Tane fonctionne sans compte, et tout ce que vous enregistrez reste sur votre appareil, chiffré. Il n'y a pas de publicités, pas de trackers, et pas de serveur Tane.\n\nRien n'est partagé sauf si vous le choisissez : quand vous publiez une offre ou votre profil, ou envoyez un message, cela passe par des serveurs gérés par la communauté. Les offres ne portent qu'une zone approximative — jamais votre adresse.\n\nCe que vous publiez est public, et des copies peuvent rester même après l'avoir retiré — alors partagez avec prudence.", + "rulesTitle": "Les règles du jeu", + "rulesBody": "Tane est un outil, pas un magasin : les échanges sont convenus directement entre les gens, et personne ne prend de commission. Cela signifie aussi que vous êtes responsable de ce que vous offrez et envoyez.\n\nSur le marché : soyez honnête avec vos graines, n'offrez que ce que vous pouvez partager, traitez les gens bien et ne faites pas de spam. Vous pouvez bloquer n'importe qui et signaler les offres ou les gens qui enfreignent les règles — les signalements sont traités sur les serveurs communautaires.", + "seedsTitle": "À propos du partage de semences", + "seedsBody": "Donner et échanger des graines entre amateurs est largement reconnu dans la plupart des pays. La vente peut être différente : dans de nombreux endroits, vendre des graines de variétés non officiellement enregistrées est restreint — vérifiez votre législation locale avant de demander un prix.\n\nEnvoyer des graines dans un autre pays est souvent restreint aussi, et les variétés protégées commercialement ne peuvent pas être reproduites sans permission. En cas de doute, gardez-le local et faites-en un cadeau.", + "readFull": "Lire les documents complets en ligne" + }, + "marketGate": { + "title": "Avant de rejoindre le marché", + "intro": "Le marché est un espace partagé entre voisins. En continuant, vous acceptez quelques règles simples :", + "ruleHonest": "Soyez honnête avec les graines que vous offrez", + "ruleLegal": "Partagez uniquement ce que vous êtes autorisé à partager où vous vivez", + "ruleRespect": "Traitez les gens bien — pas de spam, pas d'abus", + "publicNote": "Ce que vous publiez ici est public, et des copies peuvent rester même si vous le retirez plus tard.", + "viewLegal": "Confidentialité & règles", + "accept": "J'accepte", + "decline": "Pas maintenant" + }, + "report": { + "offer": "Signaler cette offre", + "person": "Signaler cette personne", + "title": "Signaler", + "prompt": "Qu'est-ce qui ne va pas ?", + "reasonSpam": "Spam ou escroquerie", + "reasonAbuse": "Abusif ou irrespectueux", + "reasonIllegal": "Graines qui ne devraient pas être offertes", + "reasonOther": "Autre chose", + "detailsHint": "Ajouter des détails (optionnel)", + "send": "Envoyer le signalement", + "sentHidden": "Signalement envoyé — vous ne verrez plus cela", + "failed": "Impossible d'envoyer le signalement — vérifiez votre connexion", + "alsoBlock": "Bloquer aussi cette personne" + }, + "block": { + "action": "Bloquer cette personne", + "confirmTitle": "Bloquer cette personne ?", + "confirmBody": "Vous ne verrez plus ses offres ou messages. Vous pouvez la débloquer plus tard sous Personnes bloquées dans la configuration du partage.", + "confirm": "Bloquer", + "blockedToast": "Personne bloquée — ses offres et messages sont cachés", + "manageTitle": "Personnes bloquées", + "manageEmpty": "Vous n'avez bloqué personne", + "unblock": "Débloquer" + } +} diff --git a/apps/app_seeds/lib/i18n/pt.i18n.json b/apps/app_seeds/lib/i18n/pt.i18n.json index 546ce99..a6e40e4 100644 --- a/apps/app_seeds/lib/i18n/pt.i18n.json +++ b/apps/app_seeds/lib/i18n/pt.i18n.json @@ -96,6 +96,8 @@ "langEn": "English", "langPt": "Português", "langAst": "Asturianu", + "langFr": "Français", + "langDe": "Deutsch", "about": "Acerca de", "aboutText": "Inventário local e cifrado para sementes tradicionais. AGPL-3.0.", "aboutOpen": "Acerca do Tane" diff --git a/apps/app_seeds/lib/i18n/strings.g.dart b/apps/app_seeds/lib/i18n/strings.g.dart index 02498ab..3a7f6f4 100644 --- a/apps/app_seeds/lib/i18n/strings.g.dart +++ b/apps/app_seeds/lib/i18n/strings.g.dart @@ -3,10 +3,10 @@ /// Source: lib/i18n /// To regenerate, run: `dart run slang` /// -/// Locales: 4 -/// Strings: 2236 (559 per locale) +/// Locales: 6 +/// Strings: 3356 (559 per locale) /// -/// Built on 2026-07-13 at 15:47 UTC +/// Built on 2026-07-13 at 16:11 UTC // coverage:ignore-file // ignore_for_file: type=lint, unused_import @@ -19,7 +19,9 @@ import 'package:slang_flutter/slang_flutter.dart'; export 'package:slang_flutter/slang_flutter.dart'; import 'strings_ast.g.dart' as l_ast; +import 'strings_de.g.dart' as l_de; import 'strings_es.g.dart' as l_es; +import 'strings_fr.g.dart' as l_fr; import 'strings_pt.g.dart' as l_pt; part 'strings_en.g.dart'; @@ -32,7 +34,9 @@ part 'strings_en.g.dart'; enum AppLocale with BaseAppLocale { en(languageCode: 'en'), ast(languageCode: 'ast'), + de(languageCode: 'de'), es(languageCode: 'es'), + fr(languageCode: 'fr'), pt(languageCode: 'pt'); const AppLocale({ @@ -77,12 +81,24 @@ enum AppLocale with BaseAppLocale { cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver, ); + case AppLocale.de: + return l_de.TranslationsDe( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); case AppLocale.es: return l_es.TranslationsEs( overrides: overrides, cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver, ); + case AppLocale.fr: + return l_fr.TranslationsFr( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); case AppLocale.pt: return l_pt.TranslationsPt( overrides: overrides, diff --git a/apps/app_seeds/lib/i18n/strings_ast.g.dart b/apps/app_seeds/lib/i18n/strings_ast.g.dart index ba63935..41acb84 100644 --- a/apps/app_seeds/lib/i18n/strings_ast.g.dart +++ b/apps/app_seeds/lib/i18n/strings_ast.g.dart @@ -263,6 +263,8 @@ class _Translations$settings$ast extends Translations$settings$en { @override String get langEn => 'English'; @override String get langPt => 'Português'; @override String get langAst => 'Asturianu'; + @override String get langFr => 'Français'; + @override String get langDe => 'Deutsch'; @override String get about => 'Tocante a'; @override String get aboutText => 'Inventariu llocal y cifráu pa simiente tradicional. AGPL-3.0.'; @override String get aboutOpen => 'Tocante a Tane'; @@ -1484,6 +1486,8 @@ extension on TranslationsAst { 'settings.langEn' => 'English', 'settings.langPt' => 'Português', 'settings.langAst' => 'Asturianu', + 'settings.langFr' => 'Français', + 'settings.langDe' => 'Deutsch', 'settings.about' => 'Tocante a', 'settings.aboutText' => 'Inventariu llocal y cifráu pa simiente tradicional. AGPL-3.0.', 'settings.aboutOpen' => 'Tocante a Tane', @@ -1919,10 +1923,10 @@ extension on TranslationsAst { 'sale.iBought' => 'Mercué', 'sale.direction' => '¿Vendes o merques?', 'sale.counterparty' => '¿Con quién?', - 'sale.counterpartyHint' => 'Una persona o un coleutivu (opcional)', - 'sale.amount' => 'Importe', _ => null, } ?? switch (path) { + 'sale.counterpartyHint' => 'Una persona o un coleutivu (opcional)', + 'sale.amount' => 'Importe', 'sale.currency' => 'Moneda', 'sale.currencyHint' => '€, Ğ1, hores… (opcional)', 'sale.hours' => 'hores', diff --git a/apps/app_seeds/lib/i18n/strings_de.g.dart b/apps/app_seeds/lib/i18n/strings_de.g.dart new file mode 100644 index 0000000..d8f82b0 --- /dev/null +++ b/apps/app_seeds/lib/i18n/strings_de.g.dart @@ -0,0 +1,1971 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import +// dart format off + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsDe extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsDe({Map? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata? meta}) + : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = meta ?? TranslationMetadata( + locale: AppLocale.de, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver) { + super.$meta.setFlatMapFunction($meta.getTranslation); // copy base translations to super.$meta + $meta.setFlatMapFunction(_flatMapFunction); + } + + /// Metadata for the translations of . + @override final TranslationMetadata $meta; + + /// Access flat map + @override dynamic operator[](String key) => $meta.getTranslation(key) ?? super.$meta.getTranslation(key); + + late final TranslationsDe _root = this; // ignore: unused_field + + @override + TranslationsDe $copyWith({TranslationMetadata? meta}) => TranslationsDe(meta: meta ?? this.$meta); + + // Translations + @override late final _Translations$avatar$de avatar = _Translations$avatar$de._(_root); + @override late final _Translations$favorites$de favorites = _Translations$favorites$de._(_root); + @override late final _Translations$seedSaving$de seedSaving = _Translations$seedSaving$de._(_root); + @override late final _Translations$calendar$de calendar = _Translations$calendar$de._(_root); + @override late final _Translations$app$de app = _Translations$app$de._(_root); + @override late final _Translations$bootstrap$de bootstrap = _Translations$bootstrap$de._(_root); + @override late final _Translations$common$de common = _Translations$common$de._(_root); + @override late final _Translations$home$de home = _Translations$home$de._(_root); + @override late final _Translations$photo$de photo = _Translations$photo$de._(_root); + @override late final _Translations$menu$de menu = _Translations$menu$de._(_root); + @override late final _Translations$settings$de settings = _Translations$settings$de._(_root); + @override late final _Translations$backup$de backup = _Translations$backup$de._(_root); + @override late final _Translations$about$de about = _Translations$about$de._(_root); + @override late final _Translations$intro$de intro = _Translations$intro$de._(_root); + @override late final _Translations$inventory$de inventory = _Translations$inventory$de._(_root); + @override late final _Translations$draft$de draft = _Translations$draft$de._(_root); + @override late final _Translations$quickAdd$de quickAdd = _Translations$quickAdd$de._(_root); + @override late final _Translations$detail$de detail = _Translations$detail$de._(_root); + @override late final _Translations$germination$de germination = _Translations$germination$de._(_root); + @override late final _Translations$viability$de viability = _Translations$viability$de._(_root); + @override late final _Translations$editVariety$de editVariety = _Translations$editVariety$de._(_root); + @override late final _Translations$addLot$de addLot = _Translations$addLot$de._(_root); + @override late final _Translations$harvest$de harvest = _Translations$harvest$de._(_root); + @override late final _Translations$lotType$de lotType = _Translations$lotType$de._(_root); + @override late final _Translations$presentation$de presentation = _Translations$presentation$de._(_root); + @override late final _Translations$provenance$de provenance = _Translations$provenance$de._(_root); + @override late final _Translations$abundance$de abundance = _Translations$abundance$de._(_root); + @override late final _Translations$share$de share = _Translations$share$de._(_root); + @override late final _Translations$printLabels$de printLabels = _Translations$printLabels$de._(_root); + @override late final _Translations$cropCalendar$de cropCalendar = _Translations$cropCalendar$de._(_root); + @override late final _Translations$needsReproduction$de needsReproduction = _Translations$needsReproduction$de._(_root); + @override late final _Translations$preservation$de preservation = _Translations$preservation$de._(_root); + @override late final _Translations$conditionCheck$de conditionCheck = _Translations$conditionCheck$de._(_root); + @override late final _Translations$desiccant$de desiccant = _Translations$desiccant$de._(_root); + @override late final _Translations$unit$de unit = _Translations$unit$de._(_root); + @override late final _Translations$market$de market = _Translations$market$de._(_root); + @override late final _Translations$profile$de profile = _Translations$profile$de._(_root); + @override late final _Translations$chatList$de chatList = _Translations$chatList$de._(_root); + @override late final _Translations$chat$de chat = _Translations$chat$de._(_root); + @override late final _Translations$trust$de trust = _Translations$trust$de._(_root); + @override late final _Translations$yourPeople$de yourPeople = _Translations$yourPeople$de._(_root); + @override late final _Translations$ratings$de ratings = _Translations$ratings$de._(_root); + @override late final _Translations$notifications$de notifications = _Translations$notifications$de._(_root); + @override late final _Translations$plantare$de plantare = _Translations$plantare$de._(_root); + @override late final _Translations$handover$de handover = _Translations$handover$de._(_root); + @override late final _Translations$sale$de sale = _Translations$sale$de._(_root); + @override late final _Translations$legal$de legal = _Translations$legal$de._(_root); + @override late final _Translations$marketGate$de marketGate = _Translations$marketGate$de._(_root); + @override late final _Translations$report$de report = _Translations$report$de._(_root); + @override late final _Translations$block$de block = _Translations$block$de._(_root); +} + +// Path: avatar +class _Translations$avatar$de extends Translations$avatar$en { + _Translations$avatar$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Dein Foto oder Avatar'; + @override String get fromPhoto => 'Foto machen oder auswählen'; + @override String get illustration => 'Oder wähle eine Illustration'; + @override String get remove => 'Entfernen'; +} + +// Path: favorites +class _Translations$favorites$de extends Translations$favorites$en { + _Translations$favorites$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Favoriten'; + @override String get empty => 'Noch keine Favoriten. Speichere Angebote, die dir auf dem Markt gefallen.'; + @override String get save => 'Zu Favoriten speichern'; + @override String get remove => 'Aus Favoriten entfernen'; + @override String get unavailable => 'Nicht mehr verfügbar'; +} + +// Path: seedSaving +class _Translations$seedSaving$de extends Translations$seedSaving$en { + _Translations$seedSaving$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Samen vervielfältigen'; + @override String get subtitle => 'Was nötig ist, um die Sorte echt zu erhalten'; + @override String get lifeCycle => 'Zyklus'; + @override String get cycleAnnual => 'Einjährig'; + @override String get cycleBiennial => 'Zweijährig - Samen im 2. Jahr'; + @override String get cyclePerennial => 'Mehrjährig'; + @override String get pollination => 'Bestäubung'; + @override String get pollSelf => 'Selbstbestäubend'; + @override String get pollCross => 'Kreuzt mit anderen'; + @override String get pollMixed => 'Selbstbestäubend, manchmal Fremdbefruchtung'; + @override String get byInsect => 'durch Insekten'; + @override String get byWind => 'durch Wind'; + @override String get isolation => 'Abstand halten'; + @override String isolationRange({required Object min, required Object max}) => '${min}–${max} m zu anderen Sorten'; + @override String isolationSingle({required Object min}) => '${min} m zu anderen Sorten'; + @override String get plants => 'Samen von mehreren Pflanzen sammeln'; + @override String plantsValue({required Object n}) => 'Von mindestens ${n} Pflanzen'; + @override String get processing => 'Samen reinigen'; + @override String get procDry => 'Trockensamen (ausdreschen)'; + @override String get procWet => 'Feuchtsamen (fermentieren und spülen)'; + @override String get difficulty => 'Schwierigkeit'; + @override String get diffEasy => 'Leicht'; + @override String get diffMedium => 'Mittel'; + @override String get diffHard => 'Schwer'; + @override String get advisory => 'Allgemeine Hinweise - passe sie an dein Klima und deine Sorte an.'; + @override String get sourcePrefix => 'Quelle'; +} + +// Path: calendar +class _Translations$calendar$de extends Translations$calendar$en { + _Translations$calendar$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Dieser Monat'; + @override String get filterChip => 'Dieser Monat'; + @override String get selfNote => 'Was du in deinen Sorten notiert hast.'; + @override String nothing({required Object month}) => 'Nichts für ${month} notiert.'; +} + +// Path: app +class _Translations$app$de extends Translations$app$en { + _Translations$app$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Tane'; +} + +// Path: bootstrap +class _Translations$bootstrap$de extends Translations$bootstrap$en { + _Translations$bootstrap$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get failed => 'Tane konnte nicht starten'; + @override String get retry => 'Versuchen'; +} + +// Path: common +class _Translations$common$de extends Translations$common$en { + _Translations$common$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get save => 'Speichern'; + @override String get cancel => 'Abbrechen'; + @override String get delete => 'Löschen'; + @override String get edit => 'Bearbeiten'; + @override String get type => 'Typ'; + @override String get comingSoon => 'Bald'; + @override String get offline => 'Offline - Teilen ist unterbrochen'; +} + +// Path: home +class _Translations$home$de extends Translations$home$en { + _Translations$home$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get tagline => 'Teile und baue lokale Samen an'; + @override String get openMarket => 'Markt'; + @override String get openMarketSubtitle => 'Entdecke und teile Samen in deiner Nähe'; + @override String get yourInventory => 'Dein Bestand'; + @override String get yourInventorySubtitle => 'Verwalte deine Samen'; +} + +// Path: photo +class _Translations$photo$de extends Translations$photo$en { + _Translations$photo$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get camera => 'Foto machen'; + @override String get gallery => 'Aus Galerie wählen'; + @override String get setAsCover => 'Als Deckblatt setzen'; + @override String get isCover => 'Deckblatt-Foto'; + @override String get deleteConfirm => 'Dieses Foto löschen?'; +} + +// Path: menu +class _Translations$menu$de extends Translations$menu$en { + _Translations$menu$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get tagline => 'deine Saatgutbank'; + @override String get inventory => 'Bestand'; + @override String get market => 'Markt'; + @override String get profile => 'Dein Profil'; + @override String get chat => 'Chat'; + @override String get wishlist => 'Favoriten'; + @override String get following => 'Gefolgt'; + @override String get plantares => 'Plantares'; + @override String get sales => 'Verkäufe'; + @override String get calendar => 'Kalender'; + @override String get settings => 'Einstellungen'; +} + +// Path: settings +class _Translations$settings$de extends Translations$settings$en { + _Translations$settings$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get language => 'Sprache'; + @override String get systemLanguage => 'Systemsprache'; + @override String get langEs => 'Español'; + @override String get langEn => 'English'; + @override String get langPt => 'Português'; + @override String get langAst => 'Asturianu'; + @override String get about => 'Über'; + @override String get aboutText => 'Lokale, verschlüsselte Saatgutbank für traditionelle Samen. AGPL-3.0.'; + @override String get aboutOpen => 'Über Tane'; + @override String get langDe => 'Deutsch'; + @override String get langFr => 'Français'; +} + +// Path: backup +class _Translations$backup$de extends Translations$backup$en { + _Translations$backup$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Sicherung und Wiederherstellung'; + @override String get autoBackupTitle => 'Automatische Sicherungen'; + @override String autoBackupLast({required Object date}) => 'Letzte Sicherung ${date}'; + @override String get autoBackupNone => 'Eine Kopie wird automatisch im Hintergrund gespeichert'; + @override String 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'; + @override String get importJsonSubtitle => 'Bringe eine gespeicherte Kopie zurück - nichts wird dupliziert'; + @override String get exportCsv => 'In eine Tabelle exportieren'; + @override String get exportCsvSubtitle => 'Eine einfache Liste für Excel oder LibreOffice - ohne Fotos'; + @override String get importCsv => 'Eine Liste importieren'; + @override String get importCsvSubtitle => 'Einträge aus einer Tabelle hinzufügen'; + @override String get importConfirmTitle => 'Sicherung wiederherstellen?'; + @override String get importConfirmBody => 'Einträge werden mit deinem Bestand zusammengeführt; wenn ein Eintrag auf beiden Seiten existiert, gewinnt die neuere Version. Nichts wird dupliziert.'; + @override String get importCsvConfirmTitle => 'Liste importieren?'; + @override String get importCsvConfirmBody => 'Jede Zeile wird als neuer Eintrag hinzugefügt. Dies führt nicht zusammen und ersetzt nicht, also bringt zweimaliger Import dieselbe Datei zweimal ein.'; + @override String get importAction => 'Importieren'; + @override String get exportSaved => 'Kopie gespeichert'; + @override String get cancelled => 'Abgebrochen'; + @override String importDone({required Object added, required Object updated}) => 'Importiert: ${added} neu, ${updated} aktualisiert'; + @override String importCsvDone({required Object count}) => '${count} Einträge hinzugefügt'; + @override String get importFailed => 'Diese Datei konnte nicht als Tane-Kopie gelesen werden'; + @override String get failed => 'Etwas ist schief gelaufen'; + @override String get recoveryTitle => 'Dein Wiederherstellungscode'; + @override String get recoverySubtitle => 'Drucke ihn und bewahre ihn auf - er öffnet deine Kopien auf einem neuen Gerät'; + @override String get recoveryIntro => 'Dieser Code öffnet deine gespeicherten Kopien und stellt deine Bank auf jedem Gerät wieder her. Bewahre zwei Papierkopien an sicheren Orten auf, wie dein bestes Saatgut. Jeder, der ihn hat, kann deine Kopien lesen, also teile ihn mit niemandem.'; + @override String get recoveryCopy => 'Kopieren'; + @override String get recoverySave => 'Blatt speichern'; + @override String get recoverySheetTitle => 'Tane - dein Wiederherstellungsblatt'; + @override String get recoveryPromptTitle => 'Gib deinen Wiederherstellungscode ein'; + @override String get recoveryPromptBody => 'Diese Kopie wurde mit einem anderen Code gespeichert. Gib den Code von deinem Wiederherstellungsblatt ein, um sie zu öffnen.'; + @override String get recoveryWrongCode => 'Dieser Code öffnet diese Kopie nicht'; +} + +// Path: about +class _Translations$about$de extends Translations$about$en { + _Translations$about$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Über'; + @override String get kanji => '種'; + @override String get tagline => 'Eine lokal speichernde, dezentralisierte App zum Verwalten und Teilen traditioneller Samen und Setzlinge.'; + @override String get intro => 'Tane (種, \'Samen\' auf Japanisch) hilft Menschen und Gemeinschaften, eine freundliche Saatgutbank zu führen, zu entscheiden, was sie anbieten, und es lokal zu teilen - ohne einen zentralen Vermittler, der es kontrollieren, zensieren oder dafür bestraft werden könnte. Der Name kommt von tanemaki (種まき), \'säen / Samen verstreuen\'. Das Ziel ist praktisch und politisch zugleich: traditionelle Samensorten unterstützen und gegen das Saatgutmonopol angehen.'; + @override String get heritage => 'Der Name würdigt alte japanische Traditionen der gegenseitigen Hilfe rund um Reis - yui (gemeinsame Gemeinschaftsarbeit) und tanomoshi (Gegenseitigkeitsfonds) - die das Papier Plantare inspiriert haben, die \'Gemeinschaftswährung für Samenaustausch\' (BAH-Semillero, 2009, CC-BY-SA). Tane ist das digitale Plantare.'; + @override String get version => 'Version'; + @override String get license => 'Lizenz'; + @override String get licenseValue => 'AGPL-3.0'; + @override String get website => 'Webseite'; + @override String get openSourceLicenses => 'Open-Source-Lizenzen'; + @override String get openSourceLicensesSubtitle => 'Bibliotheken von Drittanbietern und ihre Lizenzen'; + @override String copyright({required Object years}) => '© ${years} Comunes Association, unter AGPLv3'; +} + +// Path: intro +class _Translations$intro$de extends Translations$intro$en { + _Translations$intro$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get skip => 'Überspringen'; + @override String get next => 'Nächste'; + @override String get start => 'Anfangen'; + @override String get menuEntry => 'Wie Tane funktioniert'; + @override late final _Translations$intro$slides$de slides = _Translations$intro$slides$de._(_root); +} + +// Path: inventory +class _Translations$inventory$de extends Translations$inventory$en { + _Translations$inventory$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Bestand'; + @override String get searchHint => 'Samen suchen'; + @override String get empty => 'Noch keine Samen. Tippe +, um deine erste hinzuzufügen.'; + @override String get noMatches => 'Keine Samen passen zu deinen Filtern.'; + @override String get clearFilters => 'Filter löschen'; + @override String get uncategorized => 'Unkategorisiert'; + @override String get needsReproductionFilter => 'Zu vermehren'; + @override String get loadError => 'Konnte deine Saatgutbank nicht öffnen. Sie war vielleicht beschäftigt - versuche es erneut.'; + @override String get retry => 'Versuchen'; +} + +// Path: draft +class _Translations$draft$de extends Translations$draft$en { + _Translations$draft$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get capture => 'Fotos erfassen'; + @override String captured({required Object n}) => '${n} erfasst zum Katalogisieren'; + @override String get triageTitle => 'Zum Katalogisieren'; + @override String triageCount({required Object n}) => '${n} zum Katalogisieren'; + @override String get untitled => 'Unbenannt'; + @override String get nameField => 'Benenne diesen Samen'; + @override String get nameHint => 'Was ist es?'; + @override String get suggestFromPhoto => 'Namen aus Foto vorschlagen'; + @override String get discard => 'Verwerfen'; +} + +// Path: quickAdd +class _Translations$quickAdd$de extends Translations$quickAdd$en { + _Translations$quickAdd$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Einen Samen hinzufügen'; + @override String get labelField => 'Name'; + @override String get labelRequired => 'Gib ihm einen Namen'; + @override String get addPhoto => 'Foto hinzufügen'; + @override String get quantity => 'Wie viel?'; + @override String get more => 'Mehr hinzufügen…'; + @override String get save => 'Speichern'; + @override String get saveAndAddAnother => 'Speichern und noch einen hinzufügen'; + @override String addedCount({required Object n}) => '${n} hinzugefügt'; + @override String get cancel => 'Abbrechen'; +} + +// Path: detail +class _Translations$detail$de extends Translations$detail$en { + _Translations$detail$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get notFound => 'Dieser Samen ist nicht mehr hier.'; + @override String get lots => 'Partien'; + @override String get noLots => 'Noch keine Partien.'; + @override String get names => 'Auch bekannt als'; + @override String get addName => 'Namen hinzufügen'; + @override String get links => 'Links'; + @override String get addLink => 'Link hinzufügen'; + @override String get linkUrl => 'URL'; + @override String get linkTitle => 'Titel (optional)'; + @override String get reference => 'Mehr erfahren'; + @override String get refGbif => 'GBIF'; + @override String get refWikipedia => 'Wikipedia'; + @override String get refWikispecies => 'Wikispecies'; + @override String get notes => 'Notizen'; + @override String get addLot => 'Partie hinzufügen'; + @override String get editLot => 'Partie bearbeiten'; + @override String get deleteConfirm => 'Diesen Samen löschen?'; + @override String year({required Object year}) => 'Jahr ${year}'; + @override String get noYear => 'Jahr unbekannt'; +} + +// Path: germination +class _Translations$germination$de extends Translations$germination$en { + _Translations$germination$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Keimung'; + @override String get add => 'Test hinzufügen'; + @override String get sampleSize => 'Stichprobengröße'; + @override String get germinated => 'Gekeimt'; + @override String get none => 'Noch keine Keimtests.'; + @override String result({required Object percent}) => '${percent}%'; +} + +// Path: viability +class _Translations$viability$de extends Translations$viability$en { + _Translations$viability$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get expiringSoon => 'Verwende oder vervielfältige diese Saison'; + @override String expiringSoonYears({required Object years}) => 'Verwende oder vervielfältige diese Saison · hält ~${years} Jahre'; + @override String get expired => 'Über typische Keimfähigkeit hinaus - zu vervielfältigen'; + @override String expiredYears({required Object years}) => 'Über typische Keimfähigkeit (~${years} Jahre) - zu vervielfältigen'; +} + +// Path: editVariety +class _Translations$editVariety$de extends Translations$editVariety$en { + _Translations$editVariety$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Samen bearbeiten'; + @override String get name => 'Name'; + @override String get category => 'Kategorie'; + @override String get notes => 'Notizen'; + @override String get species => 'Art (aus Katalog)'; + @override String get speciesHint => 'Durchsuche eine Art…'; + @override String get speciesSuggested => 'Aus dem Namen vorgeschlagen'; + @override String get organic => 'Bio'; + @override String get organicHint => 'Biologisch angebaut (Öko)'; +} + +// Path: addLot +class _Translations$addLot$de extends Translations$addLot$en { + _Translations$addLot$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Partie hinzufügen'; + @override String get year => 'Erntedate'; + @override String get quantity => 'Wie viel?'; + @override String get amount => 'Menge'; +} + +// Path: harvest +class _Translations$harvest$de extends Translations$harvest$en { + _Translations$harvest$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get pickTitle => 'Wähle Monat / Jahr'; + @override String get anyMonth => 'Jeder Monat'; + @override String get noDate => 'Erntedate setzen'; + @override List get monthNames => [ + 'Januar', + 'Februar', + 'März', + 'April', + 'Mai', + 'Juni', + 'Juli', + 'August', + 'September', + 'Oktober', + 'November', + 'Dezember', + ]; +} + +// Path: lotType +class _Translations$lotType$de extends Translations$lotType$en { + _Translations$lotType$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get seed => 'Samen'; + @override String get plant => 'Pflanze'; + @override String get seedling => 'Setzling'; + @override String get tree => 'Baum / Strauch'; + @override String get bulb => 'Zwiebel / Knolle'; + @override String get cutting => 'Steckling'; +} + +// Path: presentation +class _Translations$presentation$de extends Translations$presentation$en { + _Translations$presentation$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Verpackung'; + @override String get none => 'Unspezifisch'; + @override String get pot => 'Topf'; + @override String get tray => 'Tablett'; + @override String get plug => 'Topfplatte'; + @override String get bareRoot => 'Nacktwurzel'; + @override String get rootBall => 'Wurzelballen'; +} + +// Path: provenance +class _Translations$provenance$de extends Translations$provenance$en { + _Translations$provenance$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get section => 'Woher es kommt'; + @override String get seedsFrom => 'Samen von'; + @override String get seedsFromHint => 'Wer sie anbaute oder gab'; + @override String get place => 'Ort'; + @override String get placeHint => 'Woher sie kommen (mit Gegend)'; + @override String get addSeedsFrom => 'Samen von'; + @override String get addPlace => 'Ort'; +} + +// Path: abundance +class _Translations$abundance$de extends Translations$abundance$en { + _Translations$abundance$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get add => 'Wie viel ich habe'; + @override String get title => 'Wie viel ich habe'; + @override String get none => 'Nicht gesetzt'; + @override String get plentyToShare => 'Reichlich zum Teilen'; + @override String get enoughToShare => 'Genug zum etwas Teilen'; + @override String get enoughForMe => 'Genug für mich'; + @override String get runningLow => 'Wird knapp'; +} + +// Path: share +class _Translations$share$de extends Translations$share$en { + _Translations$share$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get add => 'Teilst du es?'; + @override String get title => 'Teilst du es?'; + @override String get nudge => 'Du hast reichlich - du könntest etwas teilen.'; + @override String get price => 'Preis'; + @override String get priceHint => 'Lass es leer, um es später zu vereinbaren'; + @override String get private => 'Nur für mich'; + @override String get gift => 'Zum Verschenken'; + @override String get exchange => 'Zum Tauschen'; + @override String get sell => 'Zum Verkauf'; + @override String get filterChip => 'Ich teile'; + @override String get printCatalog => 'Drucke, was ich teile'; + @override String get catalogTitle => 'Was ich teile'; + @override String get catalogSaved => 'Katalog gespeichert'; + @override String get cancelled => 'Abgebrochen'; +} + +// Path: printLabels +class _Translations$printLabels$de extends Translations$printLabels$en { + _Translations$printLabels$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get action => 'Etiketten drucken'; + @override String get title => 'Etiketten drucken'; + @override String get selectHint => 'Wähle die Samen, für die du Etiketten drucken möchtest'; + @override String get selectAll => 'Alles auswählen'; + @override String selected({required Object n}) => '${n} ausgewählt'; + @override String get none => 'Wähle zuerst Samen aus'; + @override String get format => 'Etikettengröße'; + @override String get formatStickers => 'Kleine Aufkleber'; + @override String get formatStickersHint => 'Viele kleine Etiketten pro Seite - zum Aufkleben auf Päckchen'; + @override String get formatCards => 'Große Karten'; + @override String get formatCardsHint => 'Weniger, größere Etiketten - für Gläser und Boxen'; + @override String count({required Object n}) => '${n} Etiketten'; + @override String get save => 'Etiketten speichern'; + @override String get saved => 'Etiketten gespeichert'; + @override String get cancelled => 'Abgebrochen'; +} + +// Path: cropCalendar +class _Translations$cropCalendar$de extends Translations$cropCalendar$en { + _Translations$cropCalendar$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get add => 'Anbaukalender'; + @override String get title => 'Anbaukalender'; + @override String get sow => 'Säen'; + @override String get transplant => 'Pflanzen'; + @override String get flowering => 'Blüte'; + @override String get fruiting => 'Fruchtbildung'; + @override String get seedHarvest => 'Samenernte'; + @override String get editorHint => 'Notiere die typischen Monate für diese Sorte in deinem Gebiet - das sind deine eigenen Notizen.'; + @override String get unset => '—'; +} + +// Path: needsReproduction +class _Translations$needsReproduction$de extends Translations$needsReproduction$en { + _Translations$needsReproduction$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get label => 'Diese Saison vermehren'; + @override String get hint => 'Baue es an, bevor der Samen ausgeht'; + @override String get badge => 'Zu vermehren'; +} + +// Path: preservation +class _Translations$preservation$de extends Translations$preservation$en { + _Translations$preservation$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get add => 'Wie es aufbewahrt wird'; + @override String get title => 'Wie es aufbewahrt wird'; + @override String get none => 'Unspezifisch'; + @override String get jarWithDesiccant => 'Glas mit Trockenmittel'; + @override String get glassJar => 'Glasgefäß'; + @override String get paperEnvelope => 'Papierumschlag'; + @override String get paperBag => 'Papierbeutel'; + @override String get plasticBag => 'Plastikbeutel'; +} + +// Path: conditionCheck +class _Translations$conditionCheck$de extends Translations$conditionCheck$en { + _Translations$conditionCheck$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get advanced => 'Lagerung und Saatgutbank-Details'; + @override String get title => 'Lagerchecks'; + @override String get add => 'Check hinzufügen'; + @override String get containers => 'Gläser / Behälter'; + @override String get desiccant => 'Trockenmittel'; + @override String get none => 'Noch keine Lagerchecks.'; + @override String summary({required Object count, required Object state}) => '${count} Glas(gläser) · ${state}'; +} + +// Path: desiccant +class _Translations$desiccant$de extends Translations$desiccant$en { + _Translations$desiccant$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get none => 'Keine'; + @override String get add => 'Eine hinzufügen'; + @override String get replace => 'Austauschen'; + @override String get dry => 'Blau - trocken'; + @override String get fresh => 'Gerade erneuert'; +} + +// Path: unit +class _Translations$unit$de extends Translations$unit$en { + _Translations$unit$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get aFew => 'einige'; + @override String get some => 'einige'; + @override String get plenty => 'viele'; + @override String get pinch => 'eine Prise'; + @override late final _Translations$unit$handful$de handful = _Translations$unit$handful$de._(_root); + @override late final _Translations$unit$teaspoon$de teaspoon = _Translations$unit$teaspoon$de._(_root); + @override late final _Translations$unit$spoon$de spoon = _Translations$unit$spoon$de._(_root); + @override late final _Translations$unit$cup$de cup = _Translations$unit$cup$de._(_root); + @override late final _Translations$unit$jar$de jar = _Translations$unit$jar$de._(_root); + @override late final _Translations$unit$sack$de sack = _Translations$unit$sack$de._(_root); + @override late final _Translations$unit$packet$de packet = _Translations$unit$packet$de._(_root); + @override late final _Translations$unit$cob$de cob = _Translations$unit$cob$de._(_root); + @override late final _Translations$unit$pod$de pod = _Translations$unit$pod$de._(_root); + @override late final _Translations$unit$ear$de ear = _Translations$unit$ear$de._(_root); + @override late final _Translations$unit$head$de head = _Translations$unit$head$de._(_root); + @override late final _Translations$unit$fruit$de fruit = _Translations$unit$fruit$de._(_root); + @override late final _Translations$unit$bulb$de bulb = _Translations$unit$bulb$de._(_root); + @override late final _Translations$unit$tuber$de tuber = _Translations$unit$tuber$de._(_root); + @override late final _Translations$unit$seedHead$de seedHead = _Translations$unit$seedHead$de._(_root); + @override late final _Translations$unit$bunch$de bunch = _Translations$unit$bunch$de._(_root); + @override late final _Translations$unit$plant$de plant = _Translations$unit$plant$de._(_root); + @override late final _Translations$unit$pot$de pot = _Translations$unit$pot$de._(_root); + @override late final _Translations$unit$tray$de tray = _Translations$unit$tray$de._(_root); + @override late final _Translations$unit$seedling$de seedling = _Translations$unit$seedling$de._(_root); + @override late final _Translations$unit$tree$de tree = _Translations$unit$tree$de._(_root); + @override late final _Translations$unit$cutting$de cutting = _Translations$unit$cutting$de._(_root); + @override late final _Translations$unit$grams$de grams = _Translations$unit$grams$de._(_root); + @override late final _Translations$unit$count$de count = _Translations$unit$count$de._(_root); +} + +// Path: market +class _Translations$market$de extends Translations$market$en { + _Translations$market$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Samen in deiner Nähe'; + @override String get subtitle => 'Was andere in der Nähe teilen'; + @override String get notSetUp => 'Teilen ist noch nicht eingerichtet'; + @override String get notSetUpBody => 'Aktiviere Teilen, um Samen zu sehen und mit Menschen in der Nähe zu teilen. Es bleibt ungefähr - deine Zone, nie deine genaue Adresse.'; + @override String get setUp => 'Teilen einrichten'; + @override String get cantReach => 'Kann die Gemeinschaftsserver gerade nicht erreichen'; + @override String get cantReachBody => 'Versuche es erneut, oder überprüfe die Server unter Erweiterte Einrichtung.'; + @override String get retry => 'Erneut versuchen'; + @override String get setArea => 'Stelle dein Gebiet ein'; + @override String get setAreaBody => 'Teile dem Markt ungefähr mit, wo du bist, um Samen in deiner Nähe zu sehen.'; + @override String get searching => 'Schaue nach deinem Gebiet…'; + @override String get empty => 'Noch keine Samen in deiner Nähe geteilt'; + @override String get searchHint => 'Suche nach diesen Samen'; + @override String get noMatches => 'Keine geteilten Samen passen zu deiner Suche'; + @override String get near => 'In deiner Nähe'; + @override String get contact => 'Nachricht'; + @override String get mine => 'Du'; + @override String get configTitle => 'Teilen-Einrichtung'; + @override String get setupIntro => 'Teilen mit Menschen in der Nähe ist optional. Gib einfach dein ungefähres Gebiet an - du bist bereits mit freigegebenen Gemeinschaftsservern verbunden, damit Leute das finden können, das du anbietest, ohne ein Unternehmen dazwischen.'; + @override String get areaLabel => 'Dein Gebiet'; + @override String get areaHelp => 'Absichtlich grob gehalten - deine Zone, nie ein genauer Punkt.'; + @override String get areaSet => 'Dein Gebiet ist gesetzt - grob, nie dein genauer Punkt'; + @override String get areaNotSet => 'Gebiet noch nicht gesetzt - verwende deinen Standort oder füge einen Code unter Erweiterte hinzu'; + @override String get advanced => 'Erweiterte'; + @override String get areaCodeLabel => 'Gebiets-Code'; + @override String get areaCodeHint => 'Ein kurzer Code wie sp3e9 - kein Ortsname'; + @override String get serversLabel => 'Gemeinschaftsserver'; + @override String get serversHelp => 'Eine Adresse pro Zeile (wss://…). Lass die Standardwerte, wenn du dir nicht sicher bist.'; + @override String get serversAdvanced => 'Füge einen weiteren Server hinzu'; + @override String get save => 'Speichern'; + @override String get saved => 'Gespeichert'; + @override String get wanted => 'Gesucht'; + @override String get shareMine => 'Meine Samen teilen'; + @override String sharedCount({required Object n}) => '${n} Samen in der Nähe geteilt'; + @override String get nothingToShare => 'Markiere zuerst einige Samen zum Verschenken, Tauschen oder Verkaufen'; + @override String get useLocation => 'Meinen ungefähren Standort verwenden'; + @override String get locationFailed => 'Konnte deinen Standort nicht ermitteln - überprüfe, dass Standort aktiviert ist und die Berechtigung erteilt wurde'; + @override String get queued => 'Gespeichert - wir werden diese teilen, wenn du verbunden bist'; + @override String get shareFailed => 'Konnte die Gemeinschaftsserver nicht erreichen - deine Samen wurden nicht geteilt. Versuche es gleich erneut.'; + @override String get rangeLabel => 'Wie weit zum Suchen'; + @override String get rangeNear => 'Sehr nah'; + @override String get rangeArea => 'Um mich herum'; + @override String get rangeRegion => 'Meine Region'; + @override String get sharedBy => 'Geteilt von'; + @override String get noProfile => 'Diese Person hat noch kein Profil geteilt'; + @override String get copyId => 'Code kopieren'; + @override String get idCopied => 'Code kopiert'; + @override String get photo => 'Foto'; +} + +// Path: profile +class _Translations$profile$de extends Translations$profile$en { + _Translations$profile$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Dein Profil'; + @override String get name => 'Anzeigename'; + @override String get nameHint => 'Wie dich andere sehen'; + @override String get about => 'Über'; + @override String get aboutHint => 'Eine kurze Zeile - was du anbaust, wo'; + @override String get g1 => 'Ğ1-Adresse (optional)'; + @override String get g1Hint => 'Damit dich Leute in Ğ1 bezahlen können - getrennt von deinem Schlüssel'; + @override String get yourId => 'Deine Identität'; + @override String get idHelp => 'Teile dies, damit dich Leute erkennen'; + @override String get copy => 'Kopieren'; + @override String get copied => 'Kopiert'; + @override String get save => 'Speichern'; + @override String get saved => 'Profil gespeichert'; + @override String get identities => 'Deine Identitäten'; + @override String get identitiesHelp => 'Halte separate Identitäten - jede mit ihren eigenen Nachrichten und Kontakten. Alle kommen aus deiner einen Sicherung, also Wechsel fügt nichts hinzu, das man sich merken muss.'; + @override String identityLabel({required Object n}) => 'Identität ${n}'; + @override String get current => 'In Gebrauch'; + @override String get newIdentity => 'Neue Identität'; + @override String get switchTitle => 'Identität wechseln?'; + @override String get switchBody => 'Nachrichten und Kontakte werden für jede Identität getrennt aufbewahrt. Du kannst jederzeit zurückwechseln.'; + @override String get switchAction => 'Wechsel'; +} + +// Path: chatList +class _Translations$chatList$de extends Translations$chatList$en { + _Translations$chatList$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Nachrichten'; + @override String get empty => 'Noch keine Gespräche. Schreibe jemanden vom Markt an.'; +} + +// Path: chat +class _Translations$chat$de extends Translations$chat$en { + _Translations$chat$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Chat'; + @override String get hint => 'Schreibe eine Nachricht…'; + @override String get send => 'Senden'; + @override String get empty => 'Noch keine Nachrichten - sag hallo'; + @override String get offline => 'Richte Teilen ein, um Nachrichten zu senden'; + @override String get payG1 => 'In Ğ1 bezahlen'; + @override String get g1Copied => 'Ğ1-Adresse kopiert - füge sie in dein Portemonnaie ein'; + @override String get today => 'Heute'; + @override String get yesterday => 'Gestern'; + @override String get sendError => 'Konnte nicht senden - überprüfe deine Verbindung'; + @override String get noLinks => 'Links sind in Nachrichten nicht erlaubt'; +} + +// Path: trust +class _Translations$trust$de extends Translations$trust$en { + _Translations$trust$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get none => 'Noch niemand bürgt für sie'; + @override String count({required Object n}) => 'Von ${n} bestätigt'; + @override String get vouch => 'Ich kenne diese Person'; + @override String get vouched => 'Du bürgst für sie'; + @override String get circle => 'In deinem Kreis'; +} + +// Path: yourPeople +class _Translations$yourPeople$de extends Translations$yourPeople$en { + _Translations$yourPeople$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Deine Leute'; + @override String get help => 'Menschen, die du kennst und für die du einstehst, und Menschen, die für dich einstehen.'; + @override String get youVouchFor => 'Du stehst ein für'; + @override String get vouchesForYou => 'Sie stehen für dich ein'; + @override String get youVouchForEmpty => 'Du stehst noch für niemanden ein. Wenn du jemanden triffst, öffne deinen Chat mit ihnen und tippe \'Ich kenne diese Person\'.'; + @override String get vouchesForYouEmpty => 'Noch niemand steht für dich ein'; + @override String get revoke => 'Nicht mehr einstehen'; + @override String get revokeConfirm => 'Nicht mehr für diese Person einstehen?'; + @override String get offline => 'Du bist offline - versuche es, wenn du verbunden bist'; +} + +// Path: ratings +class _Translations$ratings$de extends Translations$ratings$en { + _Translations$ratings$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get rate => 'Bewerte diese Person'; + @override String get edit => 'Bearbeite deine Bewertung'; + @override String get commentHint => 'Wie war es? (optional)'; + @override String fromYourCircle({required Object n}) => '${n} von Leuten, die du kennst'; + @override String get retract => 'Entferne deine Bewertung'; + @override String get saved => 'Bewertung gespeichert'; +} + +// Path: notifications +class _Translations$notifications$de extends Translations$notifications$en { + _Translations$notifications$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String newMessageFrom({required Object name}) => 'Neue Nachricht von ${name}'; +} + +// Path: plantare +class _Translations$plantare$de extends Translations$plantare$en { + _Translations$plantare$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Plantares'; + @override String get help => 'Ein Plantare ist ein Versprechen, einen Samen zu vervielfältigen und etwas zurückzugeben - wie eine Sorte von Hand zu Hand reist. Es ist kein Verkauf.'; + @override String get add => 'Verpflichtung hinzufügen'; + @override String get empty => 'Noch keine Verpflichtungen. Wenn du einen Samen mit dem Versprechen teilst oder erhältst, ihn anzubauen und etwas zurückzugeben, notiere es hier.'; + @override String get iReturn => 'Ich baue es an und gebe es zurück'; + @override String get owedToMe => 'Sie geben mir etwas zurück'; + @override String get direction => 'Wer baut an und gibt zurück'; + @override String get counterparty => 'Mit wem?'; + @override String get counterpartyHint => 'Eine Person oder ein Kollektiv (optional)'; + @override String get owed => 'Was kommt zurück?'; + @override String get owedHint => 'z.B. eine Handvoll nächste Saison (optional)'; + @override String get note => 'Notiz (optional)'; + @override String get save => 'Speichern'; + @override String get markReturned => 'Als zurückgegeben markieren'; + @override String get markForgiven => 'Absehen lassen'; + @override String get reopen => 'Erneut öffnen'; + @override String get delete => 'Entfernen'; + @override String get statusReturned => 'Zurückgegeben'; + @override String get statusForgiven => 'Erledigt'; + @override String get openSection => 'Offen'; + @override String get settledSection => 'Erledigt'; + @override String get removeConfirm => 'Diese Verpflichtung entfernen?'; +} + +// Path: handover +class _Translations$handover$de extends Translations$handover$en { + _Translations$handover$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Samen wechselten den Besitzer'; + @override String get help => 'Ein Geschenk, ein Tausch oder ein Verkauf - notiere es auf, mit oder ohne Rückgabeversprechen.'; + @override String get iGave => 'Ich gab Samen'; + @override String get iReceived => 'Ich erhielt Samen'; + @override String get whichLot => 'Welche Partie?'; + @override String get howMuch => 'Wie viel?'; + @override String get allOfIt => 'Alles'; + @override String get partOfIt => 'Ein Teil'; + @override String get paymentChip => 'Geld wechselte den Besitzer'; + @override String get promiseGave => 'Sie geben mir Samen zurück'; + @override String get promiseReceived => 'Ich gebe Samen zurück'; +} + +// Path: sale +class _Translations$sale$de extends Translations$sale$en { + _Translations$sale$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Verkäufe'; + @override String get help => 'Notiere Samen, die du verkauft oder gekauft hast - Geld, Ğ1 oder jede Währung. Ein eigenes Modell abseits Geschenk und Plantare. Es wird nie eine Kommission auf Samen erhoben.'; + @override String get add => 'Verkauf notieren'; + @override String get empty => 'Noch keine Verkäufe. Notiere hier, was du verkaufst oder kaufst.'; + @override String get iSold => 'Ich verkaufte'; + @override String get iBought => 'Ich kaufte'; + @override String get direction => 'Verkauft oder gekauft?'; + @override String get counterparty => 'Mit wem?'; + @override String get counterpartyHint => 'Eine Person oder ein Kollektiv (optional)'; + @override String get amount => 'Betrag'; + @override String get currency => 'Währung'; + @override String get currencyHint => '€, Ğ1, Stunden… (optional)'; + @override String get hours => 'Stunden'; + @override String get note => 'Notiz (optional)'; + @override String get save => 'Speichern'; + @override String get delete => 'Entfernen'; + @override String get removeConfirm => 'Diesen Verkauf entfernen?'; +} + +// Path: legal +class _Translations$legal$de extends Translations$legal$en { + _Translations$legal$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Datenschutz und Regeln'; + @override String get subtitle => 'Dein Datenschutz, die Marktregeln und die Legalität von Samen'; + @override String get privacyTitle => 'Dein Datenschutz'; + @override String get privacyBody => 'Tane funktioniert ohne Konto, und alles, das du notierst, bleibt auf deinem Gerät, verschlüsselt. Es gibt keine Werbung, keine Tracker und keinen Tane-Server.\n\nNichts wird geteilt, es sei denn, du wählst es: Wenn du ein Angebot oder dein Profil veröffentlichst oder eine Nachricht sendest, reist es durch Gemeinschaftsserver. Angebote tragen nur eine ungefähre Zone - nie deine Adresse.\n\nWas du veröffentlichst, ist öffentlich, und Kopien können bleiben, selbst nachdem du es entfernt hast - teile also mit Bedacht.'; + @override String get rulesTitle => 'Die Spielregeln'; + @override String get rulesBody => 'Tane ist ein Werkzeug, kein Laden: Austausch wird direkt zwischen Menschen vereinbart, und niemand nimmt eine Provision. Das bedeutet auch, dass du verantwortlich bist für das, das du anbietest und sendest.\n\nAuf dem Markt: Sei ehrlich mit deinen Samen, biete nur an, was du teilen darfst, behandle Menschen gut und spamme nicht. Du kannst jeden blockieren und Angebote oder Menschen melden, die die Regeln brechen - Meldungen werden auf den Gemeinschaftsservern bearbeitet.'; + @override String get seedsTitle => 'Über das Teilen von Samen'; + @override String get seedsBody => 'Das Verschenken und Tauschen von Samen zwischen Hobbyisten ist in den meisten Ländern weit verbreitet. Verkaufen kann anders sein: An vielen Orten ist der Verkauf von Samen nicht offiziell registrierter Sorten eingeschränkt - überprüfe deine örtlichen Vorschriften, bevor du einen Preis fragst.\n\nSamen in ein anderes Land zu schicken ist auch oft eingeschränkt, und kommerziell geschützte Sorten dürfen nicht ohne Genehmigung vermehrt werden. Im Zweifelsfall lieber lokal und lieber Geschenk.'; + @override String get readFull => 'Lese die vollständigen Dokumente online'; +} + +// Path: marketGate +class _Translations$marketGate$de extends Translations$marketGate$en { + _Translations$marketGate$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Bevor du den Markt betrittst'; + @override String get intro => 'Der Markt ist ein gemeinsamer Raum zwischen Nachbarn. Wenn du fortfährst, akzeptierst du einige einfache Regeln:'; + @override String get ruleHonest => 'Sei ehrlich mit den Samen, die du anbietest'; + @override String get ruleLegal => 'Teile nur, was du teilen darfst, wo du lebst'; + @override String get ruleRespect => 'Behandle Menschen gut - kein Spam, kein Missbrauch'; + @override String get publicNote => 'Was du hier veröffentlichst, ist öffentlich, und Kopien können bleiben, selbst wenn du es später entfernst.'; + @override String get viewLegal => 'Datenschutz und Regeln'; + @override String get accept => 'Ich akzeptiere'; + @override String get decline => 'Nicht jetzt'; +} + +// Path: report +class _Translations$report$de extends Translations$report$en { + _Translations$report$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get offer => 'Melde dieses Angebot'; + @override String get person => 'Melde diese Person'; + @override String get title => 'Melden'; + @override String get prompt => 'Was ist falsch?'; + @override String get reasonSpam => 'Spam oder Betrug'; + @override String get reasonAbuse => 'Beleidigend oder respektlos'; + @override String get reasonIllegal => 'Samen, die nicht angeboten werden sollten'; + @override String get reasonOther => 'Etwas anderes'; + @override String get detailsHint => 'Füge Details hinzu (optional)'; + @override String get send => 'Meldung senden'; + @override String get sentHidden => 'Meldung gesendet - du wirst dies nicht mehr sehen'; + @override String get failed => 'Konnte die Meldung nicht senden - überprüfe deine Verbindung'; + @override String get alsoBlock => 'Diese Person auch blockieren'; +} + +// Path: block +class _Translations$block$de extends Translations$block$en { + _Translations$block$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get action => 'Diese Person blockieren'; + @override String get confirmTitle => 'Diese Person blockieren?'; + @override String get confirmBody => 'Du wirst ihre Angebote und Nachrichten nicht mehr sehen. Du kannst sie später unter Blockierte Leute in der Teilen-Einrichtung entsperren.'; + @override String get confirm => 'Blockieren'; + @override String get blockedToast => 'Blockiert - ihre Angebote und Nachrichten sind verborgen'; + @override String get manageTitle => 'Blockierte Leute'; + @override String get manageEmpty => 'Du hast niemanden blockiert'; + @override String get unblock => 'Entsperren'; +} + +// Path: intro.slides +class _Translations$intro$slides$de extends Translations$intro$slides$en { + _Translations$intro$slides$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override late final _Translations$intro$slides$welcome$de welcome = _Translations$intro$slides$welcome$de._(_root); + @override late final _Translations$intro$slides$inventory$de inventory = _Translations$intro$slides$inventory$de._(_root); + @override late final _Translations$intro$slides$privacy$de privacy = _Translations$intro$slides$privacy$de._(_root); + @override late final _Translations$intro$slides$share$de share = _Translations$intro$slides$share$de._(_root); + @override late final _Translations$intro$slides$plantare$de plantare = _Translations$intro$slides$plantare$de._(_root); +} + +// Path: unit.handful +class _Translations$unit$handful$de extends Translations$unit$handful$en { + _Translations$unit$handful$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Handvoll'; + @override String get plural => 'Handvoll'; +} + +// Path: unit.teaspoon +class _Translations$unit$teaspoon$de extends Translations$unit$teaspoon$en { + _Translations$unit$teaspoon$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Teelöffel'; + @override String get plural => 'Teelöffel'; +} + +// Path: unit.spoon +class _Translations$unit$spoon$de extends Translations$unit$spoon$en { + _Translations$unit$spoon$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Löffel'; + @override String get plural => 'Löffel'; +} + +// Path: unit.cup +class _Translations$unit$cup$de extends Translations$unit$cup$en { + _Translations$unit$cup$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Tasse'; + @override String get plural => 'Tassen'; +} + +// Path: unit.jar +class _Translations$unit$jar$de extends Translations$unit$jar$en { + _Translations$unit$jar$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Glas'; + @override String get plural => 'Gläser'; +} + +// Path: unit.sack +class _Translations$unit$sack$de extends Translations$unit$sack$en { + _Translations$unit$sack$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Sack'; + @override String get plural => 'Säcke'; +} + +// Path: unit.packet +class _Translations$unit$packet$de extends Translations$unit$packet$en { + _Translations$unit$packet$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Päckchen'; + @override String get plural => 'Päckchen'; +} + +// Path: unit.cob +class _Translations$unit$cob$de extends Translations$unit$cob$en { + _Translations$unit$cob$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Kolben'; + @override String get plural => 'Kolben'; +} + +// Path: unit.pod +class _Translations$unit$pod$de extends Translations$unit$pod$en { + _Translations$unit$pod$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Schote'; + @override String get plural => 'Schoten'; +} + +// Path: unit.ear +class _Translations$unit$ear$de extends Translations$unit$ear$en { + _Translations$unit$ear$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Ähre'; + @override String get plural => 'Ähren'; +} + +// Path: unit.head +class _Translations$unit$head$de extends Translations$unit$head$en { + _Translations$unit$head$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Kopf'; + @override String get plural => 'Köpfe'; +} + +// Path: unit.fruit +class _Translations$unit$fruit$de extends Translations$unit$fruit$en { + _Translations$unit$fruit$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Frucht'; + @override String get plural => 'Früchte'; +} + +// Path: unit.bulb +class _Translations$unit$bulb$de extends Translations$unit$bulb$en { + _Translations$unit$bulb$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Zwiebel'; + @override String get plural => 'Zwiebeln'; +} + +// Path: unit.tuber +class _Translations$unit$tuber$de extends Translations$unit$tuber$en { + _Translations$unit$tuber$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Knolle'; + @override String get plural => 'Knollen'; +} + +// Path: unit.seedHead +class _Translations$unit$seedHead$de extends Translations$unit$seedHead$en { + _Translations$unit$seedHead$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Samenkopf'; + @override String get plural => 'Samenköpfe'; +} + +// Path: unit.bunch +class _Translations$unit$bunch$de extends Translations$unit$bunch$en { + _Translations$unit$bunch$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Bund'; + @override String get plural => 'Bunde'; +} + +// Path: unit.plant +class _Translations$unit$plant$de extends Translations$unit$plant$en { + _Translations$unit$plant$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Pflanze'; + @override String get plural => 'Pflanzen'; +} + +// Path: unit.pot +class _Translations$unit$pot$de extends Translations$unit$pot$en { + _Translations$unit$pot$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Topf'; + @override String get plural => 'Töpfe'; +} + +// Path: unit.tray +class _Translations$unit$tray$de extends Translations$unit$tray$en { + _Translations$unit$tray$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Tablett'; + @override String get plural => 'Tabletts'; +} + +// Path: unit.seedling +class _Translations$unit$seedling$de extends Translations$unit$seedling$en { + _Translations$unit$seedling$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Setzling'; + @override String get plural => 'Setzlinge'; +} + +// Path: unit.tree +class _Translations$unit$tree$de extends Translations$unit$tree$en { + _Translations$unit$tree$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Baum'; + @override String get plural => 'Bäume'; +} + +// Path: unit.cutting +class _Translations$unit$cutting$de extends Translations$unit$cutting$en { + _Translations$unit$cutting$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Steckling'; + @override String get plural => 'Stecklinge'; +} + +// Path: unit.grams +class _Translations$unit$grams$de extends Translations$unit$grams$en { + _Translations$unit$grams$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Gramm'; + @override String get plural => 'Gramm'; +} + +// Path: unit.count +class _Translations$unit$count$de extends Translations$unit$count$en { + _Translations$unit$count$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get singular => 'Samen'; + @override String get plural => 'Samen'; +} + +// Path: intro.slides.welcome +class _Translations$intro$slides$welcome$de extends Translations$intro$slides$welcome$en { + _Translations$intro$slides$welcome$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Der Samen, der dich hierher brachte'; + @override String get body => 'Jeder traditionelle Samen ist ein Brief, geschrieben von Tausenden von Generationen, weitergegeben von Hand zu Hand. Wir sind, was wir sind, dank dieses Teilens.'; +} + +// Path: intro.slides.inventory +class _Translations$intro$slides$inventory$de extends Translations$intro$slides$inventory$en { + _Translations$intro$slides$inventory$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Deine Saatgutbank in deiner Tasche'; + @override String get body => 'Notiere, was du hast, von welchem Jahr, wie viel und woher es kam - mit dem Namen, den du verwendest. Ein Foto und ein Name reichen aus, um zu beginnen.'; +} + +// Path: intro.slides.privacy +class _Translations$intro$slides$privacy$de extends Translations$intro$slides$privacy$en { + _Translations$intro$slides$privacy$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Deins und nur deins'; + @override String get body => 'Kein Konto, kein Internet, keine Tracker. Deine Daten leben verschlüsselt auf deinem Gerät, und nur das, das du wählst, wird je geteilt.'; +} + +// Path: intro.slides.share +class _Translations$intro$slides$share$de extends Translations$intro$slides$share$en { + _Translations$intro$slides$share$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Teilen, wie es immer gemacht wurde'; + @override String get body => 'Biete an, was du übrig hast - Geschenk, Tausch oder Verkauf - und lass jemanden in deiner Nähe es finden. Nur ein ungefährer Abstand wird gezeigt, nie deine Adresse; du schließt das Geschäft von Angesicht zu Angesicht.'; +} + +// Path: intro.slides.plantare +class _Translations$intro$slides$plantare$de extends Translations$intro$slides$plantare$en { + _Translations$intro$slides$plantare$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get title => 'Säen ist vervielfältigen'; + @override String get body => 'Bei einem Plantare verspricht, wer einen Samen erhält, später etwas zurückzugeben. Und da Zurückgeben bedeutet, es anzubauen, vervielfältigt jede Leihe das Gemeingut.'; +} + +/// The flat map containing all translations for locale . +/// Only for edge cases! For simple maps, use the map function of this library. +/// +/// The Dart AOT compiler has issues with very large switch statements, +/// so the map is split into smaller functions (512 entries each). +extension on TranslationsDe { + dynamic _flatMapFunction(String path) { + return switch (path) { + 'avatar.title' => 'Dein Foto oder Avatar', + 'avatar.fromPhoto' => 'Foto machen oder auswählen', + 'avatar.illustration' => 'Oder wähle eine Illustration', + 'avatar.remove' => 'Entfernen', + 'favorites.title' => 'Favoriten', + 'favorites.empty' => 'Noch keine Favoriten. Speichere Angebote, die dir auf dem Markt gefallen.', + 'favorites.save' => 'Zu Favoriten speichern', + 'favorites.remove' => 'Aus Favoriten entfernen', + 'favorites.unavailable' => 'Nicht mehr verfügbar', + 'seedSaving.title' => 'Samen vervielfältigen', + 'seedSaving.subtitle' => 'Was nötig ist, um die Sorte echt zu erhalten', + 'seedSaving.lifeCycle' => 'Zyklus', + 'seedSaving.cycleAnnual' => 'Einjährig', + 'seedSaving.cycleBiennial' => 'Zweijährig - Samen im 2. Jahr', + 'seedSaving.cyclePerennial' => 'Mehrjährig', + 'seedSaving.pollination' => 'Bestäubung', + 'seedSaving.pollSelf' => 'Selbstbestäubend', + 'seedSaving.pollCross' => 'Kreuzt mit anderen', + 'seedSaving.pollMixed' => 'Selbstbestäubend, manchmal Fremdbefruchtung', + 'seedSaving.byInsect' => 'durch Insekten', + 'seedSaving.byWind' => 'durch Wind', + 'seedSaving.isolation' => 'Abstand halten', + 'seedSaving.isolationRange' => ({required Object min, required Object max}) => '${min}–${max} m zu anderen Sorten', + 'seedSaving.isolationSingle' => ({required Object min}) => '${min} m zu anderen Sorten', + 'seedSaving.plants' => 'Samen von mehreren Pflanzen sammeln', + 'seedSaving.plantsValue' => ({required Object n}) => 'Von mindestens ${n} Pflanzen', + 'seedSaving.processing' => 'Samen reinigen', + 'seedSaving.procDry' => 'Trockensamen (ausdreschen)', + 'seedSaving.procWet' => 'Feuchtsamen (fermentieren und spülen)', + 'seedSaving.difficulty' => 'Schwierigkeit', + 'seedSaving.diffEasy' => 'Leicht', + 'seedSaving.diffMedium' => 'Mittel', + 'seedSaving.diffHard' => 'Schwer', + 'seedSaving.advisory' => 'Allgemeine Hinweise - passe sie an dein Klima und deine Sorte an.', + 'seedSaving.sourcePrefix' => 'Quelle', + 'calendar.title' => 'Dieser Monat', + 'calendar.filterChip' => 'Dieser Monat', + 'calendar.selfNote' => 'Was du in deinen Sorten notiert hast.', + 'calendar.nothing' => ({required Object month}) => 'Nichts für ${month} notiert.', + 'app.title' => 'Tane', + 'bootstrap.failed' => 'Tane konnte nicht starten', + 'bootstrap.retry' => 'Versuchen', + 'common.save' => 'Speichern', + 'common.cancel' => 'Abbrechen', + 'common.delete' => 'Löschen', + 'common.edit' => 'Bearbeiten', + 'common.type' => 'Typ', + 'common.comingSoon' => 'Bald', + 'common.offline' => 'Offline - Teilen ist unterbrochen', + 'home.tagline' => 'Teile und baue lokale Samen an', + 'home.openMarket' => 'Markt', + 'home.openMarketSubtitle' => 'Entdecke und teile Samen in deiner Nähe', + 'home.yourInventory' => 'Dein Bestand', + 'home.yourInventorySubtitle' => 'Verwalte deine Samen', + 'photo.camera' => 'Foto machen', + 'photo.gallery' => 'Aus Galerie wählen', + 'photo.setAsCover' => 'Als Deckblatt setzen', + 'photo.isCover' => 'Deckblatt-Foto', + 'photo.deleteConfirm' => 'Dieses Foto löschen?', + 'menu.tagline' => 'deine Saatgutbank', + 'menu.inventory' => 'Bestand', + 'menu.market' => 'Markt', + 'menu.profile' => 'Dein Profil', + 'menu.chat' => 'Chat', + 'menu.wishlist' => 'Favoriten', + 'menu.following' => 'Gefolgt', + 'menu.plantares' => 'Plantares', + 'menu.sales' => 'Verkäufe', + 'menu.calendar' => 'Kalender', + 'menu.settings' => 'Einstellungen', + 'settings.language' => 'Sprache', + 'settings.systemLanguage' => 'Systemsprache', + 'settings.langEs' => 'Español', + 'settings.langEn' => 'English', + 'settings.langPt' => 'Português', + 'settings.langAst' => 'Asturianu', + 'settings.about' => 'Über', + 'settings.aboutText' => 'Lokale, verschlüsselte Saatgutbank für traditionelle Samen. AGPL-3.0.', + 'settings.aboutOpen' => 'Über Tane', + 'settings.langDe' => 'Deutsch', + 'settings.langFr' => 'Français', + 'backup.title' => 'Sicherung und Wiederherstellung', + 'backup.autoBackupTitle' => 'Automatische Sicherungen', + 'backup.autoBackupLast' => ({required Object date}) => 'Letzte Sicherung ${date}', + 'backup.autoBackupNone' => 'Eine Kopie wird automatisch im Hintergrund gespeichert', + 'backup.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', + 'backup.importJsonSubtitle' => 'Bringe eine gespeicherte Kopie zurück - nichts wird dupliziert', + 'backup.exportCsv' => 'In eine Tabelle exportieren', + 'backup.exportCsvSubtitle' => 'Eine einfache Liste für Excel oder LibreOffice - ohne Fotos', + 'backup.importCsv' => 'Eine Liste importieren', + 'backup.importCsvSubtitle' => 'Einträge aus einer Tabelle hinzufügen', + 'backup.importConfirmTitle' => 'Sicherung wiederherstellen?', + 'backup.importConfirmBody' => 'Einträge werden mit deinem Bestand zusammengeführt; wenn ein Eintrag auf beiden Seiten existiert, gewinnt die neuere Version. Nichts wird dupliziert.', + 'backup.importCsvConfirmTitle' => 'Liste importieren?', + 'backup.importCsvConfirmBody' => 'Jede Zeile wird als neuer Eintrag hinzugefügt. Dies führt nicht zusammen und ersetzt nicht, also bringt zweimaliger Import dieselbe Datei zweimal ein.', + 'backup.importAction' => 'Importieren', + 'backup.exportSaved' => 'Kopie gespeichert', + 'backup.cancelled' => 'Abgebrochen', + 'backup.importDone' => ({required Object added, required Object updated}) => 'Importiert: ${added} neu, ${updated} aktualisiert', + 'backup.importCsvDone' => ({required Object count}) => '${count} Einträge hinzugefügt', + 'backup.importFailed' => 'Diese Datei konnte nicht als Tane-Kopie gelesen werden', + 'backup.failed' => 'Etwas ist schief gelaufen', + 'backup.recoveryTitle' => 'Dein Wiederherstellungscode', + 'backup.recoverySubtitle' => 'Drucke ihn und bewahre ihn auf - er öffnet deine Kopien auf einem neuen Gerät', + 'backup.recoveryIntro' => 'Dieser Code öffnet deine gespeicherten Kopien und stellt deine Bank auf jedem Gerät wieder her. Bewahre zwei Papierkopien an sicheren Orten auf, wie dein bestes Saatgut. Jeder, der ihn hat, kann deine Kopien lesen, also teile ihn mit niemandem.', + 'backup.recoveryCopy' => 'Kopieren', + 'backup.recoverySave' => 'Blatt speichern', + 'backup.recoverySheetTitle' => 'Tane - dein Wiederherstellungsblatt', + 'backup.recoveryPromptTitle' => 'Gib deinen Wiederherstellungscode ein', + 'backup.recoveryPromptBody' => 'Diese Kopie wurde mit einem anderen Code gespeichert. Gib den Code von deinem Wiederherstellungsblatt ein, um sie zu öffnen.', + 'backup.recoveryWrongCode' => 'Dieser Code öffnet diese Kopie nicht', + 'about.title' => 'Über', + 'about.kanji' => '種', + 'about.tagline' => 'Eine lokal speichernde, dezentralisierte App zum Verwalten und Teilen traditioneller Samen und Setzlinge.', + 'about.intro' => 'Tane (種, \'Samen\' auf Japanisch) hilft Menschen und Gemeinschaften, eine freundliche Saatgutbank zu führen, zu entscheiden, was sie anbieten, und es lokal zu teilen - ohne einen zentralen Vermittler, der es kontrollieren, zensieren oder dafür bestraft werden könnte. Der Name kommt von tanemaki (種まき), \'säen / Samen verstreuen\'. Das Ziel ist praktisch und politisch zugleich: traditionelle Samensorten unterstützen und gegen das Saatgutmonopol angehen.', + 'about.heritage' => 'Der Name würdigt alte japanische Traditionen der gegenseitigen Hilfe rund um Reis - yui (gemeinsame Gemeinschaftsarbeit) und tanomoshi (Gegenseitigkeitsfonds) - die das Papier Plantare inspiriert haben, die \'Gemeinschaftswährung für Samenaustausch\' (BAH-Semillero, 2009, CC-BY-SA). Tane ist das digitale Plantare.', + 'about.version' => 'Version', + 'about.license' => 'Lizenz', + 'about.licenseValue' => 'AGPL-3.0', + 'about.website' => 'Webseite', + 'about.openSourceLicenses' => 'Open-Source-Lizenzen', + 'about.openSourceLicensesSubtitle' => 'Bibliotheken von Drittanbietern und ihre Lizenzen', + 'about.copyright' => ({required Object years}) => '© ${years} Comunes Association, unter AGPLv3', + 'intro.skip' => 'Überspringen', + 'intro.next' => 'Nächste', + 'intro.start' => 'Anfangen', + 'intro.menuEntry' => 'Wie Tane funktioniert', + 'intro.slides.welcome.title' => 'Der Samen, der dich hierher brachte', + 'intro.slides.welcome.body' => 'Jeder traditionelle Samen ist ein Brief, geschrieben von Tausenden von Generationen, weitergegeben von Hand zu Hand. Wir sind, was wir sind, dank dieses Teilens.', + 'intro.slides.inventory.title' => 'Deine Saatgutbank in deiner Tasche', + 'intro.slides.inventory.body' => 'Notiere, was du hast, von welchem Jahr, wie viel und woher es kam - mit dem Namen, den du verwendest. Ein Foto und ein Name reichen aus, um zu beginnen.', + 'intro.slides.privacy.title' => 'Deins und nur deins', + 'intro.slides.privacy.body' => 'Kein Konto, kein Internet, keine Tracker. Deine Daten leben verschlüsselt auf deinem Gerät, und nur das, das du wählst, wird je geteilt.', + 'intro.slides.share.title' => 'Teilen, wie es immer gemacht wurde', + 'intro.slides.share.body' => 'Biete an, was du übrig hast - Geschenk, Tausch oder Verkauf - und lass jemanden in deiner Nähe es finden. Nur ein ungefährer Abstand wird gezeigt, nie deine Adresse; du schließt das Geschäft von Angesicht zu Angesicht.', + 'intro.slides.plantare.title' => 'Säen ist vervielfältigen', + 'intro.slides.plantare.body' => 'Bei einem Plantare verspricht, wer einen Samen erhält, später etwas zurückzugeben. Und da Zurückgeben bedeutet, es anzubauen, vervielfältigt jede Leihe das Gemeingut.', + 'inventory.title' => 'Bestand', + 'inventory.searchHint' => 'Samen suchen', + 'inventory.empty' => 'Noch keine Samen. Tippe +, um deine erste hinzuzufügen.', + 'inventory.noMatches' => 'Keine Samen passen zu deinen Filtern.', + 'inventory.clearFilters' => 'Filter löschen', + 'inventory.uncategorized' => 'Unkategorisiert', + 'inventory.needsReproductionFilter' => 'Zu vermehren', + 'inventory.loadError' => 'Konnte deine Saatgutbank nicht öffnen. Sie war vielleicht beschäftigt - versuche es erneut.', + 'inventory.retry' => 'Versuchen', + 'draft.capture' => 'Fotos erfassen', + 'draft.captured' => ({required Object n}) => '${n} erfasst zum Katalogisieren', + 'draft.triageTitle' => 'Zum Katalogisieren', + 'draft.triageCount' => ({required Object n}) => '${n} zum Katalogisieren', + 'draft.untitled' => 'Unbenannt', + 'draft.nameField' => 'Benenne diesen Samen', + 'draft.nameHint' => 'Was ist es?', + 'draft.suggestFromPhoto' => 'Namen aus Foto vorschlagen', + 'draft.discard' => 'Verwerfen', + 'quickAdd.title' => 'Einen Samen hinzufügen', + 'quickAdd.labelField' => 'Name', + 'quickAdd.labelRequired' => 'Gib ihm einen Namen', + 'quickAdd.addPhoto' => 'Foto hinzufügen', + 'quickAdd.quantity' => 'Wie viel?', + 'quickAdd.more' => 'Mehr hinzufügen…', + 'quickAdd.save' => 'Speichern', + 'quickAdd.saveAndAddAnother' => 'Speichern und noch einen hinzufügen', + 'quickAdd.addedCount' => ({required Object n}) => '${n} hinzugefügt', + 'quickAdd.cancel' => 'Abbrechen', + 'detail.notFound' => 'Dieser Samen ist nicht mehr hier.', + 'detail.lots' => 'Partien', + 'detail.noLots' => 'Noch keine Partien.', + 'detail.names' => 'Auch bekannt als', + 'detail.addName' => 'Namen hinzufügen', + 'detail.links' => 'Links', + 'detail.addLink' => 'Link hinzufügen', + 'detail.linkUrl' => 'URL', + 'detail.linkTitle' => 'Titel (optional)', + 'detail.reference' => 'Mehr erfahren', + 'detail.refGbif' => 'GBIF', + 'detail.refWikipedia' => 'Wikipedia', + 'detail.refWikispecies' => 'Wikispecies', + 'detail.notes' => 'Notizen', + 'detail.addLot' => 'Partie hinzufügen', + 'detail.editLot' => 'Partie bearbeiten', + 'detail.deleteConfirm' => 'Diesen Samen löschen?', + 'detail.year' => ({required Object year}) => 'Jahr ${year}', + 'detail.noYear' => 'Jahr unbekannt', + 'germination.title' => 'Keimung', + 'germination.add' => 'Test hinzufügen', + 'germination.sampleSize' => 'Stichprobengröße', + 'germination.germinated' => 'Gekeimt', + 'germination.none' => 'Noch keine Keimtests.', + 'germination.result' => ({required Object percent}) => '${percent}%', + 'viability.expiringSoon' => 'Verwende oder vervielfältige diese Saison', + 'viability.expiringSoonYears' => ({required Object years}) => 'Verwende oder vervielfältige diese Saison · hält ~${years} Jahre', + 'viability.expired' => 'Über typische Keimfähigkeit hinaus - zu vervielfältigen', + 'viability.expiredYears' => ({required Object years}) => 'Über typische Keimfähigkeit (~${years} Jahre) - zu vervielfältigen', + 'editVariety.title' => 'Samen bearbeiten', + 'editVariety.name' => 'Name', + 'editVariety.category' => 'Kategorie', + 'editVariety.notes' => 'Notizen', + 'editVariety.species' => 'Art (aus Katalog)', + 'editVariety.speciesHint' => 'Durchsuche eine Art…', + 'editVariety.speciesSuggested' => 'Aus dem Namen vorgeschlagen', + 'editVariety.organic' => 'Bio', + 'editVariety.organicHint' => 'Biologisch angebaut (Öko)', + 'addLot.title' => 'Partie hinzufügen', + 'addLot.year' => 'Erntedate', + 'addLot.quantity' => 'Wie viel?', + 'addLot.amount' => 'Menge', + 'harvest.pickTitle' => 'Wähle Monat / Jahr', + 'harvest.anyMonth' => 'Jeder Monat', + 'harvest.noDate' => 'Erntedate setzen', + 'harvest.monthNames.0' => 'Januar', + 'harvest.monthNames.1' => 'Februar', + 'harvest.monthNames.2' => 'März', + 'harvest.monthNames.3' => 'April', + 'harvest.monthNames.4' => 'Mai', + 'harvest.monthNames.5' => 'Juni', + 'harvest.monthNames.6' => 'Juli', + 'harvest.monthNames.7' => 'August', + 'harvest.monthNames.8' => 'September', + 'harvest.monthNames.9' => 'Oktober', + 'harvest.monthNames.10' => 'November', + 'harvest.monthNames.11' => 'Dezember', + 'lotType.seed' => 'Samen', + 'lotType.plant' => 'Pflanze', + 'lotType.seedling' => 'Setzling', + 'lotType.tree' => 'Baum / Strauch', + 'lotType.bulb' => 'Zwiebel / Knolle', + 'lotType.cutting' => 'Steckling', + 'presentation.title' => 'Verpackung', + 'presentation.none' => 'Unspezifisch', + 'presentation.pot' => 'Topf', + 'presentation.tray' => 'Tablett', + 'presentation.plug' => 'Topfplatte', + 'presentation.bareRoot' => 'Nacktwurzel', + 'presentation.rootBall' => 'Wurzelballen', + 'provenance.section' => 'Woher es kommt', + 'provenance.seedsFrom' => 'Samen von', + 'provenance.seedsFromHint' => 'Wer sie anbaute oder gab', + 'provenance.place' => 'Ort', + 'provenance.placeHint' => 'Woher sie kommen (mit Gegend)', + 'provenance.addSeedsFrom' => 'Samen von', + 'provenance.addPlace' => 'Ort', + 'abundance.add' => 'Wie viel ich habe', + 'abundance.title' => 'Wie viel ich habe', + 'abundance.none' => 'Nicht gesetzt', + 'abundance.plentyToShare' => 'Reichlich zum Teilen', + 'abundance.enoughToShare' => 'Genug zum etwas Teilen', + 'abundance.enoughForMe' => 'Genug für mich', + 'abundance.runningLow' => 'Wird knapp', + 'share.add' => 'Teilst du es?', + 'share.title' => 'Teilst du es?', + 'share.nudge' => 'Du hast reichlich - du könntest etwas teilen.', + 'share.price' => 'Preis', + 'share.priceHint' => 'Lass es leer, um es später zu vereinbaren', + 'share.private' => 'Nur für mich', + 'share.gift' => 'Zum Verschenken', + 'share.exchange' => 'Zum Tauschen', + 'share.sell' => 'Zum Verkauf', + 'share.filterChip' => 'Ich teile', + 'share.printCatalog' => 'Drucke, was ich teile', + 'share.catalogTitle' => 'Was ich teile', + 'share.catalogSaved' => 'Katalog gespeichert', + 'share.cancelled' => 'Abgebrochen', + 'printLabels.action' => 'Etiketten drucken', + 'printLabels.title' => 'Etiketten drucken', + 'printLabels.selectHint' => 'Wähle die Samen, für die du Etiketten drucken möchtest', + 'printLabels.selectAll' => 'Alles auswählen', + 'printLabels.selected' => ({required Object n}) => '${n} ausgewählt', + 'printLabels.none' => 'Wähle zuerst Samen aus', + 'printLabels.format' => 'Etikettengröße', + 'printLabels.formatStickers' => 'Kleine Aufkleber', + 'printLabels.formatStickersHint' => 'Viele kleine Etiketten pro Seite - zum Aufkleben auf Päckchen', + 'printLabels.formatCards' => 'Große Karten', + 'printLabels.formatCardsHint' => 'Weniger, größere Etiketten - für Gläser und Boxen', + 'printLabels.count' => ({required Object n}) => '${n} Etiketten', + 'printLabels.save' => 'Etiketten speichern', + 'printLabels.saved' => 'Etiketten gespeichert', + 'printLabels.cancelled' => 'Abgebrochen', + 'cropCalendar.add' => 'Anbaukalender', + 'cropCalendar.title' => 'Anbaukalender', + 'cropCalendar.sow' => 'Säen', + 'cropCalendar.transplant' => 'Pflanzen', + 'cropCalendar.flowering' => 'Blüte', + 'cropCalendar.fruiting' => 'Fruchtbildung', + 'cropCalendar.seedHarvest' => 'Samenernte', + 'cropCalendar.editorHint' => 'Notiere die typischen Monate für diese Sorte in deinem Gebiet - das sind deine eigenen Notizen.', + 'cropCalendar.unset' => '—', + 'needsReproduction.label' => 'Diese Saison vermehren', + 'needsReproduction.hint' => 'Baue es an, bevor der Samen ausgeht', + 'needsReproduction.badge' => 'Zu vermehren', + 'preservation.add' => 'Wie es aufbewahrt wird', + 'preservation.title' => 'Wie es aufbewahrt wird', + 'preservation.none' => 'Unspezifisch', + 'preservation.jarWithDesiccant' => 'Glas mit Trockenmittel', + 'preservation.glassJar' => 'Glasgefäß', + 'preservation.paperEnvelope' => 'Papierumschlag', + 'preservation.paperBag' => 'Papierbeutel', + 'preservation.plasticBag' => 'Plastikbeutel', + 'conditionCheck.advanced' => 'Lagerung und Saatgutbank-Details', + 'conditionCheck.title' => 'Lagerchecks', + 'conditionCheck.add' => 'Check hinzufügen', + 'conditionCheck.containers' => 'Gläser / Behälter', + 'conditionCheck.desiccant' => 'Trockenmittel', + 'conditionCheck.none' => 'Noch keine Lagerchecks.', + 'conditionCheck.summary' => ({required Object count, required Object state}) => '${count} Glas(gläser) · ${state}', + 'desiccant.none' => 'Keine', + 'desiccant.add' => 'Eine hinzufügen', + 'desiccant.replace' => 'Austauschen', + 'desiccant.dry' => 'Blau - trocken', + 'desiccant.fresh' => 'Gerade erneuert', + 'unit.aFew' => 'einige', + 'unit.some' => 'einige', + 'unit.plenty' => 'viele', + 'unit.pinch' => 'eine Prise', + 'unit.handful.singular' => 'Handvoll', + 'unit.handful.plural' => 'Handvoll', + 'unit.teaspoon.singular' => 'Teelöffel', + 'unit.teaspoon.plural' => 'Teelöffel', + 'unit.spoon.singular' => 'Löffel', + 'unit.spoon.plural' => 'Löffel', + 'unit.cup.singular' => 'Tasse', + 'unit.cup.plural' => 'Tassen', + 'unit.jar.singular' => 'Glas', + 'unit.jar.plural' => 'Gläser', + 'unit.sack.singular' => 'Sack', + 'unit.sack.plural' => 'Säcke', + 'unit.packet.singular' => 'Päckchen', + 'unit.packet.plural' => 'Päckchen', + 'unit.cob.singular' => 'Kolben', + 'unit.cob.plural' => 'Kolben', + 'unit.pod.singular' => 'Schote', + 'unit.pod.plural' => 'Schoten', + 'unit.ear.singular' => 'Ähre', + 'unit.ear.plural' => 'Ähren', + 'unit.head.singular' => 'Kopf', + 'unit.head.plural' => 'Köpfe', + 'unit.fruit.singular' => 'Frucht', + 'unit.fruit.plural' => 'Früchte', + 'unit.bulb.singular' => 'Zwiebel', + 'unit.bulb.plural' => 'Zwiebeln', + 'unit.tuber.singular' => 'Knolle', + 'unit.tuber.plural' => 'Knollen', + 'unit.seedHead.singular' => 'Samenkopf', + 'unit.seedHead.plural' => 'Samenköpfe', + 'unit.bunch.singular' => 'Bund', + 'unit.bunch.plural' => 'Bunde', + 'unit.plant.singular' => 'Pflanze', + 'unit.plant.plural' => 'Pflanzen', + 'unit.pot.singular' => 'Topf', + 'unit.pot.plural' => 'Töpfe', + 'unit.tray.singular' => 'Tablett', + 'unit.tray.plural' => 'Tabletts', + 'unit.seedling.singular' => 'Setzling', + 'unit.seedling.plural' => 'Setzlinge', + 'unit.tree.singular' => 'Baum', + 'unit.tree.plural' => 'Bäume', + 'unit.cutting.singular' => 'Steckling', + 'unit.cutting.plural' => 'Stecklinge', + 'unit.grams.singular' => 'Gramm', + 'unit.grams.plural' => 'Gramm', + 'unit.count.singular' => 'Samen', + 'unit.count.plural' => 'Samen', + 'market.title' => 'Samen in deiner Nähe', + 'market.subtitle' => 'Was andere in der Nähe teilen', + 'market.notSetUp' => 'Teilen ist noch nicht eingerichtet', + 'market.notSetUpBody' => 'Aktiviere Teilen, um Samen zu sehen und mit Menschen in der Nähe zu teilen. Es bleibt ungefähr - deine Zone, nie deine genaue Adresse.', + 'market.setUp' => 'Teilen einrichten', + 'market.cantReach' => 'Kann die Gemeinschaftsserver gerade nicht erreichen', + 'market.cantReachBody' => 'Versuche es erneut, oder überprüfe die Server unter Erweiterte Einrichtung.', + 'market.retry' => 'Erneut versuchen', + 'market.setArea' => 'Stelle dein Gebiet ein', + 'market.setAreaBody' => 'Teile dem Markt ungefähr mit, wo du bist, um Samen in deiner Nähe zu sehen.', + 'market.searching' => 'Schaue nach deinem Gebiet…', + 'market.empty' => 'Noch keine Samen in deiner Nähe geteilt', + 'market.searchHint' => 'Suche nach diesen Samen', + 'market.noMatches' => 'Keine geteilten Samen passen zu deiner Suche', + 'market.near' => 'In deiner Nähe', + 'market.contact' => 'Nachricht', + 'market.mine' => 'Du', + 'market.configTitle' => 'Teilen-Einrichtung', + 'market.setupIntro' => 'Teilen mit Menschen in der Nähe ist optional. Gib einfach dein ungefähres Gebiet an - du bist bereits mit freigegebenen Gemeinschaftsservern verbunden, damit Leute das finden können, das du anbietest, ohne ein Unternehmen dazwischen.', + 'market.areaLabel' => 'Dein Gebiet', + 'market.areaHelp' => 'Absichtlich grob gehalten - deine Zone, nie ein genauer Punkt.', + 'market.areaSet' => 'Dein Gebiet ist gesetzt - grob, nie dein genauer Punkt', + 'market.areaNotSet' => 'Gebiet noch nicht gesetzt - verwende deinen Standort oder füge einen Code unter Erweiterte hinzu', + 'market.advanced' => 'Erweiterte', + 'market.areaCodeLabel' => 'Gebiets-Code', + 'market.areaCodeHint' => 'Ein kurzer Code wie sp3e9 - kein Ortsname', + 'market.serversLabel' => 'Gemeinschaftsserver', + 'market.serversHelp' => 'Eine Adresse pro Zeile (wss://…). Lass die Standardwerte, wenn du dir nicht sicher bist.', + 'market.serversAdvanced' => 'Füge einen weiteren Server hinzu', + 'market.save' => 'Speichern', + 'market.saved' => 'Gespeichert', + 'market.wanted' => 'Gesucht', + 'market.shareMine' => 'Meine Samen teilen', + 'market.sharedCount' => ({required Object n}) => '${n} Samen in der Nähe geteilt', + 'market.nothingToShare' => 'Markiere zuerst einige Samen zum Verschenken, Tauschen oder Verkaufen', + 'market.useLocation' => 'Meinen ungefähren Standort verwenden', + 'market.locationFailed' => 'Konnte deinen Standort nicht ermitteln - überprüfe, dass Standort aktiviert ist und die Berechtigung erteilt wurde', + 'market.queued' => 'Gespeichert - wir werden diese teilen, wenn du verbunden bist', + 'market.shareFailed' => 'Konnte die Gemeinschaftsserver nicht erreichen - deine Samen wurden nicht geteilt. Versuche es gleich erneut.', + 'market.rangeLabel' => 'Wie weit zum Suchen', + 'market.rangeNear' => 'Sehr nah', + 'market.rangeArea' => 'Um mich herum', + 'market.rangeRegion' => 'Meine Region', + 'market.sharedBy' => 'Geteilt von', + 'market.noProfile' => 'Diese Person hat noch kein Profil geteilt', + 'market.copyId' => 'Code kopieren', + 'market.idCopied' => 'Code kopiert', + 'market.photo' => 'Foto', + 'profile.title' => 'Dein Profil', + 'profile.name' => 'Anzeigename', + 'profile.nameHint' => 'Wie dich andere sehen', + 'profile.about' => 'Über', + 'profile.aboutHint' => 'Eine kurze Zeile - was du anbaust, wo', + 'profile.g1' => 'Ğ1-Adresse (optional)', + 'profile.g1Hint' => 'Damit dich Leute in Ğ1 bezahlen können - getrennt von deinem Schlüssel', + 'profile.yourId' => 'Deine Identität', + 'profile.idHelp' => 'Teile dies, damit dich Leute erkennen', + 'profile.copy' => 'Kopieren', + 'profile.copied' => 'Kopiert', + 'profile.save' => 'Speichern', + 'profile.saved' => 'Profil gespeichert', + 'profile.identities' => 'Deine Identitäten', + 'profile.identitiesHelp' => 'Halte separate Identitäten - jede mit ihren eigenen Nachrichten und Kontakten. Alle kommen aus deiner einen Sicherung, also Wechsel fügt nichts hinzu, das man sich merken muss.', + 'profile.identityLabel' => ({required Object n}) => 'Identität ${n}', + 'profile.current' => 'In Gebrauch', + 'profile.newIdentity' => 'Neue Identität', + 'profile.switchTitle' => 'Identität wechseln?', + 'profile.switchBody' => 'Nachrichten und Kontakte werden für jede Identität getrennt aufbewahrt. Du kannst jederzeit zurückwechseln.', + 'profile.switchAction' => 'Wechsel', + 'chatList.title' => 'Nachrichten', + 'chatList.empty' => 'Noch keine Gespräche. Schreibe jemanden vom Markt an.', + 'chat.title' => 'Chat', + 'chat.hint' => 'Schreibe eine Nachricht…', + 'chat.send' => 'Senden', + 'chat.empty' => 'Noch keine Nachrichten - sag hallo', + 'chat.offline' => 'Richte Teilen ein, um Nachrichten zu senden', + 'chat.payG1' => 'In Ğ1 bezahlen', + 'chat.g1Copied' => 'Ğ1-Adresse kopiert - füge sie in dein Portemonnaie ein', + 'chat.today' => 'Heute', + 'chat.yesterday' => 'Gestern', + 'chat.sendError' => 'Konnte nicht senden - überprüfe deine Verbindung', + 'chat.noLinks' => 'Links sind in Nachrichten nicht erlaubt', + 'trust.none' => 'Noch niemand bürgt für sie', + 'trust.count' => ({required Object n}) => 'Von ${n} bestätigt', + 'trust.vouch' => 'Ich kenne diese Person', + 'trust.vouched' => 'Du bürgst für sie', + 'trust.circle' => 'In deinem Kreis', + 'yourPeople.title' => 'Deine Leute', + 'yourPeople.help' => 'Menschen, die du kennst und für die du einstehst, und Menschen, die für dich einstehen.', + 'yourPeople.youVouchFor' => 'Du stehst ein für', + 'yourPeople.vouchesForYou' => 'Sie stehen für dich ein', + 'yourPeople.youVouchForEmpty' => 'Du stehst noch für niemanden ein. Wenn du jemanden triffst, öffne deinen Chat mit ihnen und tippe \'Ich kenne diese Person\'.', + 'yourPeople.vouchesForYouEmpty' => 'Noch niemand steht für dich ein', + 'yourPeople.revoke' => 'Nicht mehr einstehen', + 'yourPeople.revokeConfirm' => 'Nicht mehr für diese Person einstehen?', + 'yourPeople.offline' => 'Du bist offline - versuche es, wenn du verbunden bist', + 'ratings.rate' => 'Bewerte diese Person', + 'ratings.edit' => 'Bearbeite deine Bewertung', + 'ratings.commentHint' => 'Wie war es? (optional)', + 'ratings.fromYourCircle' => ({required Object n}) => '${n} von Leuten, die du kennst', + 'ratings.retract' => 'Entferne deine Bewertung', + 'ratings.saved' => 'Bewertung gespeichert', + 'notifications.newMessageFrom' => ({required Object name}) => 'Neue Nachricht von ${name}', + 'plantare.title' => 'Plantares', + 'plantare.help' => 'Ein Plantare ist ein Versprechen, einen Samen zu vervielfältigen und etwas zurückzugeben - wie eine Sorte von Hand zu Hand reist. Es ist kein Verkauf.', + 'plantare.add' => 'Verpflichtung hinzufügen', + 'plantare.empty' => 'Noch keine Verpflichtungen. Wenn du einen Samen mit dem Versprechen teilst oder erhältst, ihn anzubauen und etwas zurückzugeben, notiere es hier.', + 'plantare.iReturn' => 'Ich baue es an und gebe es zurück', + 'plantare.owedToMe' => 'Sie geben mir etwas zurück', + 'plantare.direction' => 'Wer baut an und gibt zurück', + 'plantare.counterparty' => 'Mit wem?', + 'plantare.counterpartyHint' => 'Eine Person oder ein Kollektiv (optional)', + 'plantare.owed' => 'Was kommt zurück?', + 'plantare.owedHint' => 'z.B. eine Handvoll nächste Saison (optional)', + 'plantare.note' => 'Notiz (optional)', + 'plantare.save' => 'Speichern', + 'plantare.markReturned' => 'Als zurückgegeben markieren', + 'plantare.markForgiven' => 'Absehen lassen', + 'plantare.reopen' => 'Erneut öffnen', + 'plantare.delete' => 'Entfernen', + 'plantare.statusReturned' => 'Zurückgegeben', + 'plantare.statusForgiven' => 'Erledigt', + 'plantare.openSection' => 'Offen', + 'plantare.settledSection' => 'Erledigt', + 'plantare.removeConfirm' => 'Diese Verpflichtung entfernen?', + 'handover.title' => 'Samen wechselten den Besitzer', + 'handover.help' => 'Ein Geschenk, ein Tausch oder ein Verkauf - notiere es auf, mit oder ohne Rückgabeversprechen.', + 'handover.iGave' => 'Ich gab Samen', + 'handover.iReceived' => 'Ich erhielt Samen', + 'handover.whichLot' => 'Welche Partie?', + 'handover.howMuch' => 'Wie viel?', + 'handover.allOfIt' => 'Alles', + 'handover.partOfIt' => 'Ein Teil', + 'handover.paymentChip' => 'Geld wechselte den Besitzer', + 'handover.promiseGave' => 'Sie geben mir Samen zurück', + 'handover.promiseReceived' => 'Ich gebe Samen zurück', + 'sale.title' => 'Verkäufe', + 'sale.help' => 'Notiere Samen, die du verkauft oder gekauft hast - Geld, Ğ1 oder jede Währung. Ein eigenes Modell abseits Geschenk und Plantare. Es wird nie eine Kommission auf Samen erhoben.', + 'sale.add' => 'Verkauf notieren', + 'sale.empty' => 'Noch keine Verkäufe. Notiere hier, was du verkaufst oder kaufst.', + 'sale.iSold' => 'Ich verkaufte', + 'sale.iBought' => 'Ich kaufte', + 'sale.direction' => 'Verkauft oder gekauft?', + 'sale.counterparty' => 'Mit wem?', + 'sale.counterpartyHint' => 'Eine Person oder ein Kollektiv (optional)', + 'sale.amount' => 'Betrag', + 'sale.currency' => 'Währung', + 'sale.currencyHint' => '€, Ğ1, Stunden… (optional)', + _ => null, + } ?? switch (path) { + 'sale.hours' => 'Stunden', + 'sale.note' => 'Notiz (optional)', + 'sale.save' => 'Speichern', + 'sale.delete' => 'Entfernen', + 'sale.removeConfirm' => 'Diesen Verkauf entfernen?', + 'legal.title' => 'Datenschutz und Regeln', + 'legal.subtitle' => 'Dein Datenschutz, die Marktregeln und die Legalität von Samen', + 'legal.privacyTitle' => 'Dein Datenschutz', + 'legal.privacyBody' => 'Tane funktioniert ohne Konto, und alles, das du notierst, bleibt auf deinem Gerät, verschlüsselt. Es gibt keine Werbung, keine Tracker und keinen Tane-Server.\n\nNichts wird geteilt, es sei denn, du wählst es: Wenn du ein Angebot oder dein Profil veröffentlichst oder eine Nachricht sendest, reist es durch Gemeinschaftsserver. Angebote tragen nur eine ungefähre Zone - nie deine Adresse.\n\nWas du veröffentlichst, ist öffentlich, und Kopien können bleiben, selbst nachdem du es entfernt hast - teile also mit Bedacht.', + 'legal.rulesTitle' => 'Die Spielregeln', + 'legal.rulesBody' => 'Tane ist ein Werkzeug, kein Laden: Austausch wird direkt zwischen Menschen vereinbart, und niemand nimmt eine Provision. Das bedeutet auch, dass du verantwortlich bist für das, das du anbietest und sendest.\n\nAuf dem Markt: Sei ehrlich mit deinen Samen, biete nur an, was du teilen darfst, behandle Menschen gut und spamme nicht. Du kannst jeden blockieren und Angebote oder Menschen melden, die die Regeln brechen - Meldungen werden auf den Gemeinschaftsservern bearbeitet.', + 'legal.seedsTitle' => 'Über das Teilen von Samen', + 'legal.seedsBody' => 'Das Verschenken und Tauschen von Samen zwischen Hobbyisten ist in den meisten Ländern weit verbreitet. Verkaufen kann anders sein: An vielen Orten ist der Verkauf von Samen nicht offiziell registrierter Sorten eingeschränkt - überprüfe deine örtlichen Vorschriften, bevor du einen Preis fragst.\n\nSamen in ein anderes Land zu schicken ist auch oft eingeschränkt, und kommerziell geschützte Sorten dürfen nicht ohne Genehmigung vermehrt werden. Im Zweifelsfall lieber lokal und lieber Geschenk.', + 'legal.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:', + 'marketGate.ruleHonest' => 'Sei ehrlich mit den Samen, die du anbietest', + 'marketGate.ruleLegal' => 'Teile nur, was du teilen darfst, wo du lebst', + 'marketGate.ruleRespect' => 'Behandle Menschen gut - kein Spam, kein Missbrauch', + 'marketGate.publicNote' => 'Was du hier veröffentlichst, ist öffentlich, und Kopien können bleiben, selbst wenn du es später entfernst.', + 'marketGate.viewLegal' => 'Datenschutz und Regeln', + 'marketGate.accept' => 'Ich akzeptiere', + 'marketGate.decline' => 'Nicht jetzt', + 'report.offer' => 'Melde dieses Angebot', + 'report.person' => 'Melde diese Person', + 'report.title' => 'Melden', + 'report.prompt' => 'Was ist falsch?', + 'report.reasonSpam' => 'Spam oder Betrug', + 'report.reasonAbuse' => 'Beleidigend oder respektlos', + 'report.reasonIllegal' => 'Samen, die nicht angeboten werden sollten', + 'report.reasonOther' => 'Etwas anderes', + 'report.detailsHint' => 'Füge Details hinzu (optional)', + 'report.send' => 'Meldung senden', + 'report.sentHidden' => 'Meldung gesendet - du wirst dies nicht mehr sehen', + 'report.failed' => 'Konnte die Meldung nicht senden - überprüfe deine Verbindung', + 'report.alsoBlock' => 'Diese Person auch blockieren', + 'block.action' => 'Diese Person blockieren', + 'block.confirmTitle' => 'Diese Person blockieren?', + 'block.confirmBody' => 'Du wirst ihre Angebote und Nachrichten nicht mehr sehen. Du kannst sie später unter Blockierte Leute in der Teilen-Einrichtung entsperren.', + 'block.confirm' => 'Blockieren', + 'block.blockedToast' => 'Blockiert - ihre Angebote und Nachrichten sind verborgen', + 'block.manageTitle' => 'Blockierte Leute', + 'block.manageEmpty' => 'Du hast niemanden blockiert', + 'block.unblock' => 'Entsperren', + _ => null, + }; + } +} diff --git a/apps/app_seeds/lib/i18n/strings_en.g.dart b/apps/app_seeds/lib/i18n/strings_en.g.dart index c7c0085..f978628 100644 --- a/apps/app_seeds/lib/i18n/strings_en.g.dart +++ b/apps/app_seeds/lib/i18n/strings_en.g.dart @@ -418,6 +418,12 @@ class Translations$settings$en { /// en: 'Asturianu' String get langAst => 'Asturianu'; + /// en: 'Français' + String get langFr => 'Français'; + + /// en: 'Deutsch' + String get langDe => 'Deutsch'; + /// en: 'About' String get about => 'About'; @@ -2590,6 +2596,8 @@ extension on Translations { 'settings.langEn' => 'English', 'settings.langPt' => 'Português', 'settings.langAst' => 'Asturianu', + 'settings.langFr' => 'Français', + 'settings.langDe' => 'Deutsch', 'settings.about' => 'About', 'settings.aboutText' => 'Local-first, encrypted inventory for traditional seeds. AGPL-3.0.', 'settings.aboutOpen' => 'About Tane', @@ -3024,10 +3032,10 @@ extension on Translations { 'sale.add' => 'Record a sale', 'sale.empty' => 'No sales yet. Note here what you sell or buy.', 'sale.iSold' => 'I sold', - 'sale.iBought' => 'I bought', - 'sale.direction' => 'Sold or bought?', _ => null, } ?? switch (path) { + 'sale.iBought' => 'I bought', + 'sale.direction' => 'Sold or bought?', 'sale.counterparty' => 'With whom?', 'sale.counterpartyHint' => 'A person or a collective (optional)', 'sale.amount' => 'Amount', diff --git a/apps/app_seeds/lib/i18n/strings_es.g.dart b/apps/app_seeds/lib/i18n/strings_es.g.dart index 1ed4201..e94c59d 100644 --- a/apps/app_seeds/lib/i18n/strings_es.g.dart +++ b/apps/app_seeds/lib/i18n/strings_es.g.dart @@ -263,6 +263,8 @@ class _Translations$settings$es extends Translations$settings$en { @override String get langEs => 'Español'; @override String get langEn => 'English'; @override String get langPt => 'Português'; + @override String get langFr => 'Français'; + @override String get langDe => 'Deutsch'; @override String get about => 'Acerca de'; @override String get aboutText => 'Inventario local y cifrado para semillas tradicionales. AGPL-3.0.'; @override String get aboutOpen => 'Acerca de Tane'; @@ -1486,6 +1488,8 @@ extension on TranslationsEs { 'settings.langEs' => 'Español', 'settings.langEn' => 'English', 'settings.langPt' => 'Português', + 'settings.langFr' => 'Français', + 'settings.langDe' => 'Deutsch', 'settings.about' => 'Acerca de', 'settings.aboutText' => 'Inventario local y cifrado para semillas tradicionales. AGPL-3.0.', 'settings.aboutOpen' => 'Acerca de Tane', @@ -1921,10 +1925,10 @@ extension on TranslationsEs { 'sale.empty' => 'Aún no hay ventas. Anota aquí lo que vendes o compras.', 'sale.iSold' => 'Vendí', 'sale.iBought' => 'Compré', - 'sale.direction' => '¿Vendes o compras?', - 'sale.counterparty' => '¿Con quién?', _ => null, } ?? switch (path) { + 'sale.direction' => '¿Vendes o compras?', + 'sale.counterparty' => '¿Con quién?', 'sale.counterpartyHint' => 'Una persona o un colectivo (opcional)', 'sale.amount' => 'Importe', 'sale.currency' => 'Moneda', diff --git a/apps/app_seeds/lib/i18n/strings_fr.g.dart b/apps/app_seeds/lib/i18n/strings_fr.g.dart new file mode 100644 index 0000000..f4273dc --- /dev/null +++ b/apps/app_seeds/lib/i18n/strings_fr.g.dart @@ -0,0 +1,1971 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import +// dart format off + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsFr extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsFr({Map? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata? meta}) + : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = meta ?? TranslationMetadata( + locale: AppLocale.fr, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver) { + super.$meta.setFlatMapFunction($meta.getTranslation); // copy base translations to super.$meta + $meta.setFlatMapFunction(_flatMapFunction); + } + + /// Metadata for the translations of . + @override final TranslationMetadata $meta; + + /// Access flat map + @override dynamic operator[](String key) => $meta.getTranslation(key) ?? super.$meta.getTranslation(key); + + late final TranslationsFr _root = this; // ignore: unused_field + + @override + TranslationsFr $copyWith({TranslationMetadata? meta}) => TranslationsFr(meta: meta ?? this.$meta); + + // Translations + @override late final _Translations$avatar$fr avatar = _Translations$avatar$fr._(_root); + @override late final _Translations$favorites$fr favorites = _Translations$favorites$fr._(_root); + @override late final _Translations$seedSaving$fr seedSaving = _Translations$seedSaving$fr._(_root); + @override late final _Translations$calendar$fr calendar = _Translations$calendar$fr._(_root); + @override late final _Translations$app$fr app = _Translations$app$fr._(_root); + @override late final _Translations$bootstrap$fr bootstrap = _Translations$bootstrap$fr._(_root); + @override late final _Translations$common$fr common = _Translations$common$fr._(_root); + @override late final _Translations$home$fr home = _Translations$home$fr._(_root); + @override late final _Translations$photo$fr photo = _Translations$photo$fr._(_root); + @override late final _Translations$menu$fr menu = _Translations$menu$fr._(_root); + @override late final _Translations$settings$fr settings = _Translations$settings$fr._(_root); + @override late final _Translations$backup$fr backup = _Translations$backup$fr._(_root); + @override late final _Translations$about$fr about = _Translations$about$fr._(_root); + @override late final _Translations$intro$fr intro = _Translations$intro$fr._(_root); + @override late final _Translations$inventory$fr inventory = _Translations$inventory$fr._(_root); + @override late final _Translations$draft$fr draft = _Translations$draft$fr._(_root); + @override late final _Translations$quickAdd$fr quickAdd = _Translations$quickAdd$fr._(_root); + @override late final _Translations$detail$fr detail = _Translations$detail$fr._(_root); + @override late final _Translations$germination$fr germination = _Translations$germination$fr._(_root); + @override late final _Translations$viability$fr viability = _Translations$viability$fr._(_root); + @override late final _Translations$editVariety$fr editVariety = _Translations$editVariety$fr._(_root); + @override late final _Translations$addLot$fr addLot = _Translations$addLot$fr._(_root); + @override late final _Translations$harvest$fr harvest = _Translations$harvest$fr._(_root); + @override late final _Translations$lotType$fr lotType = _Translations$lotType$fr._(_root); + @override late final _Translations$presentation$fr presentation = _Translations$presentation$fr._(_root); + @override late final _Translations$provenance$fr provenance = _Translations$provenance$fr._(_root); + @override late final _Translations$abundance$fr abundance = _Translations$abundance$fr._(_root); + @override late final _Translations$share$fr share = _Translations$share$fr._(_root); + @override late final _Translations$printLabels$fr printLabels = _Translations$printLabels$fr._(_root); + @override late final _Translations$cropCalendar$fr cropCalendar = _Translations$cropCalendar$fr._(_root); + @override late final _Translations$needsReproduction$fr needsReproduction = _Translations$needsReproduction$fr._(_root); + @override late final _Translations$preservation$fr preservation = _Translations$preservation$fr._(_root); + @override late final _Translations$conditionCheck$fr conditionCheck = _Translations$conditionCheck$fr._(_root); + @override late final _Translations$desiccant$fr desiccant = _Translations$desiccant$fr._(_root); + @override late final _Translations$unit$fr unit = _Translations$unit$fr._(_root); + @override late final _Translations$market$fr market = _Translations$market$fr._(_root); + @override late final _Translations$profile$fr profile = _Translations$profile$fr._(_root); + @override late final _Translations$chatList$fr chatList = _Translations$chatList$fr._(_root); + @override late final _Translations$chat$fr chat = _Translations$chat$fr._(_root); + @override late final _Translations$trust$fr trust = _Translations$trust$fr._(_root); + @override late final _Translations$yourPeople$fr yourPeople = _Translations$yourPeople$fr._(_root); + @override late final _Translations$ratings$fr ratings = _Translations$ratings$fr._(_root); + @override late final _Translations$notifications$fr notifications = _Translations$notifications$fr._(_root); + @override late final _Translations$plantare$fr plantare = _Translations$plantare$fr._(_root); + @override late final _Translations$handover$fr handover = _Translations$handover$fr._(_root); + @override late final _Translations$sale$fr sale = _Translations$sale$fr._(_root); + @override late final _Translations$legal$fr legal = _Translations$legal$fr._(_root); + @override late final _Translations$marketGate$fr marketGate = _Translations$marketGate$fr._(_root); + @override late final _Translations$report$fr report = _Translations$report$fr._(_root); + @override late final _Translations$block$fr block = _Translations$block$fr._(_root); +} + +// Path: avatar +class _Translations$avatar$fr extends Translations$avatar$en { + _Translations$avatar$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Votre photo ou avatar'; + @override String get fromPhoto => 'Prendre ou choisir une photo'; + @override String get illustration => 'Ou choisir une illustration'; + @override String get remove => 'Supprimer'; +} + +// Path: favorites +class _Translations$favorites$fr extends Translations$favorites$en { + _Translations$favorites$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Favoris'; + @override String get empty => 'Pas encore de favoris. Enregistrez les offres que vous aimez du marché.'; + @override String get save => 'Ajouter aux favoris'; + @override String get remove => 'Retirer des favoris'; + @override String get unavailable => 'Plus disponible'; +} + +// Path: seedSaving +class _Translations$seedSaving$fr extends Translations$seedSaving$en { + _Translations$seedSaving$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Conserver sa semence'; + @override String get subtitle => 'Ce qu\'il faut pour garder la variété fidèle'; + @override String get lifeCycle => 'Cycle'; + @override String get cycleAnnual => 'Annuelle'; + @override String get cycleBiennial => 'Bisannuelle — graines la 2e année'; + @override String get cyclePerennial => 'Vivace'; + @override String get pollination => 'Pollinisation'; + @override String get pollSelf => 'Autoféconde'; + @override String get pollCross => 'Se croise avec d\'autres'; + @override String get pollMixed => 'S\'autoféconde, parfois se croise'; + @override String get byInsect => 'par les insectes'; + @override String get byWind => 'par le vent'; + @override String get isolation => 'À isoler'; + @override String isolationRange({required Object min, required Object max}) => '${min}–${max} m des autres variétés'; + @override String isolationSingle({required Object min}) => '${min} m des autres variétés'; + @override String get plants => 'Préserver plusieurs plantes'; + @override String plantsValue({required Object n}) => 'D\'au moins ${n} plantes'; + @override String get processing => 'Nettoyer la semence'; + @override String get procDry => 'Semence sèche (dépiquage)'; + @override String get procWet => 'Semence humide (fermentation et rinçage)'; + @override String get difficulty => 'Difficulté'; + @override String get diffEasy => 'Facile'; + @override String get diffMedium => 'Moyen'; + @override String get diffHard => 'Difficile'; + @override String get advisory => 'Guide général — adaptez-le à votre climat et à votre variété.'; + @override String get sourcePrefix => 'Source'; +} + +// Path: calendar +class _Translations$calendar$fr extends Translations$calendar$en { + _Translations$calendar$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Ce mois'; + @override String get filterChip => 'Ce mois'; + @override String get selfNote => 'Ce que vous avez noté dans vos variétés.'; + @override String nothing({required Object month}) => 'Rien noté pour ${month}.'; +} + +// Path: app +class _Translations$app$fr extends Translations$app$en { + _Translations$app$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Tane'; +} + +// Path: bootstrap +class _Translations$bootstrap$fr extends Translations$bootstrap$en { + _Translations$bootstrap$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get failed => 'Tane n\'a pas pu démarrer'; + @override String get retry => 'Réessayer'; +} + +// Path: common +class _Translations$common$fr extends Translations$common$en { + _Translations$common$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get save => 'Enregistrer'; + @override String get cancel => 'Annuler'; + @override String get delete => 'Supprimer'; + @override String get edit => 'Modifier'; + @override String get type => 'Type'; + @override String get comingSoon => 'À venir'; + @override String get offline => 'Vous êtes hors ligne — le partage est en pause'; +} + +// Path: home +class _Translations$home$fr extends Translations$home$en { + _Translations$home$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get tagline => 'Partagez et cultivez des graines locales'; + @override String get openMarket => 'Marché'; + @override String get openMarketSubtitle => 'Découvrez et partagez des graines à proximité'; + @override String get yourInventory => 'Votre inventaire'; + @override String get yourInventorySubtitle => 'Gérez vos graines'; +} + +// Path: photo +class _Translations$photo$fr extends Translations$photo$en { + _Translations$photo$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get camera => 'Prendre une photo'; + @override String get gallery => 'Choisir de la galerie'; + @override String get setAsCover => 'Mettre en couverture'; + @override String get isCover => 'Photo de couverture'; + @override String get deleteConfirm => 'Supprimer cette photo ?'; +} + +// Path: menu +class _Translations$menu$fr extends Translations$menu$en { + _Translations$menu$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get tagline => 'votre grainothèque'; + @override String get inventory => 'Inventaire'; + @override String get market => 'Marché'; + @override String get profile => 'Votre profil'; + @override String get chat => 'Messages'; + @override String get wishlist => 'Favoris'; + @override String get following => 'Abonnements'; + @override String get plantares => 'Plantares'; + @override String get sales => 'Ventes'; + @override String get calendar => 'Calendrier'; + @override String get settings => 'Paramètres'; +} + +// Path: settings +class _Translations$settings$fr extends Translations$settings$en { + _Translations$settings$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get language => 'Langue'; + @override String get systemLanguage => 'Langue du système'; + @override String get langEs => 'Español'; + @override String get langEn => 'English'; + @override String get langPt => 'Português'; + @override String get langAst => 'Asturianu'; + @override String get langFr => 'Français'; + @override String get langDe => 'Deutsch'; + @override String get about => 'À propos'; + @override String get aboutText => 'Inventaire local-first et chiffré pour les semences traditionnelles. AGPL-3.0.'; + @override String get aboutOpen => 'À propos de Tane'; +} + +// Path: backup +class _Translations$backup$fr extends Translations$backup$en { + _Translations$backup$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Sauvegarde & restauration'; + @override String get autoBackupTitle => 'Sauvegardes automatiques'; + @override String autoBackupLast({required Object date}) => 'Dernière copie sauvegardée ${date}'; + @override String get autoBackupNone => 'Une copie est conservée automatiquement en arrière-plan'; + @override String 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'; + @override String get importJsonSubtitle => 'Récupérez une copie enregistrée — rien ne sera dupliqué'; + @override String get exportCsv => 'Exporter vers un tableur'; + @override String get exportCsvSubtitle => 'Une liste simple pour Excel ou LibreOffice — sans photos'; + @override String get importCsv => 'Importer une liste'; + @override String get importCsvSubtitle => 'Ajoutez des entrées depuis un tableur'; + @override String get importConfirmTitle => 'Restaurer une sauvegarde ?'; + @override String get importConfirmBody => 'Les entrées fusionnent avec votre inventaire ; si une entrée existe des deux côtés, c\'est la version la plus récente qui gagne. Rien ne sera dupliqué.'; + @override String get importCsvConfirmTitle => 'Importer une liste ?'; + @override String get importCsvConfirmBody => 'Chaque ligne est ajoutée comme une nouvelle entrée. Cela ne fusionne ni ne remplace, donc importer le même fichier deux fois l\'ajoute deux fois.'; + @override String get importAction => 'Importer'; + @override String get exportSaved => 'Copie enregistrée'; + @override String get cancelled => 'Annulé'; + @override String importDone({required Object added, required Object updated}) => 'Importé : ${added} nouvelles, ${updated} actualisées'; + @override String importCsvDone({required Object count}) => 'Ajoutées ${count} entrées'; + @override String get importFailed => 'Ce fichier n\'a pas pu être lu comme une sauvegarde Tane'; + @override String get failed => 'Quelque chose s\'est mal passé'; + @override String get recoveryTitle => 'Votre code de récupération'; + @override String get recoverySubtitle => 'Imprimez-le et gardez-le en sécurité — il ouvre vos sauvegardes sur un nouvel appareil'; + @override String get recoveryIntro => 'Ce code ouvre vos sauvegardes et retrouve votre grainothèque sur n\'importe quel appareil. Conservez deux copies imprimées en lieux sûrs, comme votre meilleure graine. Quiconque l\'obtient peut lire vos sauvegardes, alors ne le partagez avec personne.'; + @override String get recoveryCopy => 'Copier'; + @override String get recoverySave => 'Enregistrer la feuille'; + @override String get recoverySheetTitle => 'Tane — votre feuille de récupération'; + @override String get recoveryPromptTitle => 'Entrez votre code de récupération'; + @override String get recoveryPromptBody => 'Cette sauvegarde a été enregistrée avec un autre code. Entrez le code de votre feuille de récupération pour l\'ouvrir.'; + @override String get recoveryWrongCode => 'Ce code n\'ouvre pas cette sauvegarde'; +} + +// Path: about +class _Translations$about$fr extends Translations$about$en { + _Translations$about$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'À propos'; + @override String get kanji => '種'; + @override String get tagline => 'Une app local-first et décentralisée pour gérer et partager des semences et plantules traditionnelles.'; + @override String get intro => 'Tane (種, « graine » en japonais) aide les gens et les collectifs à gérer un inventaire bienveillant de leur grainothèque, décider ce qu\'ils offrent et le partager localement — sans intermédiaire central qui pourrait contrôler, censurer ou être poursuivi pour cela. Son nom vient de tanemaki (種まき), « semer / disperser des graines ». L\'objectif est à la fois pratique et politique : soutenir les variétés de semences traditionnelles et résister au monopole des semenciers.'; + @override String get heritage => 'Le nom honore les anciennes traditions d\'entraide japonaises autour du riz — yui (travail communautaire partagé) et tanomoshi (caisses de secours mutuel) — qui ont inspiré le document Plantare, la « monnaie communautaire pour l\'échange de semences » (BAH-Semillero, 2009, CC-BY-SA). Tane est le Plantare numérique.'; + @override String get version => 'Version'; + @override String get license => 'Licence'; + @override String get licenseValue => 'AGPL-3.0'; + @override String get website => 'Site web'; + @override String get openSourceLicenses => 'Licences open source'; + @override String get openSourceLicensesSubtitle => 'Bibliothèques tiers et leurs licences'; + @override String copyright({required Object years}) => '© ${years} Association Comunes, sous AGPLv3'; +} + +// Path: intro +class _Translations$intro$fr extends Translations$intro$en { + _Translations$intro$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get skip => 'Passer'; + @override String get next => 'Suivant'; + @override String get start => 'Commencer'; + @override String get menuEntry => 'Comment fonctionne Tane'; + @override late final _Translations$intro$slides$fr slides = _Translations$intro$slides$fr._(_root); +} + +// Path: inventory +class _Translations$inventory$fr extends Translations$inventory$en { + _Translations$inventory$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Inventaire'; + @override String get searchHint => 'Rechercher des graines'; + @override String get empty => 'Pas encore de graines. Appuyez sur + pour ajouter votre première.'; + @override String get noMatches => 'Aucune graine ne correspond à vos filtres.'; + @override String get clearFilters => 'Effacer les filtres'; + @override String get uncategorized => 'Non catégorisé'; + @override String get needsReproductionFilter => 'À multiplier'; + @override String get loadError => 'Impossible d\'ouvrir votre grainothèque. Elle était peut-être occupée — réessayez.'; + @override String get retry => 'Réessayer'; +} + +// Path: draft +class _Translations$draft$fr extends Translations$draft$en { + _Translations$draft$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get capture => 'Capturer des photos'; + @override String captured({required Object n}) => '${n} capturée(s) à cataloguer'; + @override String get triageTitle => 'À cataloguer'; + @override String triageCount({required Object n}) => '${n} à cataloguer'; + @override String get untitled => 'Sans titre'; + @override String get nameField => 'Nommez cette graine'; + @override String get nameHint => 'Qu\'est-ce que c\'est ?'; + @override String get suggestFromPhoto => 'Suggérer un nom depuis la photo'; + @override String get discard => 'Abandonner'; +} + +// Path: quickAdd +class _Translations$quickAdd$fr extends Translations$quickAdd$en { + _Translations$quickAdd$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Ajouter une graine'; + @override String get labelField => 'Nom'; + @override String get labelRequired => 'Donnez-lui un nom'; + @override String get addPhoto => 'Ajouter une photo'; + @override String get quantity => 'Combien ?'; + @override String get more => 'Ajouter plus…'; + @override String get save => 'Enregistrer'; + @override String get saveAndAddAnother => 'Enregistrer et ajouter une autre'; + @override String addedCount({required Object n}) => '${n} ajoutée(s)'; + @override String get cancel => 'Annuler'; +} + +// Path: detail +class _Translations$detail$fr extends Translations$detail$en { + _Translations$detail$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get notFound => 'Cette graine n\'est plus ici.'; + @override String get lots => 'Lots'; + @override String get noLots => 'Pas encore de lots.'; + @override String get names => 'Aussi connue sous le nom de'; + @override String get addName => 'Ajouter un nom'; + @override String get links => 'Liens'; + @override String get addLink => 'Ajouter un lien'; + @override String get linkUrl => 'URL'; + @override String get linkTitle => 'Titre (optionnel)'; + @override String get reference => 'En savoir plus'; + @override String get refGbif => 'GBIF'; + @override String get refWikipedia => 'Wikipedia'; + @override String get refWikispecies => 'Wikispecies'; + @override String get notes => 'Notes'; + @override String get addLot => 'Ajouter un lot'; + @override String get editLot => 'Modifier le lot'; + @override String get deleteConfirm => 'Supprimer cette graine ?'; + @override String year({required Object year}) => 'Année ${year}'; + @override String get noYear => 'Année inconnue'; +} + +// Path: germination +class _Translations$germination$fr extends Translations$germination$en { + _Translations$germination$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Germination'; + @override String get add => 'Ajouter un test'; + @override String get sampleSize => 'Échantillon'; + @override String get germinated => 'Germinées'; + @override String get none => 'Pas encore de tests de germination.'; + @override String result({required Object percent}) => '${percent}%'; +} + +// Path: viability +class _Translations$viability$fr extends Translations$viability$en { + _Translations$viability$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get expiringSoon => 'Utilisez-la ou multipliez-la cette saison'; + @override String expiringSoonYears({required Object years}) => 'Utilisez-la ou multipliez-la cette saison · se garde ~${years} an(s)'; + @override String get expired => 'Au-delà de la viabilité typique — à multiplier'; + @override String expiredYears({required Object years}) => 'Au-delà de la viabilité typique (~${years} an(s)) — à multiplier'; +} + +// Path: editVariety +class _Translations$editVariety$fr extends Translations$editVariety$en { + _Translations$editVariety$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Modifier la graine'; + @override String get name => 'Nom'; + @override String get category => 'Catégorie'; + @override String get notes => 'Notes'; + @override String get species => 'Espèce (du catalogue)'; + @override String get speciesHint => 'Rechercher une espèce…'; + @override String get speciesSuggested => 'Suggérée par le nom'; + @override String get organic => 'Biologique'; + @override String get organicHint => 'Cultivée de manière biologique (bio)'; +} + +// Path: addLot +class _Translations$addLot$fr extends Translations$addLot$en { + _Translations$addLot$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Ajouter un lot'; + @override String get year => 'Date de récolte'; + @override String get quantity => 'Combien ?'; + @override String get amount => 'Quantité'; +} + +// Path: harvest +class _Translations$harvest$fr extends Translations$harvest$en { + _Translations$harvest$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get pickTitle => 'Sélectionnez le mois / l\'année'; + @override String get anyMonth => 'N\'importe quel mois'; + @override String get noDate => 'Définir la date de récolte'; + @override List get monthNames => [ + 'janvier', + 'février', + 'mars', + 'avril', + 'mai', + 'juin', + 'juillet', + 'août', + 'septembre', + 'octobre', + 'novembre', + 'décembre', + ]; +} + +// Path: lotType +class _Translations$lotType$fr extends Translations$lotType$en { + _Translations$lotType$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get seed => 'Graines'; + @override String get plant => 'Plante'; + @override String get seedling => 'Plantule'; + @override String get tree => 'Arbre / arbuste'; + @override String get bulb => 'Bulbe / tubercule'; + @override String get cutting => 'Bouture'; +} + +// Path: presentation +class _Translations$presentation$fr extends Translations$presentation$en { + _Translations$presentation$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Emballage'; + @override String get none => 'Non spécifié'; + @override String get pot => 'Pot'; + @override String get tray => 'Plateau'; + @override String get plug => 'Alvéole'; + @override String get bareRoot => 'Racines nues'; + @override String get rootBall => 'Motte'; +} + +// Path: provenance +class _Translations$provenance$fr extends Translations$provenance$en { + _Translations$provenance$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get section => 'D\'où elle vient'; + @override String get seedsFrom => 'Graines de'; + @override String get seedsFromHint => 'Qui les a cultivées ou données'; + @override String get place => 'Lieu'; + @override String get placeHint => 'D\'où elles viennent (avec région)'; + @override String get addSeedsFrom => 'Graines de'; + @override String get addPlace => 'Lieu'; +} + +// Path: abundance +class _Translations$abundance$fr extends Translations$abundance$en { + _Translations$abundance$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get add => 'Combien j\'en ai'; + @override String get title => 'Combien j\'en ai'; + @override String get none => 'Non défini'; + @override String get plentyToShare => 'De quoi partager généreusement'; + @override String get enoughToShare => 'Assez pour partager un peu'; + @override String get enoughForMe => 'Assez pour moi'; + @override String get runningLow => 'Ça commence à manquer'; +} + +// Path: share +class _Translations$share$fr extends Translations$share$en { + _Translations$share$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get add => 'La partagez-vous ?'; + @override String get title => 'La partagez-vous ?'; + @override String get nudge => 'Vous en avez beaucoup — vous pourriez en partager.'; + @override String get price => 'Prix'; + @override String get priceHint => 'Laissez vide pour en discuter plus tard'; + @override String get private => 'Juste pour moi'; + @override String get gift => 'À donner'; + @override String get exchange => 'À échanger'; + @override String get sell => 'À vendre'; + @override String get filterChip => 'Je partage'; + @override String get printCatalog => 'Imprimer ce que je partage'; + @override String get catalogTitle => 'Ce que je partage'; + @override String get catalogSaved => 'Catalogue enregistré'; + @override String get cancelled => 'Annulé'; +} + +// Path: printLabels +class _Translations$printLabels$fr extends Translations$printLabels$en { + _Translations$printLabels$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get action => 'Imprimer les étiquettes'; + @override String get title => 'Imprimer les étiquettes'; + @override String get selectHint => 'Choisissez les graines pour lesquelles imprimer les étiquettes'; + @override String get selectAll => 'Tout sélectionner'; + @override String selected({required Object n}) => '${n} sélectionnée(s)'; + @override String get none => 'Sélectionnez d\'abord les graines'; + @override String get format => 'Taille d\'étiquette'; + @override String get formatStickers => 'Petits autocollants'; + @override String get formatStickersHint => 'Beaucoup de petites étiquettes par page — à coller sur les sachets'; + @override String get formatCards => 'Grandes cartes'; + @override String get formatCardsHint => 'Moins d\'étiquettes, plus grandes — pour les pots et boîtes'; + @override String count({required Object n}) => '${n} étiquette(s)'; + @override String get save => 'Enregistrer les étiquettes'; + @override String get saved => 'Étiquettes enregistrées'; + @override String get cancelled => 'Annulé'; +} + +// Path: cropCalendar +class _Translations$cropCalendar$fr extends Translations$cropCalendar$en { + _Translations$cropCalendar$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get add => 'Calendrier de culture'; + @override String get title => 'Calendrier de culture'; + @override String get sow => 'Semis'; + @override String get transplant => 'Repiquage'; + @override String get flowering => 'Floraison'; + @override String get fruiting => 'Fructification'; + @override String get seedHarvest => 'Récolte de semences'; + @override String get editorHint => 'Notez les mois typiques pour cette variété dans votre région — ce sont vos propres notes.'; + @override String get unset => '—'; +} + +// Path: needsReproduction +class _Translations$needsReproduction$fr extends Translations$needsReproduction$en { + _Translations$needsReproduction$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get label => 'À multiplier cette saison'; + @override String get hint => 'Cultivez-la avant que la semence ne manque'; + @override String get badge => 'À multiplier'; +} + +// Path: preservation +class _Translations$preservation$fr extends Translations$preservation$en { + _Translations$preservation$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get add => 'Comment c\'est conservé'; + @override String get title => 'Comment c\'est conservé'; + @override String get none => 'Non spécifié'; + @override String get jarWithDesiccant => 'Pot avec dessiccant'; + @override String get glassJar => 'Pot en verre'; + @override String get paperEnvelope => 'Enveloppe en papier'; + @override String get paperBag => 'Sac en papier'; + @override String get plasticBag => 'Sac en plastique'; +} + +// Path: conditionCheck +class _Translations$conditionCheck$fr extends Translations$conditionCheck$en { + _Translations$conditionCheck$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get advanced => 'Conservation et détails de la grainothèque'; + @override String get title => 'Contrôles de conservation'; + @override String get add => 'Ajouter un contrôle'; + @override String get containers => 'Pots / récipients'; + @override String get desiccant => 'Dessiccant'; + @override String get none => 'Pas encore de contrôles.'; + @override String summary({required Object count, required Object state}) => '${count} pot(s) · ${state}'; +} + +// Path: desiccant +class _Translations$desiccant$fr extends Translations$desiccant$en { + _Translations$desiccant$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get none => 'Aucun'; + @override String get add => 'En ajouter'; + @override String get replace => 'À changer'; + @override String get dry => 'Bleu — sec'; + @override String get fresh => 'Fraîchement mis'; +} + +// Path: unit +class _Translations$unit$fr extends Translations$unit$en { + _Translations$unit$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get aFew => 'quelques'; + @override String get some => 'quelques'; + @override String get plenty => 'beaucoup'; + @override String get pinch => 'une pincée'; + @override late final _Translations$unit$handful$fr handful = _Translations$unit$handful$fr._(_root); + @override late final _Translations$unit$teaspoon$fr teaspoon = _Translations$unit$teaspoon$fr._(_root); + @override late final _Translations$unit$spoon$fr spoon = _Translations$unit$spoon$fr._(_root); + @override late final _Translations$unit$cup$fr cup = _Translations$unit$cup$fr._(_root); + @override late final _Translations$unit$jar$fr jar = _Translations$unit$jar$fr._(_root); + @override late final _Translations$unit$sack$fr sack = _Translations$unit$sack$fr._(_root); + @override late final _Translations$unit$packet$fr packet = _Translations$unit$packet$fr._(_root); + @override late final _Translations$unit$cob$fr cob = _Translations$unit$cob$fr._(_root); + @override late final _Translations$unit$pod$fr pod = _Translations$unit$pod$fr._(_root); + @override late final _Translations$unit$ear$fr ear = _Translations$unit$ear$fr._(_root); + @override late final _Translations$unit$head$fr head = _Translations$unit$head$fr._(_root); + @override late final _Translations$unit$fruit$fr fruit = _Translations$unit$fruit$fr._(_root); + @override late final _Translations$unit$bulb$fr bulb = _Translations$unit$bulb$fr._(_root); + @override late final _Translations$unit$tuber$fr tuber = _Translations$unit$tuber$fr._(_root); + @override late final _Translations$unit$seedHead$fr seedHead = _Translations$unit$seedHead$fr._(_root); + @override late final _Translations$unit$bunch$fr bunch = _Translations$unit$bunch$fr._(_root); + @override late final _Translations$unit$plant$fr plant = _Translations$unit$plant$fr._(_root); + @override late final _Translations$unit$pot$fr pot = _Translations$unit$pot$fr._(_root); + @override late final _Translations$unit$tray$fr tray = _Translations$unit$tray$fr._(_root); + @override late final _Translations$unit$seedling$fr seedling = _Translations$unit$seedling$fr._(_root); + @override late final _Translations$unit$tree$fr tree = _Translations$unit$tree$fr._(_root); + @override late final _Translations$unit$cutting$fr cutting = _Translations$unit$cutting$fr._(_root); + @override late final _Translations$unit$grams$fr grams = _Translations$unit$grams$fr._(_root); + @override late final _Translations$unit$count$fr count = _Translations$unit$count$fr._(_root); +} + +// Path: market +class _Translations$market$fr extends Translations$market$en { + _Translations$market$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Graines près de vous'; + @override String get subtitle => 'Ce que les autres partagent à proximité'; + @override String get notSetUp => 'Le partage n\'est pas encore configuré'; + @override String get notSetUpBody => 'Activez le partage pour voir et donner des graines aux gens à proximité. C\'est volontairement approximatif — votre zone, jamais votre adresse exacte.'; + @override String get setUp => 'Configurer le partage'; + @override String get cantReach => 'Impossible de se connecter aux serveurs communautaires en ce moment'; + @override String get cantReachBody => 'Réessayez, ou vérifiez les serveurs sous Configuration avancée.'; + @override String get retry => 'Réessayer'; + @override String get setArea => 'Définir votre zone'; + @override String get setAreaBody => 'Dites au marché approximativement où vous êtes pour voir les graines à proximité.'; + @override String get searching => 'Recherche autour de votre zone…'; + @override String get empty => 'Aucune graine n\'est encore partagée près de vous'; + @override String get searchHint => 'Rechercher parmi ces graines'; + @override String get noMatches => 'Aucune graine partagée ne correspond à votre recherche'; + @override String get near => 'Près de vous'; + @override String get contact => 'Message'; + @override String get mine => 'Vous'; + @override String get configTitle => 'Configuration du partage'; + @override String get setupIntro => 'Le partage avec les gens à proximité est optionnel. Définissez simplement votre zone approximative — vous êtes déjà connectés aux serveurs communautaires partagés pour que les gens trouvent ce que vous offrez, sans aucune entreprise au milieu.'; + @override String get areaLabel => 'Votre zone'; + @override String get areaHelp => 'Gardée approximative volontairement — votre zone, jamais un point exact.'; + @override String get areaSet => 'Votre zone est définie — approximative, jamais votre point exact'; + @override String get areaNotSet => 'Zone non définie — utilisez votre position, ou ajoutez un code sous Avancé'; + @override String get advanced => 'Avancé'; + @override String get areaCodeLabel => 'Code de zone'; + @override String get areaCodeHint => 'Un code court comme sp3e9 — pas un nom de lieu'; + @override String get serversLabel => 'Serveurs communautaires'; + @override String get serversHelp => 'Une adresse par ligne (wss://…). Laissez les valeurs par défaut si vous n\'êtes pas sûr.'; + @override String get serversAdvanced => 'Ajouter un autre serveur'; + @override String get save => 'Enregistrer'; + @override String get saved => 'Enregistré'; + @override String get wanted => 'Recherché'; + @override String get shareMine => 'Partager mes graines'; + @override String sharedCount({required Object n}) => '${n} graines partagées'; + @override String get nothingToShare => 'Marquez d\'abord certaines graines à donner, échanger ou vendre'; + @override String get useLocation => 'Utiliser ma position approximative'; + @override String get locationFailed => 'Impossible d\'obtenir votre position — vérifiez que la localisation est activée et la permission accordée'; + @override String get queued => 'Enregistré — nous partagerons cela quand vous serez connecté'; + @override String get shareFailed => 'Impossible de se connecter aux serveurs communautaires — vos graines n\'ont pas été partagées. Réessayez dans un instant.'; + @override String get rangeLabel => 'Jusqu\'où chercher'; + @override String get rangeNear => 'Très proche'; + @override String get rangeArea => 'Autour d\'ici'; + @override String get rangeRegion => 'Ma région'; + @override String get sharedBy => 'Partagé par'; + @override String get noProfile => 'Cette personne n\'a pas encore partagé son profil'; + @override String get copyId => 'Copier le code'; + @override String get idCopied => 'Code copié'; + @override String get photo => 'Photo'; +} + +// Path: profile +class _Translations$profile$fr extends Translations$profile$en { + _Translations$profile$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Votre profil'; + @override String get name => 'Nom d\'affichage'; + @override String get nameHint => 'Comment les autres vous voient'; + @override String get about => 'À propos'; + @override String get aboutHint => 'Une courte ligne — ce que vous cultivez, où'; + @override String get g1 => 'Adresse Ğ1 (optionnel)'; + @override String get g1Hint => 'Pour que les gens puissent vous payer en Ğ1 — séparé de votre clé'; + @override String get yourId => 'Votre identité'; + @override String get idHelp => 'Partagez-la pour que les gens vous reconnaissent'; + @override String get copy => 'Copier'; + @override String get copied => 'Copié'; + @override String get save => 'Enregistrer'; + @override String get saved => 'Profil enregistré'; + @override String get identities => 'Vos identités'; + @override String get identitiesHelp => 'Gardez des identités séparées — chacune avec ses propres messages et contacts. Elles proviennent toutes de votre unique sauvegarde, donc changer n\'ajoute rien à retenir.'; + @override String identityLabel({required Object n}) => 'Identité ${n}'; + @override String get current => 'En cours d\'utilisation'; + @override String get newIdentity => 'Nouvelle identité'; + @override String get switchTitle => 'Changer d\'identité ?'; + @override String get switchBody => 'Les messages et contacts sont conservés séparément pour chaque identité. Vous pouvez revenir en arrière à tout moment.'; + @override String get switchAction => 'Changer'; +} + +// Path: chatList +class _Translations$chatList$fr extends Translations$chatList$en { + _Translations$chatList$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Messages'; + @override String get empty => 'Pas encore de conversations. Envoyez un message à quelqu\'un depuis le marché.'; +} + +// Path: chat +class _Translations$chat$fr extends Translations$chat$en { + _Translations$chat$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Messages'; + @override String get hint => 'Écrivez un message…'; + @override String get send => 'Envoyer'; + @override String get empty => 'Pas encore de messages — dites bonjour'; + @override String get offline => 'Configurez le partage pour envoyer des messages'; + @override String get payG1 => 'Payer en Ğ1'; + @override String get g1Copied => 'Adresse Ğ1 copiée — collez-la dans votre portefeuille'; + @override String get today => 'Aujourd\'hui'; + @override String get yesterday => 'Hier'; + @override String get sendError => 'Impossible d\'envoyer — vérifiez votre connexion'; + @override String get noLinks => 'Les liens ne sont pas autorisés dans les messages'; +} + +// Path: trust +class _Translations$trust$fr extends Translations$trust$en { + _Translations$trust$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get none => 'Personne ne les cautionne encore'; + @override String count({required Object n}) => 'Cautionnée par ${n}'; + @override String get vouch => 'Je connais cette personne'; + @override String get vouched => 'Vous la cautionnez'; + @override String get circle => 'Dans votre cercle'; +} + +// Path: yourPeople +class _Translations$yourPeople$fr extends Translations$yourPeople$en { + _Translations$yourPeople$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Vos contacts'; + @override String get help => 'Les gens que vous connaissez et cautionnez, et les gens qui vous cautionnent.'; + @override String get youVouchFor => 'Vous cautionnez'; + @override String get vouchesForYou => 'Ils vous cautionnent'; + @override String get youVouchForEmpty => 'Vous ne cautionnez personne pour l\'instant. Quand vous rencontrez quelqu\'un, ouvrez votre conversation avec lui et appuyez sur « Je connais cette personne ».'; + @override String get vouchesForYouEmpty => 'Personne ne vous cautionne pour l\'instant'; + @override String get revoke => 'Arrêter de cautionner'; + @override String get revokeConfirm => 'Arrêter de cautionner cette personne ?'; + @override String get offline => 'Vous êtes hors ligne — réessayez quand vous êtes connecté'; +} + +// Path: ratings +class _Translations$ratings$fr extends Translations$ratings$en { + _Translations$ratings$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get rate => 'Évaluer cette personne'; + @override String get edit => 'Modifier votre évaluation'; + @override String get commentHint => 'Comment ça s\'est passé ? (optionnel)'; + @override String fromYourCircle({required Object n}) => '${n} de gens que vous connaissez'; + @override String get retract => 'Retirer votre évaluation'; + @override String get saved => 'Évaluation enregistrée'; +} + +// Path: notifications +class _Translations$notifications$fr extends Translations$notifications$en { + _Translations$notifications$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String newMessageFrom({required Object name}) => 'Nouveau message de ${name}'; +} + +// Path: plantare +class _Translations$plantare$fr extends Translations$plantare$en { + _Translations$plantare$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Plantares'; + @override String get help => 'Un Plantare est un engagement à multiplier une semence et en rendre une partie — comment une variété continue son voyage de main en main. Ce n\'est pas une vente.'; + @override String get add => 'Ajouter un engagement'; + @override String get empty => 'Pas encore d\'engagements. Quand vous partagez ou recevez une graine avec la promesse de la cultiver et d\'en renvoyer une partie, notez-le ici.'; + @override String get iReturn => 'Je la multiplie et la rends'; + @override String get owedToMe => 'Ils m\'en renvoient'; + @override String get direction => 'Qui multiplie et rend'; + @override String get counterparty => 'Avec qui ?'; + @override String get counterpartyHint => 'Une personne ou un collectif (optionnel)'; + @override String get owed => 'Qu\'est-ce qui revient ?'; + @override String get owedHint => 'p. ex. une poignée la saison prochaine (optionnel)'; + @override String get note => 'Note (optionnel)'; + @override String get save => 'Enregistrer'; + @override String get markReturned => 'Marquer comme rendu'; + @override String get markForgiven => 'Clore l\'engagement'; + @override String get reopen => 'Rouvrir'; + @override String get delete => 'Retirer'; + @override String get statusReturned => 'Rendu'; + @override String get statusForgiven => 'Clôturé'; + @override String get openSection => 'En attente'; + @override String get settledSection => 'Fermés'; + @override String get removeConfirm => 'Retirer cet engagement ?'; +} + +// Path: handover +class _Translations$handover$fr extends Translations$handover$en { + _Translations$handover$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Graines échangées'; + @override String get help => 'Un cadeau, un échange ou une vente — notez-le, avec une promesse de retour ou pas.'; + @override String get iGave => 'J\'ai donné des graines'; + @override String get iReceived => 'J\'ai reçu des graines'; + @override String get whichLot => 'Quel lot ?'; + @override String get howMuch => 'Combien ?'; + @override String get allOfIt => 'Tout'; + @override String get partOfIt => 'Une partie'; + @override String get paymentChip => 'Il y a eu un échange d\'argent'; + @override String get promiseGave => 'Ils me renverront de la graine'; + @override String get promiseReceived => 'Je rendrai de la graine'; +} + +// Path: sale +class _Translations$sale$fr extends Translations$sale$en { + _Translations$sale$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Ventes'; + @override String get help => 'Enregistrez les graines que vous avez vendues ou achetées — argent, Ğ1, ou n\'importe quelle monnaie. Un modèle distinct d\'un cadeau ou d\'un Plantare. Aucune commission n\'est jamais prélevée sur les graines.'; + @override String get add => 'Enregistrer une vente'; + @override String get empty => 'Pas encore de ventes. Notez ici ce que vous vendez ou achetez.'; + @override String get iSold => 'J\'ai vendu'; + @override String get iBought => 'J\'ai acheté'; + @override String get direction => 'Vendu ou acheté ?'; + @override String get counterparty => 'Avec qui ?'; + @override String get counterpartyHint => 'Une personne ou un collectif (optionnel)'; + @override String get amount => 'Montant'; + @override String get currency => 'Monnaie'; + @override String get currencyHint => '€, Ğ1, heures… (optionnel)'; + @override String get hours => 'heures'; + @override String get note => 'Note (optionnel)'; + @override String get save => 'Enregistrer'; + @override String get delete => 'Retirer'; + @override String get removeConfirm => 'Retirer cette vente ?'; +} + +// Path: legal +class _Translations$legal$fr extends Translations$legal$en { + _Translations$legal$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Confidentialité & règles'; + @override String get subtitle => 'Votre confidentialité, les règles du marché et le partage légal de semences'; + @override String get privacyTitle => 'Votre confidentialité'; + @override String get privacyBody => 'Tane fonctionne sans compte, et tout ce que vous enregistrez reste sur votre appareil, chiffré. Il n\'y a pas de publicités, pas de trackers, et pas de serveur Tane.\n\nRien n\'est partagé sauf si vous le choisissez : quand vous publiez une offre ou votre profil, ou envoyez un message, cela passe par des serveurs gérés par la communauté. Les offres ne portent qu\'une zone approximative — jamais votre adresse.\n\nCe que vous publiez est public, et des copies peuvent rester même après l\'avoir retiré — alors partagez avec prudence.'; + @override String get rulesTitle => 'Les règles du jeu'; + @override String get rulesBody => 'Tane est un outil, pas un magasin : les échanges sont convenus directement entre les gens, et personne ne prend de commission. Cela signifie aussi que vous êtes responsable de ce que vous offrez et envoyez.\n\nSur le marché : soyez honnête avec vos graines, n\'offrez que ce que vous pouvez partager, traitez les gens bien et ne faites pas de spam. Vous pouvez bloquer n\'importe qui et signaler les offres ou les gens qui enfreignent les règles — les signalements sont traités sur les serveurs communautaires.'; + @override String get seedsTitle => 'À propos du partage de semences'; + @override String get seedsBody => 'Donner et échanger des graines entre amateurs est largement reconnu dans la plupart des pays. La vente peut être différente : dans de nombreux endroits, vendre des graines de variétés non officiellement enregistrées est restreint — vérifiez votre législation locale avant de demander un prix.\n\nEnvoyer des graines dans un autre pays est souvent restreint aussi, et les variétés protégées commercialement ne peuvent pas être reproduites sans permission. En cas de doute, gardez-le local et faites-en un cadeau.'; + @override String get readFull => 'Lire les documents complets en ligne'; +} + +// Path: marketGate +class _Translations$marketGate$fr extends Translations$marketGate$en { + _Translations$marketGate$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Avant de rejoindre le marché'; + @override String get intro => 'Le marché est un espace partagé entre voisins. En continuant, vous acceptez quelques règles simples :'; + @override String get ruleHonest => 'Soyez honnête avec les graines que vous offrez'; + @override String get ruleLegal => 'Partagez uniquement ce que vous êtes autorisé à partager où vous vivez'; + @override String get ruleRespect => 'Traitez les gens bien — pas de spam, pas d\'abus'; + @override String get publicNote => 'Ce que vous publiez ici est public, et des copies peuvent rester même si vous le retirez plus tard.'; + @override String get viewLegal => 'Confidentialité & règles'; + @override String get accept => 'J\'accepte'; + @override String get decline => 'Pas maintenant'; +} + +// Path: report +class _Translations$report$fr extends Translations$report$en { + _Translations$report$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get offer => 'Signaler cette offre'; + @override String get person => 'Signaler cette personne'; + @override String get title => 'Signaler'; + @override String get prompt => 'Qu\'est-ce qui ne va pas ?'; + @override String get reasonSpam => 'Spam ou escroquerie'; + @override String get reasonAbuse => 'Abusif ou irrespectueux'; + @override String get reasonIllegal => 'Graines qui ne devraient pas être offertes'; + @override String get reasonOther => 'Autre chose'; + @override String get detailsHint => 'Ajouter des détails (optionnel)'; + @override String get send => 'Envoyer le signalement'; + @override String get sentHidden => 'Signalement envoyé — vous ne verrez plus cela'; + @override String get failed => 'Impossible d\'envoyer le signalement — vérifiez votre connexion'; + @override String get alsoBlock => 'Bloquer aussi cette personne'; +} + +// Path: block +class _Translations$block$fr extends Translations$block$en { + _Translations$block$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get action => 'Bloquer cette personne'; + @override String get confirmTitle => 'Bloquer cette personne ?'; + @override String get confirmBody => 'Vous ne verrez plus ses offres ou messages. Vous pouvez la débloquer plus tard sous Personnes bloquées dans la configuration du partage.'; + @override String get confirm => 'Bloquer'; + @override String get blockedToast => 'Personne bloquée — ses offres et messages sont cachés'; + @override String get manageTitle => 'Personnes bloquées'; + @override String get manageEmpty => 'Vous n\'avez bloqué personne'; + @override String get unblock => 'Débloquer'; +} + +// Path: intro.slides +class _Translations$intro$slides$fr extends Translations$intro$slides$en { + _Translations$intro$slides$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override late final _Translations$intro$slides$welcome$fr welcome = _Translations$intro$slides$welcome$fr._(_root); + @override late final _Translations$intro$slides$inventory$fr inventory = _Translations$intro$slides$inventory$fr._(_root); + @override late final _Translations$intro$slides$privacy$fr privacy = _Translations$intro$slides$privacy$fr._(_root); + @override late final _Translations$intro$slides$share$fr share = _Translations$intro$slides$share$fr._(_root); + @override late final _Translations$intro$slides$plantare$fr plantare = _Translations$intro$slides$plantare$fr._(_root); +} + +// Path: unit.handful +class _Translations$unit$handful$fr extends Translations$unit$handful$en { + _Translations$unit$handful$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'poignée'; + @override String get plural => 'poignées'; +} + +// Path: unit.teaspoon +class _Translations$unit$teaspoon$fr extends Translations$unit$teaspoon$en { + _Translations$unit$teaspoon$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'cuillère à café'; + @override String get plural => 'cuillères à café'; +} + +// Path: unit.spoon +class _Translations$unit$spoon$fr extends Translations$unit$spoon$en { + _Translations$unit$spoon$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'cuillère'; + @override String get plural => 'cuillères'; +} + +// Path: unit.cup +class _Translations$unit$cup$fr extends Translations$unit$cup$en { + _Translations$unit$cup$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'tasse'; + @override String get plural => 'tasses'; +} + +// Path: unit.jar +class _Translations$unit$jar$fr extends Translations$unit$jar$en { + _Translations$unit$jar$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'pot'; + @override String get plural => 'pots'; +} + +// Path: unit.sack +class _Translations$unit$sack$fr extends Translations$unit$sack$en { + _Translations$unit$sack$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'sac'; + @override String get plural => 'sacs'; +} + +// Path: unit.packet +class _Translations$unit$packet$fr extends Translations$unit$packet$en { + _Translations$unit$packet$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'sachet'; + @override String get plural => 'sachets'; +} + +// Path: unit.cob +class _Translations$unit$cob$fr extends Translations$unit$cob$en { + _Translations$unit$cob$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'épi'; + @override String get plural => 'épis'; +} + +// Path: unit.pod +class _Translations$unit$pod$fr extends Translations$unit$pod$en { + _Translations$unit$pod$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'gousse'; + @override String get plural => 'gousses'; +} + +// Path: unit.ear +class _Translations$unit$ear$fr extends Translations$unit$ear$en { + _Translations$unit$ear$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'épi'; + @override String get plural => 'épis'; +} + +// Path: unit.head +class _Translations$unit$head$fr extends Translations$unit$head$en { + _Translations$unit$head$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'capitule'; + @override String get plural => 'capitules'; +} + +// Path: unit.fruit +class _Translations$unit$fruit$fr extends Translations$unit$fruit$en { + _Translations$unit$fruit$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'fruit'; + @override String get plural => 'fruits'; +} + +// Path: unit.bulb +class _Translations$unit$bulb$fr extends Translations$unit$bulb$en { + _Translations$unit$bulb$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'bulbe'; + @override String get plural => 'bulbes'; +} + +// Path: unit.tuber +class _Translations$unit$tuber$fr extends Translations$unit$tuber$en { + _Translations$unit$tuber$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'tubercule'; + @override String get plural => 'tubercules'; +} + +// Path: unit.seedHead +class _Translations$unit$seedHead$fr extends Translations$unit$seedHead$en { + _Translations$unit$seedHead$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'tête de graines'; + @override String get plural => 'têtes de graines'; +} + +// Path: unit.bunch +class _Translations$unit$bunch$fr extends Translations$unit$bunch$en { + _Translations$unit$bunch$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'botte'; + @override String get plural => 'bottes'; +} + +// Path: unit.plant +class _Translations$unit$plant$fr extends Translations$unit$plant$en { + _Translations$unit$plant$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'plante'; + @override String get plural => 'plantes'; +} + +// Path: unit.pot +class _Translations$unit$pot$fr extends Translations$unit$pot$en { + _Translations$unit$pot$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'pot'; + @override String get plural => 'pots'; +} + +// Path: unit.tray +class _Translations$unit$tray$fr extends Translations$unit$tray$en { + _Translations$unit$tray$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'plateau'; + @override String get plural => 'plateaux'; +} + +// Path: unit.seedling +class _Translations$unit$seedling$fr extends Translations$unit$seedling$en { + _Translations$unit$seedling$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'plantule'; + @override String get plural => 'plantules'; +} + +// Path: unit.tree +class _Translations$unit$tree$fr extends Translations$unit$tree$en { + _Translations$unit$tree$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'arbre'; + @override String get plural => 'arbres'; +} + +// Path: unit.cutting +class _Translations$unit$cutting$fr extends Translations$unit$cutting$en { + _Translations$unit$cutting$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'bouture'; + @override String get plural => 'boutures'; +} + +// Path: unit.grams +class _Translations$unit$grams$fr extends Translations$unit$grams$en { + _Translations$unit$grams$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'gramme'; + @override String get plural => 'grammes'; +} + +// Path: unit.count +class _Translations$unit$count$fr extends Translations$unit$count$en { + _Translations$unit$count$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get singular => 'graine'; + @override String get plural => 'graines'; +} + +// Path: intro.slides.welcome +class _Translations$intro$slides$welcome$fr extends Translations$intro$slides$welcome$en { + _Translations$intro$slides$welcome$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'La graine qui vous a menés ici'; + @override String get body => 'Chaque semence traditionnelle est une lettre écrite par des milliers de générations, passée de main en main. Nous sommes ce que nous sommes grâce à ce partage.'; +} + +// Path: intro.slides.inventory +class _Translations$intro$slides$inventory$fr extends Translations$intro$slides$inventory$en { + _Translations$intro$slides$inventory$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Votre grainothèque, dans votre poche'; + @override String get body => 'Notez ce que vous avez, de quelle année, combien et d\'où ça vient — avec le nom que vous utilisez. Une photo et un nom suffisent pour commencer.'; +} + +// Path: intro.slides.privacy +class _Translations$intro$slides$privacy$fr extends Translations$intro$slides$privacy$en { + _Translations$intro$slides$privacy$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Vôtre, et uniquement vôtre'; + @override String get body => 'Pas de compte, pas d\'internet, pas de trackers. Vos données vivent chiffrées sur votre appareil, et seul ce que vous choisissez est partagé.'; +} + +// Path: intro.slides.share +class _Translations$intro$slides$share$fr extends Translations$intro$slides$share$en { + _Translations$intro$slides$share$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Partager, comme cela s\'est toujours fait'; + @override String get body => 'Offrez ce que vous avez en excédent — cadeau, échange ou vente — et laissez quelqu\'un à proximité le trouver. Seule la distance approximative est affichée, jamais votre adresse ; vous fermez le marché en personne.'; +} + +// Path: intro.slides.plantare +class _Translations$intro$slides$plantare$fr extends Translations$intro$slides$plantare$en { + _Translations$intro$slides$plantare$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get title => 'Semer c\'est multiplier'; + @override String get body => 'Avec un Plantare, celui qui reçoit la graine promet d\'en renvoyer plus tard. Et comme renvoyer signifie la cultiver, chaque prêt multiplie le bien commun.'; +} + +/// The flat map containing all translations for locale . +/// Only for edge cases! For simple maps, use the map function of this library. +/// +/// The Dart AOT compiler has issues with very large switch statements, +/// so the map is split into smaller functions (512 entries each). +extension on TranslationsFr { + dynamic _flatMapFunction(String path) { + return switch (path) { + 'avatar.title' => 'Votre photo ou avatar', + 'avatar.fromPhoto' => 'Prendre ou choisir une photo', + 'avatar.illustration' => 'Ou choisir une illustration', + 'avatar.remove' => 'Supprimer', + 'favorites.title' => 'Favoris', + 'favorites.empty' => 'Pas encore de favoris. Enregistrez les offres que vous aimez du marché.', + 'favorites.save' => 'Ajouter aux favoris', + 'favorites.remove' => 'Retirer des favoris', + 'favorites.unavailable' => 'Plus disponible', + 'seedSaving.title' => 'Conserver sa semence', + 'seedSaving.subtitle' => 'Ce qu\'il faut pour garder la variété fidèle', + 'seedSaving.lifeCycle' => 'Cycle', + 'seedSaving.cycleAnnual' => 'Annuelle', + 'seedSaving.cycleBiennial' => 'Bisannuelle — graines la 2e année', + 'seedSaving.cyclePerennial' => 'Vivace', + 'seedSaving.pollination' => 'Pollinisation', + 'seedSaving.pollSelf' => 'Autoféconde', + 'seedSaving.pollCross' => 'Se croise avec d\'autres', + 'seedSaving.pollMixed' => 'S\'autoféconde, parfois se croise', + 'seedSaving.byInsect' => 'par les insectes', + 'seedSaving.byWind' => 'par le vent', + 'seedSaving.isolation' => 'À isoler', + 'seedSaving.isolationRange' => ({required Object min, required Object max}) => '${min}–${max} m des autres variétés', + 'seedSaving.isolationSingle' => ({required Object min}) => '${min} m des autres variétés', + 'seedSaving.plants' => 'Préserver plusieurs plantes', + 'seedSaving.plantsValue' => ({required Object n}) => 'D\'au moins ${n} plantes', + 'seedSaving.processing' => 'Nettoyer la semence', + 'seedSaving.procDry' => 'Semence sèche (dépiquage)', + 'seedSaving.procWet' => 'Semence humide (fermentation et rinçage)', + 'seedSaving.difficulty' => 'Difficulté', + 'seedSaving.diffEasy' => 'Facile', + 'seedSaving.diffMedium' => 'Moyen', + 'seedSaving.diffHard' => 'Difficile', + 'seedSaving.advisory' => 'Guide général — adaptez-le à votre climat et à votre variété.', + 'seedSaving.sourcePrefix' => 'Source', + 'calendar.title' => 'Ce mois', + 'calendar.filterChip' => 'Ce mois', + 'calendar.selfNote' => 'Ce que vous avez noté dans vos variétés.', + 'calendar.nothing' => ({required Object month}) => 'Rien noté pour ${month}.', + 'app.title' => 'Tane', + 'bootstrap.failed' => 'Tane n\'a pas pu démarrer', + 'bootstrap.retry' => 'Réessayer', + 'common.save' => 'Enregistrer', + 'common.cancel' => 'Annuler', + 'common.delete' => 'Supprimer', + 'common.edit' => 'Modifier', + 'common.type' => 'Type', + 'common.comingSoon' => 'À venir', + 'common.offline' => 'Vous êtes hors ligne — le partage est en pause', + 'home.tagline' => 'Partagez et cultivez des graines locales', + 'home.openMarket' => 'Marché', + 'home.openMarketSubtitle' => 'Découvrez et partagez des graines à proximité', + 'home.yourInventory' => 'Votre inventaire', + 'home.yourInventorySubtitle' => 'Gérez vos graines', + 'photo.camera' => 'Prendre une photo', + 'photo.gallery' => 'Choisir de la galerie', + 'photo.setAsCover' => 'Mettre en couverture', + 'photo.isCover' => 'Photo de couverture', + 'photo.deleteConfirm' => 'Supprimer cette photo ?', + 'menu.tagline' => 'votre grainothèque', + 'menu.inventory' => 'Inventaire', + 'menu.market' => 'Marché', + 'menu.profile' => 'Votre profil', + 'menu.chat' => 'Messages', + 'menu.wishlist' => 'Favoris', + 'menu.following' => 'Abonnements', + 'menu.plantares' => 'Plantares', + 'menu.sales' => 'Ventes', + 'menu.calendar' => 'Calendrier', + 'menu.settings' => 'Paramètres', + 'settings.language' => 'Langue', + 'settings.systemLanguage' => 'Langue du système', + 'settings.langEs' => 'Español', + 'settings.langEn' => 'English', + 'settings.langPt' => 'Português', + 'settings.langAst' => 'Asturianu', + 'settings.langFr' => 'Français', + 'settings.langDe' => 'Deutsch', + 'settings.about' => 'À propos', + 'settings.aboutText' => 'Inventaire local-first et chiffré pour les semences traditionnelles. AGPL-3.0.', + 'settings.aboutOpen' => 'À propos de Tane', + 'backup.title' => 'Sauvegarde & restauration', + 'backup.autoBackupTitle' => 'Sauvegardes automatiques', + 'backup.autoBackupLast' => ({required Object date}) => 'Dernière copie sauvegardée ${date}', + 'backup.autoBackupNone' => 'Une copie est conservée automatiquement en arrière-plan', + 'backup.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', + 'backup.importJsonSubtitle' => 'Récupérez une copie enregistrée — rien ne sera dupliqué', + 'backup.exportCsv' => 'Exporter vers un tableur', + 'backup.exportCsvSubtitle' => 'Une liste simple pour Excel ou LibreOffice — sans photos', + 'backup.importCsv' => 'Importer une liste', + 'backup.importCsvSubtitle' => 'Ajoutez des entrées depuis un tableur', + 'backup.importConfirmTitle' => 'Restaurer une sauvegarde ?', + 'backup.importConfirmBody' => 'Les entrées fusionnent avec votre inventaire ; si une entrée existe des deux côtés, c\'est la version la plus récente qui gagne. Rien ne sera dupliqué.', + 'backup.importCsvConfirmTitle' => 'Importer une liste ?', + 'backup.importCsvConfirmBody' => 'Chaque ligne est ajoutée comme une nouvelle entrée. Cela ne fusionne ni ne remplace, donc importer le même fichier deux fois l\'ajoute deux fois.', + 'backup.importAction' => 'Importer', + 'backup.exportSaved' => 'Copie enregistrée', + 'backup.cancelled' => 'Annulé', + 'backup.importDone' => ({required Object added, required Object updated}) => 'Importé : ${added} nouvelles, ${updated} actualisées', + 'backup.importCsvDone' => ({required Object count}) => 'Ajoutées ${count} entrées', + 'backup.importFailed' => 'Ce fichier n\'a pas pu être lu comme une sauvegarde Tane', + 'backup.failed' => 'Quelque chose s\'est mal passé', + 'backup.recoveryTitle' => 'Votre code de récupération', + 'backup.recoverySubtitle' => 'Imprimez-le et gardez-le en sécurité — il ouvre vos sauvegardes sur un nouvel appareil', + 'backup.recoveryIntro' => 'Ce code ouvre vos sauvegardes et retrouve votre grainothèque sur n\'importe quel appareil. Conservez deux copies imprimées en lieux sûrs, comme votre meilleure graine. Quiconque l\'obtient peut lire vos sauvegardes, alors ne le partagez avec personne.', + 'backup.recoveryCopy' => 'Copier', + 'backup.recoverySave' => 'Enregistrer la feuille', + 'backup.recoverySheetTitle' => 'Tane — votre feuille de récupération', + 'backup.recoveryPromptTitle' => 'Entrez votre code de récupération', + 'backup.recoveryPromptBody' => 'Cette sauvegarde a été enregistrée avec un autre code. Entrez le code de votre feuille de récupération pour l\'ouvrir.', + 'backup.recoveryWrongCode' => 'Ce code n\'ouvre pas cette sauvegarde', + 'about.title' => 'À propos', + 'about.kanji' => '種', + 'about.tagline' => 'Une app local-first et décentralisée pour gérer et partager des semences et plantules traditionnelles.', + 'about.intro' => 'Tane (種, « graine » en japonais) aide les gens et les collectifs à gérer un inventaire bienveillant de leur grainothèque, décider ce qu\'ils offrent et le partager localement — sans intermédiaire central qui pourrait contrôler, censurer ou être poursuivi pour cela. Son nom vient de tanemaki (種まき), « semer / disperser des graines ». L\'objectif est à la fois pratique et politique : soutenir les variétés de semences traditionnelles et résister au monopole des semenciers.', + 'about.heritage' => 'Le nom honore les anciennes traditions d\'entraide japonaises autour du riz — yui (travail communautaire partagé) et tanomoshi (caisses de secours mutuel) — qui ont inspiré le document Plantare, la « monnaie communautaire pour l\'échange de semences » (BAH-Semillero, 2009, CC-BY-SA). Tane est le Plantare numérique.', + 'about.version' => 'Version', + 'about.license' => 'Licence', + 'about.licenseValue' => 'AGPL-3.0', + 'about.website' => 'Site web', + 'about.openSourceLicenses' => 'Licences open source', + 'about.openSourceLicensesSubtitle' => 'Bibliothèques tiers et leurs licences', + 'about.copyright' => ({required Object years}) => '© ${years} Association Comunes, sous AGPLv3', + 'intro.skip' => 'Passer', + 'intro.next' => 'Suivant', + 'intro.start' => 'Commencer', + 'intro.menuEntry' => 'Comment fonctionne Tane', + 'intro.slides.welcome.title' => 'La graine qui vous a menés ici', + 'intro.slides.welcome.body' => 'Chaque semence traditionnelle est une lettre écrite par des milliers de générations, passée de main en main. Nous sommes ce que nous sommes grâce à ce partage.', + 'intro.slides.inventory.title' => 'Votre grainothèque, dans votre poche', + 'intro.slides.inventory.body' => 'Notez ce que vous avez, de quelle année, combien et d\'où ça vient — avec le nom que vous utilisez. Une photo et un nom suffisent pour commencer.', + 'intro.slides.privacy.title' => 'Vôtre, et uniquement vôtre', + 'intro.slides.privacy.body' => 'Pas de compte, pas d\'internet, pas de trackers. Vos données vivent chiffrées sur votre appareil, et seul ce que vous choisissez est partagé.', + 'intro.slides.share.title' => 'Partager, comme cela s\'est toujours fait', + 'intro.slides.share.body' => 'Offrez ce que vous avez en excédent — cadeau, échange ou vente — et laissez quelqu\'un à proximité le trouver. Seule la distance approximative est affichée, jamais votre adresse ; vous fermez le marché en personne.', + 'intro.slides.plantare.title' => 'Semer c\'est multiplier', + 'intro.slides.plantare.body' => 'Avec un Plantare, celui qui reçoit la graine promet d\'en renvoyer plus tard. Et comme renvoyer signifie la cultiver, chaque prêt multiplie le bien commun.', + 'inventory.title' => 'Inventaire', + 'inventory.searchHint' => 'Rechercher des graines', + 'inventory.empty' => 'Pas encore de graines. Appuyez sur + pour ajouter votre première.', + 'inventory.noMatches' => 'Aucune graine ne correspond à vos filtres.', + 'inventory.clearFilters' => 'Effacer les filtres', + 'inventory.uncategorized' => 'Non catégorisé', + 'inventory.needsReproductionFilter' => 'À multiplier', + 'inventory.loadError' => 'Impossible d\'ouvrir votre grainothèque. Elle était peut-être occupée — réessayez.', + 'inventory.retry' => 'Réessayer', + 'draft.capture' => 'Capturer des photos', + 'draft.captured' => ({required Object n}) => '${n} capturée(s) à cataloguer', + 'draft.triageTitle' => 'À cataloguer', + 'draft.triageCount' => ({required Object n}) => '${n} à cataloguer', + 'draft.untitled' => 'Sans titre', + 'draft.nameField' => 'Nommez cette graine', + 'draft.nameHint' => 'Qu\'est-ce que c\'est ?', + 'draft.suggestFromPhoto' => 'Suggérer un nom depuis la photo', + 'draft.discard' => 'Abandonner', + 'quickAdd.title' => 'Ajouter une graine', + 'quickAdd.labelField' => 'Nom', + 'quickAdd.labelRequired' => 'Donnez-lui un nom', + 'quickAdd.addPhoto' => 'Ajouter une photo', + 'quickAdd.quantity' => 'Combien ?', + 'quickAdd.more' => 'Ajouter plus…', + 'quickAdd.save' => 'Enregistrer', + 'quickAdd.saveAndAddAnother' => 'Enregistrer et ajouter une autre', + 'quickAdd.addedCount' => ({required Object n}) => '${n} ajoutée(s)', + 'quickAdd.cancel' => 'Annuler', + 'detail.notFound' => 'Cette graine n\'est plus ici.', + 'detail.lots' => 'Lots', + 'detail.noLots' => 'Pas encore de lots.', + 'detail.names' => 'Aussi connue sous le nom de', + 'detail.addName' => 'Ajouter un nom', + 'detail.links' => 'Liens', + 'detail.addLink' => 'Ajouter un lien', + 'detail.linkUrl' => 'URL', + 'detail.linkTitle' => 'Titre (optionnel)', + 'detail.reference' => 'En savoir plus', + 'detail.refGbif' => 'GBIF', + 'detail.refWikipedia' => 'Wikipedia', + 'detail.refWikispecies' => 'Wikispecies', + 'detail.notes' => 'Notes', + 'detail.addLot' => 'Ajouter un lot', + 'detail.editLot' => 'Modifier le lot', + 'detail.deleteConfirm' => 'Supprimer cette graine ?', + 'detail.year' => ({required Object year}) => 'Année ${year}', + 'detail.noYear' => 'Année inconnue', + 'germination.title' => 'Germination', + 'germination.add' => 'Ajouter un test', + 'germination.sampleSize' => 'Échantillon', + 'germination.germinated' => 'Germinées', + 'germination.none' => 'Pas encore de tests de germination.', + 'germination.result' => ({required Object percent}) => '${percent}%', + 'viability.expiringSoon' => 'Utilisez-la ou multipliez-la cette saison', + 'viability.expiringSoonYears' => ({required Object years}) => 'Utilisez-la ou multipliez-la cette saison · se garde ~${years} an(s)', + 'viability.expired' => 'Au-delà de la viabilité typique — à multiplier', + 'viability.expiredYears' => ({required Object years}) => 'Au-delà de la viabilité typique (~${years} an(s)) — à multiplier', + 'editVariety.title' => 'Modifier la graine', + 'editVariety.name' => 'Nom', + 'editVariety.category' => 'Catégorie', + 'editVariety.notes' => 'Notes', + 'editVariety.species' => 'Espèce (du catalogue)', + 'editVariety.speciesHint' => 'Rechercher une espèce…', + 'editVariety.speciesSuggested' => 'Suggérée par le nom', + 'editVariety.organic' => 'Biologique', + 'editVariety.organicHint' => 'Cultivée de manière biologique (bio)', + 'addLot.title' => 'Ajouter un lot', + 'addLot.year' => 'Date de récolte', + 'addLot.quantity' => 'Combien ?', + 'addLot.amount' => 'Quantité', + 'harvest.pickTitle' => 'Sélectionnez le mois / l\'année', + 'harvest.anyMonth' => 'N\'importe quel mois', + 'harvest.noDate' => 'Définir la date de récolte', + 'harvest.monthNames.0' => 'janvier', + 'harvest.monthNames.1' => 'février', + 'harvest.monthNames.2' => 'mars', + 'harvest.monthNames.3' => 'avril', + 'harvest.monthNames.4' => 'mai', + 'harvest.monthNames.5' => 'juin', + 'harvest.monthNames.6' => 'juillet', + 'harvest.monthNames.7' => 'août', + 'harvest.monthNames.8' => 'septembre', + 'harvest.monthNames.9' => 'octobre', + 'harvest.monthNames.10' => 'novembre', + 'harvest.monthNames.11' => 'décembre', + 'lotType.seed' => 'Graines', + 'lotType.plant' => 'Plante', + 'lotType.seedling' => 'Plantule', + 'lotType.tree' => 'Arbre / arbuste', + 'lotType.bulb' => 'Bulbe / tubercule', + 'lotType.cutting' => 'Bouture', + 'presentation.title' => 'Emballage', + 'presentation.none' => 'Non spécifié', + 'presentation.pot' => 'Pot', + 'presentation.tray' => 'Plateau', + 'presentation.plug' => 'Alvéole', + 'presentation.bareRoot' => 'Racines nues', + 'presentation.rootBall' => 'Motte', + 'provenance.section' => 'D\'où elle vient', + 'provenance.seedsFrom' => 'Graines de', + 'provenance.seedsFromHint' => 'Qui les a cultivées ou données', + 'provenance.place' => 'Lieu', + 'provenance.placeHint' => 'D\'où elles viennent (avec région)', + 'provenance.addSeedsFrom' => 'Graines de', + 'provenance.addPlace' => 'Lieu', + 'abundance.add' => 'Combien j\'en ai', + 'abundance.title' => 'Combien j\'en ai', + 'abundance.none' => 'Non défini', + 'abundance.plentyToShare' => 'De quoi partager généreusement', + 'abundance.enoughToShare' => 'Assez pour partager un peu', + 'abundance.enoughForMe' => 'Assez pour moi', + 'abundance.runningLow' => 'Ça commence à manquer', + 'share.add' => 'La partagez-vous ?', + 'share.title' => 'La partagez-vous ?', + 'share.nudge' => 'Vous en avez beaucoup — vous pourriez en partager.', + 'share.price' => 'Prix', + 'share.priceHint' => 'Laissez vide pour en discuter plus tard', + 'share.private' => 'Juste pour moi', + 'share.gift' => 'À donner', + 'share.exchange' => 'À échanger', + 'share.sell' => 'À vendre', + 'share.filterChip' => 'Je partage', + 'share.printCatalog' => 'Imprimer ce que je partage', + 'share.catalogTitle' => 'Ce que je partage', + 'share.catalogSaved' => 'Catalogue enregistré', + 'share.cancelled' => 'Annulé', + 'printLabels.action' => 'Imprimer les étiquettes', + 'printLabels.title' => 'Imprimer les étiquettes', + 'printLabels.selectHint' => 'Choisissez les graines pour lesquelles imprimer les étiquettes', + 'printLabels.selectAll' => 'Tout sélectionner', + 'printLabels.selected' => ({required Object n}) => '${n} sélectionnée(s)', + 'printLabels.none' => 'Sélectionnez d\'abord les graines', + 'printLabels.format' => 'Taille d\'étiquette', + 'printLabels.formatStickers' => 'Petits autocollants', + 'printLabels.formatStickersHint' => 'Beaucoup de petites étiquettes par page — à coller sur les sachets', + 'printLabels.formatCards' => 'Grandes cartes', + 'printLabels.formatCardsHint' => 'Moins d\'étiquettes, plus grandes — pour les pots et boîtes', + 'printLabels.count' => ({required Object n}) => '${n} étiquette(s)', + 'printLabels.save' => 'Enregistrer les étiquettes', + 'printLabels.saved' => 'Étiquettes enregistrées', + 'printLabels.cancelled' => 'Annulé', + 'cropCalendar.add' => 'Calendrier de culture', + 'cropCalendar.title' => 'Calendrier de culture', + 'cropCalendar.sow' => 'Semis', + 'cropCalendar.transplant' => 'Repiquage', + 'cropCalendar.flowering' => 'Floraison', + 'cropCalendar.fruiting' => 'Fructification', + 'cropCalendar.seedHarvest' => 'Récolte de semences', + 'cropCalendar.editorHint' => 'Notez les mois typiques pour cette variété dans votre région — ce sont vos propres notes.', + 'cropCalendar.unset' => '—', + 'needsReproduction.label' => 'À multiplier cette saison', + 'needsReproduction.hint' => 'Cultivez-la avant que la semence ne manque', + 'needsReproduction.badge' => 'À multiplier', + 'preservation.add' => 'Comment c\'est conservé', + 'preservation.title' => 'Comment c\'est conservé', + 'preservation.none' => 'Non spécifié', + 'preservation.jarWithDesiccant' => 'Pot avec dessiccant', + 'preservation.glassJar' => 'Pot en verre', + 'preservation.paperEnvelope' => 'Enveloppe en papier', + 'preservation.paperBag' => 'Sac en papier', + 'preservation.plasticBag' => 'Sac en plastique', + 'conditionCheck.advanced' => 'Conservation et détails de la grainothèque', + 'conditionCheck.title' => 'Contrôles de conservation', + 'conditionCheck.add' => 'Ajouter un contrôle', + 'conditionCheck.containers' => 'Pots / récipients', + 'conditionCheck.desiccant' => 'Dessiccant', + 'conditionCheck.none' => 'Pas encore de contrôles.', + 'conditionCheck.summary' => ({required Object count, required Object state}) => '${count} pot(s) · ${state}', + 'desiccant.none' => 'Aucun', + 'desiccant.add' => 'En ajouter', + 'desiccant.replace' => 'À changer', + 'desiccant.dry' => 'Bleu — sec', + 'desiccant.fresh' => 'Fraîchement mis', + 'unit.aFew' => 'quelques', + 'unit.some' => 'quelques', + 'unit.plenty' => 'beaucoup', + 'unit.pinch' => 'une pincée', + 'unit.handful.singular' => 'poignée', + 'unit.handful.plural' => 'poignées', + 'unit.teaspoon.singular' => 'cuillère à café', + 'unit.teaspoon.plural' => 'cuillères à café', + 'unit.spoon.singular' => 'cuillère', + 'unit.spoon.plural' => 'cuillères', + 'unit.cup.singular' => 'tasse', + 'unit.cup.plural' => 'tasses', + 'unit.jar.singular' => 'pot', + 'unit.jar.plural' => 'pots', + 'unit.sack.singular' => 'sac', + 'unit.sack.plural' => 'sacs', + 'unit.packet.singular' => 'sachet', + 'unit.packet.plural' => 'sachets', + 'unit.cob.singular' => 'épi', + 'unit.cob.plural' => 'épis', + 'unit.pod.singular' => 'gousse', + 'unit.pod.plural' => 'gousses', + 'unit.ear.singular' => 'épi', + 'unit.ear.plural' => 'épis', + 'unit.head.singular' => 'capitule', + 'unit.head.plural' => 'capitules', + 'unit.fruit.singular' => 'fruit', + 'unit.fruit.plural' => 'fruits', + 'unit.bulb.singular' => 'bulbe', + 'unit.bulb.plural' => 'bulbes', + 'unit.tuber.singular' => 'tubercule', + 'unit.tuber.plural' => 'tubercules', + 'unit.seedHead.singular' => 'tête de graines', + 'unit.seedHead.plural' => 'têtes de graines', + 'unit.bunch.singular' => 'botte', + 'unit.bunch.plural' => 'bottes', + 'unit.plant.singular' => 'plante', + 'unit.plant.plural' => 'plantes', + 'unit.pot.singular' => 'pot', + 'unit.pot.plural' => 'pots', + 'unit.tray.singular' => 'plateau', + 'unit.tray.plural' => 'plateaux', + 'unit.seedling.singular' => 'plantule', + 'unit.seedling.plural' => 'plantules', + 'unit.tree.singular' => 'arbre', + 'unit.tree.plural' => 'arbres', + 'unit.cutting.singular' => 'bouture', + 'unit.cutting.plural' => 'boutures', + 'unit.grams.singular' => 'gramme', + 'unit.grams.plural' => 'grammes', + 'unit.count.singular' => 'graine', + 'unit.count.plural' => 'graines', + 'market.title' => 'Graines près de vous', + 'market.subtitle' => 'Ce que les autres partagent à proximité', + 'market.notSetUp' => 'Le partage n\'est pas encore configuré', + 'market.notSetUpBody' => 'Activez le partage pour voir et donner des graines aux gens à proximité. C\'est volontairement approximatif — votre zone, jamais votre adresse exacte.', + 'market.setUp' => 'Configurer le partage', + 'market.cantReach' => 'Impossible de se connecter aux serveurs communautaires en ce moment', + 'market.cantReachBody' => 'Réessayez, ou vérifiez les serveurs sous Configuration avancée.', + 'market.retry' => 'Réessayer', + 'market.setArea' => 'Définir votre zone', + 'market.setAreaBody' => 'Dites au marché approximativement où vous êtes pour voir les graines à proximité.', + 'market.searching' => 'Recherche autour de votre zone…', + 'market.empty' => 'Aucune graine n\'est encore partagée près de vous', + 'market.searchHint' => 'Rechercher parmi ces graines', + 'market.noMatches' => 'Aucune graine partagée ne correspond à votre recherche', + 'market.near' => 'Près de vous', + 'market.contact' => 'Message', + 'market.mine' => 'Vous', + 'market.configTitle' => 'Configuration du partage', + 'market.setupIntro' => 'Le partage avec les gens à proximité est optionnel. Définissez simplement votre zone approximative — vous êtes déjà connectés aux serveurs communautaires partagés pour que les gens trouvent ce que vous offrez, sans aucune entreprise au milieu.', + 'market.areaLabel' => 'Votre zone', + 'market.areaHelp' => 'Gardée approximative volontairement — votre zone, jamais un point exact.', + 'market.areaSet' => 'Votre zone est définie — approximative, jamais votre point exact', + 'market.areaNotSet' => 'Zone non définie — utilisez votre position, ou ajoutez un code sous Avancé', + 'market.advanced' => 'Avancé', + 'market.areaCodeLabel' => 'Code de zone', + 'market.areaCodeHint' => 'Un code court comme sp3e9 — pas un nom de lieu', + 'market.serversLabel' => 'Serveurs communautaires', + 'market.serversHelp' => 'Une adresse par ligne (wss://…). Laissez les valeurs par défaut si vous n\'êtes pas sûr.', + 'market.serversAdvanced' => 'Ajouter un autre serveur', + 'market.save' => 'Enregistrer', + 'market.saved' => 'Enregistré', + 'market.wanted' => 'Recherché', + 'market.shareMine' => 'Partager mes graines', + 'market.sharedCount' => ({required Object n}) => '${n} graines partagées', + 'market.nothingToShare' => 'Marquez d\'abord certaines graines à donner, échanger ou vendre', + 'market.useLocation' => 'Utiliser ma position approximative', + 'market.locationFailed' => 'Impossible d\'obtenir votre position — vérifiez que la localisation est activée et la permission accordée', + 'market.queued' => 'Enregistré — nous partagerons cela quand vous serez connecté', + 'market.shareFailed' => 'Impossible de se connecter aux serveurs communautaires — vos graines n\'ont pas été partagées. Réessayez dans un instant.', + 'market.rangeLabel' => 'Jusqu\'où chercher', + 'market.rangeNear' => 'Très proche', + 'market.rangeArea' => 'Autour d\'ici', + 'market.rangeRegion' => 'Ma région', + 'market.sharedBy' => 'Partagé par', + 'market.noProfile' => 'Cette personne n\'a pas encore partagé son profil', + 'market.copyId' => 'Copier le code', + 'market.idCopied' => 'Code copié', + 'market.photo' => 'Photo', + 'profile.title' => 'Votre profil', + 'profile.name' => 'Nom d\'affichage', + 'profile.nameHint' => 'Comment les autres vous voient', + 'profile.about' => 'À propos', + 'profile.aboutHint' => 'Une courte ligne — ce que vous cultivez, où', + 'profile.g1' => 'Adresse Ğ1 (optionnel)', + 'profile.g1Hint' => 'Pour que les gens puissent vous payer en Ğ1 — séparé de votre clé', + 'profile.yourId' => 'Votre identité', + 'profile.idHelp' => 'Partagez-la pour que les gens vous reconnaissent', + 'profile.copy' => 'Copier', + 'profile.copied' => 'Copié', + 'profile.save' => 'Enregistrer', + 'profile.saved' => 'Profil enregistré', + 'profile.identities' => 'Vos identités', + 'profile.identitiesHelp' => 'Gardez des identités séparées — chacune avec ses propres messages et contacts. Elles proviennent toutes de votre unique sauvegarde, donc changer n\'ajoute rien à retenir.', + 'profile.identityLabel' => ({required Object n}) => 'Identité ${n}', + 'profile.current' => 'En cours d\'utilisation', + 'profile.newIdentity' => 'Nouvelle identité', + 'profile.switchTitle' => 'Changer d\'identité ?', + 'profile.switchBody' => 'Les messages et contacts sont conservés séparément pour chaque identité. Vous pouvez revenir en arrière à tout moment.', + 'profile.switchAction' => 'Changer', + 'chatList.title' => 'Messages', + 'chatList.empty' => 'Pas encore de conversations. Envoyez un message à quelqu\'un depuis le marché.', + 'chat.title' => 'Messages', + 'chat.hint' => 'Écrivez un message…', + 'chat.send' => 'Envoyer', + 'chat.empty' => 'Pas encore de messages — dites bonjour', + 'chat.offline' => 'Configurez le partage pour envoyer des messages', + 'chat.payG1' => 'Payer en Ğ1', + 'chat.g1Copied' => 'Adresse Ğ1 copiée — collez-la dans votre portefeuille', + 'chat.today' => 'Aujourd\'hui', + 'chat.yesterday' => 'Hier', + 'chat.sendError' => 'Impossible d\'envoyer — vérifiez votre connexion', + 'chat.noLinks' => 'Les liens ne sont pas autorisés dans les messages', + 'trust.none' => 'Personne ne les cautionne encore', + 'trust.count' => ({required Object n}) => 'Cautionnée par ${n}', + 'trust.vouch' => 'Je connais cette personne', + 'trust.vouched' => 'Vous la cautionnez', + 'trust.circle' => 'Dans votre cercle', + 'yourPeople.title' => 'Vos contacts', + 'yourPeople.help' => 'Les gens que vous connaissez et cautionnez, et les gens qui vous cautionnent.', + 'yourPeople.youVouchFor' => 'Vous cautionnez', + 'yourPeople.vouchesForYou' => 'Ils vous cautionnent', + 'yourPeople.youVouchForEmpty' => 'Vous ne cautionnez personne pour l\'instant. Quand vous rencontrez quelqu\'un, ouvrez votre conversation avec lui et appuyez sur « Je connais cette personne ».', + 'yourPeople.vouchesForYouEmpty' => 'Personne ne vous cautionne pour l\'instant', + 'yourPeople.revoke' => 'Arrêter de cautionner', + 'yourPeople.revokeConfirm' => 'Arrêter de cautionner cette personne ?', + 'yourPeople.offline' => 'Vous êtes hors ligne — réessayez quand vous êtes connecté', + 'ratings.rate' => 'Évaluer cette personne', + 'ratings.edit' => 'Modifier votre évaluation', + 'ratings.commentHint' => 'Comment ça s\'est passé ? (optionnel)', + 'ratings.fromYourCircle' => ({required Object n}) => '${n} de gens que vous connaissez', + 'ratings.retract' => 'Retirer votre évaluation', + 'ratings.saved' => 'Évaluation enregistrée', + 'notifications.newMessageFrom' => ({required Object name}) => 'Nouveau message de ${name}', + 'plantare.title' => 'Plantares', + 'plantare.help' => 'Un Plantare est un engagement à multiplier une semence et en rendre une partie — comment une variété continue son voyage de main en main. Ce n\'est pas une vente.', + 'plantare.add' => 'Ajouter un engagement', + 'plantare.empty' => 'Pas encore d\'engagements. Quand vous partagez ou recevez une graine avec la promesse de la cultiver et d\'en renvoyer une partie, notez-le ici.', + 'plantare.iReturn' => 'Je la multiplie et la rends', + 'plantare.owedToMe' => 'Ils m\'en renvoient', + 'plantare.direction' => 'Qui multiplie et rend', + 'plantare.counterparty' => 'Avec qui ?', + 'plantare.counterpartyHint' => 'Une personne ou un collectif (optionnel)', + 'plantare.owed' => 'Qu\'est-ce qui revient ?', + 'plantare.owedHint' => 'p. ex. une poignée la saison prochaine (optionnel)', + 'plantare.note' => 'Note (optionnel)', + 'plantare.save' => 'Enregistrer', + 'plantare.markReturned' => 'Marquer comme rendu', + 'plantare.markForgiven' => 'Clore l\'engagement', + 'plantare.reopen' => 'Rouvrir', + 'plantare.delete' => 'Retirer', + 'plantare.statusReturned' => 'Rendu', + 'plantare.statusForgiven' => 'Clôturé', + 'plantare.openSection' => 'En attente', + 'plantare.settledSection' => 'Fermés', + 'plantare.removeConfirm' => 'Retirer cet engagement ?', + 'handover.title' => 'Graines échangées', + 'handover.help' => 'Un cadeau, un échange ou une vente — notez-le, avec une promesse de retour ou pas.', + 'handover.iGave' => 'J\'ai donné des graines', + 'handover.iReceived' => 'J\'ai reçu des graines', + 'handover.whichLot' => 'Quel lot ?', + 'handover.howMuch' => 'Combien ?', + 'handover.allOfIt' => 'Tout', + 'handover.partOfIt' => 'Une partie', + 'handover.paymentChip' => 'Il y a eu un échange d\'argent', + 'handover.promiseGave' => 'Ils me renverront de la graine', + 'handover.promiseReceived' => 'Je rendrai de la graine', + 'sale.title' => 'Ventes', + 'sale.help' => 'Enregistrez les graines que vous avez vendues ou achetées — argent, Ğ1, ou n\'importe quelle monnaie. Un modèle distinct d\'un cadeau ou d\'un Plantare. Aucune commission n\'est jamais prélevée sur les graines.', + 'sale.add' => 'Enregistrer une vente', + 'sale.empty' => 'Pas encore de ventes. Notez ici ce que vous vendez ou achetez.', + 'sale.iSold' => 'J\'ai vendu', + 'sale.iBought' => 'J\'ai acheté', + 'sale.direction' => 'Vendu ou acheté ?', + 'sale.counterparty' => 'Avec qui ?', + 'sale.counterpartyHint' => 'Une personne ou un collectif (optionnel)', + 'sale.amount' => 'Montant', + 'sale.currency' => 'Monnaie', + 'sale.currencyHint' => '€, Ğ1, heures… (optionnel)', + _ => null, + } ?? switch (path) { + 'sale.hours' => 'heures', + 'sale.note' => 'Note (optionnel)', + 'sale.save' => 'Enregistrer', + 'sale.delete' => 'Retirer', + 'sale.removeConfirm' => 'Retirer cette vente ?', + 'legal.title' => 'Confidentialité & règles', + 'legal.subtitle' => 'Votre confidentialité, les règles du marché et le partage légal de semences', + 'legal.privacyTitle' => 'Votre confidentialité', + 'legal.privacyBody' => 'Tane fonctionne sans compte, et tout ce que vous enregistrez reste sur votre appareil, chiffré. Il n\'y a pas de publicités, pas de trackers, et pas de serveur Tane.\n\nRien n\'est partagé sauf si vous le choisissez : quand vous publiez une offre ou votre profil, ou envoyez un message, cela passe par des serveurs gérés par la communauté. Les offres ne portent qu\'une zone approximative — jamais votre adresse.\n\nCe que vous publiez est public, et des copies peuvent rester même après l\'avoir retiré — alors partagez avec prudence.', + 'legal.rulesTitle' => 'Les règles du jeu', + 'legal.rulesBody' => 'Tane est un outil, pas un magasin : les échanges sont convenus directement entre les gens, et personne ne prend de commission. Cela signifie aussi que vous êtes responsable de ce que vous offrez et envoyez.\n\nSur le marché : soyez honnête avec vos graines, n\'offrez que ce que vous pouvez partager, traitez les gens bien et ne faites pas de spam. Vous pouvez bloquer n\'importe qui et signaler les offres ou les gens qui enfreignent les règles — les signalements sont traités sur les serveurs communautaires.', + 'legal.seedsTitle' => 'À propos du partage de semences', + 'legal.seedsBody' => 'Donner et échanger des graines entre amateurs est largement reconnu dans la plupart des pays. La vente peut être différente : dans de nombreux endroits, vendre des graines de variétés non officiellement enregistrées est restreint — vérifiez votre législation locale avant de demander un prix.\n\nEnvoyer des graines dans un autre pays est souvent restreint aussi, et les variétés protégées commercialement ne peuvent pas être reproduites sans permission. En cas de doute, gardez-le local et faites-en un cadeau.', + 'legal.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 :', + 'marketGate.ruleHonest' => 'Soyez honnête avec les graines que vous offrez', + 'marketGate.ruleLegal' => 'Partagez uniquement ce que vous êtes autorisé à partager où vous vivez', + 'marketGate.ruleRespect' => 'Traitez les gens bien — pas de spam, pas d\'abus', + 'marketGate.publicNote' => 'Ce que vous publiez ici est public, et des copies peuvent rester même si vous le retirez plus tard.', + 'marketGate.viewLegal' => 'Confidentialité & règles', + 'marketGate.accept' => 'J\'accepte', + 'marketGate.decline' => 'Pas maintenant', + 'report.offer' => 'Signaler cette offre', + 'report.person' => 'Signaler cette personne', + 'report.title' => 'Signaler', + 'report.prompt' => 'Qu\'est-ce qui ne va pas ?', + 'report.reasonSpam' => 'Spam ou escroquerie', + 'report.reasonAbuse' => 'Abusif ou irrespectueux', + 'report.reasonIllegal' => 'Graines qui ne devraient pas être offertes', + 'report.reasonOther' => 'Autre chose', + 'report.detailsHint' => 'Ajouter des détails (optionnel)', + 'report.send' => 'Envoyer le signalement', + 'report.sentHidden' => 'Signalement envoyé — vous ne verrez plus cela', + 'report.failed' => 'Impossible d\'envoyer le signalement — vérifiez votre connexion', + 'report.alsoBlock' => 'Bloquer aussi cette personne', + 'block.action' => 'Bloquer cette personne', + 'block.confirmTitle' => 'Bloquer cette personne ?', + 'block.confirmBody' => 'Vous ne verrez plus ses offres ou messages. Vous pouvez la débloquer plus tard sous Personnes bloquées dans la configuration du partage.', + 'block.confirm' => 'Bloquer', + 'block.blockedToast' => 'Personne bloquée — ses offres et messages sont cachés', + 'block.manageTitle' => 'Personnes bloquées', + 'block.manageEmpty' => 'Vous n\'avez bloqué personne', + 'block.unblock' => 'Débloquer', + _ => null, + }; + } +} diff --git a/apps/app_seeds/lib/i18n/strings_pt.g.dart b/apps/app_seeds/lib/i18n/strings_pt.g.dart index 50d6bcb..7ff9a19 100644 --- a/apps/app_seeds/lib/i18n/strings_pt.g.dart +++ b/apps/app_seeds/lib/i18n/strings_pt.g.dart @@ -264,6 +264,8 @@ class _Translations$settings$pt extends Translations$settings$en { @override String get langEn => 'English'; @override String get langPt => 'Português'; @override String get langAst => 'Asturianu'; + @override String get langFr => 'Français'; + @override String get langDe => 'Deutsch'; @override String get about => 'Acerca de'; @override String get aboutText => 'Inventário local e cifrado para sementes tradicionais. AGPL-3.0.'; @override String get aboutOpen => 'Acerca do Tane'; @@ -1484,6 +1486,8 @@ extension on TranslationsPt { 'settings.langEn' => 'English', 'settings.langPt' => 'Português', 'settings.langAst' => 'Asturianu', + 'settings.langFr' => 'Français', + 'settings.langDe' => 'Deutsch', 'settings.about' => 'Acerca de', 'settings.aboutText' => 'Inventário local e cifrado para sementes tradicionais. AGPL-3.0.', 'settings.aboutOpen' => 'Acerca do Tane', @@ -1918,10 +1922,10 @@ extension on TranslationsPt { 'sale.direction' => 'Vendes ou compras?', 'sale.counterparty' => 'Com quem?', 'sale.counterpartyHint' => 'Uma pessoa ou um coletivo (opcional)', - 'sale.amount' => 'Montante', - 'sale.currency' => 'Moeda', _ => null, } ?? switch (path) { + 'sale.amount' => 'Montante', + 'sale.currency' => 'Moeda', 'sale.currencyHint' => '€, Ğ1, horas… (opcional)', 'sale.hours' => 'horas', 'sale.note' => 'Nota (opcional)', diff --git a/apps/app_seeds/lib/ui/settings_screen.dart b/apps/app_seeds/lib/ui/settings_screen.dart index b00b5ae..6a5ba16 100644 --- a/apps/app_seeds/lib/ui/settings_screen.dart +++ b/apps/app_seeds/lib/ui/settings_screen.dart @@ -50,6 +50,16 @@ class SettingsScreen extends StatelessWidget { selected: current == AppLocale.pt, onTap: () => pick(AppLocale.pt), ), + _LanguageTile( + label: t.settings.langFr, + selected: current == AppLocale.fr, + onTap: () => pick(AppLocale.fr), + ), + _LanguageTile( + label: t.settings.langDe, + selected: current == AppLocale.de, + onTap: () => pick(AppLocale.de), + ), ListTile( leading: const Icon(Icons.smartphone_outlined), title: Text(t.settings.systemLanguage), diff --git a/apps/app_seeds/test/ui/small_screen_overflow_test.dart b/apps/app_seeds/test/ui/small_screen_overflow_test.dart index 3f46a5c..744def7 100644 --- a/apps/app_seeds/test/ui/small_screen_overflow_test.dart +++ b/apps/app_seeds/test/ui/small_screen_overflow_test.dart @@ -40,7 +40,14 @@ void main() { // iPhone-SE-class logical viewport: narrow AND short, where clipping shows. const small = Size(320, 568); // The locales whose strings are longest — English rarely overflows first. - const longLocales = [AppLocale.es, AppLocale.pt, AppLocale.ast]; + // German is included for its long compound nouns; French for its verbosity. + const longLocales = [ + AppLocale.es, + AppLocale.pt, + AppLocale.ast, + AppLocale.de, + AppLocale.fr, + ]; setUpAll(() => PackageInfo.setMockInitialValues( appName: 'Tane',