feat(species): derived verified reference links (GBIF/Wikipedia/Wikispecies)

Add a read-only "Learn more" section on the variety detail that surfaces
verified external references for the linked species, built deterministically
from bundled identifiers — no titles bundled, no network, offline-first:

- GBIF taxon page from the backbone key
- Wikipedia via Wikidata Special:GoToLinkedPage (locale-aware, RTL-safe,
  falls back to the Wikidata item when a language lacks the article)
- Wikispecies from the scientific name

Enrich the bundled catalog (species.json v3) with gbif_key + wikidata_qid for
all 14 species, cross-checked (each QID carries GBIF ID P846 = the key).
Schema already had the columns; seedBundled now persists and backfills them.

The grower's own manual links stay but are demoted (progressive disclosure):
the section only shows when links exist and "Add link" is a low-emphasis
button, since hand-adding a link is the rarer power move.

Pure-Dart link builder is unit-tested; repo persistence/backfill and the
detail-screen section are covered too.
This commit is contained in:
vjrj 2026-07-09 22:44:12 +02:00
parent ba87bf2719
commit fde0ea6eab
14 changed files with 484 additions and 46 deletions

View file

@ -1,90 +1,118 @@
{
"version": 2,
"note": "Curated starter set of common horticultural species — a seed, not a region-locked list. `common` is a locale-keyed map extensible to ANY language (add es/en/fr/de/ar/zh/…); the app resolves names by the user's locale and falls back gracefully, so this must never assume es/en only. Names are enriched later per-locale from the varilla (Wikidata CC0 + GBIF) work, which carries vernacular names in every language. viability_years is typical seed longevity under normal home storage (public-domain agricultural-extension figures); a conservative single value, used to warn about aging lots.",
"version": 3,
"note": "Curated starter set of common horticultural species — a seed, not a region-locked list. `common` is a locale-keyed map extensible to ANY language (add es/en/fr/de/ar/zh/…); the app resolves names by the user's locale and falls back gracefully, so this must never assume es/en only. Names are enriched later per-locale from the varilla (Wikidata CC0 + GBIF) work, which carries vernacular names in every language. viability_years is typical seed longevity under normal home storage (public-domain agricultural-extension figures); a conservative single value, used to warn about aging lots. `gbif_key` (GBIF backbone taxon key) and `wikidata_qid` (Wikidata item) are verified cross-checked identifiers (each QID carries GBIF ID P846 = the key here); the app derives locale-aware reference links (GBIF, Wikipedia via Wikidata GoToLinkedPage, Wikispecies) from them — no titles are bundled.",
"species": [
{
"scientific_name": "Solanum lycopersicum",
"family": "Solanaceae",
"common": { "es": ["Tomate"], "en": ["Tomato"] },
"viability_years": 5
"viability_years": 5,
"gbif_key": 2930137,
"wikidata_qid": "Q23501"
},
{
"scientific_name": "Solanum melongena",
"family": "Solanaceae",
"common": { "es": ["Berenjena"], "en": ["Aubergine", "Eggplant"] },
"viability_years": 5
"viability_years": 5,
"gbif_key": 2930617,
"wikidata_qid": "Q7540"
},
{
"scientific_name": "Capsicum annuum",
"family": "Solanaceae",
"common": { "es": ["Pimiento", "Guindilla"], "en": ["Pepper", "Chilli"] },
"viability_years": 3
"viability_years": 3,
"gbif_key": 2932944,
"wikidata_qid": "Q1380"
},
{
"scientific_name": "Phaseolus vulgaris",
"family": "Fabaceae",
"common": { "es": ["Judía", "Alubia", "Habichuela"], "en": ["Common bean"] },
"viability_years": 3
"viability_years": 3,
"gbif_key": 5350452,
"wikidata_qid": "Q42339"
},
{
"scientific_name": "Vicia faba",
"family": "Fabaceae",
"common": { "es": ["Haba"], "en": ["Broad bean", "Fava bean"] },
"viability_years": 4
"viability_years": 4,
"gbif_key": 2974832,
"wikidata_qid": "Q131342"
},
{
"scientific_name": "Pisum sativum",
"family": "Fabaceae",
"common": { "es": ["Guisante"], "en": ["Pea"] },
"viability_years": 3
"viability_years": 3,
"gbif_key": 5347845,
"wikidata_qid": "Q25237"
},
{
"scientific_name": "Zea mays",
"family": "Poaceae",
"common": { "es": ["Maíz"], "en": ["Maize", "Corn"] },
"viability_years": 2
"viability_years": 2,
"gbif_key": 5290052,
"wikidata_qid": "Q11575"
},
{
"scientific_name": "Cucurbita pepo",
"family": "Cucurbitaceae",
"common": { "es": ["Calabacín", "Calabaza"], "en": ["Courgette", "Zucchini", "Squash"] },
"viability_years": 5
"viability_years": 5,
"gbif_key": 2874508,
"wikidata_qid": "Q7229863"
},
{
"scientific_name": "Cucumis sativus",
"family": "Cucurbitaceae",
"common": { "es": ["Pepino"], "en": ["Cucumber"] },
"viability_years": 5
"viability_years": 5,
"gbif_key": 2874569,
"wikidata_qid": "Q23425"
},
{
"scientific_name": "Lactuca sativa",
"family": "Asteraceae",
"common": { "es": ["Lechuga"], "en": ["Lettuce"] },
"viability_years": 3
"viability_years": 3,
"gbif_key": 7403263,
"wikidata_qid": "Q83193"
},
{
"scientific_name": "Beta vulgaris",
"family": "Amaranthaceae",
"common": { "es": ["Acelga", "Remolacha"], "en": ["Chard", "Beetroot"] },
"viability_years": 4
"viability_years": 4,
"gbif_key": 8971274,
"wikidata_qid": "Q165191"
},
{
"scientific_name": "Allium cepa",
"family": "Amaryllidaceae",
"common": { "es": ["Cebolla"], "en": ["Onion"] },
"viability_years": 1
"viability_years": 1,
"gbif_key": 2857697,
"wikidata_qid": "Q23485"
},
{
"scientific_name": "Allium sativum",
"family": "Amaryllidaceae",
"common": { "es": ["Ajo"], "en": ["Garlic"] },
"viability_years": 1
"viability_years": 1,
"gbif_key": 2856681,
"wikidata_qid": "Q23400"
},
{
"scientific_name": "Daucus carota",
"family": "Apiaceae",
"common": { "es": ["Zanahoria"], "en": ["Carrot"] },
"viability_years": 3
"viability_years": 3,
"gbif_key": 3034742,
"wikidata_qid": "Q30056"
}
]
}