refactor(branding): rename app Tanemaki → Tane
Public name is now Tane (種, "seed"); Tanemaki (種まき, "to scatter seeds") is kept only as etymology in the About screen and onboarding. App not yet distributed, so format tokens rename cleanly with no migration: backup extension .tanemaki→.tane, QR scheme tanemaki://→tane://, file prefixes tane-*. Website link and species-catalog User-Agent → tane.comunes.org. Android label capitalised to "Tane". Identity/crypto constants already use org.comunes.tane (derivation, HKDF backup, sync namespace, TANE1 recovery tag) — left untouched, so keys, backups and sync are unaffected. Tests updated; analyze + full suite green.
This commit is contained in:
parent
2c113cc17d
commit
a534c14983
34 changed files with 180 additions and 180 deletions
|
|
@ -6,7 +6,7 @@
|
|||
asks the user at runtime). -->
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
<application
|
||||
android:label="tane"
|
||||
android:label="Tane"
|
||||
android:name="${applicationName}"
|
||||
android:icon="@mipmap/ic_launcher">
|
||||
<activity
|
||||
|
|
|
|||
|
|
@ -263,7 +263,7 @@ class InventoryJsonCodec {
|
|||
throw const FormatException('Not a valid JSON file.');
|
||||
}
|
||||
if (root is! Map<String, dynamic>) {
|
||||
throw const FormatException('Not a Tanemaki inventory file.');
|
||||
throw const FormatException('Not a Tane inventory file.');
|
||||
}
|
||||
final version = root['formatVersion'];
|
||||
if (version is! int) {
|
||||
|
|
|
|||
|
|
@ -38,16 +38,16 @@ class SeedLabelData extends Equatable {
|
|||
];
|
||||
}
|
||||
|
||||
/// Encodes/decodes [SeedLabelData] as a compact, versioned `tanemaki://seed`
|
||||
/// Encodes/decodes [SeedLabelData] as a compact, versioned `tane://seed`
|
||||
/// URI — self-describing and parseable, so a future scan-to-import feature can
|
||||
/// read a label a keeper printed today. Unicode and RTL text are percent-encoded
|
||||
/// by [Uri], so any QR reader round-trips them safely.
|
||||
///
|
||||
/// Shape: `tanemaki://seed?v=<variety>&s=<scientific>&c=<common>&y=<year>&o=<origin>`
|
||||
/// Shape: `tane://seed?v=<variety>&s=<scientific>&c=<common>&y=<year>&o=<origin>`
|
||||
/// Absent fields are omitted, keeping the payload (and the QR) as small as the
|
||||
/// data allows.
|
||||
abstract final class SeedLabelCodec {
|
||||
static const _scheme = 'tanemaki';
|
||||
static const _scheme = 'tane';
|
||||
static const _host = 'seed';
|
||||
|
||||
static String encode(SeedLabelData data) {
|
||||
|
|
@ -65,7 +65,7 @@ abstract final class SeedLabelCodec {
|
|||
).toString();
|
||||
}
|
||||
|
||||
/// Parses a `tanemaki://seed` URI back to [SeedLabelData]. Returns null when
|
||||
/// Parses a `tane://seed` URI back to [SeedLabelData]. Returns null when
|
||||
/// [input] is not a well-formed seed label (wrong scheme/host, or no variety).
|
||||
static SeedLabelData? decode(String input) {
|
||||
final uri = Uri.tryParse(input.trim());
|
||||
|
|
|
|||
|
|
@ -40,10 +40,10 @@
|
|||
"nothing": "Nada anotao pa {month}."
|
||||
},
|
||||
"app": {
|
||||
"title": "Tanemaki"
|
||||
"title": "Tane"
|
||||
},
|
||||
"bootstrap": {
|
||||
"failed": "Tanemaki nun pudo aniciar",
|
||||
"failed": "Tane nun pudo aniciar",
|
||||
"retry": "Reintentar"
|
||||
},
|
||||
"common": {
|
||||
|
|
@ -90,7 +90,7 @@
|
|||
"langAst": "Asturianu",
|
||||
"about": "Tocante a",
|
||||
"aboutText": "Inventariu llocal y cifráu pa simiente tradicional. AGPL-3.0.",
|
||||
"aboutOpen": "Tocante a Tanemaki"
|
||||
"aboutOpen": "Tocante a Tane"
|
||||
},
|
||||
"backup": {
|
||||
"title": "Copia de seguranza",
|
||||
|
|
@ -114,24 +114,24 @@
|
|||
"cancelled": "Encaboxáu",
|
||||
"importDone": "Importáu: {added} nueves, {updated} anovaes",
|
||||
"importCsvDone": "Amestaes {count} entraes",
|
||||
"importFailed": "Esti ficheru nun se pudo lleer como una copia de Tanemaki",
|
||||
"importFailed": "Esti ficheru nun se pudo lleer como una copia de Tane",
|
||||
"failed": "Daqué salió mal",
|
||||
"recoveryTitle": "El to códigu de recuperación",
|
||||
"recoverySubtitle": "Imprémelu y guárdalu bien: abre les tos copies n'otru preséu",
|
||||
"recoveryIntro": "Esti códigu abre les tos copies guardaes y recupera'l to bancu en cualquier preséu. Guarda dos copies en papel en sitios seguros, como la to meyor simiente. Quien lu tenga pue lleer les tos copies, asina que nun lu compartas con naide.",
|
||||
"recoveryCopy": "Copiar",
|
||||
"recoverySave": "Guardar la fueya",
|
||||
"recoverySheetTitle": "Tanemaki — la to fueya de recuperación",
|
||||
"recoverySheetTitle": "Tane — la to fueya de recuperación",
|
||||
"recoveryPromptTitle": "Escribi'l to códigu de recuperación",
|
||||
"recoveryPromptBody": "Esta copia guardóse con otru códigu. Escribi'l códigu de la to fueya de recuperación p'abrilla.",
|
||||
"recoveryWrongCode": "Esi códigu nun abre esta copia"
|
||||
},
|
||||
"about": {
|
||||
"title": "Tocante a",
|
||||
"kanji": "種まき",
|
||||
"kanji": "種",
|
||||
"tagline": "Una app local-first y descentralizada pa remanar y compartir simiente y plantones tradicionales.",
|
||||
"intro": "Tanemaki (種まき, «semar / esparder simiente» en xaponés; nome curtiu Tane, 種 «grana») ayuda a persones y coleutivos a llevar un inventariu amable del so bancu de simiente, decidir qué ufierten y compartilo llocalmente — ensin un intermediariu central que pueda controlalo, censuralo o ser multáu por ello. L'oxetivu ye a la vez práuticu y políticu: sofitar les variedaes tradicionales de simiente y plantar cara al monopoliu simienteru.",
|
||||
"heritage": "El nome honra les vieyes tradiciones xaponeses d'ayuda mutua alredor del arroz — yui (trabayu comunitariu compartíu) y tanomoshi (fondos de reciprocidá) — qu'inspiraron el papel Plantare, la «moneda comunitaria pal intercambiu de simiente» (BAH-Semilleru, 2009, CC-BY-SA). Tanemaki ye'l Plantare dixital.",
|
||||
"intro": "Tane (種, «grana» en xaponés) ayuda a persones y coleutivos a llevar un inventariu amable del so bancu de simiente, decidir qué ufierten y compartilo llocalmente — ensin un intermediariu central que pueda controlalo, censuralo o ser multáu por ello. El so nome vien de tanemaki (種まき), «semar / esparder simiente». L'oxetivu ye a la vez práuticu y políticu: sofitar les variedaes tradicionales de simiente y plantar cara al monopoliu simienteru.",
|
||||
"heritage": "El nome honra les vieyes tradiciones xaponeses d'ayuda mutua alredor del arroz — yui (trabayu comunitariu compartíu) y tanomoshi (fondos de reciprocidá) — qu'inspiraron el papel Plantare, la «moneda comunitaria pal intercambiu de simiente» (BAH-Semilleru, 2009, CC-BY-SA). Tane ye'l Plantare dixital.",
|
||||
"version": "Versión",
|
||||
"license": "Llicencia",
|
||||
"licenseValue": "AGPL-3.0",
|
||||
|
|
@ -144,7 +144,7 @@
|
|||
"skip": "Saltar",
|
||||
"next": "Siguiente",
|
||||
"start": "Entamar",
|
||||
"menuEntry": "Cómo furrula Tanemaki",
|
||||
"menuEntry": "Cómo furrula Tane",
|
||||
"slides": {
|
||||
"welcome": {
|
||||
"title": "La grana que te traxo hasta equí",
|
||||
|
|
|
|||
|
|
@ -40,10 +40,10 @@
|
|||
"nothing": "Nothing noted for {month}."
|
||||
},
|
||||
"app": {
|
||||
"title": "Tanemaki"
|
||||
"title": "Tane"
|
||||
},
|
||||
"bootstrap": {
|
||||
"failed": "Tanemaki couldn't start",
|
||||
"failed": "Tane couldn't start",
|
||||
"retry": "Try again"
|
||||
},
|
||||
"common": {
|
||||
|
|
@ -91,7 +91,7 @@
|
|||
"langAst": "Asturianu",
|
||||
"about": "About",
|
||||
"aboutText": "Local-first, encrypted inventory for traditional seeds. AGPL-3.0.",
|
||||
"aboutOpen": "About Tanemaki"
|
||||
"aboutOpen": "About Tane"
|
||||
},
|
||||
"backup": {
|
||||
"title": "Backup & restore",
|
||||
|
|
@ -115,24 +115,24 @@
|
|||
"cancelled": "Cancelled",
|
||||
"importDone": "Imported: {added} new, {updated} updated",
|
||||
"importCsvDone": "Added {count} entries",
|
||||
"importFailed": "This file could not be read as a Tanemaki copy",
|
||||
"importFailed": "This file could not be read as a Tane copy",
|
||||
"failed": "Something went wrong",
|
||||
"recoveryTitle": "Your recovery code",
|
||||
"recoverySubtitle": "Print it and keep it safe — it opens your copies on a new device",
|
||||
"recoveryIntro": "This code opens your saved copies and brings your bank back on any device. Keep two paper copies in safe places, like your best seed. Anyone holding it can read your copies, so share it with no one.",
|
||||
"recoveryCopy": "Copy",
|
||||
"recoverySave": "Save the sheet",
|
||||
"recoverySheetTitle": "Tanemaki — your recovery sheet",
|
||||
"recoverySheetTitle": "Tane — your recovery sheet",
|
||||
"recoveryPromptTitle": "Enter your recovery code",
|
||||
"recoveryPromptBody": "This copy was saved with another code. Type the code from your recovery sheet to open it.",
|
||||
"recoveryWrongCode": "That code doesn't open this copy"
|
||||
},
|
||||
"about": {
|
||||
"title": "About",
|
||||
"kanji": "種まき",
|
||||
"kanji": "種",
|
||||
"tagline": "A local-first, decentralized app for managing and sharing traditional seeds and seedlings.",
|
||||
"intro": "Tanemaki (種まき, \"to sow / scatter seeds\" in Japanese; short name Tane, 種 \"seed\") helps people and collectives keep a friendly inventory of their seed bank, decide what they offer, and share it locally — without a central intermediary that could control, censor, or be fined for it. The goal is both practical and political: to support traditional seed varieties and push back against the seed monopoly.",
|
||||
"heritage": "The name honors the old Japanese mutual-aid traditions around rice — yui (shared community labour) and tanomoshi (reciprocity funds) — that inspired the paper Plantare, the \"community currency for seed exchange\" (BAH-Semillero, 2009, CC-BY-SA). Tanemaki is the digital Plantare.",
|
||||
"intro": "Tane (種, \"seed\" in Japanese) helps people and collectives keep a friendly inventory of their seed bank, decide what they offer, and share it locally — without a central intermediary that could control, censor, or be fined for it. Its name comes from tanemaki (種まき), \"to sow / scatter seeds\". The goal is both practical and political: to support traditional seed varieties and push back against the seed monopoly.",
|
||||
"heritage": "The name honors the old Japanese mutual-aid traditions around rice — yui (shared community labour) and tanomoshi (reciprocity funds) — that inspired the paper Plantare, the \"community currency for seed exchange\" (BAH-Semillero, 2009, CC-BY-SA). Tane is the digital Plantare.",
|
||||
"version": "Version",
|
||||
"license": "License",
|
||||
"licenseValue": "AGPL-3.0",
|
||||
|
|
@ -145,7 +145,7 @@
|
|||
"skip": "Skip",
|
||||
"next": "Next",
|
||||
"start": "Get started",
|
||||
"menuEntry": "How Tanemaki works",
|
||||
"menuEntry": "How Tane works",
|
||||
"slides": {
|
||||
"welcome": {
|
||||
"title": "The seed that brought you here",
|
||||
|
|
|
|||
|
|
@ -40,10 +40,10 @@
|
|||
"nothing": "Nada anotado para {month}."
|
||||
},
|
||||
"app": {
|
||||
"title": "Tanemaki"
|
||||
"title": "Tane"
|
||||
},
|
||||
"bootstrap": {
|
||||
"failed": "Tanemaki no pudo arrancar",
|
||||
"failed": "Tane no pudo arrancar",
|
||||
"retry": "Reintentar"
|
||||
},
|
||||
"common": {
|
||||
|
|
@ -90,7 +90,7 @@
|
|||
"langPt": "Português",
|
||||
"about": "Acerca de",
|
||||
"aboutText": "Inventario local y cifrado para semillas tradicionales. AGPL-3.0.",
|
||||
"aboutOpen": "Acerca de Tanemaki"
|
||||
"aboutOpen": "Acerca de Tane"
|
||||
},
|
||||
"backup": {
|
||||
"title": "Copia de seguridad",
|
||||
|
|
@ -114,24 +114,24 @@
|
|||
"cancelled": "Cancelado",
|
||||
"importDone": "Importado: {added} nuevas, {updated} actualizadas",
|
||||
"importCsvDone": "Añadidas {count} entradas",
|
||||
"importFailed": "Este fichero no se pudo leer como una copia de Tanemaki",
|
||||
"importFailed": "Este fichero no se pudo leer como una copia de Tane",
|
||||
"failed": "Algo ha salido mal",
|
||||
"recoveryTitle": "Tu código de recuperación",
|
||||
"recoverySubtitle": "Imprímelo y guárdalo bien: abre tus copias en otro dispositivo",
|
||||
"recoveryIntro": "Este código abre tus copias guardadas y recupera tu banco en cualquier dispositivo. Guarda dos copias en papel en sitios seguros, como tu mejor semilla. Quien lo tenga puede leer tus copias, así que no lo compartas con nadie.",
|
||||
"recoveryCopy": "Copiar",
|
||||
"recoverySave": "Guardar la hoja",
|
||||
"recoverySheetTitle": "Tanemaki — tu hoja de recuperación",
|
||||
"recoverySheetTitle": "Tane — tu hoja de recuperación",
|
||||
"recoveryPromptTitle": "Escribe tu código de recuperación",
|
||||
"recoveryPromptBody": "Esta copia se guardó con otro código. Escribe el código de tu hoja de recuperación para abrirla.",
|
||||
"recoveryWrongCode": "Ese código no abre esta copia"
|
||||
},
|
||||
"about": {
|
||||
"title": "Acerca de",
|
||||
"kanji": "種まき",
|
||||
"kanji": "種",
|
||||
"tagline": "Una app local-first y descentralizada para gestionar y compartir semillas y plantones tradicionales.",
|
||||
"intro": "Tanemaki (種まき, «sembrar / esparcir semillas» en japonés; nombre corto Tane, 種 «semilla») ayuda a personas y colectivos a llevar un inventario amable de su banco de semillas, decidir qué ofrecen y compartirlo localmente — sin un intermediario central que pueda controlarlo, censurarlo o ser multado por ello. El objetivo es a la vez práctico y político: apoyar las variedades tradicionales de semillas y plantar cara al monopolio semillero.",
|
||||
"heritage": "El nombre honra las viejas tradiciones japonesas de ayuda mutua en torno al arroz — yui (trabajo comunitario compartido) y tanomoshi (fondos de reciprocidad) — que inspiraron el papel Plantare, la «moneda comunitaria para el intercambio de semillas» (BAH-Semillero, 2009, CC-BY-SA). Tanemaki es el Plantare digital.",
|
||||
"intro": "Tane (種, «semilla» en japonés) ayuda a personas y colectivos a llevar un inventario amable de su banco de semillas, decidir qué ofrecen y compartirlo localmente — sin un intermediario central que pueda controlarlo, censurarlo o ser multado por ello. Su nombre viene de tanemaki (種まき), «sembrar / esparcir semillas». El objetivo es a la vez práctico y político: apoyar las variedades tradicionales de semillas y plantar cara al monopolio semillero.",
|
||||
"heritage": "El nombre honra las viejas tradiciones japonesas de ayuda mutua en torno al arroz — yui (trabajo comunitario compartido) y tanomoshi (fondos de reciprocidad) — que inspiraron el papel Plantare, la «moneda comunitaria para el intercambio de semillas» (BAH-Semillero, 2009, CC-BY-SA). Tane es el Plantare digital.",
|
||||
"version": "Versión",
|
||||
"license": "Licencia",
|
||||
"licenseValue": "AGPL-3.0",
|
||||
|
|
@ -144,7 +144,7 @@
|
|||
"skip": "Saltar",
|
||||
"next": "Siguiente",
|
||||
"start": "Empezar",
|
||||
"menuEntry": "Cómo funciona Tanemaki",
|
||||
"menuEntry": "Cómo funciona Tane",
|
||||
"slides": {
|
||||
"welcome": {
|
||||
"title": "La semilla que te trajo hasta aquí",
|
||||
|
|
|
|||
|
|
@ -40,10 +40,10 @@
|
|||
"nothing": "Nada anotado para {month}."
|
||||
},
|
||||
"app": {
|
||||
"title": "Tanemaki"
|
||||
"title": "Tane"
|
||||
},
|
||||
"bootstrap": {
|
||||
"failed": "O Tanemaki não conseguiu iniciar",
|
||||
"failed": "O Tane não conseguiu iniciar",
|
||||
"retry": "Tentar de novo"
|
||||
},
|
||||
"common": {
|
||||
|
|
@ -91,7 +91,7 @@
|
|||
"langAst": "Asturianu",
|
||||
"about": "Acerca de",
|
||||
"aboutText": "Inventário local e cifrado para sementes tradicionais. AGPL-3.0.",
|
||||
"aboutOpen": "Acerca do Tanemaki"
|
||||
"aboutOpen": "Acerca do Tane"
|
||||
},
|
||||
"backup": {
|
||||
"title": "Cópia de segurança",
|
||||
|
|
@ -115,24 +115,24 @@
|
|||
"cancelled": "Cancelado",
|
||||
"importDone": "Importado: {added} novas, {updated} atualizadas",
|
||||
"importCsvDone": "{count} entradas acrescentadas",
|
||||
"importFailed": "Este ficheiro não pôde ser lido como uma cópia do Tanemaki",
|
||||
"importFailed": "Este ficheiro não pôde ser lido como uma cópia do Tane",
|
||||
"failed": "Algo correu mal",
|
||||
"recoveryTitle": "O teu código de recuperação",
|
||||
"recoverySubtitle": "Imprime-o e guarda-o bem: abre as tuas cópias noutro aparelho",
|
||||
"recoveryIntro": "Este código abre as tuas cópias guardadas e recupera o teu banco em qualquer aparelho. Guarda duas cópias em papel em sítios seguros, como a tua melhor semente. Quem o tiver pode ler as tuas cópias, por isso não o partilhes com ninguém.",
|
||||
"recoveryCopy": "Copiar",
|
||||
"recoverySave": "Guardar a folha",
|
||||
"recoverySheetTitle": "Tanemaki — a tua folha de recuperação",
|
||||
"recoverySheetTitle": "Tane — a tua folha de recuperação",
|
||||
"recoveryPromptTitle": "Escreve o teu código de recuperação",
|
||||
"recoveryPromptBody": "Esta cópia foi guardada com outro código. Escreve o código da tua folha de recuperação para a abrir.",
|
||||
"recoveryWrongCode": "Esse código não abre esta cópia"
|
||||
},
|
||||
"about": {
|
||||
"title": "Acerca de",
|
||||
"kanji": "種まき",
|
||||
"kanji": "種",
|
||||
"tagline": "Uma aplicação local e descentralizada para gerir e partilhar sementes e plântulas tradicionais.",
|
||||
"intro": "O Tanemaki (種まき, \"semear / espalhar sementes\" em japonês; nome curto Tane, 種 \"semente\") ajuda pessoas e coletivos a manter um inventário amigável do seu banco de sementes, decidir o que oferecem e partilhá-lo localmente — sem um intermediário central que possa controlar, censurar ou ser multado por isso. O objetivo é prático e político ao mesmo tempo: apoiar as variedades tradicionais e fazer frente ao monopólio das sementes.",
|
||||
"heritage": "O nome honra as antigas tradições japonesas de ajuda mútua à volta do arroz — yui (trabalho comunitário partilhado) e tanomoshi (fundos de reciprocidade) — que inspiraram o Plantare em papel, a \"moeda comunitária de troca de sementes\" (BAH-Semillero, 2009, CC-BY-SA). O Tanemaki é o Plantare digital.",
|
||||
"intro": "O Tane (種, \"semente\" em japonês) ajuda pessoas e coletivos a manter um inventário amigável do seu banco de sementes, decidir o que oferecem e partilhá-lo localmente — sem um intermediário central que possa controlar, censurar ou ser multado por isso. O seu nome vem de tanemaki (種まき), \"semear / espalhar sementes\". O objetivo é prático e político ao mesmo tempo: apoiar as variedades tradicionais e fazer frente ao monopólio das sementes.",
|
||||
"heritage": "O nome honra as antigas tradições japonesas de ajuda mútua à volta do arroz — yui (trabalho comunitário partilhado) e tanomoshi (fundos de reciprocidade) — que inspiraram o Plantare em papel, a \"moeda comunitária de troca de sementes\" (BAH-Semillero, 2009, CC-BY-SA). O Tane é o Plantare digital.",
|
||||
"version": "Versão",
|
||||
"license": "Licença",
|
||||
"licenseValue": "AGPL-3.0",
|
||||
|
|
@ -145,7 +145,7 @@
|
|||
"skip": "Saltar",
|
||||
"next": "Seguinte",
|
||||
"start": "Começar",
|
||||
"menuEntry": "Como funciona o Tanemaki",
|
||||
"menuEntry": "Como funciona o Tane",
|
||||
"slides": {
|
||||
"welcome": {
|
||||
"title": "A semente que te trouxe até aqui",
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/// Locales: 4
|
||||
/// Strings: 2032 (508 per locale)
|
||||
///
|
||||
/// Built on 2026-07-12 at 00:47 UTC
|
||||
/// Built on 2026-07-12 at 10:59 UTC
|
||||
|
||||
// coverage:ignore-file
|
||||
// ignore_for_file: type=lint, unused_import
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ class _Translations$app$ast extends Translations$app$en {
|
|||
final TranslationsAst _root; // ignore: unused_field
|
||||
|
||||
// Translations
|
||||
@override String get title => 'Tanemaki';
|
||||
@override String get title => 'Tane';
|
||||
}
|
||||
|
||||
// Path: bootstrap
|
||||
|
|
@ -164,7 +164,7 @@ class _Translations$bootstrap$ast extends Translations$bootstrap$en {
|
|||
final TranslationsAst _root; // ignore: unused_field
|
||||
|
||||
// Translations
|
||||
@override String get failed => 'Tanemaki nun pudo aniciar';
|
||||
@override String get failed => 'Tane nun pudo aniciar';
|
||||
@override String get retry => 'Reintentar';
|
||||
}
|
||||
|
||||
|
|
@ -246,7 +246,7 @@ class _Translations$settings$ast extends Translations$settings$en {
|
|||
@override String get langAst => 'Asturianu';
|
||||
@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 Tanemaki';
|
||||
@override String get aboutOpen => 'Tocante a Tane';
|
||||
}
|
||||
|
||||
// Path: backup
|
||||
|
|
@ -277,14 +277,14 @@ class _Translations$backup$ast extends Translations$backup$en {
|
|||
@override String get cancelled => 'Encaboxáu';
|
||||
@override String importDone({required Object added, required Object updated}) => 'Importáu: ${added} nueves, ${updated} anovaes';
|
||||
@override String importCsvDone({required Object count}) => 'Amestaes ${count} entraes';
|
||||
@override String get importFailed => 'Esti ficheru nun se pudo lleer como una copia de Tanemaki';
|
||||
@override String get importFailed => 'Esti ficheru nun se pudo lleer como una copia de Tane';
|
||||
@override String get failed => 'Daqué salió mal';
|
||||
@override String get recoveryTitle => 'El to códigu de recuperación';
|
||||
@override String get recoverySubtitle => 'Imprémelu y guárdalu bien: abre les tos copies n\'otru preséu';
|
||||
@override String get recoveryIntro => 'Esti códigu abre les tos copies guardaes y recupera\'l to bancu en cualquier preséu. Guarda dos copies en papel en sitios seguros, como la to meyor simiente. Quien lu tenga pue lleer les tos copies, asina que nun lu compartas con naide.';
|
||||
@override String get recoveryCopy => 'Copiar';
|
||||
@override String get recoverySave => 'Guardar la fueya';
|
||||
@override String get recoverySheetTitle => 'Tanemaki — la to fueya de recuperación';
|
||||
@override String get recoverySheetTitle => 'Tane — la to fueya de recuperación';
|
||||
@override String get recoveryPromptTitle => 'Escribi\'l to códigu de recuperación';
|
||||
@override String get recoveryPromptBody => 'Esta copia guardóse con otru códigu. Escribi\'l códigu de la to fueya de recuperación p\'abrilla.';
|
||||
@override String get recoveryWrongCode => 'Esi códigu nun abre esta copia';
|
||||
|
|
@ -298,10 +298,10 @@ class _Translations$about$ast extends Translations$about$en {
|
|||
|
||||
// Translations
|
||||
@override String get title => 'Tocante a';
|
||||
@override String get kanji => '種まき';
|
||||
@override String get kanji => '種';
|
||||
@override String get tagline => 'Una app local-first y descentralizada pa remanar y compartir simiente y plantones tradicionales.';
|
||||
@override String get intro => 'Tanemaki (種まき, «semar / esparder simiente» en xaponés; nome curtiu Tane, 種 «grana») ayuda a persones y coleutivos a llevar un inventariu amable del so bancu de simiente, decidir qué ufierten y compartilo llocalmente — ensin un intermediariu central que pueda controlalo, censuralo o ser multáu por ello. L\'oxetivu ye a la vez práuticu y políticu: sofitar les variedaes tradicionales de simiente y plantar cara al monopoliu simienteru.';
|
||||
@override String get heritage => 'El nome honra les vieyes tradiciones xaponeses d\'ayuda mutua alredor del arroz — yui (trabayu comunitariu compartíu) y tanomoshi (fondos de reciprocidá) — qu\'inspiraron el papel Plantare, la «moneda comunitaria pal intercambiu de simiente» (BAH-Semilleru, 2009, CC-BY-SA). Tanemaki ye\'l Plantare dixital.';
|
||||
@override String get intro => 'Tane (種, «grana» en xaponés) ayuda a persones y coleutivos a llevar un inventariu amable del so bancu de simiente, decidir qué ufierten y compartilo llocalmente — ensin un intermediariu central que pueda controlalo, censuralo o ser multáu por ello. El so nome vien de tanemaki (種まき), «semar / esparder simiente». L\'oxetivu ye a la vez práuticu y políticu: sofitar les variedaes tradicionales de simiente y plantar cara al monopoliu simienteru.';
|
||||
@override String get heritage => 'El nome honra les vieyes tradiciones xaponeses d\'ayuda mutua alredor del arroz — yui (trabayu comunitariu compartíu) y tanomoshi (fondos de reciprocidá) — qu\'inspiraron el papel Plantare, la «moneda comunitaria pal intercambiu de simiente» (BAH-Semilleru, 2009, CC-BY-SA). Tane ye\'l Plantare dixital.';
|
||||
@override String get version => 'Versión';
|
||||
@override String get license => 'Llicencia';
|
||||
@override String get licenseValue => 'AGPL-3.0';
|
||||
|
|
@ -321,7 +321,7 @@ class _Translations$intro$ast extends Translations$intro$en {
|
|||
@override String get skip => 'Saltar';
|
||||
@override String get next => 'Siguiente';
|
||||
@override String get start => 'Entamar';
|
||||
@override String get menuEntry => 'Cómo furrula Tanemaki';
|
||||
@override String get menuEntry => 'Cómo furrula Tane';
|
||||
@override late final _Translations$intro$slides$ast slides = _Translations$intro$slides$ast._(_root);
|
||||
}
|
||||
|
||||
|
|
@ -1342,8 +1342,8 @@ extension on TranslationsAst {
|
|||
'calendar.filterChip' => 'Esti mes',
|
||||
'calendar.selfNote' => 'Lo qu\'anotasti nes tos variedaes.',
|
||||
'calendar.nothing' => ({required Object month}) => 'Nada anotao pa ${month}.',
|
||||
'app.title' => 'Tanemaki',
|
||||
'bootstrap.failed' => 'Tanemaki nun pudo aniciar',
|
||||
'app.title' => 'Tane',
|
||||
'bootstrap.failed' => 'Tane nun pudo aniciar',
|
||||
'bootstrap.retry' => 'Reintentar',
|
||||
'common.save' => 'Guardar',
|
||||
'common.cancel' => 'Encaboxar',
|
||||
|
|
@ -1380,7 +1380,7 @@ extension on TranslationsAst {
|
|||
'settings.langAst' => 'Asturianu',
|
||||
'settings.about' => 'Tocante a',
|
||||
'settings.aboutText' => 'Inventariu llocal y cifráu pa simiente tradicional. AGPL-3.0.',
|
||||
'settings.aboutOpen' => 'Tocante a Tanemaki',
|
||||
'settings.aboutOpen' => 'Tocante a Tane',
|
||||
'backup.title' => 'Copia de seguranza',
|
||||
'backup.autoBackupTitle' => 'Copies automátiques',
|
||||
'backup.autoBackupLast' => ({required Object date}) => 'Cabera copia guardada\'l ${date}',
|
||||
|
|
@ -1402,22 +1402,22 @@ extension on TranslationsAst {
|
|||
'backup.cancelled' => 'Encaboxáu',
|
||||
'backup.importDone' => ({required Object added, required Object updated}) => 'Importáu: ${added} nueves, ${updated} anovaes',
|
||||
'backup.importCsvDone' => ({required Object count}) => 'Amestaes ${count} entraes',
|
||||
'backup.importFailed' => 'Esti ficheru nun se pudo lleer como una copia de Tanemaki',
|
||||
'backup.importFailed' => 'Esti ficheru nun se pudo lleer como una copia de Tane',
|
||||
'backup.failed' => 'Daqué salió mal',
|
||||
'backup.recoveryTitle' => 'El to códigu de recuperación',
|
||||
'backup.recoverySubtitle' => 'Imprémelu y guárdalu bien: abre les tos copies n\'otru preséu',
|
||||
'backup.recoveryIntro' => 'Esti códigu abre les tos copies guardaes y recupera\'l to bancu en cualquier preséu. Guarda dos copies en papel en sitios seguros, como la to meyor simiente. Quien lu tenga pue lleer les tos copies, asina que nun lu compartas con naide.',
|
||||
'backup.recoveryCopy' => 'Copiar',
|
||||
'backup.recoverySave' => 'Guardar la fueya',
|
||||
'backup.recoverySheetTitle' => 'Tanemaki — la to fueya de recuperación',
|
||||
'backup.recoverySheetTitle' => 'Tane — la to fueya de recuperación',
|
||||
'backup.recoveryPromptTitle' => 'Escribi\'l to códigu de recuperación',
|
||||
'backup.recoveryPromptBody' => 'Esta copia guardóse con otru códigu. Escribi\'l códigu de la to fueya de recuperación p\'abrilla.',
|
||||
'backup.recoveryWrongCode' => 'Esi códigu nun abre esta copia',
|
||||
'about.title' => 'Tocante a',
|
||||
'about.kanji' => '種まき',
|
||||
'about.kanji' => '種',
|
||||
'about.tagline' => 'Una app local-first y descentralizada pa remanar y compartir simiente y plantones tradicionales.',
|
||||
'about.intro' => 'Tanemaki (種まき, «semar / esparder simiente» en xaponés; nome curtiu Tane, 種 «grana») ayuda a persones y coleutivos a llevar un inventariu amable del so bancu de simiente, decidir qué ufierten y compartilo llocalmente — ensin un intermediariu central que pueda controlalo, censuralo o ser multáu por ello. L\'oxetivu ye a la vez práuticu y políticu: sofitar les variedaes tradicionales de simiente y plantar cara al monopoliu simienteru.',
|
||||
'about.heritage' => 'El nome honra les vieyes tradiciones xaponeses d\'ayuda mutua alredor del arroz — yui (trabayu comunitariu compartíu) y tanomoshi (fondos de reciprocidá) — qu\'inspiraron el papel Plantare, la «moneda comunitaria pal intercambiu de simiente» (BAH-Semilleru, 2009, CC-BY-SA). Tanemaki ye\'l Plantare dixital.',
|
||||
'about.intro' => 'Tane (種, «grana» en xaponés) ayuda a persones y coleutivos a llevar un inventariu amable del so bancu de simiente, decidir qué ufierten y compartilo llocalmente — ensin un intermediariu central que pueda controlalo, censuralo o ser multáu por ello. El so nome vien de tanemaki (種まき), «semar / esparder simiente». L\'oxetivu ye a la vez práuticu y políticu: sofitar les variedaes tradicionales de simiente y plantar cara al monopoliu simienteru.',
|
||||
'about.heritage' => 'El nome honra les vieyes tradiciones xaponeses d\'ayuda mutua alredor del arroz — yui (trabayu comunitariu compartíu) y tanomoshi (fondos de reciprocidá) — qu\'inspiraron el papel Plantare, la «moneda comunitaria pal intercambiu de simiente» (BAH-Semilleru, 2009, CC-BY-SA). Tane ye\'l Plantare dixital.',
|
||||
'about.version' => 'Versión',
|
||||
'about.license' => 'Llicencia',
|
||||
'about.licenseValue' => 'AGPL-3.0',
|
||||
|
|
@ -1428,7 +1428,7 @@ extension on TranslationsAst {
|
|||
'intro.skip' => 'Saltar',
|
||||
'intro.next' => 'Siguiente',
|
||||
'intro.start' => 'Entamar',
|
||||
'intro.menuEntry' => 'Cómo furrula Tanemaki',
|
||||
'intro.menuEntry' => 'Cómo furrula Tane',
|
||||
'intro.slides.welcome.title' => 'La grana que te traxo hasta equí',
|
||||
'intro.slides.welcome.body' => 'Cada simiente tradicional ye una carta escrita por miles de xeneraciones, que pasó de mano en mano. Somos lo que somos gracies a esi intercambiu.',
|
||||
'intro.slides.inventory.title' => 'El to bancu de simiente, nel bolsu',
|
||||
|
|
|
|||
|
|
@ -224,8 +224,8 @@ class Translations$app$en {
|
|||
|
||||
// Translations
|
||||
|
||||
/// en: 'Tanemaki'
|
||||
String get title => 'Tanemaki';
|
||||
/// en: 'Tane'
|
||||
String get title => 'Tane';
|
||||
}
|
||||
|
||||
// Path: bootstrap
|
||||
|
|
@ -236,8 +236,8 @@ class Translations$bootstrap$en {
|
|||
|
||||
// Translations
|
||||
|
||||
/// en: 'Tanemaki couldn't start'
|
||||
String get failed => 'Tanemaki couldn\'t start';
|
||||
/// en: 'Tane couldn't start'
|
||||
String get failed => 'Tane couldn\'t start';
|
||||
|
||||
/// en: 'Try again'
|
||||
String get retry => 'Try again';
|
||||
|
|
@ -395,8 +395,8 @@ class Translations$settings$en {
|
|||
/// en: 'Local-first, encrypted inventory for traditional seeds. AGPL-3.0.'
|
||||
String get aboutText => 'Local-first, encrypted inventory for traditional seeds. AGPL-3.0.';
|
||||
|
||||
/// en: 'About Tanemaki'
|
||||
String get aboutOpen => 'About Tanemaki';
|
||||
/// en: 'About Tane'
|
||||
String get aboutOpen => 'About Tane';
|
||||
}
|
||||
|
||||
// Path: backup
|
||||
|
|
@ -470,8 +470,8 @@ class Translations$backup$en {
|
|||
/// en: 'Added {count} entries'
|
||||
String importCsvDone({required Object count}) => 'Added ${count} entries';
|
||||
|
||||
/// en: 'This file could not be read as a Tanemaki copy'
|
||||
String get importFailed => 'This file could not be read as a Tanemaki copy';
|
||||
/// en: 'This file could not be read as a Tane copy'
|
||||
String get importFailed => 'This file could not be read as a Tane copy';
|
||||
|
||||
/// en: 'Something went wrong'
|
||||
String get failed => 'Something went wrong';
|
||||
|
|
@ -491,8 +491,8 @@ class Translations$backup$en {
|
|||
/// en: 'Save the sheet'
|
||||
String get recoverySave => 'Save the sheet';
|
||||
|
||||
/// en: 'Tanemaki — your recovery sheet'
|
||||
String get recoverySheetTitle => 'Tanemaki — your recovery sheet';
|
||||
/// en: 'Tane — your recovery sheet'
|
||||
String get recoverySheetTitle => 'Tane — your recovery sheet';
|
||||
|
||||
/// en: 'Enter your recovery code'
|
||||
String get recoveryPromptTitle => 'Enter your recovery code';
|
||||
|
|
@ -515,17 +515,17 @@ class Translations$about$en {
|
|||
/// en: 'About'
|
||||
String get title => 'About';
|
||||
|
||||
/// en: '種まき'
|
||||
String get kanji => '種まき';
|
||||
/// en: '種'
|
||||
String get kanji => '種';
|
||||
|
||||
/// en: 'A local-first, decentralized app for managing and sharing traditional seeds and seedlings.'
|
||||
String get tagline => 'A local-first, decentralized app for managing and sharing traditional seeds and seedlings.';
|
||||
|
||||
/// en: 'Tanemaki (種まき, "to sow / scatter seeds" in Japanese; short name Tane, 種 "seed") helps people and collectives keep a friendly inventory of their seed bank, decide what they offer, and share it locally — without a central intermediary that could control, censor, or be fined for it. The goal is both practical and political: to support traditional seed varieties and push back against the seed monopoly.'
|
||||
String get intro => 'Tanemaki (種まき, "to sow / scatter seeds" in Japanese; short name Tane, 種 "seed") helps people and collectives keep a friendly inventory of their seed bank, decide what they offer, and share it locally — without a central intermediary that could control, censor, or be fined for it. The goal is both practical and political: to support traditional seed varieties and push back against the seed monopoly.';
|
||||
/// en: 'Tane (種, "seed" in Japanese) helps people and collectives keep a friendly inventory of their seed bank, decide what they offer, and share it locally — without a central intermediary that could control, censor, or be fined for it. Its name comes from tanemaki (種まき), "to sow / scatter seeds". The goal is both practical and political: to support traditional seed varieties and push back against the seed monopoly.'
|
||||
String get intro => 'Tane (種, "seed" in Japanese) helps people and collectives keep a friendly inventory of their seed bank, decide what they offer, and share it locally — without a central intermediary that could control, censor, or be fined for it. Its name comes from tanemaki (種まき), "to sow / scatter seeds". The goal is both practical and political: to support traditional seed varieties and push back against the seed monopoly.';
|
||||
|
||||
/// en: 'The name honors the old Japanese mutual-aid traditions around rice — yui (shared community labour) and tanomoshi (reciprocity funds) — that inspired the paper Plantare, the "community currency for seed exchange" (BAH-Semillero, 2009, CC-BY-SA). Tanemaki is the digital Plantare.'
|
||||
String get heritage => 'The name honors the old Japanese mutual-aid traditions around rice — yui (shared community labour) and tanomoshi (reciprocity funds) — that inspired the paper Plantare, the "community currency for seed exchange" (BAH-Semillero, 2009, CC-BY-SA). Tanemaki is the digital Plantare.';
|
||||
/// en: 'The name honors the old Japanese mutual-aid traditions around rice — yui (shared community labour) and tanomoshi (reciprocity funds) — that inspired the paper Plantare, the "community currency for seed exchange" (BAH-Semillero, 2009, CC-BY-SA). Tane is the digital Plantare.'
|
||||
String get heritage => 'The name honors the old Japanese mutual-aid traditions around rice — yui (shared community labour) and tanomoshi (reciprocity funds) — that inspired the paper Plantare, the "community currency for seed exchange" (BAH-Semillero, 2009, CC-BY-SA). Tane is the digital Plantare.';
|
||||
|
||||
/// en: 'Version'
|
||||
String get version => 'Version';
|
||||
|
|
@ -566,8 +566,8 @@ class Translations$intro$en {
|
|||
/// en: 'Get started'
|
||||
String get start => 'Get started';
|
||||
|
||||
/// en: 'How Tanemaki works'
|
||||
String get menuEntry => 'How Tanemaki works';
|
||||
/// en: 'How Tane works'
|
||||
String get menuEntry => 'How Tane works';
|
||||
|
||||
late final Translations$intro$slides$en slides = Translations$intro$slides$en.internal(_root);
|
||||
}
|
||||
|
|
@ -2345,8 +2345,8 @@ extension on Translations {
|
|||
'calendar.filterChip' => 'This month',
|
||||
'calendar.selfNote' => 'What you\'ve noted in your varieties.',
|
||||
'calendar.nothing' => ({required Object month}) => 'Nothing noted for ${month}.',
|
||||
'app.title' => 'Tanemaki',
|
||||
'bootstrap.failed' => 'Tanemaki couldn\'t start',
|
||||
'app.title' => 'Tane',
|
||||
'bootstrap.failed' => 'Tane couldn\'t start',
|
||||
'bootstrap.retry' => 'Try again',
|
||||
'common.save' => 'Save',
|
||||
'common.cancel' => 'Cancel',
|
||||
|
|
@ -2384,7 +2384,7 @@ extension on Translations {
|
|||
'settings.langAst' => 'Asturianu',
|
||||
'settings.about' => 'About',
|
||||
'settings.aboutText' => 'Local-first, encrypted inventory for traditional seeds. AGPL-3.0.',
|
||||
'settings.aboutOpen' => 'About Tanemaki',
|
||||
'settings.aboutOpen' => 'About Tane',
|
||||
'backup.title' => 'Backup & restore',
|
||||
'backup.autoBackupTitle' => 'Automatic backups',
|
||||
'backup.autoBackupLast' => ({required Object date}) => 'Last copy saved ${date}',
|
||||
|
|
@ -2406,22 +2406,22 @@ extension on Translations {
|
|||
'backup.cancelled' => 'Cancelled',
|
||||
'backup.importDone' => ({required Object added, required Object updated}) => 'Imported: ${added} new, ${updated} updated',
|
||||
'backup.importCsvDone' => ({required Object count}) => 'Added ${count} entries',
|
||||
'backup.importFailed' => 'This file could not be read as a Tanemaki copy',
|
||||
'backup.importFailed' => 'This file could not be read as a Tane copy',
|
||||
'backup.failed' => 'Something went wrong',
|
||||
'backup.recoveryTitle' => 'Your recovery code',
|
||||
'backup.recoverySubtitle' => 'Print it and keep it safe — it opens your copies on a new device',
|
||||
'backup.recoveryIntro' => 'This code opens your saved copies and brings your bank back on any device. Keep two paper copies in safe places, like your best seed. Anyone holding it can read your copies, so share it with no one.',
|
||||
'backup.recoveryCopy' => 'Copy',
|
||||
'backup.recoverySave' => 'Save the sheet',
|
||||
'backup.recoverySheetTitle' => 'Tanemaki — your recovery sheet',
|
||||
'backup.recoverySheetTitle' => 'Tane — your recovery sheet',
|
||||
'backup.recoveryPromptTitle' => 'Enter your recovery code',
|
||||
'backup.recoveryPromptBody' => 'This copy was saved with another code. Type the code from your recovery sheet to open it.',
|
||||
'backup.recoveryWrongCode' => 'That code doesn\'t open this copy',
|
||||
'about.title' => 'About',
|
||||
'about.kanji' => '種まき',
|
||||
'about.kanji' => '種',
|
||||
'about.tagline' => 'A local-first, decentralized app for managing and sharing traditional seeds and seedlings.',
|
||||
'about.intro' => 'Tanemaki (種まき, "to sow / scatter seeds" in Japanese; short name Tane, 種 "seed") helps people and collectives keep a friendly inventory of their seed bank, decide what they offer, and share it locally — without a central intermediary that could control, censor, or be fined for it. The goal is both practical and political: to support traditional seed varieties and push back against the seed monopoly.',
|
||||
'about.heritage' => 'The name honors the old Japanese mutual-aid traditions around rice — yui (shared community labour) and tanomoshi (reciprocity funds) — that inspired the paper Plantare, the "community currency for seed exchange" (BAH-Semillero, 2009, CC-BY-SA). Tanemaki is the digital Plantare.',
|
||||
'about.intro' => 'Tane (種, "seed" in Japanese) helps people and collectives keep a friendly inventory of their seed bank, decide what they offer, and share it locally — without a central intermediary that could control, censor, or be fined for it. Its name comes from tanemaki (種まき), "to sow / scatter seeds". The goal is both practical and political: to support traditional seed varieties and push back against the seed monopoly.',
|
||||
'about.heritage' => 'The name honors the old Japanese mutual-aid traditions around rice — yui (shared community labour) and tanomoshi (reciprocity funds) — that inspired the paper Plantare, the "community currency for seed exchange" (BAH-Semillero, 2009, CC-BY-SA). Tane is the digital Plantare.',
|
||||
'about.version' => 'Version',
|
||||
'about.license' => 'License',
|
||||
'about.licenseValue' => 'AGPL-3.0',
|
||||
|
|
@ -2432,7 +2432,7 @@ extension on Translations {
|
|||
'intro.skip' => 'Skip',
|
||||
'intro.next' => 'Next',
|
||||
'intro.start' => 'Get started',
|
||||
'intro.menuEntry' => 'How Tanemaki works',
|
||||
'intro.menuEntry' => 'How Tane works',
|
||||
'intro.slides.welcome.title' => 'The seed that brought you here',
|
||||
'intro.slides.welcome.body' => 'Every traditional seed is a letter written by thousands of generations, passed from hand to hand. We are what we are thanks to that sharing.',
|
||||
'intro.slides.inventory.title' => 'Your seed bank, in your pocket',
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ class _Translations$app$es extends Translations$app$en {
|
|||
final TranslationsEs _root; // ignore: unused_field
|
||||
|
||||
// Translations
|
||||
@override String get title => 'Tanemaki';
|
||||
@override String get title => 'Tane';
|
||||
}
|
||||
|
||||
// Path: bootstrap
|
||||
|
|
@ -164,7 +164,7 @@ class _Translations$bootstrap$es extends Translations$bootstrap$en {
|
|||
final TranslationsEs _root; // ignore: unused_field
|
||||
|
||||
// Translations
|
||||
@override String get failed => 'Tanemaki no pudo arrancar';
|
||||
@override String get failed => 'Tane no pudo arrancar';
|
||||
@override String get retry => 'Reintentar';
|
||||
}
|
||||
|
||||
|
|
@ -246,7 +246,7 @@ class _Translations$settings$es extends Translations$settings$en {
|
|||
@override String get langPt => 'Português';
|
||||
@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 Tanemaki';
|
||||
@override String get aboutOpen => 'Acerca de Tane';
|
||||
}
|
||||
|
||||
// Path: backup
|
||||
|
|
@ -277,14 +277,14 @@ class _Translations$backup$es extends Translations$backup$en {
|
|||
@override String get cancelled => 'Cancelado';
|
||||
@override String importDone({required Object added, required Object updated}) => 'Importado: ${added} nuevas, ${updated} actualizadas';
|
||||
@override String importCsvDone({required Object count}) => 'Añadidas ${count} entradas';
|
||||
@override String get importFailed => 'Este fichero no se pudo leer como una copia de Tanemaki';
|
||||
@override String get importFailed => 'Este fichero no se pudo leer como una copia de Tane';
|
||||
@override String get failed => 'Algo ha salido mal';
|
||||
@override String get recoveryTitle => 'Tu código de recuperación';
|
||||
@override String get recoverySubtitle => 'Imprímelo y guárdalo bien: abre tus copias en otro dispositivo';
|
||||
@override String get recoveryIntro => 'Este código abre tus copias guardadas y recupera tu banco en cualquier dispositivo. Guarda dos copias en papel en sitios seguros, como tu mejor semilla. Quien lo tenga puede leer tus copias, así que no lo compartas con nadie.';
|
||||
@override String get recoveryCopy => 'Copiar';
|
||||
@override String get recoverySave => 'Guardar la hoja';
|
||||
@override String get recoverySheetTitle => 'Tanemaki — tu hoja de recuperación';
|
||||
@override String get recoverySheetTitle => 'Tane — tu hoja de recuperación';
|
||||
@override String get recoveryPromptTitle => 'Escribe tu código de recuperación';
|
||||
@override String get recoveryPromptBody => 'Esta copia se guardó con otro código. Escribe el código de tu hoja de recuperación para abrirla.';
|
||||
@override String get recoveryWrongCode => 'Ese código no abre esta copia';
|
||||
|
|
@ -298,10 +298,10 @@ class _Translations$about$es extends Translations$about$en {
|
|||
|
||||
// Translations
|
||||
@override String get title => 'Acerca de';
|
||||
@override String get kanji => '種まき';
|
||||
@override String get kanji => '種';
|
||||
@override String get tagline => 'Una app local-first y descentralizada para gestionar y compartir semillas y plantones tradicionales.';
|
||||
@override String get intro => 'Tanemaki (種まき, «sembrar / esparcir semillas» en japonés; nombre corto Tane, 種 «semilla») ayuda a personas y colectivos a llevar un inventario amable de su banco de semillas, decidir qué ofrecen y compartirlo localmente — sin un intermediario central que pueda controlarlo, censurarlo o ser multado por ello. El objetivo es a la vez práctico y político: apoyar las variedades tradicionales de semillas y plantar cara al monopolio semillero.';
|
||||
@override String get heritage => 'El nombre honra las viejas tradiciones japonesas de ayuda mutua en torno al arroz — yui (trabajo comunitario compartido) y tanomoshi (fondos de reciprocidad) — que inspiraron el papel Plantare, la «moneda comunitaria para el intercambio de semillas» (BAH-Semillero, 2009, CC-BY-SA). Tanemaki es el Plantare digital.';
|
||||
@override String get intro => 'Tane (種, «semilla» en japonés) ayuda a personas y colectivos a llevar un inventario amable de su banco de semillas, decidir qué ofrecen y compartirlo localmente — sin un intermediario central que pueda controlarlo, censurarlo o ser multado por ello. Su nombre viene de tanemaki (種まき), «sembrar / esparcir semillas». El objetivo es a la vez práctico y político: apoyar las variedades tradicionales de semillas y plantar cara al monopolio semillero.';
|
||||
@override String get heritage => 'El nombre honra las viejas tradiciones japonesas de ayuda mutua en torno al arroz — yui (trabajo comunitario compartido) y tanomoshi (fondos de reciprocidad) — que inspiraron el papel Plantare, la «moneda comunitaria para el intercambio de semillas» (BAH-Semillero, 2009, CC-BY-SA). Tane es el Plantare digital.';
|
||||
@override String get version => 'Versión';
|
||||
@override String get license => 'Licencia';
|
||||
@override String get licenseValue => 'AGPL-3.0';
|
||||
|
|
@ -321,7 +321,7 @@ class _Translations$intro$es extends Translations$intro$en {
|
|||
@override String get skip => 'Saltar';
|
||||
@override String get next => 'Siguiente';
|
||||
@override String get start => 'Empezar';
|
||||
@override String get menuEntry => 'Cómo funciona Tanemaki';
|
||||
@override String get menuEntry => 'Cómo funciona Tane';
|
||||
@override late final _Translations$intro$slides$es slides = _Translations$intro$slides$es._(_root);
|
||||
}
|
||||
|
||||
|
|
@ -1344,8 +1344,8 @@ extension on TranslationsEs {
|
|||
'calendar.filterChip' => 'Este mes',
|
||||
'calendar.selfNote' => 'Lo que has anotado en tus variedades.',
|
||||
'calendar.nothing' => ({required Object month}) => 'Nada anotado para ${month}.',
|
||||
'app.title' => 'Tanemaki',
|
||||
'bootstrap.failed' => 'Tanemaki no pudo arrancar',
|
||||
'app.title' => 'Tane',
|
||||
'bootstrap.failed' => 'Tane no pudo arrancar',
|
||||
'bootstrap.retry' => 'Reintentar',
|
||||
'common.save' => 'Guardar',
|
||||
'common.cancel' => 'Cancelar',
|
||||
|
|
@ -1382,7 +1382,7 @@ extension on TranslationsEs {
|
|||
'settings.langPt' => 'Português',
|
||||
'settings.about' => 'Acerca de',
|
||||
'settings.aboutText' => 'Inventario local y cifrado para semillas tradicionales. AGPL-3.0.',
|
||||
'settings.aboutOpen' => 'Acerca de Tanemaki',
|
||||
'settings.aboutOpen' => 'Acerca de Tane',
|
||||
'backup.title' => 'Copia de seguridad',
|
||||
'backup.autoBackupTitle' => 'Copias automáticas',
|
||||
'backup.autoBackupLast' => ({required Object date}) => 'Última copia guardada el ${date}',
|
||||
|
|
@ -1404,22 +1404,22 @@ extension on TranslationsEs {
|
|||
'backup.cancelled' => 'Cancelado',
|
||||
'backup.importDone' => ({required Object added, required Object updated}) => 'Importado: ${added} nuevas, ${updated} actualizadas',
|
||||
'backup.importCsvDone' => ({required Object count}) => 'Añadidas ${count} entradas',
|
||||
'backup.importFailed' => 'Este fichero no se pudo leer como una copia de Tanemaki',
|
||||
'backup.importFailed' => 'Este fichero no se pudo leer como una copia de Tane',
|
||||
'backup.failed' => 'Algo ha salido mal',
|
||||
'backup.recoveryTitle' => 'Tu código de recuperación',
|
||||
'backup.recoverySubtitle' => 'Imprímelo y guárdalo bien: abre tus copias en otro dispositivo',
|
||||
'backup.recoveryIntro' => 'Este código abre tus copias guardadas y recupera tu banco en cualquier dispositivo. Guarda dos copias en papel en sitios seguros, como tu mejor semilla. Quien lo tenga puede leer tus copias, así que no lo compartas con nadie.',
|
||||
'backup.recoveryCopy' => 'Copiar',
|
||||
'backup.recoverySave' => 'Guardar la hoja',
|
||||
'backup.recoverySheetTitle' => 'Tanemaki — tu hoja de recuperación',
|
||||
'backup.recoverySheetTitle' => 'Tane — tu hoja de recuperación',
|
||||
'backup.recoveryPromptTitle' => 'Escribe tu código de recuperación',
|
||||
'backup.recoveryPromptBody' => 'Esta copia se guardó con otro código. Escribe el código de tu hoja de recuperación para abrirla.',
|
||||
'backup.recoveryWrongCode' => 'Ese código no abre esta copia',
|
||||
'about.title' => 'Acerca de',
|
||||
'about.kanji' => '種まき',
|
||||
'about.kanji' => '種',
|
||||
'about.tagline' => 'Una app local-first y descentralizada para gestionar y compartir semillas y plantones tradicionales.',
|
||||
'about.intro' => 'Tanemaki (種まき, «sembrar / esparcir semillas» en japonés; nombre corto Tane, 種 «semilla») ayuda a personas y colectivos a llevar un inventario amable de su banco de semillas, decidir qué ofrecen y compartirlo localmente — sin un intermediario central que pueda controlarlo, censurarlo o ser multado por ello. El objetivo es a la vez práctico y político: apoyar las variedades tradicionales de semillas y plantar cara al monopolio semillero.',
|
||||
'about.heritage' => 'El nombre honra las viejas tradiciones japonesas de ayuda mutua en torno al arroz — yui (trabajo comunitario compartido) y tanomoshi (fondos de reciprocidad) — que inspiraron el papel Plantare, la «moneda comunitaria para el intercambio de semillas» (BAH-Semillero, 2009, CC-BY-SA). Tanemaki es el Plantare digital.',
|
||||
'about.intro' => 'Tane (種, «semilla» en japonés) ayuda a personas y colectivos a llevar un inventario amable de su banco de semillas, decidir qué ofrecen y compartirlo localmente — sin un intermediario central que pueda controlarlo, censurarlo o ser multado por ello. Su nombre viene de tanemaki (種まき), «sembrar / esparcir semillas». El objetivo es a la vez práctico y político: apoyar las variedades tradicionales de semillas y plantar cara al monopolio semillero.',
|
||||
'about.heritage' => 'El nombre honra las viejas tradiciones japonesas de ayuda mutua en torno al arroz — yui (trabajo comunitario compartido) y tanomoshi (fondos de reciprocidad) — que inspiraron el papel Plantare, la «moneda comunitaria para el intercambio de semillas» (BAH-Semillero, 2009, CC-BY-SA). Tane es el Plantare digital.',
|
||||
'about.version' => 'Versión',
|
||||
'about.license' => 'Licencia',
|
||||
'about.licenseValue' => 'AGPL-3.0',
|
||||
|
|
@ -1430,7 +1430,7 @@ extension on TranslationsEs {
|
|||
'intro.skip' => 'Saltar',
|
||||
'intro.next' => 'Siguiente',
|
||||
'intro.start' => 'Empezar',
|
||||
'intro.menuEntry' => 'Cómo funciona Tanemaki',
|
||||
'intro.menuEntry' => 'Cómo funciona Tane',
|
||||
'intro.slides.welcome.title' => 'La semilla que te trajo hasta aquí',
|
||||
'intro.slides.welcome.body' => 'Cada semilla tradicional es una carta escrita por miles de generaciones, que pasó de mano en mano. Somos lo que somos gracias a ese intercambio.',
|
||||
'intro.slides.inventory.title' => 'Tu banco de semillas, en el bolsillo',
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ class _Translations$app$pt extends Translations$app$en {
|
|||
final TranslationsPt _root; // ignore: unused_field
|
||||
|
||||
// Translations
|
||||
@override String get title => 'Tanemaki';
|
||||
@override String get title => 'Tane';
|
||||
}
|
||||
|
||||
// Path: bootstrap
|
||||
|
|
@ -164,7 +164,7 @@ class _Translations$bootstrap$pt extends Translations$bootstrap$en {
|
|||
final TranslationsPt _root; // ignore: unused_field
|
||||
|
||||
// Translations
|
||||
@override String get failed => 'O Tanemaki não conseguiu iniciar';
|
||||
@override String get failed => 'O Tane não conseguiu iniciar';
|
||||
@override String get retry => 'Tentar de novo';
|
||||
}
|
||||
|
||||
|
|
@ -247,7 +247,7 @@ class _Translations$settings$pt extends Translations$settings$en {
|
|||
@override String get langAst => 'Asturianu';
|
||||
@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 Tanemaki';
|
||||
@override String get aboutOpen => 'Acerca do Tane';
|
||||
}
|
||||
|
||||
// Path: backup
|
||||
|
|
@ -278,14 +278,14 @@ class _Translations$backup$pt extends Translations$backup$en {
|
|||
@override String get cancelled => 'Cancelado';
|
||||
@override String importDone({required Object added, required Object updated}) => 'Importado: ${added} novas, ${updated} atualizadas';
|
||||
@override String importCsvDone({required Object count}) => '${count} entradas acrescentadas';
|
||||
@override String get importFailed => 'Este ficheiro não pôde ser lido como uma cópia do Tanemaki';
|
||||
@override String get importFailed => 'Este ficheiro não pôde ser lido como uma cópia do Tane';
|
||||
@override String get failed => 'Algo correu mal';
|
||||
@override String get recoveryTitle => 'O teu código de recuperação';
|
||||
@override String get recoverySubtitle => 'Imprime-o e guarda-o bem: abre as tuas cópias noutro aparelho';
|
||||
@override String get recoveryIntro => 'Este código abre as tuas cópias guardadas e recupera o teu banco em qualquer aparelho. Guarda duas cópias em papel em sítios seguros, como a tua melhor semente. Quem o tiver pode ler as tuas cópias, por isso não o partilhes com ninguém.';
|
||||
@override String get recoveryCopy => 'Copiar';
|
||||
@override String get recoverySave => 'Guardar a folha';
|
||||
@override String get recoverySheetTitle => 'Tanemaki — a tua folha de recuperação';
|
||||
@override String get recoverySheetTitle => 'Tane — a tua folha de recuperação';
|
||||
@override String get recoveryPromptTitle => 'Escreve o teu código de recuperação';
|
||||
@override String get recoveryPromptBody => 'Esta cópia foi guardada com outro código. Escreve o código da tua folha de recuperação para a abrir.';
|
||||
@override String get recoveryWrongCode => 'Esse código não abre esta cópia';
|
||||
|
|
@ -299,10 +299,10 @@ class _Translations$about$pt extends Translations$about$en {
|
|||
|
||||
// Translations
|
||||
@override String get title => 'Acerca de';
|
||||
@override String get kanji => '種まき';
|
||||
@override String get kanji => '種';
|
||||
@override String get tagline => 'Uma aplicação local e descentralizada para gerir e partilhar sementes e plântulas tradicionais.';
|
||||
@override String get intro => 'O Tanemaki (種まき, "semear / espalhar sementes" em japonês; nome curto Tane, 種 "semente") ajuda pessoas e coletivos a manter um inventário amigável do seu banco de sementes, decidir o que oferecem e partilhá-lo localmente — sem um intermediário central que possa controlar, censurar ou ser multado por isso. O objetivo é prático e político ao mesmo tempo: apoiar as variedades tradicionais e fazer frente ao monopólio das sementes.';
|
||||
@override String get heritage => 'O nome honra as antigas tradições japonesas de ajuda mútua à volta do arroz — yui (trabalho comunitário partilhado) e tanomoshi (fundos de reciprocidade) — que inspiraram o Plantare em papel, a "moeda comunitária de troca de sementes" (BAH-Semillero, 2009, CC-BY-SA). O Tanemaki é o Plantare digital.';
|
||||
@override String get intro => 'O Tane (種, "semente" em japonês) ajuda pessoas e coletivos a manter um inventário amigável do seu banco de sementes, decidir o que oferecem e partilhá-lo localmente — sem um intermediário central que possa controlar, censurar ou ser multado por isso. O seu nome vem de tanemaki (種まき), "semear / espalhar sementes". O objetivo é prático e político ao mesmo tempo: apoiar as variedades tradicionais e fazer frente ao monopólio das sementes.';
|
||||
@override String get heritage => 'O nome honra as antigas tradições japonesas de ajuda mútua à volta do arroz — yui (trabalho comunitário partilhado) e tanomoshi (fundos de reciprocidade) — que inspiraram o Plantare em papel, a "moeda comunitária de troca de sementes" (BAH-Semillero, 2009, CC-BY-SA). O Tane é o Plantare digital.';
|
||||
@override String get version => 'Versão';
|
||||
@override String get license => 'Licença';
|
||||
@override String get licenseValue => 'AGPL-3.0';
|
||||
|
|
@ -322,7 +322,7 @@ class _Translations$intro$pt extends Translations$intro$en {
|
|||
@override String get skip => 'Saltar';
|
||||
@override String get next => 'Seguinte';
|
||||
@override String get start => 'Começar';
|
||||
@override String get menuEntry => 'Como funciona o Tanemaki';
|
||||
@override String get menuEntry => 'Como funciona o Tane';
|
||||
@override late final _Translations$intro$slides$pt slides = _Translations$intro$slides$pt._(_root);
|
||||
}
|
||||
|
||||
|
|
@ -1341,8 +1341,8 @@ extension on TranslationsPt {
|
|||
'calendar.filterChip' => 'Este mês',
|
||||
'calendar.selfNote' => 'O que anotaste nas tuas variedades.',
|
||||
'calendar.nothing' => ({required Object month}) => 'Nada anotado para ${month}.',
|
||||
'app.title' => 'Tanemaki',
|
||||
'bootstrap.failed' => 'O Tanemaki não conseguiu iniciar',
|
||||
'app.title' => 'Tane',
|
||||
'bootstrap.failed' => 'O Tane não conseguiu iniciar',
|
||||
'bootstrap.retry' => 'Tentar de novo',
|
||||
'common.save' => 'Guardar',
|
||||
'common.cancel' => 'Cancelar',
|
||||
|
|
@ -1380,7 +1380,7 @@ extension on TranslationsPt {
|
|||
'settings.langAst' => 'Asturianu',
|
||||
'settings.about' => 'Acerca de',
|
||||
'settings.aboutText' => 'Inventário local e cifrado para sementes tradicionais. AGPL-3.0.',
|
||||
'settings.aboutOpen' => 'Acerca do Tanemaki',
|
||||
'settings.aboutOpen' => 'Acerca do Tane',
|
||||
'backup.title' => 'Cópia de segurança',
|
||||
'backup.autoBackupTitle' => 'Cópias automáticas',
|
||||
'backup.autoBackupLast' => ({required Object date}) => 'Última cópia guardada em ${date}',
|
||||
|
|
@ -1402,22 +1402,22 @@ extension on TranslationsPt {
|
|||
'backup.cancelled' => 'Cancelado',
|
||||
'backup.importDone' => ({required Object added, required Object updated}) => 'Importado: ${added} novas, ${updated} atualizadas',
|
||||
'backup.importCsvDone' => ({required Object count}) => '${count} entradas acrescentadas',
|
||||
'backup.importFailed' => 'Este ficheiro não pôde ser lido como uma cópia do Tanemaki',
|
||||
'backup.importFailed' => 'Este ficheiro não pôde ser lido como uma cópia do Tane',
|
||||
'backup.failed' => 'Algo correu mal',
|
||||
'backup.recoveryTitle' => 'O teu código de recuperação',
|
||||
'backup.recoverySubtitle' => 'Imprime-o e guarda-o bem: abre as tuas cópias noutro aparelho',
|
||||
'backup.recoveryIntro' => 'Este código abre as tuas cópias guardadas e recupera o teu banco em qualquer aparelho. Guarda duas cópias em papel em sítios seguros, como a tua melhor semente. Quem o tiver pode ler as tuas cópias, por isso não o partilhes com ninguém.',
|
||||
'backup.recoveryCopy' => 'Copiar',
|
||||
'backup.recoverySave' => 'Guardar a folha',
|
||||
'backup.recoverySheetTitle' => 'Tanemaki — a tua folha de recuperação',
|
||||
'backup.recoverySheetTitle' => 'Tane — a tua folha de recuperação',
|
||||
'backup.recoveryPromptTitle' => 'Escreve o teu código de recuperação',
|
||||
'backup.recoveryPromptBody' => 'Esta cópia foi guardada com outro código. Escreve o código da tua folha de recuperação para a abrir.',
|
||||
'backup.recoveryWrongCode' => 'Esse código não abre esta cópia',
|
||||
'about.title' => 'Acerca de',
|
||||
'about.kanji' => '種まき',
|
||||
'about.kanji' => '種',
|
||||
'about.tagline' => 'Uma aplicação local e descentralizada para gerir e partilhar sementes e plântulas tradicionais.',
|
||||
'about.intro' => 'O Tanemaki (種まき, "semear / espalhar sementes" em japonês; nome curto Tane, 種 "semente") ajuda pessoas e coletivos a manter um inventário amigável do seu banco de sementes, decidir o que oferecem e partilhá-lo localmente — sem um intermediário central que possa controlar, censurar ou ser multado por isso. O objetivo é prático e político ao mesmo tempo: apoiar as variedades tradicionais e fazer frente ao monopólio das sementes.',
|
||||
'about.heritage' => 'O nome honra as antigas tradições japonesas de ajuda mútua à volta do arroz — yui (trabalho comunitário partilhado) e tanomoshi (fundos de reciprocidade) — que inspiraram o Plantare em papel, a "moeda comunitária de troca de sementes" (BAH-Semillero, 2009, CC-BY-SA). O Tanemaki é o Plantare digital.',
|
||||
'about.intro' => 'O Tane (種, "semente" em japonês) ajuda pessoas e coletivos a manter um inventário amigável do seu banco de sementes, decidir o que oferecem e partilhá-lo localmente — sem um intermediário central que possa controlar, censurar ou ser multado por isso. O seu nome vem de tanemaki (種まき), "semear / espalhar sementes". O objetivo é prático e político ao mesmo tempo: apoiar as variedades tradicionais e fazer frente ao monopólio das sementes.',
|
||||
'about.heritage' => 'O nome honra as antigas tradições japonesas de ajuda mútua à volta do arroz — yui (trabalho comunitário partilhado) e tanomoshi (fundos de reciprocidade) — que inspiraram o Plantare em papel, a "moeda comunitária de troca de sementes" (BAH-Semillero, 2009, CC-BY-SA). O Tane é o Plantare digital.',
|
||||
'about.version' => 'Versão',
|
||||
'about.license' => 'Licença',
|
||||
'about.licenseValue' => 'AGPL-3.0',
|
||||
|
|
@ -1428,7 +1428,7 @@ extension on TranslationsPt {
|
|||
'intro.skip' => 'Saltar',
|
||||
'intro.next' => 'Seguinte',
|
||||
'intro.start' => 'Começar',
|
||||
'intro.menuEntry' => 'Como funciona o Tanemaki',
|
||||
'intro.menuEntry' => 'Como funciona o Tane',
|
||||
'intro.slides.welcome.title' => 'A semente que te trouxe até aqui',
|
||||
'intro.slides.welcome.body' => 'Cada semente tradicional é uma carta escrita por milhares de gerações, passada de mão em mão. Somos o que somos graças a essa partilha.',
|
||||
'intro.slides.inventory.title' => 'O teu banco de sementes, no bolso',
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ class AutoBackupService {
|
|||
|
||||
/// Filename prefix so rotation only ever touches automatic copies, never a
|
||||
/// backup the user saved by hand.
|
||||
static const _prefix = 'tanemaki-auto-';
|
||||
static const _prefix = 'tane-auto-';
|
||||
|
||||
/// How many automatic copies to keep. A rotating window (not a single file)
|
||||
/// so a corrupt copy can't overwrite the only backup.
|
||||
|
|
@ -62,7 +62,7 @@ class AutoBackupService {
|
|||
await dir.create(recursive: true);
|
||||
final sealed = await _exporter.buildSealedBackup();
|
||||
final date = now.toIso8601String().substring(0, 10);
|
||||
final file = File('${dir.path}/$_prefix$date.tanemaki');
|
||||
final file = File('${dir.path}/$_prefix$date.tane');
|
||||
await file.writeAsBytes(sealed, flush: true);
|
||||
|
||||
await _rotate(dir);
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ class ExportImportService implements InventorySnapshotIO {
|
|||
static const _csvCodec = InventoryCsvCodec();
|
||||
|
||||
/// The backup file extension. The content is the sealed interchange JSON.
|
||||
static const backupExtension = 'tanemaki';
|
||||
static const backupExtension = 'tane';
|
||||
|
||||
/// Raw (unsealed) interchange snapshot for device-to-device sync: includes
|
||||
/// tombstones (so deletions replicate) and omits photo bytes (kept device-
|
||||
|
|
@ -150,7 +150,7 @@ class ExportImportService implements InventorySnapshotIO {
|
|||
|
||||
String _fileName(String extension) {
|
||||
final date = _now().toIso8601String().substring(0, 10);
|
||||
return 'tanemaki-backup-$date.$extension';
|
||||
return 'tane-backup-$date.$extension';
|
||||
}
|
||||
|
||||
static List<int> _hexToBytes(String hex) => [
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ class LabelSheetLabel {
|
|||
/// The batch facts line ("2006 · Perales · 2 cobs"), if any.
|
||||
final String? details;
|
||||
|
||||
/// The QR payload (a `tanemaki://seed` URI), so the seed's data rides on the
|
||||
/// The QR payload (a `tane://seed` URI), so the seed's data rides on the
|
||||
/// physical packet.
|
||||
final String qrData;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,10 +6,10 @@ import '../i18n/strings.g.dart';
|
|||
import 'theme.dart';
|
||||
|
||||
/// The app's public website. Shown as a tappable row in [AboutScreen].
|
||||
const String _websiteUrl = 'https://tanemaki.app';
|
||||
const String _websiteUrl = 'https://tane.comunes.org';
|
||||
|
||||
/// The year Tanemaki's copyright starts. Ğ1nkgo uses its own first year (2023);
|
||||
/// Tanemaki's is 2026.
|
||||
/// The year Tane's copyright starts. Ğ1nkgo uses its own first year (2023);
|
||||
/// Tane's is 2026.
|
||||
const int _copyrightStartYear = 2026;
|
||||
|
||||
/// A single year (`2026`) until the calendar rolls over, then a range
|
||||
|
|
@ -22,7 +22,7 @@ String _copyrightYears() {
|
|||
}
|
||||
|
||||
/// An "about" screen à la Ğ1nkgo: brand header, the human explanation of what
|
||||
/// Tanemaki is and where its name comes from, the app version, license, the
|
||||
/// Tane is and where its name comes from, the app version, license, the
|
||||
/// website, and the bundled open-source licenses page.
|
||||
class AboutScreen extends StatelessWidget {
|
||||
const AboutScreen({super.key});
|
||||
|
|
@ -99,7 +99,7 @@ class AboutScreen extends StatelessWidget {
|
|||
}
|
||||
}
|
||||
|
||||
/// Brand block: the logo, the app name and its 種まき kanji.
|
||||
/// Brand block: the logo, the app name and its 種 kanji.
|
||||
class _Header extends StatelessWidget {
|
||||
const _Header();
|
||||
|
||||
|
|
@ -133,7 +133,7 @@ class _Header extends StatelessWidget {
|
|||
}
|
||||
}
|
||||
|
||||
/// The two explanatory paragraphs: what Tanemaki is, and the heritage of its
|
||||
/// The two explanatory paragraphs: what Tane is, and the heritage of its
|
||||
/// name (yui / tanomoshi / the paper Plantare).
|
||||
class _Paragraph extends StatelessWidget {
|
||||
const _Paragraph();
|
||||
|
|
|
|||
|
|
@ -140,7 +140,7 @@ class BackupSection extends StatelessWidget {
|
|||
title: t.backup.recoverySheetTitle,
|
||||
intro: t.backup.recoveryIntro,
|
||||
code: code,
|
||||
suggestedName: 'tanemaki-recovery.pdf',
|
||||
suggestedName: 'tane-recovery.pdf',
|
||||
);
|
||||
_show(messenger, saved ? t.backup.exportSaved : t.backup.cancelled);
|
||||
} on Object {
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ class _Slide {
|
|||
}
|
||||
|
||||
/// The first-run intro carousel (also reachable later from the drawer): a few
|
||||
/// swipeable cards explaining what Tanemaki is, how privacy works, how sharing
|
||||
/// swipeable cards explaining what Tane is, how privacy works, how sharing
|
||||
/// works and the Plantare. [onDone] fires when the user skips or finishes, and
|
||||
/// is where the caller marks the intro as seen and leaves the screen.
|
||||
class IntroScreen extends StatefulWidget {
|
||||
|
|
|
|||
|
|
@ -212,7 +212,7 @@ class InventoryListScreen extends StatelessWidget {
|
|||
title: t.share.catalogTitle,
|
||||
date: dateLabel,
|
||||
suggestedName:
|
||||
'tanemaki-catalog-${date.toIso8601String().substring(0, 10)}.pdf',
|
||||
'tane-catalog-${date.toIso8601String().substring(0, 10)}.pdf',
|
||||
rows: rows,
|
||||
);
|
||||
messenger.showSnackBar(
|
||||
|
|
|
|||
|
|
@ -170,7 +170,7 @@ class _LabelPrintSheetState extends State<_LabelPrintSheet> {
|
|||
final saved = await getIt<LabelSheetService>().saveLabels(
|
||||
labels: labels,
|
||||
format: _format,
|
||||
suggestedName: 'tanemaki-labels-${_today()}.pdf',
|
||||
suggestedName: 'tane-labels-${_today()}.pdf',
|
||||
rtl: rtl,
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
name: tane
|
||||
description: "Tanemaki — local-first, encrypted, decentralized traditional-seed inventory."
|
||||
description: "Tane — local-first, encrypted, decentralized traditional-seed inventory."
|
||||
publish_to: 'none'
|
||||
version: 0.1.0+1
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import 'package:tane/data/export_import/seed_label_codec.dart';
|
|||
|
||||
void main() {
|
||||
group('SeedLabelCodec.encode', () {
|
||||
test('encodes all fields as a tanemaki://seed URI', () {
|
||||
test('encodes all fields as a tane://seed URI', () {
|
||||
final uri = SeedLabelCodec.encode(
|
||||
const SeedLabelData(
|
||||
varietyLabel: 'Acelga de Perales',
|
||||
|
|
@ -13,9 +13,9 @@ void main() {
|
|||
origin: 'Perales',
|
||||
),
|
||||
);
|
||||
expect(uri, startsWith('tanemaki://seed?'));
|
||||
expect(uri, startsWith('tane://seed?'));
|
||||
final parsed = Uri.parse(uri);
|
||||
expect(parsed.scheme, 'tanemaki');
|
||||
expect(parsed.scheme, 'tane');
|
||||
expect(parsed.host, 'seed');
|
||||
expect(parsed.queryParameters, {
|
||||
'v': 'Acelga de Perales',
|
||||
|
|
@ -74,15 +74,15 @@ void main() {
|
|||
group('SeedLabelCodec.decode', () {
|
||||
test('rejects a foreign scheme', () {
|
||||
expect(SeedLabelCodec.decode('https://seed?v=x'), isNull);
|
||||
expect(SeedLabelCodec.decode('tanemaki://other?v=x'), isNull);
|
||||
expect(SeedLabelCodec.decode('tane://other?v=x'), isNull);
|
||||
});
|
||||
|
||||
test('rejects a payload without a variety', () {
|
||||
expect(SeedLabelCodec.decode('tanemaki://seed?s=Beta%20vulgaris'), isNull);
|
||||
expect(SeedLabelCodec.decode('tane://seed?s=Beta%20vulgaris'), isNull);
|
||||
});
|
||||
|
||||
test('ignores an unparseable year rather than throwing', () {
|
||||
final decoded = SeedLabelCodec.decode('tanemaki://seed?v=Maíz&y=old');
|
||||
final decoded = SeedLabelCodec.decode('tane://seed?v=Maíz&y=old');
|
||||
expect(decoded?.varietyLabel, 'Maíz');
|
||||
expect(decoded?.year, isNull);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ void main() {
|
|||
.listSync()
|
||||
.whereType<File>()
|
||||
.map((f) => f.uri.pathSegments.last)
|
||||
.where((n) => n.startsWith('tanemaki-auto-'))
|
||||
.where((n) => n.startsWith('tane-auto-'))
|
||||
.toList()
|
||||
..sort();
|
||||
|
||||
|
|
@ -89,7 +89,7 @@ void main() {
|
|||
expect(await service.runIfDue(), isTrue);
|
||||
|
||||
final copies = autoCopies();
|
||||
expect(copies, ['tanemaki-auto-2026-07-10.tanemaki']);
|
||||
expect(copies, ['tane-auto-2026-07-10.tane']);
|
||||
final bytes = File('${dir.path}/${copies.single}').readAsBytesSync();
|
||||
expect(BackupBox.looksSealed(bytes), isTrue);
|
||||
});
|
||||
|
|
@ -117,12 +117,12 @@ void main() {
|
|||
);
|
||||
|
||||
expect(await service.runIfDue(), isTrue);
|
||||
expect(autoCopies(), ['tanemaki-auto-2026-07-10.tanemaki']);
|
||||
expect(autoCopies(), ['tane-auto-2026-07-10.tane']);
|
||||
});
|
||||
|
||||
test('rotation keeps only the newest three copies', () async {
|
||||
for (final d in ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04']) {
|
||||
File('${dir.path}/tanemaki-auto-$d.tanemaki').writeAsBytesSync([0]);
|
||||
File('${dir.path}/tane-auto-$d.tane').writeAsBytesSync([0]);
|
||||
}
|
||||
final service = newService(
|
||||
newExporter(),
|
||||
|
|
@ -133,9 +133,9 @@ void main() {
|
|||
await service.runIfDue();
|
||||
|
||||
expect(autoCopies(), [
|
||||
'tanemaki-auto-2020-01-03.tanemaki',
|
||||
'tanemaki-auto-2020-01-04.tanemaki',
|
||||
'tanemaki-auto-2026-07-10.tanemaki',
|
||||
'tane-auto-2020-01-03.tane',
|
||||
'tane-auto-2020-01-04.tane',
|
||||
'tane-auto-2026-07-10.tane',
|
||||
]);
|
||||
});
|
||||
|
||||
|
|
@ -151,7 +151,7 @@ void main() {
|
|||
// runIfDue is a no-op today, but an explicit tap still makes a copy.
|
||||
expect(await service.runIfDue(), isFalse);
|
||||
expect(await service.backupNow(), isTrue);
|
||||
expect(autoCopies(), ['tanemaki-auto-2026-07-10.tanemaki']);
|
||||
expect(autoCopies(), ['tane-auto-2026-07-10.tane']);
|
||||
});
|
||||
|
||||
test('a failed backup returns false and never throws', () async {
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ void main() {
|
|||
|
||||
await service.exportBackup();
|
||||
|
||||
expect(files.savedName, endsWith('.tanemaki'));
|
||||
expect(files.savedName, endsWith('.tane'));
|
||||
expect(BackupBox.looksSealed(files.saved!), isTrue);
|
||||
expect(String.fromCharCodes(files.saved!).contains('Secret'), isFalse);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -30,11 +30,11 @@ const _labels = [
|
|||
commonName: 'Acelga',
|
||||
scientificName: 'Beta vulgaris',
|
||||
details: '2006 · Perales',
|
||||
qrData: 'tanemaki://seed?v=Acelga+de+Perales&y=2006',
|
||||
qrData: 'tane://seed?v=Acelga+de+Perales&y=2006',
|
||||
),
|
||||
LabelSheetLabel(
|
||||
varietyLabel: 'Alubia de Tolosa',
|
||||
qrData: 'tanemaki://seed?v=Alubia+de+Tolosa',
|
||||
qrData: 'tane://seed?v=Alubia+de+Tolosa',
|
||||
),
|
||||
];
|
||||
|
||||
|
|
@ -57,7 +57,7 @@ void main() {
|
|||
final service = LabelSheetService(files: _RecordingFileService());
|
||||
final bytes = await service.buildPdf(
|
||||
labels: const [
|
||||
LabelSheetLabel(varietyLabel: 'Maíz', qrData: 'tanemaki://seed?v=Maíz'),
|
||||
LabelSheetLabel(varietyLabel: 'Maíz', qrData: 'tane://seed?v=Maíz'),
|
||||
],
|
||||
format: LabelSheetFormat.stickers,
|
||||
);
|
||||
|
|
@ -68,7 +68,7 @@ void main() {
|
|||
final service = LabelSheetService(files: _RecordingFileService());
|
||||
final bytes = await service.buildPdf(
|
||||
labels: const [
|
||||
LabelSheetLabel(varietyLabel: 'بامية', qrData: 'tanemaki://seed?v=x'),
|
||||
LabelSheetLabel(varietyLabel: 'بامية', qrData: 'tane://seed?v=x'),
|
||||
],
|
||||
format: LabelSheetFormat.cards,
|
||||
rtl: true,
|
||||
|
|
@ -82,11 +82,11 @@ void main() {
|
|||
final saved = await service.saveLabels(
|
||||
labels: _labels,
|
||||
format: LabelSheetFormat.cards,
|
||||
suggestedName: 'tanemaki-labels-2026-07-10.pdf',
|
||||
suggestedName: 'tane-labels-2026-07-10.pdf',
|
||||
);
|
||||
|
||||
expect(saved, isTrue);
|
||||
expect(files.savedName, 'tanemaki-labels-2026-07-10.pdf');
|
||||
expect(files.savedName, 'tane-labels-2026-07-10.pdf');
|
||||
expect(String.fromCharCodes(files.saved!.take(5)), '%PDF-');
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,12 +55,12 @@ void main() {
|
|||
final saved = await service.saveCatalog(
|
||||
title: 'What I share',
|
||||
date: 'July 9, 2026',
|
||||
suggestedName: 'tanemaki-catalog-2026-07-09.pdf',
|
||||
suggestedName: 'tane-catalog-2026-07-09.pdf',
|
||||
rows: const [ShareCatalogRow(name: 'Maize', mode: 'To give away')],
|
||||
);
|
||||
|
||||
expect(saved, isTrue);
|
||||
expect(files.savedName, 'tanemaki-catalog-2026-07-09.pdf');
|
||||
expect(files.savedName, 'tane-catalog-2026-07-09.pdf');
|
||||
expect(String.fromCharCodes(files.saved!.take(5)), '%PDF-');
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ void main() {
|
|||
|
||||
setUp(() {
|
||||
PackageInfo.setMockInitialValues(
|
||||
appName: 'Tanemaki',
|
||||
appName: 'Tane',
|
||||
packageName: 'org.comunes.tane',
|
||||
version: '0.1.0',
|
||||
buildNumber: '1',
|
||||
|
|
@ -38,7 +38,7 @@ void main() {
|
|||
await tester.tap(find.text('About')); // drawer entry
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('種まき'), findsOneWidget);
|
||||
expect(find.text('種'), findsOneWidget);
|
||||
expect(find.textContaining('digital Plantare'), findsOneWidget);
|
||||
await disposeTree(tester);
|
||||
});
|
||||
|
|
@ -57,12 +57,12 @@ void main() {
|
|||
await tester.pumpAndSettle();
|
||||
|
||||
// The backup section pushed the About tile below the fold.
|
||||
await tester.scrollUntilVisible(find.text('About Tanemaki'), 200);
|
||||
await tester.tap(find.text('About Tanemaki'));
|
||||
await tester.scrollUntilVisible(find.text('About Tane'), 200);
|
||||
await tester.tap(find.text('About Tane'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Explanation text and kanji are shown above the fold.
|
||||
expect(find.text('種まき'), findsOneWidget);
|
||||
expect(find.text('種'), findsOneWidget);
|
||||
expect(find.textContaining('helps people and collectives'), findsOneWidget);
|
||||
expect(find.textContaining('digital Plantare'), findsOneWidget);
|
||||
|
||||
|
|
@ -87,8 +87,8 @@ void main() {
|
|||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text('Settings'));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.scrollUntilVisible(find.text('About Tanemaki'), 200);
|
||||
await tester.tap(find.text('About Tanemaki'));
|
||||
await tester.scrollUntilVisible(find.text('About Tane'), 200);
|
||||
await tester.tap(find.text('About Tane'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.scrollUntilVisible(find.text('Open-source licenses'), 200);
|
||||
|
|
|
|||
|
|
@ -109,12 +109,12 @@ void main() {
|
|||
expect(find.text('Copy saved'), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets('saving a backup writes a sealed .tanemaki file', (tester) async {
|
||||
testWidgets('saving a backup writes a sealed .tane file', (tester) async {
|
||||
await tester.pumpWidget(section());
|
||||
await tester.tap(find.text('Save a backup'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(files.savedName, endsWith('.tanemaki'));
|
||||
expect(files.savedName, endsWith('.tane'));
|
||||
expect(BackupBox.looksSealed(files.savedBytes!), isTrue);
|
||||
expect(find.text('Copy saved'), findsOneWidget);
|
||||
});
|
||||
|
|
@ -210,7 +210,7 @@ void main() {
|
|||
await tester.pumpAndSettle();
|
||||
|
||||
expect(
|
||||
find.text('This file could not be read as a Tanemaki copy'),
|
||||
find.text('This file could not be read as a Tane copy'),
|
||||
findsOneWidget,
|
||||
);
|
||||
});
|
||||
|
|
@ -228,7 +228,7 @@ void main() {
|
|||
await tester.tap(find.byKey(const Key('backup.recoverySave')));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(files.savedName, 'tanemaki-recovery.pdf');
|
||||
expect(files.savedName, 'tane-recovery.pdf');
|
||||
expect(String.fromCharCodes(files.savedBytes!.take(5)), '%PDF-');
|
||||
// The seed itself never appears in the clear in the PDF stream metadata;
|
||||
// the QR encodes the human code, which IS the secret — that's the point
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ void main() {
|
|||
const longLocales = [AppLocale.es, AppLocale.pt, AppLocale.ast];
|
||||
|
||||
setUpAll(() => PackageInfo.setMockInitialValues(
|
||||
appName: 'Tanemaki',
|
||||
appName: 'Tane',
|
||||
packageName: 'org.comunes.tane',
|
||||
version: '0.1.0',
|
||||
buildNumber: '1',
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ const String _endpoint = 'https://query.wikidata.org/sparql';
|
|||
|
||||
/// Wikimedia asks bots to send a descriptive, contactable User-Agent.
|
||||
const String _userAgent =
|
||||
'TanemakiSpeciesCatalogBot/1.0 (https://tanemaki.app; vjrj@comunes.org)';
|
||||
'TaneSpeciesCatalogBot/1.0 (https://tane.comunes.org; vjrj@comunes.org)';
|
||||
|
||||
const String _catalogNote =
|
||||
'Edible / cultivated plant species, generated from Wikidata (CC0) by '
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ abstract final class RecoveryCode {
|
|||
static String decode(String code) {
|
||||
final compact = code.toUpperCase().replaceAll(RegExp(r'[\s-]'), '');
|
||||
if (!compact.startsWith(_tag)) {
|
||||
throw const FormatException('Not a Tanemaki recovery code');
|
||||
throw const FormatException('Not a Tane recovery code');
|
||||
}
|
||||
final payload = compact.substring(_tag.length);
|
||||
final bytes = _unbase32(payload);
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ class NostrRatingTransport implements RatingTransport {
|
|||
|
||||
final NostrChannel _conn;
|
||||
|
||||
/// Custom Tanemaki rating kind (addressable range, next to trust's 30777).
|
||||
/// Custom Tane rating kind (addressable range, next to trust's 30777).
|
||||
static const kindRating = 30778;
|
||||
|
||||
@override
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ class NostrTrustTransport implements TrustTransport {
|
|||
|
||||
final NostrChannel _conn;
|
||||
|
||||
/// Custom Tanemaki certification kind (addressable range).
|
||||
/// Custom Tane certification kind (addressable range).
|
||||
static const kindCertification = 30777;
|
||||
|
||||
int get _now => DateTime.now().millisecondsSinceEpoch ~/ 1000;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Pub workspace root for Tanemaki (Tane).
|
||||
# Pub workspace root for Tane.
|
||||
# Members share a single lockfile and .dart_tool. See CLAUDE.md and
|
||||
# docs/design/core-domain-boundary.md for the package boundary rules.
|
||||
name: tane_workspace
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue