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

@ -148,6 +148,10 @@
"addLink": "Add link",
"linkUrl": "URL",
"linkTitle": "Title (optional)",
"reference": "Learn more",
"refGbif": "GBIF",
"refWikipedia": "Wikipedia",
"refWikispecies": "Wikispecies",
"notes": "Notes",
"addLot": "Add lot",
"editLot": "Edit lot",

View file

@ -148,6 +148,10 @@
"addLink": "Añadir enlace",
"linkUrl": "URL",
"linkTitle": "Título (opcional)",
"reference": "Saber más",
"refGbif": "GBIF",
"refWikipedia": "Wikipedia",
"refWikispecies": "Wikispecies",
"notes": "Notas",
"addLot": "Añadir lote",
"editLot": "Editar lote",

View file

@ -4,9 +4,9 @@
/// To regenerate, run: `dart run slang`
///
/// Locales: 2
/// Strings: 554 (277 per locale)
/// Strings: 562 (281 per locale)
///
/// Built on 2026-07-09 at 20:14 UTC
/// Built on 2026-07-09 at 20:38 UTC
// coverage:ignore-file
// ignore_for_file: type=lint, unused_import

View file

@ -495,6 +495,18 @@ class Translations$detail$en {
/// en: 'Title (optional)'
String get linkTitle => 'Title (optional)';
/// en: 'Learn more'
String get reference => 'Learn more';
/// en: 'GBIF'
String get refGbif => 'GBIF';
/// en: 'Wikipedia'
String get refWikipedia => 'Wikipedia';
/// en: 'Wikispecies'
String get refWikispecies => 'Wikispecies';
/// en: 'Notes'
String get notes => 'Notes';
@ -1564,6 +1576,10 @@ extension on Translations {
'detail.addLink' => 'Add link',
'detail.linkUrl' => 'URL',
'detail.linkTitle' => 'Title (optional)',
'detail.reference' => 'Learn more',
'detail.refGbif' => 'GBIF',
'detail.refWikipedia' => 'Wikipedia',
'detail.refWikispecies' => 'Wikispecies',
'detail.notes' => 'Notes',
'detail.addLot' => 'Add lot',
'detail.editLot' => 'Edit lot',

View file

@ -288,6 +288,10 @@ class _Translations$detail$es extends Translations$detail$en {
@override String get addLink => 'Añadir enlace';
@override String get linkUrl => 'URL';
@override String get linkTitle => 'Título (opcional)';
@override String get reference => 'Saber más';
@override String get refGbif => 'GBIF';
@override String get refWikipedia => 'Wikipedia';
@override String get refWikispecies => 'Wikispecies';
@override String get notes => 'Notas';
@override String get addLot => 'Añadir lote';
@override String get editLot => 'Editar lote';
@ -1030,6 +1034,10 @@ extension on TranslationsEs {
'detail.addLink' => 'Añadir enlace',
'detail.linkUrl' => 'URL',
'detail.linkTitle' => 'Título (opcional)',
'detail.reference' => 'Saber más',
'detail.refGbif' => 'GBIF',
'detail.refWikipedia' => 'Wikipedia',
'detail.refWikispecies' => 'Wikispecies',
'detail.notes' => 'Notas',
'detail.addLot' => 'Añadir lote',
'detail.editLot' => 'Editar lote',