Projects BibleWeb Translations Dutch (Statenvertaling)
Done

Dutch (Statenvertaling)

Area: Translations

Context

Problem: BibleWeb targets both English and Dutch-speaking users. Dutch Bible readers need access to a classical, trusted Dutch translation alongside the English BSB.

Solution: The Statenvertaling (SV, 1637) is included as the built-in Dutch translation. It is the oldest and most well-known Dutch Bible translation — the Dutch equivalent of the King James Version. Historically the standard reference Bible in the Netherlands, it remains widely used by Reformed and Protestant communities.

Not included: Modern Dutch translations (NBV, HSV, NBG) — those would require the external translations infrastructure and separate licensing.

Functional

Users can switch to Dutch text using the NL button in the reader's translation toggle. The Statenvertaling text appears in the same reading layout as the English BSB. In "Both" mode, the Dutch text appears as a second line below each English verse, displayed in italics.

User flow:

  1. User clicks "NL" in the EN/NL/Both toggle → full chapter switches to Statenvertaling Dutch text
  2. User clicks "Both" → English BSB on the first line, Statenvertaling in italics below
  3. User searches in Dutch → FTS5 search matches against Statenvertaling text with synonym expansion
  4. In the interlinear popup, Dutch glosses show SV word-level alignments

Edge cases:

  • Some verses may have text_nl as NULL (missing SV text) — the app falls back to BSB English text
  • Dutch word-level glosses (sv_gloss) on Greek words were generated by AI alignment (Claude Sonnet)
  • Dutch FTS search expands 14 Bible term families morphologically (e.g., "liefde" also searches "liefheb", "bemin")

UX & Design

Translation toggle (in ChapterNav):

  • Three pill buttons: EN | NL | Both
  • NL button: active/pressed state when selected
  • Text color: same as EN (no visual distinction in the text itself)

Both mode styling:

  • English line: normal weight, theme text color
  • Dutch line: italic, var(--color-description) (muted color)

Technical

Data storage:

  • Column: verses.text_nl (TEXT, nullable) — stored directly on the same verse row as BSB text (denormalized)
  • Translation registry: bible_translations table, id=2, code='SV', language='nl', isDefault=false
  • FTS5 mirror: Statenvertaling text also copied to verse_texts (translation_id=2) via migration for full-text search indexing

Query optimization:

  • getVersesByChapter() short-circuits for 'SV' — returns verses rows directly, client reads verse.textNl instead of verse.text
  • VerseText.svelte computes nlText = verse.textNl ?? verse.text (fallback to BSB if NL is missing)

Word-level Dutch glosses:

  • greek_words.sv_gloss column stores per-word Statenvertaling alignments
  • Generated by scripts/align-sv-glosses.ts using Claude Sonnet to map each Greek NT word to its SV equivalent
  • Used in the interlinear popup for Dutch mode

Dutch Strong's definitions:

  • strongs_greek has definition_nl, primary_gloss_nl, meanings_nl columns (5,503 entries)
  • Same structure in strongs_hebrew

Dutch search expansion:

  • expandDutchQuery() in dutch-synonyms.ts maps 14 key Bible terms to morphological OR groups
  • Example: liefde(liefde* OR liefheb* OR bemin* OR lieflijk*)

Data source: Statenvertaling text imported into verses.text_nl at database build time. Migration migrate-verse-texts.ts copies it to verse_texts for FTS5 indexing.

Files:

  • packages/db/src/schema/bible.tsverses.textNl, greekWords.svGloss, strongsGreek.definitionNl
  • apps/web/src/lib/server/queries/verses.ts — SV short-circuit in getVersesByChapter()
  • apps/web/src/lib/components/bible/VerseText.svelte — NL/Both rendering logic
  • scripts/align-sv-glosses.ts — Claude Sonnet Greek→SV word alignment
  • scripts/migrate-verse-texts.ts — migration seeding verse_texts with SV rows
  • apps/web/src/lib/server/queries/dutch-synonyms.ts — Dutch FTS query expansion

Status

Current: DONE Milestone: Foundation (pre-v1) Priority: Core — essential for Dutch-speaking users

History:

  • The Statenvertaling was chosen as the Dutch translation due to its public domain status and historical significance
  • SV text stored as text_nl column on verses (not in verse_texts) for performance — this was a deliberate denormalization
  • Dutch word-level glosses generated via AI alignment script during interlinear development
  • Dutch FTS synonym expansion added to improve search quality for Dutch morphological variations

Dependencies:

  • Requires: verse database (DONE)
  • Used by: dual translation (DONE), Dutch search (DONE), Dutch interlinear glosses (DONE)

Screenshots

Feature screenshot