[Content] Spanish lesson instructions & hints untranslated across all playground tracks #279

Closed
opened 2026-06-27 22:24:14 +00:00 by spikerj · 1 comment
Owner

Summary

While fixing #275 (playgrounds not re-localizing on language switch) we discovered a deeper, separate problem: the Spanish curriculum translations only cover lesson titles and descriptions. Per-attempt instructions and hints are essentially untranslated, so even with a correct locale fetch the lesson body renders in English while the header renders in Spanish.

This is a content/data gap, not a code bug. #275's code fix (spikersoft-angular PR #82) makes the playground re-fetch localized content on a language change; this issue tracks actually authoring the Spanish strings it should pull.

Evidence

C# lesson 302 ("Cadena else-if: calificación por letras") shows a Spanish title + description but English instructions. Its Spanish entry only contains title/description — no instructions array:

// SpikerSoft.Business/Domain/Lessons/Translations/es/csharp.json
"302": {
  "title": "Cadena else-if: calificación por letras",
  "description": "Cuando una prueba no es suficiente, una escalera else-if ..."
}

The backend (LessonStrategyBase.Localization.csFinalizeAttemptWithLocale) only substitutes Spanish instructions/hints when the translation carries an instructions/hints array whose item count matches the built attempt; otherwise it silently falls back to English. With no array present, English is always returned.

Coverage today

Translation files: SpikerSoft.Business/Domain/Lessons/Translations/es/*.json

Track Lesson entries Entries with translated instructions
csharp 102 1 (lesson 100, pilot from #215)
javascript 138 0
python 101 0
c 11 0
cpp 11 0
sql 17 0
regex 12 0
x86 10 0

So only 1 of ~402 lesson entries has translated instructions/hints.

Scope of work

Author Spanish instructions and hints (and tutorialPanels where present) for every lesson across all 8 tracks. Authoring constraints enforced by the backend:

  • The translated instructions array length must equal the English instruction count for that lesson, and likewise for hints — a mismatch makes the backend discard the translation and fall back to English (silent).
  • Preserve {seedToken} placeholders verbatim — they're late-bound to the attempt's randomized values via ApplySeedTokens (#215). e.g. print exactly: {target}.
  • Preserve inline `code` backtick spans and any markdown (**bold**, \n) so chips/formatting render identically.
  • Code, signatures, and identifiers stay in English; only prose is translated.

Suggested approach

  • Tackle one track at a time (start with C#, the largest learner-facing track) so quality can be reviewed before scaling.
  • Consider a small validation/CI check that flags any es lesson whose instructions/hints count diverges from the English source, so future English edits don't silently re-break a translation.

Related

  • Depends on the locale re-fetch from #275 (spikersoft-angular PR #82).
  • Pilot precedent: lesson 100 instructions (#215).

Severity

Medium — Spanish users get a mixed-language lesson body until translations land. Frontend behavior is otherwise correct.

## Summary While fixing #275 (playgrounds not re-localizing on language switch) we discovered a deeper, separate problem: the Spanish curriculum translations only cover lesson **titles** and **descriptions**. Per-attempt **instructions** and **hints** are essentially untranslated, so even with a correct locale fetch the lesson body renders in English while the header renders in Spanish. This is a **content/data gap**, not a code bug. #275's code fix (spikersoft-angular PR #82) makes the playground re-fetch localized content on a language change; this issue tracks actually authoring the Spanish strings it should pull. ## Evidence C# lesson 302 ("Cadena else-if: calificación por letras") shows a Spanish title + description but English instructions. Its Spanish entry only contains `title`/`description` — no `instructions` array: ```jsonc // SpikerSoft.Business/Domain/Lessons/Translations/es/csharp.json "302": { "title": "Cadena else-if: calificación por letras", "description": "Cuando una prueba no es suficiente, una escalera else-if ..." } ``` The backend (`LessonStrategyBase.Localization.cs` → `FinalizeAttemptWithLocale`) only substitutes Spanish instructions/hints when the translation carries an `instructions`/`hints` array whose item count matches the built attempt; otherwise it silently falls back to English. With no array present, English is always returned. ## Coverage today Translation files: `SpikerSoft.Business/Domain/Lessons/Translations/es/*.json` | Track | Lesson entries | Entries with translated `instructions` | |---|---|---| | csharp | 102 | 1 (lesson 100, pilot from #215) | | javascript | 138 | 0 | | python | 101 | 0 | | c | 11 | 0 | | cpp | 11 | 0 | | sql | 17 | 0 | | regex | 12 | 0 | | x86 | 10 | 0 | So only **1 of ~402** lesson entries has translated instructions/hints. ## Scope of work Author Spanish `instructions` and `hints` (and `tutorialPanels` where present) for every lesson across all 8 tracks. Authoring constraints enforced by the backend: - The translated `instructions` array length **must equal** the English instruction count for that lesson, and likewise for `hints` — a mismatch makes the backend discard the translation and fall back to English (silent). - Preserve `{seedToken}` placeholders verbatim — they're late-bound to the attempt's randomized values via `ApplySeedTokens` (#215). e.g. `print exactly: {target}`. - Preserve inline `` `code` `` backtick spans and any markdown (`**bold**`, `\n`) so chips/formatting render identically. - Code, signatures, and identifiers stay in English; only prose is translated. ## Suggested approach - Tackle one track at a time (start with C#, the largest learner-facing track) so quality can be reviewed before scaling. - Consider a small validation/CI check that flags any `es` lesson whose `instructions`/`hints` count diverges from the English source, so future English edits don't silently re-break a translation. ## Related - Depends on the locale re-fetch from #275 (spikersoft-angular PR #82). - Pilot precedent: lesson 100 instructions (#215). ## Severity Medium — Spanish users get a mixed-language lesson body until translations land. Frontend behavior is otherwise correct.
Author
Owner

Resolved across all eight playground tracks. Spanish instructions, hints, and tutorialPanels (plus any previously-missing title/description) have been authored for every lesson, with array counts matched to the English source so nothing silently falls back to English. The CurriculumLocale count-parity guard was added/verified and passes.

Merged to master in spikersoft-backend:

Track PR
C# #25
JavaScript #26
Python #27
C #28
C++ #29
SQL #30
regex #31
x86 #32

Seed-token placeholders, inline code spans, markdown, and code/identifiers were preserved verbatim; only prose was translated. Closing.

Resolved across all eight playground tracks. Spanish `instructions`, `hints`, and `tutorialPanels` (plus any previously-missing `title`/`description`) have been authored for every lesson, with array counts matched to the English source so nothing silently falls back to English. The `CurriculumLocale` count-parity guard was added/verified and passes. Merged to `master` in spikersoft-backend: | Track | PR | |---|---| | C# | #25 | | JavaScript | #26 | | Python | #27 | | C | #28 | | C++ | #29 | | SQL | #30 | | regex | #31 | | x86 | #32 | Seed-token placeholders, inline code spans, markdown, and code/identifiers were preserved verbatim; only prose was translated. Closing.
Sign in to join this conversation.