Add SBS Ch4 and WTE2 Ch5, implement image support in discovery modules

- Add SBS chapter 4 (possessive adjectives and short answers)
- Add WTE2 chapter 5 (family activities and short 'a' phonics)
- Implement image display in WordDiscoveryModule
- Add image support in LetterDiscovery and WordDiscovery games
- Update CSS for word cards with images
- Load phonics words from letters section with priority

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
StillHammer 2025-12-23 07:13:23 +08:00
parent 5df1c1b4bf
commit aee1265933
8 changed files with 1695 additions and 19 deletions

View File

@ -20,7 +20,7 @@
],
"content_tags": ["vocabulary", "grammar", "conversation", "practical-english"],
"total_chapters": 12,
"available_chapters": ["2", "3", "7-8", "8", "9", "10"],
"available_chapters": ["2", "3", "4", "7-8", "8", "9", "10"],
"completion_criteria": {
"overall_progress": 80,
"chapters_completed": 8,
@ -68,6 +68,26 @@
"dialogs_count": 4,
"exercises_count": 3
},
{
"id": "sbs-4",
"chapter_number": "4",
"name": "To Be: Short Answers / Possessive Adjectives",
"description": "Learn possessive adjectives and short answers with everyday activities",
"estimated_hours": 16,
"difficulty": "beginner",
"prerequisites": ["sbs-3"],
"learning_objectives": [
"Master possessive adjectives (my, his, her, its, our, your, their)",
"Learn short answers with to be (Yes, I am / Yes, he is)",
"Practice everyday activities vocabulary",
"Use Are you busy? pattern",
"Learn to attract someone's attention"
],
"vocabulary_count": 47,
"phrases_count": 16,
"dialogs_count": 4,
"exercises_count": 5
},
{
"id": "sbs-7-8",
"chapter_number": "7-8",

638
content/chapters/sbs-4.json Normal file
View File

@ -0,0 +1,638 @@
{
"id": "sbs-4",
"book_id": "sbs",
"name": "To Be: Short Answers / Possessive Adjectives",
"description": "Side by Side Level 4 - Possessive adjectives and short answers with everyday activities",
"difficulty": "beginner",
"language": "en-US",
"chapter_number": "4",
"metadata": {
"version": "1.0",
"created": "2025-12-13",
"updated": "2025-12-13",
"source": "Side by Side English Learning Series",
"target_level": "beginner",
"estimated_hours": 16,
"prerequisites": ["sbs-3"],
"learning_objectives": [
"Master possessive adjectives (my, his, her, its, our, your, their)",
"Learn short answers with to be (Yes, I am / Yes, he is)",
"Practice everyday activities vocabulary",
"Use Are you busy? pattern",
"Learn to attract someone's attention"
],
"content_tags": ["grammar", "possessive-adjectives", "short-answers", "activities", "beginner-english"],
"completion_criteria": {
"vocabulary_mastery": 80,
"quiz_score": 75,
"games_completed": 3
}
},
"vocabulary": {
"brushing": { "user_language": "刷", "type": "verb-ing", "pronunciation": "/ˈbrʌʃɪŋ/" },
"cleaning": { "user_language": "打扫", "type": "verb-ing", "pronunciation": "/ˈkliːnɪŋ/" },
"feeding": { "user_language": "喂", "type": "verb-ing", "pronunciation": "/ˈfiːdɪŋ/" },
"fixing": { "user_language": "修理", "type": "verb-ing", "pronunciation": "/ˈfɪksɪŋ/" },
"painting": { "user_language": "粉刷,绘画", "type": "verb-ing", "pronunciation": "/ˈpeɪntɪŋ/" },
"reading": { "user_language": "读,阅读", "type": "verb-ing", "pronunciation": "/ˈriːdɪŋ/" },
"washing": { "user_language": "洗", "type": "verb-ing", "pronunciation": "/ˈwɑːʃɪŋ/" },
"doing": { "user_language": "做", "type": "verb-ing", "pronunciation": "/ˈduːɪŋ/" },
"sink": { "user_language": "水槽", "type": "noun", "pronunciation": "/sɪŋk/" },
"car": { "user_language": "汽车", "type": "noun", "pronunciation": "/kɑːr/" },
"room": { "user_language": "房间", "type": "noun", "pronunciation": "/ruːm/" },
"apartment": { "user_language": "公寓", "type": "noun", "pronunciation": "/əˈpɑːrtmənt/" },
"homework": { "user_language": "作业", "type": "noun", "pronunciation": "/ˈhoʊmwɜːrk/" },
"hair": { "user_language": "头发", "type": "noun", "pronunciation": "/her/" },
"cat": { "user_language": "猫", "type": "noun", "pronunciation": "/kæt/" },
"TV": { "user_language": "电视", "type": "noun", "pronunciation": "/ˌtiːˈviː/" },
"bedroom": { "user_language": "卧室", "type": "noun", "pronunciation": "/ˈbedruːm/" },
"garage": { "user_language": "车库", "type": "noun", "pronunciation": "/ɡəˈrɑːʒ/" },
"dog": { "user_language": "狗", "type": "noun", "pronunciation": "/dɔːɡ/" },
"clothes": { "user_language": "衣服", "type": "noun", "pronunciation": "/kloʊðz/" },
"exercises": { "user_language": "练习", "type": "noun", "pronunciation": "/ˈeksərsaɪzɪz/" },
"bicycle": { "user_language": "自行车", "type": "noun", "pronunciation": "/ˈbaɪsɪkəl/" },
"yard": { "user_language": "院子", "type": "noun", "pronunciation": "/jɑːrd/" },
"teeth": { "user_language": "牙齿", "type": "noun", "pronunciation": "/tiːθ/" },
"windows": { "user_language": "窗户", "type": "noun", "pronunciation": "/ˈwɪndoʊz/" },
"e-mail": { "user_language": "电子邮件", "type": "noun", "pronunciation": "/ˈiːmeɪl/" },
"bathroom": { "user_language": "浴室", "type": "noun", "pronunciation": "/ˈbæθruːm/" },
"kitchen": { "user_language": "厨房", "type": "noun", "pronunciation": "/ˈkɪɪn/" },
"living room": { "user_language": "客厅", "type": "noun", "pronunciation": "/ˈlɪvɪŋ ruːm/" },
"busy": { "user_language": "忙碌的", "type": "adjective", "pronunciation": "/ˈbɪzi/" },
"my": { "user_language": "我的", "type": "possessive-adjective", "pronunciation": "/maɪ/" },
"his": { "user_language": "他的", "type": "possessive-adjective", "pronunciation": "/hɪz/" },
"her": { "user_language": "她的", "type": "possessive-adjective", "pronunciation": "/hɜːr/" },
"its": { "user_language": "它的", "type": "possessive-adjective", "pronunciation": "/ɪts/" },
"our": { "user_language": "我们的", "type": "possessive-adjective", "pronunciation": "/aʊr/" },
"your": { "user_language": "你的,你们的", "type": "possessive-adjective", "pronunciation": "/jɔːr/" },
"their": { "user_language": "他们的", "type": "possessive-adjective", "pronunciation": "/ðer/" },
"park": { "user_language": "公园", "type": "noun", "pronunciation": "/pɑːrk/" },
"library": { "user_language": "图书馆", "type": "noun", "pronunciation": "/ˈlaɪbreri/" },
"laundromat": { "user_language": "自助洗衣店", "type": "noun", "pronunciation": "/ˈːndrəmæt/" },
"restaurant": { "user_language": "餐厅", "type": "noun", "pronunciation": "/ˈrestrɑːnt/" },
"Health Club": { "user_language": "健身俱乐部", "type": "noun", "pronunciation": "/helθ klʌb/" },
"basketball": { "user_language": "篮球", "type": "noun", "pronunciation": "/ˈbæskɪtbɔːl/" },
"radio": { "user_language": "收音机", "type": "noun", "pronunciation": "/ˈreɪdioʊ/" },
"neighbors": { "user_language": "邻居", "type": "noun", "pronunciation": "/ˈneɪbərz/" },
"watching": { "user_language": "观看", "type": "verb-ing", "pronunciation": "/ˈwɑːɪŋ/" },
"listening": { "user_language": "听", "type": "verb-ing", "pronunciation": "/ˈlɪsənɪŋ/" }
},
"phrases": {
"What are you doing?": { "user_language": "你在做什么?", "context": "asking-about-activity", "pronunciation": "/wʌt ɑːr juː ˈduːɪŋ/" },
"I'm fixing my sink": { "user_language": "我在修我的水槽", "context": "describing-activity", "pronunciation": "/aɪm ˈfɪksɪŋ maɪ sɪŋk/" },
"He's fixing his car": { "user_language": "他在修他的车", "context": "describing-activity", "pronunciation": "/hiːz ˈfɪksɪŋ hɪz kɑːr/" },
"She's cleaning her room": { "user_language": "她在打扫她的房间", "context": "describing-activity", "pronunciation": "/ʃiːz ˈkliːnɪŋ hɜːr ruːm/" },
"We're cleaning our apartment": { "user_language": "我们在打扫我们的公寓", "context": "describing-activity", "pronunciation": "/wɪr ˈkliːnɪŋ aʊr əˈpɑːrtmənt/" },
"They're doing their homework": { "user_language": "他们在做他们的作业", "context": "describing-activity", "pronunciation": "/ðeɪr ˈduːɪŋ ðer ˈhoʊmwɜːrk/" },
"Are you busy?": { "user_language": "你忙吗?", "context": "asking-availability", "pronunciation": "/ɑːr juː ˈbɪzi/" },
"Yes, I am": { "user_language": "是的,我忙", "context": "short-answer", "pronunciation": "/jes aɪ æm/" },
"Yes, he is": { "user_language": "是的,他忙", "context": "short-answer", "pronunciation": "/jes hiː ɪz/" },
"Yes, she is": { "user_language": "是的,她忙", "context": "short-answer", "pronunciation": "/jes ʃiː ɪz/" },
"Yes, we are": { "user_language": "是的,我们忙", "context": "short-answer", "pronunciation": "/jes wiː ɑːr/" },
"Yes, they are": { "user_language": "是的,他们忙", "context": "short-answer", "pronunciation": "/jes ðeɪ ɑːr/" },
"I'm washing my hair": { "user_language": "我在洗我的头发", "context": "describing-activity", "pronunciation": "/aɪm ˈwɑːʃɪŋ maɪ her/" },
"Jane?": { "user_language": "简?", "context": "attracting-attention", "pronunciation": "/dʒeɪn/" },
"Yes?": { "user_language": "什么事?", "context": "responding-attention", "pronunciation": "/jes/" },
"I'm doing my exercises": { "user_language": "我在做我的练习", "context": "describing-activity", "pronunciation": "/aɪm ˈduːɪŋ maɪ ˈeksərsaɪzɪz/" }
},
"dialogs": {
"fixing_possessives": {
"title": "I'm Fixing My Sink",
"participants": ["Person A", "Person B"],
"lines": [
{ "speaker": "Person A", "text": "Hi! What are you doing?", "user_language": "嗨!你在做什么?" },
{ "speaker": "Person B", "text": "I'm fixing my sink.", "user_language": "我在修我的水槽。" },
{ "speaker": "Person A", "text": "What's Bob doing?", "user_language": "鲍勃在做什么?" },
{ "speaker": "Person B", "text": "He's fixing his car.", "user_language": "他在修他的车。" },
{ "speaker": "Person A", "text": "What's Mary doing?", "user_language": "玛丽在做什么?" },
{ "speaker": "Person B", "text": "She's cleaning her room.", "user_language": "她在打扫她的房间。" },
{ "speaker": "Person A", "text": "What are you doing?", "user_language": "你们在做什么?" },
{ "speaker": "Person B", "text": "We're cleaning our apartment.", "user_language": "我们在打扫我们的公寓。" },
{ "speaker": "Person A", "text": "What are your children doing?", "user_language": "你的孩子们在做什么?" },
{ "speaker": "Person B", "text": "They're doing their homework.", "user_language": "他们在做他们的作业。" }
]
},
"are_you_busy": {
"title": "Are You Busy?",
"participants": ["Person A", "Person B"],
"lines": [
{ "speaker": "Person A", "text": "Are you busy?", "user_language": "你忙吗?" },
{ "speaker": "Person B", "text": "Yes, I am. I'm washing my hair.", "user_language": "是的,我忙。我在洗我的头发。" }
]
},
"attracting_attention": {
"title": "Attracting Someone's Attention",
"participants": ["Person A", "Person B"],
"lines": [
{ "speaker": "Person A", "text": "Jane?", "user_language": "简?" },
{ "speaker": "Person B", "text": "Yes?", "user_language": "什么事?" },
{ "speaker": "Person A", "text": "What are you doing?", "user_language": "你在做什么?" },
{ "speaker": "Person B", "text": "I'm doing my exercises.", "user_language": "我在做我的练习。" }
]
},
"location_activity": {
"title": "Where & What",
"participants": ["Person A", "Person B"],
"lines": [
{ "speaker": "Person A", "text": "Where's Mr. Molina?", "user_language": "莫利纳先生在哪里?" },
{ "speaker": "Person B", "text": "He's in the park.", "user_language": "他在公园。" },
{ "speaker": "Person A", "text": "What's he doing?", "user_language": "他在做什么?" },
{ "speaker": "Person B", "text": "He's listening to the radio.", "user_language": "他在听收音机。" },
{ "speaker": "Person A", "text": "Where are Mr. and Mrs. Sharp?", "user_language": "夏普先生和太太在哪里?" },
{ "speaker": "Person B", "text": "They're in the laundromat.", "user_language": "他们在自助洗衣店。" },
{ "speaker": "Person A", "text": "What are they doing?", "user_language": "他们在做什么?" },
{ "speaker": "Person B", "text": "They're washing their clothes.", "user_language": "他们在洗他们的衣服。" }
]
}
},
"texts": [
{
"title": "A Busy Day",
"original_language": "Everybody at 159 River Street is very busy today. Mr. Price is cleaning his bedroom. Ms. Hunter is painting her bathroom. Ricky Gomez is feeding his cat. Mr. and Mrs. Wong are washing their clothes. Mrs. Martin is doing her exercises. And Judy and Larry Clark are fixing their car. I'm busy, too. I'm washing my windows... and of course, I'm watching all my neighbors. It's a very busy day at 159 River Street.",
"user_language": "今天159河街的每个人都很忙。普莱斯先生在打扫他的卧室。亨特女士在粉刷她的浴室。里基·戈麦斯在喂他的猫。黄先生和黄太太在洗他们的衣服。马丁太太在做她的练习。朱迪和拉里·克拉克在修他们的车。我也很忙。我在洗我的窗户……当然我在观察所有的邻居。159河街今天真是繁忙的一天。"
},
{
"title": "A Busy Day at 320 Main Street",
"original_language": "Everybody at 320 Main Street is very busy today. Alex Molina is feeding his dog. Jessica Harris is reading. Mr. and Mrs. Chang are brushing their teeth. Mr. Sharp is sleeping. Patty Williams is working on her computer. Hector Lopez is fixing his car. Mr. and Mrs. Hassan are drinking. It's a very busy day at 320 Main Street.",
"user_language": "今天320主街的每个人都很忙。亚历克斯·莫利纳在喂他的狗。杰西卡·哈里斯在读书。张先生和张太太在刷他们的牙齿。夏普先生在睡觉。帕蒂·威廉姆斯在用她的电脑工作。赫克托·洛佩兹在修他的车。哈桑先生和哈桑太太在喝东西。320主街今天真是繁忙的一天。"
}
],
"grammar": {
"possessive-adjectives": {
"title": "Possessive Adjectives (所有格形容词)",
"explanation": "Use possessive adjectives to show ownership. They come before nouns.",
"examples": [
{
"english": "I → my (I'm fixing my sink)",
"translation": "我 → 我的(我在修我的水槽)",
"explanation": "Use 'my' with 'I'"
},
{
"english": "he → his (He's fixing his car)",
"translation": "他 → 他的(他在修他的车)",
"explanation": "Use 'his' with 'he'"
},
{
"english": "she → her (She's cleaning her room)",
"translation": "她 → 她的(她在打扫她的房间)",
"explanation": "Use 'her' with 'she'"
},
{
"english": "it → its (The dog is eating its food)",
"translation": "它 → 它的(狗在吃它的食物)",
"explanation": "Use 'its' with 'it'"
},
{
"english": "we → our (We're cleaning our apartment)",
"translation": "我们 → 我们的(我们在打扫我们的公寓)",
"explanation": "Use 'our' with 'we'"
},
{
"english": "you → your (You're doing your homework)",
"translation": "你/你们 → 你的/你们的(你在做你的作业)",
"explanation": "Use 'your' with 'you'"
},
{
"english": "they → their (They're doing their homework)",
"translation": "他们 → 他们的(他们在做他们的作业)",
"explanation": "Use 'their' with 'they'"
}
]
},
"short-answers": {
"title": "Short Answers with To Be (To Be 的简短回答)",
"explanation": "When answering yes/no questions with to be, use short answers with the correct form of to be.",
"examples": [
{
"english": "Are you busy? - Yes, I am.",
"translation": "你忙吗?- 是的,我忙。",
"explanation": "Answer 'Are you' questions with 'I am'"
},
{
"english": "Is he busy? - Yes, he is.",
"translation": "他忙吗?- 是的,他忙。",
"explanation": "Answer 'Is he/she/it' questions with 'he/she/it is'"
},
{
"english": "Are they busy? - Yes, they are.",
"translation": "他们忙吗?- 是的,他们忙。",
"explanation": "Answer 'Are they/we' questions with 'they/we are'"
}
]
},
"deleted-h": {
"title": "Deleted h Pronunciation (删除h发音)",
"explanation": "In natural English speech, the 'h' sound in possessive adjectives (his, her) is often not pronounced clearly, especially in fast speech.",
"examples": [
{
"english": "She's fixing her car → She's fixing 'er car",
"translation": "她在修她的车",
"explanation": "The 'h' in 'her' may be barely heard"
},
{
"english": "He's feeding his dog → He's feeding 'is dog",
"translation": "他在喂他的狗",
"explanation": "The 'h' in 'his' may be barely heard"
}
]
}
},
"fillInBlanks": [
{
"sentence": "I'm fixing ___ sink",
"options": ["my", "his", "her", "their"],
"correctAnswer": "my",
"explanation": "Use 'my' with 'I'",
"grammarFocus": "possessive-adjectives"
},
{
"sentence": "He's cleaning ___ apartment",
"options": ["his", "her", "my", "their"],
"correctAnswer": "his",
"explanation": "Use 'his' with 'he'",
"grammarFocus": "possessive-adjectives"
},
{
"sentence": "She's feeding ___ cat",
"options": ["her", "his", "my", "our"],
"correctAnswer": "her",
"explanation": "Use 'her' with 'she'",
"grammarFocus": "possessive-adjectives"
},
{
"sentence": "We're doing ___ homework",
"options": ["our", "their", "my", "your"],
"correctAnswer": "our",
"explanation": "Use 'our' with 'we'",
"grammarFocus": "possessive-adjectives"
},
{
"sentence": "They're washing ___ clothes",
"options": ["their", "our", "his", "her"],
"correctAnswer": "their",
"explanation": "Use 'their' with 'they'",
"grammarFocus": "possessive-adjectives"
},
{
"sentence": "You're brushing ___ teeth",
"options": ["your", "my", "his", "their"],
"correctAnswer": "your",
"explanation": "Use 'your' with 'you'",
"grammarFocus": "possessive-adjectives"
},
{
"sentence": "Are you busy? - Yes, I ___",
"options": ["am", "is", "are", "do"],
"correctAnswer": "am",
"explanation": "Use 'I am' in short answers",
"grammarFocus": "short-answers"
},
{
"sentence": "Is Frank busy? - Yes, he ___",
"options": ["is", "am", "are", "does"],
"correctAnswer": "is",
"explanation": "Use 'he is' in short answers",
"grammarFocus": "short-answers"
},
{
"sentence": "Are Jim and Lisa busy? - Yes, they ___",
"options": ["are", "is", "am", "do"],
"correctAnswer": "are",
"explanation": "Use 'they are' in short answers",
"grammarFocus": "short-answers"
},
{
"sentence": "Is Helen busy? - Yes, she ___",
"options": ["is", "am", "are", "does"],
"correctAnswer": "is",
"explanation": "Use 'she is' in short answers",
"grammarFocus": "short-answers"
},
{
"sentence": "Mr. Price is cleaning ___ bedroom",
"options": ["his", "her", "my", "their"],
"correctAnswer": "his",
"explanation": "Mr. Price is male, use 'his'",
"grammarFocus": "possessive-adjectives"
},
{
"sentence": "Ms. Hunter is painting ___ bathroom",
"options": ["her", "his", "my", "our"],
"correctAnswer": "her",
"explanation": "Ms. Hunter is female, use 'her'",
"grammarFocus": "possessive-adjectives"
},
{
"sentence": "Are you ___ your exercises?",
"options": ["doing", "do", "does", "to do"],
"correctAnswer": "doing",
"explanation": "Use verb-ing form in present continuous",
"grammarFocus": "present-continuous"
},
{
"sentence": "Judy and Larry are fixing ___ car",
"options": ["their", "his", "her", "our"],
"correctAnswer": "their",
"explanation": "Use 'their' with plural subjects",
"grammarFocus": "possessive-adjectives"
},
{
"sentence": "I'm ___ my windows",
"options": ["washing", "wash", "washes", "to wash"],
"correctAnswer": "washing",
"explanation": "Use verb-ing form in present continuous",
"grammarFocus": "present-continuous"
}
],
"corrections": [
{
"correct": "I'm fixing my sink",
"incorrect": "I'm fixing me sink",
"explanation": "Use possessive 'my', not object pronoun 'me'",
"grammarFocus": "possessive-adjectives"
},
{
"correct": "He's cleaning his apartment",
"incorrect": "He's cleaning he apartment",
"explanation": "Use possessive 'his', not subject pronoun 'he'",
"grammarFocus": "possessive-adjectives"
},
{
"correct": "She's feeding her cat",
"incorrect": "She's feeding she cat",
"explanation": "Use possessive 'her', not subject pronoun 'she'",
"grammarFocus": "possessive-adjectives"
},
{
"correct": "We're doing our homework",
"incorrect": "We're doing we homework",
"explanation": "Use possessive 'our', not subject pronoun 'we'",
"grammarFocus": "possessive-adjectives"
},
{
"correct": "They're washing their clothes",
"incorrect": "They're washing they clothes",
"explanation": "Use possessive 'their', not subject pronoun 'they'",
"grammarFocus": "possessive-adjectives"
},
{
"correct": "Yes, I am",
"incorrect": "Yes, I'm",
"explanation": "In short answers, don't use contractions",
"grammarFocus": "short-answers"
},
{
"correct": "Yes, he is",
"incorrect": "Yes, he's",
"explanation": "In short answers, don't use contractions",
"grammarFocus": "short-answers"
},
{
"correct": "You're brushing your teeth",
"incorrect": "You're brushing you teeth",
"explanation": "Use possessive 'your', not subject pronoun 'you'",
"grammarFocus": "possessive-adjectives"
},
{
"correct": "Are you busy?",
"incorrect": "You are busy?",
"explanation": "In yes/no questions, put 'are' before the subject",
"grammarFocus": "questions"
},
{
"correct": "Its food (the dog's food)",
"incorrect": "It's food",
"explanation": "Use 'its' (possessive), not 'it's' (it is)",
"grammarFocus": "possessive-adjectives"
}
],
"exercises": {
"busy_people": {
"type": "conversation_practice",
"instructions": "Ask and answer: Is [person] busy? What's he/she doing?",
"items": [
{ "person": "Frank", "activity": "cleaning his apartment", "user_language": "弗兰克", "user_language_activity": "打扫他的公寓" },
{ "person": "Helen", "activity": "feeding her cat", "user_language": "海伦", "user_language_activity": "喂她的猫" },
{ "person": "Richard", "activity": "washing his clothes", "user_language": "理查德", "user_language_activity": "洗他的衣服" },
{ "person": "Timmy", "activity": "feeding his dog", "user_language": "蒂米", "user_language_activity": "喂他的狗" },
{ "person": "Karen", "activity": "washing her car", "user_language": "凯伦", "user_language_activity": "洗她的车" },
{ "person": "Anwar", "activity": "cleaning his yard", "user_language": "安瓦尔", "user_language_activity": "打扫他的院子" },
{ "person": "Wendy", "activity": "reading her e-mail", "user_language": "温迪", "user_language_activity": "读她的电子邮件" }
]
},
"busy_groups": {
"type": "conversation_practice",
"instructions": "Ask and answer: Are [people] busy? What are they doing?",
"items": [
{ "people": "Jim and Lisa", "activity": "painting their bedroom", "user_language": "吉姆和丽莎", "user_language_activity": "粉刷他们的卧室" },
{ "people": "Ed and Ruth", "activity": "painting their garage", "user_language": "埃德和露丝", "user_language_activity": "粉刷他们的车库" },
{ "people": "your children", "activity": "brushing their teeth", "user_language": "你的孩子们", "user_language_activity": "刷他们的牙齿" }
]
},
"we_busy": {
"type": "conversation_practice",
"instructions": "Ask and answer: Are you busy? What are you doing? (we)",
"items": [
{ "activity": "fixing our TV", "user_language_activity": "修我们的电视" },
{ "activity": "doing our exercises", "user_language_activity": "做我们的练习" },
{ "activity": "washing our windows", "user_language_activity": "洗我们的窗户" }
]
},
"i_busy": {
"type": "conversation_practice",
"instructions": "Ask and answer: Are you busy? What are you doing? (I)",
"items": [
{ "activity": "doing my homework", "user_language_activity": "做我的作业" },
{ "activity": "fixing my bicycle", "user_language_activity": "修我的自行车" }
]
},
"reading_check": {
"type": "true_false",
"instructions": "A Busy Day - True or False?",
"items": [
{ "statement": "Mr. Price is in his bedroom", "answer": true, "user_language": "普莱斯先生在他的卧室" },
{ "statement": "Ricky is eating", "answer": false, "user_language": "里基在吃东西" },
{ "statement": "Mr. and Mrs. Clark are in their apartment", "answer": false, "user_language": "克拉克先生和太太在他们的公寓" },
{ "statement": "Mrs. Martin is doing her exercises", "answer": true, "user_language": "马丁太太在做她的练习" },
{ "statement": "Their address is 195 River Street", "answer": false, "user_language": "他们的地址是河街195号" }
]
}
},
"thematic_questions": {
"possessive_my_his_her": [
{
"id": "q1",
"question": "What are you fixing?",
"question_user_language": "你在修什么?",
"tts_enabled": true,
"example_responses": [
"I'm fixing my sink",
"I'm fixing my car",
"I'm fixing my bicycle"
],
"theme": "possessive_my_his_her"
},
{
"id": "q2",
"question": "What's Bob fixing?",
"question_user_language": "鲍勃在修什么?",
"tts_enabled": true,
"example_responses": [
"He's fixing his car",
"He's fixing his sink",
"He's fixing his TV"
],
"theme": "possessive_my_his_her"
},
{
"id": "q3",
"question": "What's Mary cleaning?",
"question_user_language": "玛丽在打扫什么?",
"tts_enabled": true,
"example_responses": [
"She's cleaning her room",
"She's cleaning her apartment",
"She's cleaning her kitchen"
],
"theme": "possessive_my_his_her"
}
],
"possessive_our_your_their": [
{
"id": "q4",
"question": "What are you doing? (we)",
"question_user_language": "你们在做什么?",
"tts_enabled": true,
"example_responses": [
"We're cleaning our apartment",
"We're doing our homework",
"We're washing our windows"
],
"theme": "possessive_our_your_their"
},
{
"id": "q5",
"question": "What are your children doing?",
"question_user_language": "你的孩子们在做什么?",
"tts_enabled": true,
"example_responses": [
"They're doing their homework",
"They're brushing their teeth",
"They're washing their clothes"
],
"theme": "possessive_our_your_their"
},
{
"id": "q6",
"question": "What are Jim and Lisa painting?",
"question_user_language": "吉姆和丽莎在粉刷什么?",
"tts_enabled": true,
"example_responses": [
"They're painting their bedroom",
"They're painting their garage",
"They're painting their kitchen"
],
"theme": "possessive_our_your_their"
}
],
"short_answers": [
{
"id": "q7",
"question": "Are you busy?",
"question_user_language": "你忙吗?",
"tts_enabled": true,
"example_responses": [
"Yes, I am. I'm washing my hair",
"Yes, I am. I'm doing my homework",
"Yes, I am. I'm fixing my bicycle"
],
"theme": "short_answers"
},
{
"id": "q8",
"question": "Is Frank busy?",
"question_user_language": "弗兰克忙吗?",
"tts_enabled": true,
"example_responses": [
"Yes, he is. He's cleaning his apartment",
"Yes, he is",
"Yes, he is. He's very busy"
],
"theme": "short_answers"
},
{
"id": "q9",
"question": "Is Helen busy?",
"question_user_language": "海伦忙吗?",
"tts_enabled": true,
"example_responses": [
"Yes, she is. She's feeding her cat",
"Yes, she is",
"Yes, she is. She's very busy"
],
"theme": "short_answers"
},
{
"id": "q10",
"question": "Are Jim and Lisa busy?",
"question_user_language": "吉姆和丽莎忙吗?",
"tts_enabled": true,
"example_responses": [
"Yes, they are. They're painting their bedroom",
"Yes, they are",
"Yes, they are. They're very busy"
],
"theme": "short_answers"
}
],
"reading_comprehension": [
{
"id": "q11",
"question": "What's Mr. Price doing at 159 River Street?",
"question_user_language": "普莱斯先生在河街159号做什么",
"tts_enabled": true,
"example_responses": [
"He's cleaning his bedroom",
"Cleaning his bedroom",
"He's in his bedroom cleaning"
],
"theme": "reading_comprehension"
},
{
"id": "q12",
"question": "What's Ms. Hunter doing?",
"question_user_language": "亨特女士在做什么?",
"tts_enabled": true,
"example_responses": [
"She's painting her bathroom",
"Painting her bathroom",
"She's busy painting"
],
"theme": "reading_comprehension"
},
{
"id": "q13",
"question": "What are Mr. and Mrs. Wong doing?",
"question_user_language": "黄先生和黄太太在做什么?",
"tts_enabled": true,
"example_responses": [
"They're washing their clothes",
"Washing their clothes",
"They're doing laundry"
],
"theme": "reading_comprehension"
}
]
},
"statistics": {
"vocabulary_count": 47,
"phrases_count": 16,
"dialogs_count": 4,
"texts_count": 2,
"exercises_count": 5,
"fillInBlanks_count": 15,
"corrections_count": 10,
"thematic_questions_count": 13,
"estimated_completion_time": 16
}
}

View File

@ -0,0 +1,820 @@
{
"id": "wte2-5",
"book_id": "wte2",
"name": "Happy Moments & Short A Phonics",
"description": "Welcome to English 2 - Chapter 5: Learn about family activities with present continuous, describe what people are doing, and master short 'a' phonics with word families (am, an, ad, ag, ap, at)",
"difficulty": "beginner",
"language": "en-US",
"chapter_number": "5",
"metadata": {
"version": "1.0",
"created": "2025-12-06",
"updated": "2025-12-06",
"source": "Welcome to English 2 - Oxford University Press + Phonics Review 1",
"target_level": "beginner",
"estimated_hours": 5,
"prerequisites": ["wte2-1", "wte2-2", "wte2-3", "wte2-4"],
"learning_objectives": [
"Use present continuous to describe family activities",
"Ask and answer 'What is he/she doing?' and 'What are they doing?'",
"Learn family vocabulary: father, mother, sister, brother, grandma, grandpa",
"Learn action verbs with -ing: cooking, playing, watching, making, riding, dancing, singing, eating, sleeping",
"Master short 'a' sound (/æ/) and word families",
"Recognize rhyming words with short 'a'",
"Practice /w/ sound with 'wh' words"
],
"content_tags": ["present-continuous", "family", "activities", "phonics", "short-a", "rhyming", "young-learners"],
"completion_criteria": {
"vocabulary_mastery": 80,
"quiz_score": 75,
"games_completed": 2
}
},
"letters": {
"a": [
{ "word": "cat", "translation": "猫", "type": "noun", "pronunciation": "/kæt/", "image": "assets/a_sound.png" },
{ "word": "ant", "translation": "蚂蚁", "type": "noun", "pronunciation": "/ænt/", "image": "assets/a_sound.png" },
{ "word": "yak", "translation": "牦牛", "type": "noun", "pronunciation": "/jæk/", "image": "assets/a_sound.png" },
{ "word": "ax", "translation": "斧头", "type": "noun", "pronunciation": "/æks/", "image": "assets/a_sound.png" }
],
"am": [
{ "word": "ram", "translation": "公羊", "type": "noun", "pronunciation": "/ræm/", "image": "assets/am_sound.png" },
{ "word": "jam", "translation": "果酱", "type": "noun", "pronunciation": "/dʒæm/", "image": "assets/am_sound.png" },
{ "word": "yam", "translation": "山药", "type": "noun", "pronunciation": "/jæm/", "image": "assets/am_sound.png" },
{ "word": "dam", "translation": "水坝", "type": "noun", "pronunciation": "/dæm/", "image": "assets/am_sound.png" }
],
"an": [
{ "word": "fan", "translation": "风扇", "type": "noun", "pronunciation": "/fæn/", "image": "assets/an_sound.png" },
{ "word": "man", "translation": "男人", "type": "noun", "pronunciation": "/mæn/", "image": "assets/an_sound.png" },
{ "word": "pan", "translation": "平底锅", "type": "noun", "pronunciation": "/pæn/", "image": "assets/an_sound.png" },
{ "word": "can", "translation": "罐头", "type": "noun", "pronunciation": "/kæn/", "image": "assets/an_sound.png" }
]
},
"phonics": {
"short_a": {
"title": "Short A Sound",
"sound": "/æ/",
"description": "The short 'a' sound as in 'cat', 'bag', 'map'",
"word_families": ["am", "an", "ad", "ag", "ap", "at"],
"song": {
"title": "Short A Song",
"lyrics": "Bag, map, ax, cap, fan, can, pan.\nA girl with a bag,\nA man with a map,\nA ram with an ax,\nA yak with a cap,\nA rat with a fan,\nA cat with a can,\nAnd a small ant with a pan."
},
"rhyming_sets": [
{ "words": ["map", "tap", "cap", "nap", "lap", "rap"], "family": "-ap" },
{ "words": ["cat", "rat", "bat", "hat", "mat", "fat"], "family": "-at" },
{ "words": ["dam", "ram", "yam", "jam"], "family": "-am" },
{ "words": ["fan", "can", "man", "pan"], "family": "-an" },
{ "words": ["dad", "pad", "bad", "sad"], "family": "-ad" },
{ "words": ["bag", "rag", "tag"], "family": "-ag" }
]
},
"wh_sound": {
"title": "WH Sound",
"sound": "/w/",
"description": "The 'wh' sound as in 'what', 'white'",
"words": [
{ "word": "watch", "translation": "手表;观看", "pronunciation": "/wɑːtʃ/" },
{ "word": "water", "translation": "水", "pronunciation": "/ˈːtər/" },
{ "word": "what", "translation": "什么", "pronunciation": "/wʌt/" },
{ "word": "white", "translation": "白色", "pronunciation": "/waɪt/" }
],
"practice_words": [
{ "word": "wet", "translation": "湿的", "pronunciation": "/wet/" },
{ "word": "vet", "translation": "兽医", "pronunciation": "/vet/" },
{ "word": "red", "translation": "红色", "pronunciation": "/red/" }
]
}
},
"vocabulary": {
"father": { "user_language": "父亲;爸爸", "type": "noun", "pronunciation": "/ˈfɑːðər/" },
"mother": { "user_language": "母亲;妈妈", "type": "noun", "pronunciation": "/ˈmʌðər/" },
"sister": { "user_language": "姐姐;妹妹", "type": "noun", "pronunciation": "/ˈsɪstər/" },
"brother": { "user_language": "哥哥;弟弟", "type": "noun", "pronunciation": "/ˈbrʌðər/" },
"sisters": { "user_language": "姐妹们", "type": "noun", "pronunciation": "/ˈsɪstərz/" },
"brothers": { "user_language": "兄弟们", "type": "noun", "pronunciation": "/ˈbrʌðərz/" },
"grandma": { "user_language": "奶奶;外婆", "type": "noun", "pronunciation": "/ˈɡrænmɑː/" },
"grandpa": { "user_language": "爷爷;外公", "type": "noun", "pronunciation": "/ˈɡrænpɑː/" },
"mum": { "user_language": "妈妈", "type": "noun", "pronunciation": "/mʌm/" },
"dad": { "user_language": "爸爸", "type": "noun", "pronunciation": "/dæd/" },
"family": { "user_language": "家庭;家人", "type": "noun", "pronunciation": "/ˈfæməli/" },
"photo": { "user_language": "照片", "type": "noun", "pronunciation": "/ˈfoʊtoʊ/" },
"photos": { "user_language": "照片(复数)", "type": "noun", "pronunciation": "/ˈfoʊtoʊz/" },
"video": { "user_language": "视频", "type": "noun", "pronunciation": "/ˈvɪdioʊ/" },
"display": { "user_language": "展示", "type": "noun", "pronunciation": "/dɪˈspleɪ/" },
"cook": { "user_language": "烹饪", "type": "verb", "pronunciation": "/kʊk/" },
"cooking": { "user_language": "正在烹饪", "type": "verb-ing", "pronunciation": "/ˈkʊkɪŋ/" },
"play": { "user_language": "玩;打(球)", "type": "verb", "pronunciation": "/pleɪ/" },
"playing": { "user_language": "正在玩", "type": "verb-ing", "pronunciation": "/ˈpleɪɪŋ/" },
"watch": { "user_language": "观看", "type": "verb", "pronunciation": "/wɑːtʃ/" },
"watching": { "user_language": "正在观看", "type": "verb-ing", "pronunciation": "/ˈwɑːɪŋ/" },
"make": { "user_language": "做;制作", "type": "verb", "pronunciation": "/meɪk/" },
"making": { "user_language": "正在制作", "type": "verb-ing", "pronunciation": "/ˈmeɪkɪŋ/" },
"ride": { "user_language": "骑", "type": "verb", "pronunciation": "/raɪd/" },
"riding": { "user_language": "正在骑", "type": "verb-ing", "pronunciation": "/ˈraɪdɪŋ/" },
"dance": { "user_language": "跳舞", "type": "verb", "pronunciation": "/dæns/" },
"dancing": { "user_language": "正在跳舞", "type": "verb-ing", "pronunciation": "/ˈdænsɪŋ/" },
"sing": { "user_language": "唱歌", "type": "verb", "pronunciation": "/sɪŋ/" },
"singing": { "user_language": "正在唱歌", "type": "verb-ing", "pronunciation": "/ˈsɪŋɪŋ/" },
"eat": { "user_language": "吃", "type": "verb", "pronunciation": "/iːt/" },
"eating": { "user_language": "正在吃", "type": "verb-ing", "pronunciation": "/ˈiːtɪŋ/" },
"sleep": { "user_language": "睡觉", "type": "verb", "pronunciation": "/sliːp/" },
"sleeping": { "user_language": "正在睡觉", "type": "verb-ing", "pronunciation": "/ˈsliːpɪŋ/" },
"football": { "user_language": "足球", "type": "noun", "pronunciation": "/ˈfʊtbɔːl/" },
"TV": { "user_language": "电视", "type": "noun", "pronunciation": "/ˌtiːˈviː/" },
"plane": { "user_language": "飞机", "type": "noun", "pronunciation": "/pleɪn/" },
"bicycle": { "user_language": "自行车", "type": "noun", "pronunciation": "/ˈbaɪsɪkəl/" },
"kitchen": { "user_language": "厨房", "type": "noun", "pronunciation": "/ˈkɪtʃən/" },
"living room": { "user_language": "客厅", "type": "noun", "pronunciation": "/ˈlɪvɪŋ ruːm/" },
"garden": { "user_language": "花园", "type": "noun", "pronunciation": "/ˈɡɑːrdən/" },
"evening": { "user_language": "晚上", "type": "noun", "pronunciation": "/ˈiːvnɪŋ/" },
"moments": { "user_language": "时刻", "type": "noun", "pronunciation": "/ˈmoʊmənts/" },
"happy": { "user_language": "快乐的", "type": "adjective", "pronunciation": "/ˈhæpi/" },
"bag": { "user_language": "包;袋子", "type": "noun", "pronunciation": "/bæɡ/" },
"map": { "user_language": "地图", "type": "noun", "pronunciation": "/mæp/" },
"cap": { "user_language": "帽子", "type": "noun", "pronunciation": "/kæp/" },
"fan": { "user_language": "风扇", "type": "noun", "pronunciation": "/fæn/" },
"can": { "user_language": "罐头", "type": "noun", "pronunciation": "/kæn/" },
"pan": { "user_language": "平底锅", "type": "noun", "pronunciation": "/pæn/" },
"cat": { "user_language": "猫", "type": "noun", "pronunciation": "/kæt/" },
"rat": { "user_language": "老鼠", "type": "noun", "pronunciation": "/ræt/" },
"hat": { "user_language": "帽子", "type": "noun", "pronunciation": "/hæt/" },
"bat": { "user_language": "蝙蝠", "type": "noun", "pronunciation": "/bæt/" },
"mat": { "user_language": "垫子", "type": "noun", "pronunciation": "/mæt/" },
"ant": { "user_language": "蚂蚁", "type": "noun", "pronunciation": "/ænt/" },
"ram": { "user_language": "公羊", "type": "noun", "pronunciation": "/ræm/" },
"yak": { "user_language": "牦牛", "type": "noun", "pronunciation": "/jæk/" },
"jam": { "user_language": "果酱", "type": "noun", "pronunciation": "/dʒæm/" },
"ax": { "user_language": "斧头", "type": "noun", "pronunciation": "/æks/" },
"nap": { "user_language": "小睡", "type": "noun", "pronunciation": "/næp/" },
"tap": { "user_language": "水龙头", "type": "noun", "pronunciation": "/tæp/" },
"dam": { "user_language": "水坝", "type": "noun", "pronunciation": "/dæm/" },
"yam": { "user_language": "山药", "type": "noun", "pronunciation": "/jæm/" },
"rag": { "user_language": "抹布", "type": "noun", "pronunciation": "/ræɡ/" },
"man": { "user_language": "男人", "type": "noun", "pronunciation": "/mæn/" }
},
"phrases": {
"This is my father": { "user_language": "这是我的父亲", "context": "introduction", "pronunciation": "/ðɪs ɪz maɪ ˈfɑːðər/" },
"These are my sisters": { "user_language": "这些是我的姐妹们", "context": "introduction", "pronunciation": "/ðiːz ɑːr maɪ ˈsɪstərz/" },
"What is he doing?": { "user_language": "他在做什么?", "context": "present-continuous-question", "pronunciation": "/wʌt ɪz hiː ˈduːɪŋ/" },
"What is she doing?": { "user_language": "她在做什么?", "context": "present-continuous-question", "pronunciation": "/wʌt ɪz ʃiː ˈduːɪŋ/" },
"What are they doing?": { "user_language": "他们/她们在做什么?", "context": "present-continuous-question", "pronunciation": "/wʌt ɑːr ðeɪ ˈduːɪŋ/" },
"He is making a plane": { "user_language": "他正在做飞机", "context": "present-continuous-answer", "pronunciation": "/hiː ɪz ˈmeɪkɪŋ ə pleɪn/" },
"She is cooking": { "user_language": "她正在烹饪", "context": "present-continuous-answer", "pronunciation": "/ʃiː ɪz ˈkʊkɪŋ/" },
"They are dancing": { "user_language": "他们正在跳舞", "context": "present-continuous-answer", "pronunciation": "/ðeɪ ɑːr ˈdænsɪŋ/" },
"He is playing football": { "user_language": "他正在踢足球", "context": "present-continuous-answer", "pronunciation": "/hiː ɪz ˈpleɪɪŋ ˈfʊtbɔːl/" },
"She is watching TV": { "user_language": "她正在看电视", "context": "present-continuous-answer", "pronunciation": "/ʃiː ɪz ˈwɑːɪŋ ˌtiːˈviː/" },
"He is riding a bicycle": { "user_language": "他正在骑自行车", "context": "present-continuous-answer", "pronunciation": "/hiː ɪz ˈraɪdɪŋ ə ˈbaɪsɪkəl/" },
"She is singing": { "user_language": "她正在唱歌", "context": "present-continuous-answer", "pronunciation": "/ʃiː ɪz ˈsɪŋɪŋ/" },
"I am making a video": { "user_language": "我正在拍视频", "context": "present-continuous-first-person", "pronunciation": "/aɪ æm ˈmeɪkɪŋ ə ˈvɪdioʊ/" },
"I am eating": { "user_language": "我正在吃", "context": "present-continuous-first-person", "pronunciation": "/aɪ æm ˈiːtɪŋ/" },
"They are in the kitchen": { "user_language": "他们在厨房里", "context": "location", "pronunciation": "/ðeɪ ɑːr ɪn ðə ˈkɪtʃən/" },
"He is in the living room": { "user_language": "他在客厅里", "context": "location", "pronunciation": "/hiː ɪz ɪn ðə ˈlɪvɪŋ ruːm/" },
"He is in the garden": { "user_language": "他在花园里", "context": "location", "pronunciation": "/hiː ɪz ɪn ðə ˈɡɑːrdən/" },
"He is sleeping": { "user_language": "他正在睡觉", "context": "present-continuous-answer", "pronunciation": "/hiː ɪz ˈsliːpɪŋ/" },
"Go away": { "user_language": "走开", "context": "imperative", "pronunciation": "/ɡoʊ əˈweɪ/" },
"I can't see": { "user_language": "我看不见", "context": "complaint", "pronunciation": "/aɪ kænt siː/" },
"Let's find him": { "user_language": "我们去找他吧", "context": "suggestion", "pronunciation": "/lets faɪnd hɪm/" },
"There he is!": { "user_language": "他在那儿!", "context": "discovery", "pronunciation": "/ðer hiː ɪz/" },
"In the evening": { "user_language": "在晚上", "context": "time", "pronunciation": "/ɪn ðə ˈiːvnɪŋ/" },
"A cat is on the mat": { "user_language": "一只猫在垫子上", "context": "phonics-sentence", "pronunciation": "/ə kæt ɪz ɑːn ðə mæt/" },
"The man has a cap": { "user_language": "那个男人有一顶帽子", "context": "phonics-sentence", "pronunciation": "/ðə mæn hæz ə kæp/" },
"I see a ram at the dam": { "user_language": "我在水坝那里看到一只公羊", "context": "phonics-sentence", "pronunciation": "/aɪ siː ə ræm æt ðə dæm/" },
"The ant is on the can": { "user_language": "蚂蚁在罐头上", "context": "phonics-sentence", "pronunciation": "/ðə ænt ɪz ɑːn ðə kæn/" }
},
"dialogs": {
"family_photos": {
"title": "Looking at Family Photos",
"participants": ["Tom", "Mary"],
"context": "Children making a display of family photos",
"lines": [
{ "speaker": "Tom", "text": "This is my father.", "user_language": "这是我的父亲。" },
{ "speaker": "Mary", "text": "What is he doing?", "user_language": "他在做什么?" },
{ "speaker": "Tom", "text": "He is making a plane.", "user_language": "他正在做飞机。" }
]
},
"sisters_dancing": {
"title": "My Sisters",
"participants": ["Anna", "Peter"],
"context": "Looking at more family photos",
"lines": [
{ "speaker": "Anna", "text": "These are my sisters.", "user_language": "这些是我的姐妹们。" },
{ "speaker": "Peter", "text": "What are they doing?", "user_language": "她们在做什么?" },
{ "speaker": "Anna", "text": "They are dancing.", "user_language": "她们正在跳舞。" }
]
},
"dads_video_grandma": {
"title": "Dad's Video - Grandma",
"participants": ["Child", "Dad"],
"context": "Watching Dad's home video",
"lines": [
{ "speaker": "Child", "text": "What are you doing, Dad?", "user_language": "爸爸,你在做什么?" },
{ "speaker": "Dad", "text": "I am making a video. Here is Grandma. She is singing.", "user_language": "我正在拍视频。这是奶奶。她正在唱歌。" }
]
},
"dads_video_kitchen": {
"title": "Dad's Video - In the Kitchen",
"participants": ["Dad", "Cherry"],
"context": "Mum and Cherry in the kitchen",
"lines": [
{ "speaker": "Dad", "text": "Here are Mum and Cherry. They are in the kitchen. They are cooking.", "user_language": "这是妈妈和Cherry。她们在厨房里。她们正在烹饪。" },
{ "speaker": "Cherry", "text": "Yes, and I am eating.", "user_language": "是的,而且我正在吃。" }
]
},
"dads_video_grandpa": {
"title": "Dad's Video - Grandpa",
"participants": ["Dad", "Grandpa"],
"context": "Grandpa watching TV",
"lines": [
{ "speaker": "Dad", "text": "That is Grandpa. He is in the living room. He is watching TV.", "user_language": "那是爷爷。他在客厅里。他正在看电视。" },
{ "speaker": "Grandpa", "text": "Go away. I can't see.", "user_language": "走开。我看不见。" }
]
},
"finding_dad": {
"title": "Finding Dad",
"participants": ["Child 1", "Child 2"],
"context": "Looking for Dad in the video",
"lines": [
{ "speaker": "Child 1", "text": "I can't see Dad in the video. Let's find him.", "user_language": "我在视频里看不见爸爸。我们去找他吧。" },
{ "speaker": "Child 2", "text": "There he is! He is in the garden. He is sleeping.", "user_language": "他在那儿!他在花园里。他正在睡觉。" }
]
}
},
"texts": [
{
"title": "Happy Moments - Family Photos",
"difficulty": "easy",
"original_language": "The children are making a display of family photos. Tom says, 'This is my father. He is making a plane.' Anna says, 'These are my sisters. They are dancing.' Peter's mother is cooking. Mary's brother is playing football.",
"user_language": "孩子们正在制作家庭照片展示。汤姆说:'这是我的父亲。他正在做飞机。'安娜说:'这些是我的姐妹们。她们正在跳舞。'彼得的妈妈正在烹饪。玛丽的哥哥正在踢足球。"
},
{
"title": "Dad's Home Video",
"difficulty": "medium",
"original_language": "Dad is making a video. Here is Grandma. She is singing. Here are Mum and Cherry. They are in the kitchen. They are cooking. Cherry is eating too! That is Grandpa. He is in the living room. He is watching TV. In the evening, the children look for Dad. Where is Dad? There he is! He is in the garden. He is sleeping!",
"user_language": "爸爸正在拍视频。这是奶奶。她正在唱歌。这是妈妈和Cherry。她们在厨房里。她们正在烹饪。Cherry也在吃东西那是爷爷。他在客厅里。他正在看电视。晚上孩子们找爸爸。爸爸在哪里他在那儿他在花园里。他正在睡觉"
},
{
"title": "Short A Phonics Song",
"difficulty": "easy",
"original_language": "Bag, map, ax, cap, fan, can, pan. A girl with a bag, a man with a map, a ram with an ax, a yak with a cap, a rat with a fan, a cat with a can, and a small ant with a pan.",
"user_language": "包、地图、斧头、帽子、风扇、罐头、平底锅。一个女孩带着包,一个男人拿着地图,一只公羊拿着斧头,一头牦牛戴着帽子,一只老鼠拿着风扇,一只猫拿着罐头,还有一只小蚂蚁拿着平底锅。"
},
{
"title": "At the Farm - Short A Story",
"difficulty": "easy",
"original_language": "I see a cat. The cat is on the mat. I see a rat. The rat is fat. I see a man. The man has a cap. I see a ram at the dam. The ram is not sad. I see an ant on a can. The ant is small.",
"user_language": "我看到一只猫。猫在垫子上。我看到一只老鼠。老鼠很胖。我看到一个男人。男人有一顶帽子。我在水坝那里看到一只公羊。公羊不伤心。我看到一只蚂蚁在罐头上。蚂蚁很小。"
}
],
"grammar": {
"present-continuous-singular": {
"title": "Present Continuous with He/She (singular)",
"explanation": "Use 'is' + verb-ing to describe what one person is doing right now",
"examples": [
{
"english": "What is he doing? He is making a plane.",
"translation": "他在做什么?他正在做飞机。",
"explanation": "Use 'is' with he/she + verb-ing"
},
{
"english": "What is she doing? She is cooking.",
"translation": "她在做什么?她正在烹饪。",
"explanation": "Use 'is' with she + verb-ing"
},
{
"english": "Grandma is singing.",
"translation": "奶奶正在唱歌。",
"explanation": "Subject + is + verb-ing"
}
]
},
"present-continuous-plural": {
"title": "Present Continuous with They (plural)",
"explanation": "Use 'are' + verb-ing to describe what multiple people are doing right now",
"examples": [
{
"english": "What are they doing? They are dancing.",
"translation": "她们在做什么?她们正在跳舞。",
"explanation": "Use 'are' with they + verb-ing"
},
{
"english": "They are cooking.",
"translation": "她们正在烹饪。",
"explanation": "Subject (plural) + are + verb-ing"
}
]
},
"present-continuous-i": {
"title": "Present Continuous with I",
"explanation": "Use 'am' + verb-ing to describe what you are doing right now",
"examples": [
{
"english": "I am making a video.",
"translation": "我正在拍视频。",
"explanation": "Use 'am' with I + verb-ing"
},
{
"english": "I am eating.",
"translation": "我正在吃。",
"explanation": "I + am + verb-ing"
}
]
},
"this-these": {
"title": "This is / These are",
"explanation": "Use 'This is' for one person/thing, 'These are' for more than one",
"examples": [
{
"english": "This is my father.",
"translation": "这是我的父亲。",
"explanation": "Use 'This is' for singular"
},
{
"english": "These are my sisters.",
"translation": "这些是我的姐妹们。",
"explanation": "Use 'These are' for plural"
}
]
},
"short-a-phonics": {
"title": "Short A Sound (/æ/)",
"explanation": "The short 'a' sound is found in word families: -am, -an, -ad, -ag, -ap, -at",
"examples": [
{
"english": "cat, rat, bat, hat, mat, fat",
"translation": "猫、老鼠、蝙蝠、帽子、垫子、胖的",
"explanation": "-at family: all rhyme with 'at'"
},
{
"english": "map, tap, cap, nap, lap, rap",
"translation": "地图、水龙头、帽子、小睡、大腿、说唱",
"explanation": "-ap family: all rhyme with 'ap'"
},
{
"english": "fan, can, man, pan",
"translation": "风扇、罐头、男人、平底锅",
"explanation": "-an family: all rhyme with 'an'"
}
]
}
},
"fillInBlanks": [
{
"sentence": "What ___ he doing?",
"options": ["is", "are", "am", "be"],
"correctAnswer": "is",
"explanation": "Use 'is' with he/she",
"grammarFocus": "present-continuous-singular"
},
{
"sentence": "What ___ they doing?",
"options": ["are", "is", "am", "be"],
"correctAnswer": "are",
"explanation": "Use 'are' with they",
"grammarFocus": "present-continuous-plural"
},
{
"sentence": "He is ___ a plane.",
"options": ["making", "make", "makes", "made"],
"correctAnswer": "making",
"explanation": "Use verb-ing after 'is'",
"grammarFocus": "present-continuous-singular"
},
{
"sentence": "They are ___.",
"options": ["dancing", "dance", "dances", "danced"],
"correctAnswer": "dancing",
"explanation": "Use verb-ing after 'are'",
"grammarFocus": "present-continuous-plural"
},
{
"sentence": "I ___ making a video.",
"options": ["am", "is", "are", "be"],
"correctAnswer": "am",
"explanation": "Use 'am' with I",
"grammarFocus": "present-continuous-i"
},
{
"sentence": "___ is my father.",
"options": ["This", "These", "That are", "This are"],
"correctAnswer": "This",
"explanation": "Use 'This is' for one person",
"grammarFocus": "this-these"
},
{
"sentence": "___ are my sisters.",
"options": ["These", "This", "That", "It"],
"correctAnswer": "These",
"explanation": "Use 'These are' for more than one",
"grammarFocus": "this-these"
},
{
"sentence": "She is ___ TV.",
"options": ["watching", "watch", "watches", "watched"],
"correctAnswer": "watching",
"explanation": "Use verb-ing after 'is'",
"grammarFocus": "present-continuous-singular"
},
{
"sentence": "Grandpa is in the living room. He is ___ TV.",
"options": ["watching", "cooking", "singing", "sleeping"],
"correctAnswer": "watching",
"explanation": "Grandpa watches TV in the living room",
"grammarFocus": "comprehension"
},
{
"sentence": "Dad is in the garden. He is ___.",
"options": ["sleeping", "cooking", "dancing", "singing"],
"correctAnswer": "sleeping",
"explanation": "Dad sleeps in the garden",
"grammarFocus": "comprehension"
},
{
"sentence": "The cat is on the ___.",
"options": ["mat", "map", "man", "mop"],
"correctAnswer": "mat",
"explanation": "cat and mat rhyme (-at family)",
"grammarFocus": "short-a-phonics"
},
{
"sentence": "The ___ has a cap.",
"options": ["man", "mat", "map", "mop"],
"correctAnswer": "man",
"explanation": "man and cap have short 'a' sound",
"grammarFocus": "short-a-phonics"
},
{
"sentence": "I see a ram at the ___.",
"options": ["dam", "dim", "dom", "dumb"],
"correctAnswer": "dam",
"explanation": "ram and dam rhyme (-am family)",
"grammarFocus": "short-a-phonics"
},
{
"sentence": "Which word rhymes with 'cat'?",
"options": ["hat", "can", "map", "jam"],
"correctAnswer": "hat",
"explanation": "cat and hat both end in -at",
"grammarFocus": "rhyming"
},
{
"sentence": "Which word rhymes with 'fan'?",
"options": ["pan", "fat", "tap", "bag"],
"correctAnswer": "pan",
"explanation": "fan and pan both end in -an",
"grammarFocus": "rhyming"
}
],
"corrections": [
{
"correct": "What is he doing?",
"incorrect": "What are he doing?",
"explanation": "Use 'is' with he/she (singular)",
"grammarFocus": "present-continuous-singular"
},
{
"correct": "What are they doing?",
"incorrect": "What is they doing?",
"explanation": "Use 'are' with they (plural)",
"grammarFocus": "present-continuous-plural"
},
{
"correct": "He is making a plane.",
"incorrect": "He is make a plane.",
"explanation": "Use verb-ing form after 'is'",
"grammarFocus": "present-continuous-singular"
},
{
"correct": "They are dancing.",
"incorrect": "They is dancing.",
"explanation": "Use 'are' with they, not 'is'",
"grammarFocus": "present-continuous-plural"
},
{
"correct": "I am cooking.",
"incorrect": "I is cooking.",
"explanation": "Use 'am' with I, not 'is'",
"grammarFocus": "present-continuous-i"
},
{
"correct": "These are my sisters.",
"incorrect": "This are my sisters.",
"explanation": "Use 'These are' for plural, not 'This are'",
"grammarFocus": "this-these"
},
{
"correct": "This is my father.",
"incorrect": "These is my father.",
"explanation": "Use 'This is' for singular, not 'These is'",
"grammarFocus": "this-these"
},
{
"correct": "She is singing.",
"incorrect": "She are singing.",
"explanation": "Use 'is' with she (singular)",
"grammarFocus": "present-continuous-singular"
}
],
"exercises": {
"family_activities": {
"type": "matching",
"instructions": "Match the family member with what they are doing",
"items": [
{ "person": "Father", "activity": "making a plane", "sentence": "He is making a plane.", "user_language": "他正在做飞机。" },
{ "person": "Mother", "activity": "cooking", "sentence": "She is cooking.", "user_language": "她正在烹饪。" },
{ "person": "Sisters", "activity": "dancing", "sentence": "They are dancing.", "user_language": "她们正在跳舞。" },
{ "person": "Brother", "activity": "playing football", "sentence": "He is playing football.", "user_language": "他正在踢足球。" },
{ "person": "Grandma", "activity": "singing", "sentence": "She is singing.", "user_language": "她正在唱歌。" },
{ "person": "Grandpa", "activity": "watching TV", "sentence": "He is watching TV.", "user_language": "他正在看电视。" },
{ "person": "Dad", "activity": "sleeping", "sentence": "He is sleeping.", "user_language": "他正在睡觉。" }
]
},
"video_comprehension": {
"type": "true_false",
"instructions": "Dad's Video - True or False?",
"items": [
{ "statement": "Grandma is singing", "answer": true, "user_language": "奶奶正在唱歌" },
{ "statement": "Mum and Cherry are in the garden", "answer": false, "user_language": "妈妈和Cherry在花园里" },
{ "statement": "Mum and Cherry are cooking", "answer": true, "user_language": "妈妈和Cherry正在烹饪" },
{ "statement": "Grandpa is in the living room", "answer": true, "user_language": "爷爷在客厅里" },
{ "statement": "Grandpa is cooking", "answer": false, "user_language": "爷爷正在烹饪" },
{ "statement": "Dad is in the garden", "answer": true, "user_language": "爸爸在花园里" },
{ "statement": "Dad is sleeping", "answer": true, "user_language": "爸爸正在睡觉" },
{ "statement": "Cherry is eating", "answer": true, "user_language": "Cherry正在吃" }
]
},
"rhyming_words": {
"type": "matching",
"instructions": "Match the rhyming words (short 'a' sound)",
"items": [
{ "word1": "cat", "word2": "hat", "family": "-at", "user_language": "猫 - 帽子" },
{ "word1": "map", "word2": "cap", "family": "-ap", "user_language": "地图 - 帽子" },
{ "word1": "fan", "word2": "pan", "family": "-an", "user_language": "风扇 - 平底锅" },
{ "word1": "dam", "word2": "jam", "family": "-am", "user_language": "水坝 - 果酱" },
{ "word1": "bag", "word2": "rag", "family": "-ag", "user_language": "包 - 抹布" },
{ "word1": "dad", "word2": "sad", "family": "-ad", "user_language": "爸爸 - 伤心的" }
]
},
"word_families": {
"type": "categorization",
"instructions": "Sort the words into their word families",
"families": {
"-at": ["cat", "rat", "bat", "hat", "mat", "fat"],
"-ap": ["map", "tap", "cap", "nap", "lap", "rap"],
"-an": ["fan", "can", "man", "pan"],
"-am": ["dam", "ram", "yam", "jam"]
}
},
"sentence_building": {
"type": "sentence_building",
"instructions": "Build sentences: What is/are ___ doing? He/She/They is/are ___ing.",
"items": [
{
"subject": "father",
"question": "What is he doing?",
"action": "cooking",
"answer": "He is cooking.",
"user_language_q": "他在做什么?",
"user_language_a": "他正在烹饪。"
},
{
"subject": "mother",
"question": "What is she doing?",
"action": "singing",
"answer": "She is singing.",
"user_language_q": "她在做什么?",
"user_language_a": "她正在唱歌。"
},
{
"subject": "brothers",
"question": "What are they doing?",
"action": "playing football",
"answer": "They are playing football.",
"user_language_q": "他们在做什么?",
"user_language_a": "他们正在踢足球。"
},
{
"subject": "grandpa",
"question": "What is he doing?",
"action": "sleeping",
"answer": "He is sleeping.",
"user_language_q": "他在做什么?",
"user_language_a": "他正在睡觉。"
}
]
}
},
"thematic_questions": {
"present_continuous_he_she": [
{
"id": "tq1",
"question": "What is your father doing?",
"question_user_language": "你父亲在做什么?",
"tts_enabled": true,
"example_responses": [
"He is making a plane.",
"He is cooking.",
"He is watching TV."
],
"theme": "present_continuous_he_she"
},
{
"id": "tq2",
"question": "What is Grandma doing?",
"question_user_language": "奶奶在做什么?",
"tts_enabled": true,
"example_responses": [
"She is singing.",
"Grandma is singing.",
"Singing."
],
"theme": "present_continuous_he_she"
},
{
"id": "tq3",
"question": "What is Grandpa doing?",
"question_user_language": "爷爷在做什么?",
"tts_enabled": true,
"example_responses": [
"He is watching TV.",
"Grandpa is watching TV.",
"Watching TV."
],
"theme": "present_continuous_he_she"
},
{
"id": "tq4",
"question": "What is Dad doing in the garden?",
"question_user_language": "爸爸在花园里做什么?",
"tts_enabled": true,
"example_responses": [
"He is sleeping.",
"Dad is sleeping.",
"Sleeping."
],
"theme": "present_continuous_he_she"
}
],
"present_continuous_they": [
{
"id": "tq5",
"question": "What are your sisters doing?",
"question_user_language": "你姐妹们在做什么?",
"tts_enabled": true,
"example_responses": [
"They are dancing.",
"My sisters are dancing.",
"Dancing."
],
"theme": "present_continuous_they"
},
{
"id": "tq6",
"question": "What are Mum and Cherry doing?",
"question_user_language": "妈妈和Cherry在做什么",
"tts_enabled": true,
"example_responses": [
"They are cooking.",
"They are in the kitchen. They are cooking.",
"Cooking."
],
"theme": "present_continuous_they"
}
],
"family_vocabulary": [
{
"id": "tq7",
"question": "Who is in your family?",
"question_user_language": "你的家人有谁?",
"tts_enabled": true,
"example_responses": [
"My father, mother, and sister.",
"I have a father, mother, and brother.",
"Father, mother, grandma, and grandpa."
],
"theme": "family_vocabulary"
},
{
"id": "tq8",
"question": "Where is Grandpa?",
"question_user_language": "爷爷在哪里?",
"tts_enabled": true,
"example_responses": [
"He is in the living room.",
"In the living room.",
"Grandpa is in the living room."
],
"theme": "family_vocabulary"
}
],
"phonics_short_a": [
{
"id": "tq9",
"question": "What rhymes with 'cat'?",
"question_user_language": "什么词和'cat'押韵?",
"tts_enabled": true,
"example_responses": [
"Hat rhymes with cat.",
"Hat.",
"Rat, bat, mat."
],
"theme": "phonics_short_a"
},
{
"id": "tq10",
"question": "What rhymes with 'fan'?",
"question_user_language": "什么词和'fan'押韵?",
"tts_enabled": true,
"example_responses": [
"Pan rhymes with fan.",
"Pan.",
"Can, man, pan."
],
"theme": "phonics_short_a"
},
{
"id": "tq11",
"question": "Can you say three words with short 'a' sound?",
"question_user_language": "你能说出三个有短音'a'的单词吗?",
"tts_enabled": true,
"example_responses": [
"Cat, hat, bat.",
"Map, cap, tap.",
"Fan, can, man."
],
"theme": "phonics_short_a"
},
{
"id": "tq12",
"question": "Where is the cat?",
"question_user_language": "猫在哪里?",
"tts_enabled": true,
"example_responses": [
"The cat is on the mat.",
"On the mat.",
"It is on the mat."
],
"theme": "phonics_short_a"
}
]
},
"activities": {
"phonics_song": {
"title": "Short A Song",
"instructions": "Sing along with the short 'a' song",
"lyrics": "Bag, map, ax, cap, fan, can, pan.\nA girl with a bag,\nA man with a map,\nA ram with an ax,\nA yak with a cap,\nA rat with a fan,\nA cat with a can,\nAnd a small ant with a pan."
},
"rhyming_game": {
"title": "Rhyming Circle Game",
"instructions": "Listen and circle the words that rhyme",
"sets": [
{ "words": ["map", "man", "cat", "tap"], "rhymes": ["map", "tap"] },
{ "words": ["cap", "rat", "nap", "bat"], "rhymes": ["cap", "nap"] },
{ "words": ["yam", "pan", "pad", "dad"], "rhymes": ["pad", "dad"] },
{ "words": ["jam", "ant", "ram", "cap"], "rhymes": ["jam", "ram"] }
]
},
"family_photo_display": {
"title": "Make a Family Photo Display",
"instructions": "Bring photos of your family. Tell the class what each person is doing.",
"example": {
"sentence1": "This is my mother. She is cooking.",
"sentence2": "These are my brothers. They are playing football.",
"user_language1": "这是我的妈妈。她正在烹饪。",
"user_language2": "这些是我的哥哥们。他们正在踢足球。"
}
},
"board_game": {
"title": "Short A Board Game",
"instructions": "Spin the spinner and move. Read the word you land on.",
"words": ["bat", "man", "pad", "dam", "nap", "ant", "can", "ram", "mat", "cat", "fan", "tap", "cap", "bag", "yam", "yak", "rat", "rag", "pan", "dad", "jam", "ax", "hat", "map"]
}
},
"cultural_content": {
"title": "Family Moments",
"sections": [
{
"topic": "Family Activities",
"content": "Families spend time together doing different activities. Parents cook, children play, grandparents relax. These happy moments create family memories.",
"user_language": "家人们在一起做不同的活动。父母烹饪,孩子玩耍,祖父母放松。这些快乐的时刻创造了家庭回忆。"
},
{
"topic": "Home Videos and Photos",
"content": "Many families take photos and videos to remember special moments. Looking at old photos helps us remember happy times with our family.",
"user_language": "许多家庭拍照和录像来记录特殊时刻。看旧照片帮助我们记住与家人在一起的快乐时光。"
}
]
},
"statistics": {
"vocabulary_count": 65,
"phrases_count": 27,
"dialogs_count": 6,
"texts_count": 4,
"exercises_count": 5,
"fillInBlanks_count": 15,
"corrections_count": 8,
"thematic_questions_count": 12,
"phonics_word_families": 8,
"estimated_completion_time": 5
}
}

View File

@ -30,18 +30,56 @@ class WordDiscoveryModule extends DRSExerciseInterface {
* Check if module can run (when there are undiscovered words)
*/
canRun(prerequisites, chapterContent) {
if (!chapterContent?.vocabulary) return false;
const allWords = this._getAllWords(chapterContent);
if (allWords.length === 0) return false;
// Find words that haven't been discovered yet
const allWords = Object.keys(chapterContent.vocabulary);
const undiscoveredWords = allWords.filter(word => {
return !this.prerequisiteEngine.isDiscovered(word);
const undiscoveredWords = allWords.filter(wordObj => {
return !this.prerequisiteEngine.isDiscovered(wordObj.word);
});
console.log(`📖 Found ${undiscoveredWords.length} undiscovered words`);
return undiscoveredWords.length > 0;
}
/**
* Get all words from letters and vocabulary sections
* Letters (phonics) are loaded FIRST to prioritize them
*/
_getAllWords(chapterContent) {
const words = [];
// Get words from letters section FIRST (phonics) - array format
if (chapterContent?.letters) {
for (const [letterKey, letterData] of Object.entries(chapterContent.letters)) {
if (Array.isArray(letterData)) {
for (const wordEntry of letterData) {
words.push({
word: wordEntry.word,
data: {
user_language: wordEntry.translation,
translation: wordEntry.translation,
type: wordEntry.type,
pronunciation: wordEntry.pronunciation,
image: wordEntry.image,
letterGroup: letterKey
}
});
}
}
}
}
// Get words from vocabulary section
if (chapterContent?.vocabulary) {
for (const [word, data] of Object.entries(chapterContent.vocabulary)) {
words.push({ word, data });
}
}
return words;
}
/**
* Present word discovery interface
*/
@ -49,21 +87,16 @@ class WordDiscoveryModule extends DRSExerciseInterface {
this.container = container;
this.isActive = true;
// Get undiscovered words from chapter content
// Get undiscovered words from chapter content (vocabulary + letters)
const chapterContent = exerciseData.chapterContent || {};
const allWords = Object.keys(chapterContent.vocabulary || {});
const allWords = this._getAllWords(chapterContent);
this.undiscoveredWords = allWords.filter(word => {
return !this.prerequisiteEngine.isDiscovered(word);
this.undiscoveredWords = allWords.filter(wordObj => {
return !this.prerequisiteEngine.isDiscovered(wordObj.word);
});
// Take next 10 undiscovered words
this.currentWords = this.undiscoveredWords
.slice(0, this.config.wordsPerSession)
.map(word => ({
word: word,
data: chapterContent.vocabulary[word]
}));
this.currentWords = this.undiscoveredWords.slice(0, this.config.wordsPerSession);
this.currentWordIndex = 0;
@ -120,9 +153,22 @@ class WordDiscoveryModule extends DRSExerciseInterface {
const currentWord = this.currentWords[this.currentWordIndex];
const wordData = currentWord.data;
// DEBUG: Check image data
console.log('🖼️ WordDiscovery showing word:', currentWord.word);
console.log('🖼️ Word data:', wordData);
console.log('🖼️ Has image?', wordData.image ? 'YES: ' + wordData.image : 'NO');
// Build image HTML if image exists
const imageHtml = wordData.image ? `
<div class="word-image">
<img src="content/${wordData.image}" alt="${currentWord.word}" onerror="console.error('Image failed to load:', 'content/${wordData.image}'); this.style.display='none'" onload="console.log('✓ Image loaded:', 'content/${wordData.image}')">
</div>
` : '';
const wordDisplay = document.getElementById('word-display');
wordDisplay.innerHTML = `
<div class="word-card">
<div class="word-card ${wordData.image ? 'with-image' : ''}">
${imageHtml}
<div class="word-main">
<h1 class="word-text">${currentWord.word}</h1>
${this.config.showPronunciation && wordData.pronunciation ?
@ -133,7 +179,7 @@ class WordDiscoveryModule extends DRSExerciseInterface {
<div class="word-details">
<div class="word-meaning">
<h3>Meaning</h3>
<p>${wordData.user_language || 'Definition not available'}</p>
<p>${wordData.user_language || wordData.translation || 'Definition not available'}</p>
</div>
${wordData.type ? `

View File

@ -352,6 +352,22 @@ class LetterDiscovery extends Module {
animation: wordSlideIn 0.6s ease-out forwards;
}
.word-card.with-image {
max-width: 600px;
}
.word-image {
margin-bottom: 20px;
}
.word-image img {
max-width: 100%;
max-height: 250px;
object-fit: contain;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
@keyframes wordSlideIn {
to { transform: translateY(0); }
}
@ -747,12 +763,30 @@ class LetterDiscovery extends Module {
const word = words[this._currentWordIndex];
const gameContent = document.getElementById('game-content');
// Build image HTML if image exists - try multiple paths
let imageHtml = '';
if (word.image) {
// The image path from JSON is "assets/a_sound.png"
// We need to prepend "content/" to get "content/assets/a_sound.png"
const imagePath = word.image.startsWith('assets/') ? `content/${word.image}` : word.image;
imageHtml = `
<div class="word-image" style="text-align: center; margin: 20px 0;">
<img src="${imagePath}"
alt="${word.word}"
style="max-width: 100%; max-height: 250px; border-radius: 12px; box-shadow: 0 4px 12px rgba(0,0,0,0.15);"
onerror="this.onerror=null; this.src='data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22200%22 height=%22200%22%3E%3Crect fill=%22%23ddd%22 width=%22200%22 height=%22200%22/%3E%3Ctext x=%2250%25%22 y=%2250%25%22 font-size=%2220%22 text-anchor=%22middle%22 dy=%22.3em%22%3ENo Image%3C/text%3E%3C/svg%3E'; console.error('Image load failed:', '${imagePath}');"
onload="console.log('Image loaded OK:', '${imagePath}');">
</div>
`;
}
gameContent.innerHTML = `
<div class="word-exploration-header">
<div class="exploring-letter">Letter "${this._currentLetter}"</div>
<div class="word-progress">Word ${this._currentWordIndex + 1} of ${words.length}</div>
</div>
<div class="word-card">
<div class="word-card ${word.image ? 'with-image' : ''}">
${imageHtml}
<div class="word-text">${word.word}</div>
<div class="word-translation">${word.translation}</div>
${word.pronunciation ? `<div class="word-pronunciation">[${word.pronunciation}]</div>` : ''}

View File

@ -128,7 +128,8 @@ class WordDiscovery extends Module {
throw new Error('No vocabulary content available');
}
this._practiceWords = Object.entries(content.vocabulary).map(([word, data]) => ({
// Load words from both vocabulary AND letters sections
const wordsFromVocab = Object.entries(content.vocabulary || {}).map(([word, data]) => ({
word: word,
translation: typeof data === 'string' ? data :
data.user_language || data.translation || 'unknown',
@ -139,8 +140,38 @@ class WordDiscovery extends Module {
example: data.example
}));
// Load words from letters section (phonics)
const wordsFromLetters = [];
if (content.letters) {
for (const [letterKey, letterWords] of Object.entries(content.letters)) {
if (Array.isArray(letterWords)) {
for (const wordEntry of letterWords) {
wordsFromLetters.push({
word: wordEntry.word,
translation: wordEntry.translation,
pronunciation: wordEntry.pronunciation,
type: wordEntry.type || 'phonics',
image: wordEntry.image,
definition: wordEntry.definition,
example: wordEntry.example,
letterGroup: letterKey
});
}
}
}
}
// Combine both sources, prioritizing letters (phonics) first
this._practiceWords = [...wordsFromLetters, ...wordsFromVocab];
this._totalWordsAvailable = this._practiceWords.length;
console.log('📚 Loaded words:', {
fromLetters: wordsFromLetters.length,
fromVocabulary: wordsFromVocab.length,
total: this._totalWordsAvailable,
wordsWithImages: this._practiceWords.filter(w => w.image).length
});
// Restore session or start fresh
this._restoreSession();

View File

@ -3365,6 +3365,22 @@
justify-content: center;
}
.word-discovery .word-card.with-image {
min-height: 500px;
}
.word-discovery .word-image {
margin-bottom: 24px;
}
.word-discovery .word-image img {
max-width: 100%;
max-height: 200px;
object-fit: contain;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.word-discovery .word-main {
margin-bottom: 32px;
}

71
test-images.html Normal file
View File

@ -0,0 +1,71 @@
<!DOCTYPE html>
<html>
<head>
<title>Test Images</title>
<style>
body { font-family: Arial; padding: 20px; }
img { border: 2px solid #ccc; margin: 10px; max-width: 200px; }
.test { margin: 20px 0; padding: 15px; border: 1px solid #ddd; }
.ok { color: green; }
.error { color: red; }
</style>
</head>
<body>
<h1>Test Images WTE2-5</h1>
<div class="test">
<h2>Test 1: Direct path content/assets/</h2>
<img src="content/assets/a_sound.png" alt="a_sound" onerror="this.style.border='3px solid red'; this.nextSibling.textContent='ERROR!'" onload="this.style.border='3px solid green'; this.nextSibling.textContent='OK!'" />
<span></span>
<p>Path: content/assets/a_sound.png</p>
</div>
<div class="test">
<h2>Test 2: Without content/ prefix</h2>
<img src="assets/a_sound.png" alt="a_sound" onerror="this.style.border='3px solid red'; this.nextSibling.textContent='ERROR!'" onload="this.style.border='3px solid green'; this.nextSibling.textContent='OK!'" />
<span></span>
<p>Path: assets/a_sound.png</p>
</div>
<div class="test">
<h2>Test 3: With leading slash /content/</h2>
<img src="/content/assets/a_sound.png" alt="a_sound" onerror="this.style.border='3px solid red'; this.nextSibling.textContent='ERROR!'" onload="this.style.border='3px solid green'; this.nextSibling.textContent='OK!'" />
<span></span>
<p>Path: /content/assets/a_sound.png</p>
</div>
<div class="test">
<h2>Test 4: All three images</h2>
<div>
<img src="content/assets/a_sound.png" alt="a" onload="this.nextSibling.textContent=' ✓'" onerror="this.nextSibling.textContent=' ✗'" />
<span></span> a_sound.png<br>
<img src="content/assets/am_sound.png" alt="am" onload="this.nextSibling.textContent=' ✓'" onerror="this.nextSibling.textContent=' ✗'" />
<span></span> am_sound.png<br>
<img src="content/assets/an_sound.png" alt="an" onload="this.nextSibling.textContent=' ✓'" onerror="this.nextSibling.textContent=' ✗'" />
<span></span> an_sound.png<br>
</div>
</div>
<div class="test">
<h2>Console Info</h2>
<pre id="console-info"></pre>
</div>
<script>
// Log test results
setTimeout(() => {
const images = document.querySelectorAll('img');
const results = Array.from(images).map(img => ({
src: img.src,
loaded: img.complete && img.naturalHeight !== 0,
error: !img.complete || img.naturalHeight === 0
}));
document.getElementById('console-info').textContent = JSON.stringify(results, null, 2);
console.log('Image test results:', results);
}, 2000);
</script>
</body>
</html>