From 808d6efa1a1481fd3cf5dff5357a27360fa7a97c Mon Sep 17 00:00:00 2001 From: Marcel Date: Sun, 14 Jun 2026 10:39:58 +0200 Subject: [PATCH] i18n(timeline): add zeitstrahl visual-fidelity strings (REQ-015) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Seven new timeline_* keys feeding the upcoming chrome: the header meta line (grouping label + events count), the event-pill provenance token, the ✉ sr-only label, the world-band "historisch" suffix, and the strip density caption — present in de/en/es with matching key sets, pinned by a new parity test. Refs #833 Co-Authored-By: Claude Opus 4.8 --- frontend/messages/de.json | 7 +++++++ frontend/messages/en.json | 7 +++++++ frontend/messages/es.json | 7 +++++++ frontend/src/lib/messages.spec.ts | 20 ++++++++++++++++++++ 4 files changed, 41 insertions(+) diff --git a/frontend/messages/de.json b/frontend/messages/de.json index 97f2ad4a..c3692488 100644 --- a/frontend/messages/de.json +++ b/frontend/messages/de.json @@ -1046,6 +1046,13 @@ "timeline_derived_birth": "Geburt", "timeline_derived_death": "Tod", "timeline_derived_marriage": "Heirat", + "timeline_grouping_date": "Gruppierung: Datum", + "timeline_provenance_derived": "abgeleitet", + "timeline_provenance_curated": "kuratiert", + "timeline_letter_glyph_label": "Brief", + "timeline_layer_historical_suffix": "historisch", + "timeline_strip_density_caption": "Monats-Dichte", + "timeline_events_count": "{count} Ereignisse", "event_editor_new_title": "Neues Ereignis", "event_editor_edit_title": "Ereignis bearbeiten", "event_editor_section_when": "Wann", diff --git a/frontend/messages/en.json b/frontend/messages/en.json index e0adb2ed..eb3a08ea 100644 --- a/frontend/messages/en.json +++ b/frontend/messages/en.json @@ -1046,6 +1046,13 @@ "timeline_derived_birth": "Birth", "timeline_derived_death": "Death", "timeline_derived_marriage": "Marriage", + "timeline_grouping_date": "Grouping: Date", + "timeline_provenance_derived": "derived", + "timeline_provenance_curated": "curated", + "timeline_letter_glyph_label": "Letter", + "timeline_layer_historical_suffix": "historical", + "timeline_strip_density_caption": "Monthly density", + "timeline_events_count": "{count} events", "event_editor_new_title": "New event", "event_editor_edit_title": "Edit event", "event_editor_section_when": "When", diff --git a/frontend/messages/es.json b/frontend/messages/es.json index e67a3578..c2d6df92 100644 --- a/frontend/messages/es.json +++ b/frontend/messages/es.json @@ -1046,6 +1046,13 @@ "timeline_derived_birth": "Nacimiento", "timeline_derived_death": "Fallecimiento", "timeline_derived_marriage": "Matrimonio", + "timeline_grouping_date": "Agrupación: Fecha", + "timeline_provenance_derived": "derivado", + "timeline_provenance_curated": "curado", + "timeline_letter_glyph_label": "Carta", + "timeline_layer_historical_suffix": "histórico", + "timeline_strip_density_caption": "Densidad mensual", + "timeline_events_count": "{count} eventos", "event_editor_new_title": "Nuevo evento", "event_editor_edit_title": "Editar evento", "event_editor_section_when": "Cuándo", diff --git a/frontend/src/lib/messages.spec.ts b/frontend/src/lib/messages.spec.ts index 95338e43..3d98c413 100644 --- a/frontend/src/lib/messages.spec.ts +++ b/frontend/src/lib/messages.spec.ts @@ -68,4 +68,24 @@ describe('message key parity', () => { timeline_derived_marriage: 'Matrimonio' }); }); + + // #833 REQ-015: the new visual-fidelity strings (meta line, provenance token, + // ✉ label, world-band suffix, density caption) are Paraglide keys present in + // every locale so no surface ever falls back to a missing translation. + it('zeitstrahl visual-fidelity keys are present in all locales (#833 REQ-015)', () => { + const requiredKeys = [ + 'timeline_grouping_date', + 'timeline_provenance_derived', + 'timeline_provenance_curated', + 'timeline_letter_glyph_label', + 'timeline_layer_historical_suffix', + 'timeline_strip_density_caption', + 'timeline_events_count' + ]; + for (const key of requiredKeys) { + expect(de, `missing key in de: ${key}`).toHaveProperty(key); + expect(en, `missing key in en: ${key}`).toHaveProperty(key); + expect(es, `missing key in es: ${key}`).toHaveProperty(key); + } + }); });