Problem
Selecting Spanish, French, German, or Chinese changes a handful of interface labels and the speech-synthesis locale, but the spelling curriculum remains English. The app then asks a non-English voice to pronounce English strings such as cat, dog, and yellow, while category names, age-level names, instructions, dashboard copy, and most controls remain English.
This makes the advertised “full translation + speech” behavior misleading and can actively teach incorrect pronunciation.
Evidence
game.js defines a single English-only curriculum object for every age and category.
advanced-systems.js contains UI string maps, but MultiLanguageSupport.setLanguage() only calls updateUI() and updateGameModeLabels().
- Only a small number of elements in
game.html use data-translate.
speakInLanguage(currentWord) applies the selected locale to the unchanged English word.
updateAgeDisplay() renders English curriculum/category names directly.
Proposed implementation
- Define a locale-aware curriculum schema with stable IDs and per-locale spelling, display text, phoneme/audio metadata, image description, and age/category placement.
- Move all user-visible strings out of HTML/JavaScript into complete locale catalogs, including validation, instructions, dashboard, settings, achievements, and game-mode copy.
- Make locale fallback explicit and visible; never silently pronounce English content with a different locale.
- Prefer reviewed/recorded phonics audio where browser TTS cannot reliably teach letter sounds.
- Persist locale per child profile rather than as one browser-global setting.
- Add automated catalog-completeness and curriculum-schema checks, plus native-speaker review guidance.
Acceptance criteria
- Each advertised locale has a reviewed, age-appropriate word curriculum; unsupported locale/category combinations clearly fall back to English as a unit.
- The selected language controls the word, answer letters, speech/audio, category and level names, instructions, feedback, settings, and dashboard.
- No English word is sent to a non-English TTS voice unless that content is explicitly marked as English.
- Missing and extra translation keys fail CI.
- Locale switching cannot change the identity/history of already-recorded attempts.
- Documentation states the actual coverage and review status of every locale.
Testing notes
- Add unit tests for fallback resolution and locale persistence.
- Add an end-to-end pass that completes one word in every locale and asserts text, answer, and speech locale agree.
- Include CJK handling in letter segmentation; do not assume
word.split('') is a pedagogically valid character model.
Problem
Selecting Spanish, French, German, or Chinese changes a handful of interface labels and the speech-synthesis locale, but the spelling curriculum remains English. The app then asks a non-English voice to pronounce English strings such as
cat,dog, andyellow, while category names, age-level names, instructions, dashboard copy, and most controls remain English.This makes the advertised “full translation + speech” behavior misleading and can actively teach incorrect pronunciation.
Evidence
game.jsdefines a single English-onlycurriculumobject for every age and category.advanced-systems.jscontains UI string maps, butMultiLanguageSupport.setLanguage()only callsupdateUI()andupdateGameModeLabels().game.htmlusedata-translate.speakInLanguage(currentWord)applies the selected locale to the unchanged English word.updateAgeDisplay()renders English curriculum/category names directly.Proposed implementation
Acceptance criteria
Testing notes
word.split('')is a pedagogically valid character model.