Lower the bulk-digitization cliff with two more routes on top of the already-landed CSV import and "save and add another": - Photo-first drafts (capture now, catalogue later): burst-capture photos (camera or multi-gallery) into unnamed draft varieties, shown in a "to catalogue" tray, hidden from the main list until named. Adds Variety.isDraft (schema), addDraftVariety/watchDrafts/nameDraft, the triage sheet and the inventory banner. - On-device OCR label suggestion (Tesseract, offline, no Google): a "Suggest name from photo" button in the naming dialog behind a LabelTextExtractor interface (Tesseract on Android/iOS, no-op elsewhere). Reads the largest print via hOCR bounding boxes, drops boilerplate/low-confidence noise, preprocesses (grayscale, contrast, upscale) and sweeps rotations (0-315 deg) so tilted packets still read. Bundles tessdata_fast eng+spa; validated on-device against real packets. The photo is written to a temp file deleted immediately in a finally block (the plugin needs a path) - a bounded, documented exception to no-plaintext-at-rest. This commit also carries the co-developed schema evolution v5 to v8 that shares these files (organic flag, species viability years, crop calendar, lot provenance/abundance/preservation format, condition checks) plus their exports/migrations and i18n. Tests: CSV/draft/OCR unit + widget + migration green in isolation. Note: the full widget suite currently hangs (>10 min) - under investigation.
303 lines
12 KiB
JSON
303 lines
12 KiB
JSON
{
|
|
"app": {
|
|
"title": "Tanemaki"
|
|
},
|
|
"common": {
|
|
"save": "Guardar",
|
|
"cancel": "Cancelar",
|
|
"delete": "Eliminar",
|
|
"edit": "Editar",
|
|
"type": "Tipo",
|
|
"comingSoon": "Pronto"
|
|
},
|
|
"home": {
|
|
"tagline": "Comparte y cultiva semillas locales",
|
|
"openMarket": "Mercado abierto",
|
|
"openMarketSubtitle": "Explora e intercambia",
|
|
"yourInventory": "Tu inventario",
|
|
"yourInventorySubtitle": "Gestiona tus semillas"
|
|
},
|
|
"photo": {
|
|
"camera": "Hacer una foto",
|
|
"gallery": "Elegir de la galería",
|
|
"setAsCover": "Poner de portada",
|
|
"isCover": "Foto de portada",
|
|
"deleteConfirm": "¿Borrar esta foto?"
|
|
},
|
|
"menu": {
|
|
"tagline": "tu banco de semillas",
|
|
"inventory": "Inventario",
|
|
"market": "Mercado",
|
|
"profile": "Tu perfil",
|
|
"chat": "Chat",
|
|
"wishlist": "Lista de deseos",
|
|
"following": "Siguiendo",
|
|
"settings": "Ajustes"
|
|
},
|
|
"settings": {
|
|
"language": "Idioma",
|
|
"systemLanguage": "Idioma del sistema",
|
|
"langEs": "Español",
|
|
"langEn": "English",
|
|
"about": "Acerca de",
|
|
"aboutText": "Inventario local y cifrado para semillas tradicionales. AGPL-3.0.",
|
|
"aboutOpen": "Acerca de Tanemaki"
|
|
},
|
|
"backup": {
|
|
"title": "Copia de seguridad",
|
|
"exportJson": "Guardar una copia de seguridad",
|
|
"exportJsonSubtitle": "Una copia completa para guardar a salvo, restaurar luego o pasar a otro dispositivo",
|
|
"importJson": "Restaurar una copia",
|
|
"importJsonSubtitle": "Recupera una copia guardada — no se duplica nada",
|
|
"exportCsv": "Exportar a una hoja de cálculo",
|
|
"exportCsvSubtitle": "Una lista sencilla para Excel o LibreOffice — sin fotos",
|
|
"importCsv": "Importar una lista",
|
|
"importCsvSubtitle": "Añade entradas desde una hoja de cálculo",
|
|
"importConfirmTitle": "¿Restaurar una copia?",
|
|
"importConfirmBody": "Las entradas se fusionan con tu inventario; si una entrada existe en ambos lados, gana la versión más reciente. No se duplica nada.",
|
|
"importCsvConfirmTitle": "¿Importar una lista?",
|
|
"importCsvConfirmBody": "Cada fila se añade como una entrada nueva. No fusiona ni reemplaza, así que importar el mismo fichero dos veces lo añade dos veces.",
|
|
"importAction": "Importar",
|
|
"exportSaved": "Copia guardada",
|
|
"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",
|
|
"failed": "Algo ha salido mal"
|
|
},
|
|
"about": {
|
|
"title": "Acerca de",
|
|
"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.",
|
|
"version": "Versión",
|
|
"license": "Licencia",
|
|
"licenseValue": "AGPL-3.0",
|
|
"website": "Sitio web",
|
|
"openSourceLicenses": "Licencias de código abierto",
|
|
"openSourceLicensesSubtitle": "Bibliotecas de terceros y sus licencias"
|
|
},
|
|
"intro": {
|
|
"skip": "Saltar",
|
|
"next": "Siguiente",
|
|
"start": "Empezar",
|
|
"menuEntry": "Cómo funciona Tanemaki",
|
|
"slides": {
|
|
"welcome": {
|
|
"title": "La semilla que te trajo hasta aquí",
|
|
"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."
|
|
},
|
|
"inventory": {
|
|
"title": "Tu banco de semillas, en el bolsillo",
|
|
"body": "Apunta qué tienes, de qué año, cuánto y de dónde vino, con el nombre que tú usas. Una foto y un nombre bastan para empezar."
|
|
},
|
|
"privacy": {
|
|
"title": "Tuyo y solo tuyo",
|
|
"body": "Sin cuenta, sin internet, sin rastreadores. Tus datos viven cifrados en tu dispositivo y solo se comparte lo que tú decidas."
|
|
},
|
|
"share": {
|
|
"title": "Compartir, como siempre se hizo",
|
|
"body": "Ofrece lo que te sobra —regalo, trueque o venta— y que alguien cerca lo encuentre. Solo se muestra la distancia aproximada, nunca tu dirección; el trato lo cierras en persona."
|
|
},
|
|
"plantare": {
|
|
"title": "Sembrar es multiplicar",
|
|
"body": "Con el Plantare, quien recibe promete devolver semilla más adelante. Y como para devolverla hay que cultivarla, cada préstamo multiplica el común."
|
|
}
|
|
}
|
|
},
|
|
"inventory": {
|
|
"title": "Inventario",
|
|
"searchHint": "Buscar semillas",
|
|
"empty": "Aún no hay semillas. Toca + para añadir la primera.",
|
|
"noMatches": "Ninguna semilla coincide con los filtros.",
|
|
"clearFilters": "Quitar filtros",
|
|
"uncategorized": "Sin categoría",
|
|
"needsReproductionFilter": "Por reproducir"
|
|
},
|
|
"draft": {
|
|
"capture": "Capturar fotos",
|
|
"captured": "{n} capturadas por catalogar",
|
|
"triageTitle": "Por catalogar",
|
|
"triageCount": "{n} por catalogar",
|
|
"untitled": "Sin nombre",
|
|
"nameField": "Nombra esta semilla",
|
|
"nameHint": "¿Qué es?",
|
|
"suggestFromPhoto": "Sugerir nombre de la foto",
|
|
"discard": "Descartar"
|
|
},
|
|
"quickAdd": {
|
|
"title": "Añadir una semilla",
|
|
"labelField": "Nombre",
|
|
"labelRequired": "Ponle un nombre",
|
|
"addPhoto": "Añadir foto",
|
|
"quantity": "¿Cuánta?",
|
|
"more": "Añadir más…",
|
|
"save": "Guardar",
|
|
"saveAndAddAnother": "Guardar y añadir otra",
|
|
"addedCount": "{n} añadidas",
|
|
"cancel": "Cancelar"
|
|
},
|
|
"detail": {
|
|
"notFound": "Esta semilla ya no está aquí.",
|
|
"lots": "Lotes",
|
|
"noLots": "Aún no hay lotes.",
|
|
"names": "También conocida como",
|
|
"addName": "Añadir nombre",
|
|
"links": "Enlaces",
|
|
"addLink": "Añadir enlace",
|
|
"linkUrl": "URL",
|
|
"linkTitle": "Título (opcional)",
|
|
"notes": "Notas",
|
|
"addLot": "Añadir lote",
|
|
"editLot": "Editar lote",
|
|
"deleteConfirm": "¿Eliminar esta semilla?",
|
|
"year": "Año {year}",
|
|
"noYear": "Año desconocido"
|
|
},
|
|
"germination": {
|
|
"title": "Germinación",
|
|
"add": "Añadir prueba",
|
|
"sampleSize": "Muestra",
|
|
"germinated": "Germinadas",
|
|
"none": "Aún no hay pruebas de germinación.",
|
|
"result": "{percent}%"
|
|
},
|
|
"viability": {
|
|
"expiringSoon": "Úsala o multiplícala esta temporada",
|
|
"expiringSoonYears": "Úsala o multiplícala esta temporada · dura ~{years} años",
|
|
"expired": "Supera su viabilidad típica — a multiplicar",
|
|
"expiredYears": "Supera su viabilidad típica (~{years} años) — a multiplicar"
|
|
},
|
|
"editVariety": {
|
|
"title": "Editar semilla",
|
|
"name": "Nombre",
|
|
"category": "Categoría",
|
|
"notes": "Notas",
|
|
"species": "Especie (del catálogo)",
|
|
"speciesHint": "Buscar una especie…",
|
|
"organic": "Ecológica",
|
|
"organicHint": "Cultivada de forma ecológica (eco)"
|
|
},
|
|
"addLot": {
|
|
"title": "Añadir lote",
|
|
"year": "Fecha de cosecha",
|
|
"quantity": "¿Cuánta?",
|
|
"amount": "Cantidad"
|
|
},
|
|
"harvest": {
|
|
"pickTitle": "Seleccionar mes / año",
|
|
"anyMonth": "Cualquier mes",
|
|
"noDate": "Indicar fecha de cosecha",
|
|
"monthNames": [
|
|
"enero", "febrero", "marzo", "abril", "mayo", "junio",
|
|
"julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"
|
|
]
|
|
},
|
|
"lotType": {
|
|
"seed": "Semillas",
|
|
"plant": "Planta",
|
|
"seedling": "Plantón",
|
|
"tree": "Árbol / arbusto",
|
|
"bulb": "Bulbo / tubérculo",
|
|
"cutting": "Esqueje"
|
|
},
|
|
"presentation": {
|
|
"title": "Envase",
|
|
"none": "Sin especificar",
|
|
"pot": "Maceta",
|
|
"tray": "Bandeja",
|
|
"plug": "Alvéolo",
|
|
"bareRoot": "Raíz desnuda",
|
|
"rootBall": "Cepellón"
|
|
},
|
|
"provenance": {
|
|
"section": "De dónde viene",
|
|
"seedsFrom": "Semillas de",
|
|
"seedsFromHint": "Quién las cultivó o las dio",
|
|
"place": "Lugar",
|
|
"placeHint": "De dónde vienen (con provincia)",
|
|
"addSeedsFrom": "Semillas de",
|
|
"addPlace": "Lugar"
|
|
},
|
|
"abundance": {
|
|
"add": "Cuánta tengo",
|
|
"title": "Cuánta tengo",
|
|
"none": "Sin indicar",
|
|
"plentyToShare": "De sobra para compartir",
|
|
"enoughToShare": "Bastante, para compartir con moderación",
|
|
"enoughForMe": "Suficiente para mí",
|
|
"runningLow": "Queda poca"
|
|
},
|
|
"cropCalendar": {
|
|
"add": "Calendario de cultivo",
|
|
"title": "Calendario de cultivo",
|
|
"sow": "Siembra",
|
|
"transplant": "Trasplante",
|
|
"flowering": "Floración",
|
|
"fruiting": "Fructificación",
|
|
"seedHarvest": "Cosecha de semilla",
|
|
"unset": "—"
|
|
},
|
|
"needsReproduction": {
|
|
"label": "Reproducir esta temporada",
|
|
"hint": "Cultívala antes de que se acabe la semilla",
|
|
"badge": "Por reproducir"
|
|
},
|
|
"preservation": {
|
|
"add": "Cómo se conserva",
|
|
"title": "Cómo se conserva",
|
|
"none": "Sin especificar",
|
|
"jarWithDesiccant": "Bote con desecante",
|
|
"glassJar": "Bote de cristal",
|
|
"paperEnvelope": "Sobre de papel",
|
|
"paperBag": "Bolsa de papel",
|
|
"plasticBag": "Bolsa de plástico"
|
|
},
|
|
"conditionCheck": {
|
|
"advanced": "Conservación y detalles del banco",
|
|
"title": "Revisiones de conservación",
|
|
"add": "Añadir revisión",
|
|
"containers": "Botes / recipientes",
|
|
"desiccant": "Desecante",
|
|
"none": "Aún no hay revisiones.",
|
|
"summary": "{count} bote(s) · {state}"
|
|
},
|
|
"desiccant": {
|
|
"none": "No tiene",
|
|
"add": "Se pone",
|
|
"replace": "Se cambia",
|
|
"dry": "Azul — seco",
|
|
"fresh": "Recién puesto"
|
|
},
|
|
"unit": {
|
|
"aFew": "unas pocas",
|
|
"some": "algunas",
|
|
"plenty": "muchas",
|
|
"pinch": "una pizca",
|
|
"handful": { "singular": "puñado", "plural": "puñados" },
|
|
"teaspoon": { "singular": "cucharadita", "plural": "cucharaditas" },
|
|
"spoon": { "singular": "cuchara", "plural": "cucharas" },
|
|
"cup": { "singular": "taza", "plural": "tazas" },
|
|
"jar": { "singular": "bote", "plural": "botes" },
|
|
"sack": { "singular": "saco", "plural": "sacos" },
|
|
"packet": { "singular": "sobre", "plural": "sobres" },
|
|
"cob": { "singular": "mazorca", "plural": "mazorcas" },
|
|
"pod": { "singular": "vaina", "plural": "vainas" },
|
|
"ear": { "singular": "espiga", "plural": "espigas" },
|
|
"head": { "singular": "cabezuela", "plural": "cabezuelas" },
|
|
"fruit": { "singular": "fruto", "plural": "frutos" },
|
|
"bulb": { "singular": "bulbo", "plural": "bulbos" },
|
|
"tuber": { "singular": "tubérculo", "plural": "tubérculos" },
|
|
"seedHead": { "singular": "cabeza de semillas", "plural": "cabezas de semillas" },
|
|
"bunch": { "singular": "manojo", "plural": "manojos" },
|
|
"plant": { "singular": "planta", "plural": "plantas" },
|
|
"pot": { "singular": "maceta", "plural": "macetas" },
|
|
"tray": { "singular": "bandeja", "plural": "bandejas" },
|
|
"seedling": { "singular": "plántula", "plural": "plántulas" },
|
|
"tree": { "singular": "árbol", "plural": "árboles" },
|
|
"cutting": { "singular": "esqueje", "plural": "esquejes" },
|
|
"grams": { "singular": "gramo", "plural": "gramos" },
|
|
"count": { "singular": "semilla", "plural": "semillas" }
|
|
}
|
|
}
|