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.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.
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).
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.
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.
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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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— noinstructionsarray:The backend (
LessonStrategyBase.Localization.cs→FinalizeAttemptWithLocale) only substitutes Spanish instructions/hints when the translation carries aninstructions/hintsarray 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/*.jsoninstructionsSo only 1 of ~402 lesson entries has translated instructions/hints.
Scope of work
Author Spanish
instructionsandhints(andtutorialPanelswhere present) for every lesson across all 8 tracks. Authoring constraints enforced by the backend:instructionsarray length must equal the English instruction count for that lesson, and likewise forhints— a mismatch makes the backend discard the translation and fall back to English (silent).{seedToken}placeholders verbatim — they're late-bound to the attempt's randomized values viaApplySeedTokens(#215). e.g.print exactly: {target}.`code`backtick spans and any markdown (**bold**,\n) so chips/formatting render identically.Suggested approach
eslesson whoseinstructions/hintscount diverges from the English source, so future English edits don't silently re-break a translation.Related
Severity
Medium — Spanish users get a mixed-language lesson body until translations land. Frontend behavior is otherwise correct.
Resolved across all eight playground tracks. Spanish
instructions,hints, andtutorialPanels(plus any previously-missingtitle/description) have been authored for every lesson, with array counts matched to the English source so nothing silently falls back to English. TheCurriculumLocalecount-parity guard was added/verified and passes.Merged to
masterin spikersoft-backend:Seed-token placeholders, inline code spans, markdown, and code/identifiers were preserved verbatim; only prose was translated. Closing.