feat: A1 短材料复现本单元理解词,并加入黑夜模式

课程内容
- 重写全部 21 个 A1 单元的听读材料,把本单元理解词织进听/读文本,
  单元内理解词复现率从约 20% 提升到约 77%(各单元 56–96%)。
- 修正 U01 房间号与机场大巴同为 thirty 的撞车(改为 17/30/40)。
- 校验器容差按级别读取(A1 为 8%),materials 覆盖率、字数、
  选项子串等校验全部通过;course_content_test 通过。

黑夜模式
- app_theme 拆分明/暗两套调色板,AppColors 随亮度切换;
  main 用 theme/darkTheme/themeMode + builder 镜像已解析亮度;
  主题偏好持久化到快照;进度页新增“外观主题”切换。

文档
- COURSE-PACK-JSON.md 更新 A1 词池覆盖(840/933)与材料复现约定。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-18 11:16:09 +09:00
co-authored by Claude Opus 4.8
parent 9ab08c25ef
commit febfd30f49
93 changed files with 72676 additions and 274 deletions
+857
View File
@@ -0,0 +1,857 @@
{
"schemaVersion": 1,
"id": "A1-U20",
"revision": 1,
"level": "A1",
"title": "打电话与留言",
"categories": [
"日常"
],
"canDo": "留下姓名、号码和简短信息",
"status": "draft",
"meta": {
"draftedBy": "claude-opus-5",
"draftedAt": "2026-09-17",
"sources": [
"CEFR-J Vocabulary Profile 1.5",
"CEFR-J Grammar Profile 20180315"
],
"reviews": [],
"frozenAt": null
},
"names": [],
"grammar": [
{
"id": "123",
"use": "active"
},
{
"id": "141",
"use": "active",
"reason": "只用 I'll call again later 表示马上决定的事"
},
{
"id": "237",
"use": "receptive"
},
{
"id": "117",
"use": "active"
}
],
"coreItems": [
{
"id": "A1-U20-P01",
"type": "phrase",
"en": "Hello, this is Chen.",
"zh": "你好,我是陈。",
"sceneWord": false,
"match": [
[
"this is"
]
],
"example": {
"en": "Hello, this is Anna from room 305.",
"zh": "你好,我是 305 房间的安娜。"
},
"review": {
"prompt": "打电话时先说你是谁。"
}
},
{
"id": "A1-U20-P02",
"type": "phrase",
"en": "Can I speak to Mr Brown?",
"zh": "我能和布朗先生通话吗?",
"sceneWord": false,
"match": [
[
"speak to"
]
],
"example": {
"en": "Can I speak to Lucy, please?",
"zh": "请问露西在吗?"
},
"review": {
"prompt": "打电话找你的朋友汤姆。"
}
},
{
"id": "A1-U20-P03",
"type": "phrase",
"en": "Who's calling, please?",
"zh": "请问您是哪位?",
"sceneWord": false,
"match": [
[
"who's calling",
"who is calling"
]
],
"example": {
"en": "Hello. Who's calling?",
"zh": "你好,请问是哪位?"
},
"review": {
"prompt": "接电话时问对方是谁。"
}
},
{
"id": "A1-U20-P04",
"type": "phrase",
"en": "Hold on, please.",
"zh": "请稍等。",
"sceneWord": false,
"match": [
[
"hold on"
]
],
"example": {
"en": "Hold on. I can get him.",
"zh": "稍等,我去叫他。"
},
"review": {
"prompt": "请对方在电话里稍等。"
}
},
{
"id": "A1-U20-P05",
"type": "phrase",
"en": "He's not here right now.",
"zh": "他现在不在。",
"sceneWord": false,
"match": [
[
"not here right now"
]
],
"example": {
"en": "Sorry, she's not here right now.",
"zh": "抱歉,她现在不在。"
},
"review": {
"prompt": "告诉打电话的人你妈妈不在。"
}
},
{
"id": "A1-U20-P06",
"type": "phrase",
"en": "Can I leave a message?",
"zh": "我可以留个言吗?",
"sceneWord": false,
"match": [
[
"leave a message"
]
],
"example": {
"en": "Do you want to leave a message?",
"zh": "您要留言吗?"
},
"review": {
"prompt": "要找的人不在,问能不能留言。"
}
},
{
"id": "A1-U20-P07",
"type": "phrase",
"en": "Can you call me back?",
"zh": "你能给我回电话吗?",
"sceneWord": false,
"match": [
[
"call me back",
"call you back"
]
],
"example": {
"en": "I can call you back later.",
"zh": "我晚点给你回电话。"
},
"review": {
"prompt": "请对方给你回电话。"
}
},
{
"id": "A1-U20-P08",
"type": "phrase",
"en": "What's your mobile number?",
"zh": "你的手机号是多少?",
"sceneWord": false,
"match": [
[
"mobile number",
"phone number"
]
],
"example": {
"en": "My mobile number is 138 2046 7751.",
"zh": "我的手机号是 138 2046 7751。"
},
"review": {
"prompt": "问对方的手机号。"
}
},
{
"id": "A1-U20-P09",
"type": "phrase",
"en": "Sorry, I can't hear you.",
"zh": "抱歉,我听不见你说话。",
"sceneWord": false,
"match": [
[
"can't hear"
]
],
"example": {
"en": "I can't hear you. Can you speak slowly?",
"zh": "我听不见,你能慢点说吗?"
},
"review": {
"prompt": "电话信号不好,说你听不见。"
}
},
{
"id": "A1-U20-P10",
"type": "phrase",
"en": "Sorry, wrong number.",
"zh": "抱歉,打错了。",
"sceneWord": false,
"match": [
[
"wrong number"
]
],
"example": {
"en": "I think you have the wrong number.",
"zh": "我想你打错了。"
},
"review": {
"prompt": "有人打错电话,告诉他打错了。"
}
},
{
"id": "A1-U20-P11",
"type": "phrase",
"en": "I'll call again later.",
"zh": "我晚点再打。",
"sceneWord": false,
"match": [
[
"call again",
"call later"
]
],
"example": {
"en": "OK, I'll call later.",
"zh": "好,我晚点再打。"
},
"review": {
"prompt": "对方忙,说你晚点再打。"
}
},
{
"id": "A1-U20-P12",
"type": "phrase",
"en": "Please text me.",
"zh": "请给我发短信。",
"sceneWord": true,
"sceneReason": "text 为 A2 动词,旅行中发短信确认地址很常用",
"match": [
[
"text me"
]
],
"example": {
"en": "Text me the address, please.",
"zh": "请把地址发短信给我。"
},
"review": {
"prompt": "请朋友把时间发短信给你。"
}
}
],
"receptiveWords": [
{
"id": "A1-U20-R01",
"en": "telephone",
"zh": "电话"
},
{
"id": "A1-U20-R02",
"en": "mail",
"zh": "邮件"
},
{
"id": "A1-U20-R03",
"en": "ring",
"zh": "(电话)响"
},
{
"id": "A1-U20-R04",
"en": "voice",
"zh": "声音"
},
{
"id": "A1-U20-R05",
"en": "conversation",
"zh": "对话"
},
{
"id": "A1-U20-R06",
"en": "talk",
"zh": "说话"
},
{
"id": "A1-U20-R07",
"en": "mind",
"zh": "介意(Never mind.)"
},
{
"id": "A1-U20-R08",
"en": "grandma",
"zh": "奶奶;外婆"
},
{
"id": "A1-U20-R09",
"en": "grandpa",
"zh": "爷爷;外公"
},
{
"id": "A1-U20-R10",
"en": "mum",
"zh": "妈妈"
},
{
"id": "A1-U20-R11",
"en": "haircut",
"zh": "理发"
},
{
"id": "A1-U20-R12",
"en": "class",
"zh": "课;班"
},
{
"id": "A1-U20-R13",
"en": "lesson",
"zh": "课"
},
{
"id": "A1-U20-R14",
"en": "course",
"zh": "课程"
},
{
"id": "A1-U20-R15",
"en": "test",
"zh": "考试"
},
{
"id": "A1-U20-R16",
"en": "college",
"zh": "学院"
},
{
"id": "A1-U20-R17",
"en": "club",
"zh": "俱乐部"
},
{
"id": "A1-U20-R18",
"en": "group",
"zh": "小组"
},
{
"id": "A1-U20-R19",
"en": "owner",
"zh": "老板;主人"
},
{
"id": "A1-U20-R20",
"en": "worker",
"zh": "工作人员"
}
],
"segments": [
{
"id": "A1-U20-S1",
"title": "打电话找人",
"minutes": 13,
"itemIds": [
"A1-U20-P01",
"A1-U20-P02",
"A1-U20-P03",
"A1-U20-P04",
"A1-U20-P05"
],
"listening": {
"text": "Hello? Hello, this is Chen. Can I speak to Mr Brown? Who's calling, please? Chen, from London. Hold on, please. ... Sorry, he's not here right now.",
"question": "布朗先生现在怎么样?",
"options": [
"不在",
"在开会",
"马上来接电话"
]
},
"speaking": [
{
"text": "Hello, this is Chen."
},
{
"text": "Can I speak to Mr Brown?"
},
{
"text": "Who's calling, please?"
},
{
"text": "Hold on, please.",
"tip": "hold on 连读成 /həʊl dɒn/"
},
{
"text": "He's not here right now."
}
],
"reading": {
"text": "Phone talk\nThe phone rings. Grandma answers.\nGrandma: Hello?\nLeo: Hi Grandma, this is Leo. Can I speak to Mum?\nGrandma: Hold on... Sorry, she's not here right now. She's at her dance class. Do you want to talk to Grandpa?\nLeo: Yes, please!\nIt's a short conversation, but Grandma loves Leo's voice.",
"question": "妈妈现在在哪里?",
"options": [
"在舞蹈课上",
"在上班",
"在家里"
]
},
"writing": {
"prompt": "写两句话:说你是谁,再问能不能和汤姆通话。",
"example": "Hello, this is Chen. Can I speak to Tom?",
"itemIds": [
"A1-U20-P01",
"A1-U20-P02"
]
},
"independent": {
"prompt": "你接到电话,要找的人不在,用英语问对方是谁并说那人不在。",
"itemIds": [
"A1-U20-P03",
"A1-U20-P04",
"A1-U20-P05"
]
}
},
{
"id": "A1-U20-S2",
"title": "留言和回电",
"minutes": 13,
"itemIds": [
"A1-U20-P06",
"A1-U20-P07",
"A1-U20-P08",
"A1-U20-P11",
"A1-U20-P12"
],
"listening": {
"text": "Can I leave a message? Sure. Can you ask Lucy to call me back? What's your mobile number? It's 139 5520 8864. OK. Or I'll call again later.",
"question": "打电话的人希望露西做什么?",
"options": [
"给他回电话",
"发邮件",
"去找他"
]
},
"speaking": [
{
"text": "Can I leave a message?"
},
{
"text": "Can you call me back?"
},
{
"text": "What's your mobile number?"
},
{
"text": "I'll call again later."
},
{
"text": "Please text me."
}
],
"reading": {
"text": "Phone messages\nFor: Mr Brown\nFrom: Sara, the owner of Sun Hair\nMessage: Your haircut is on Friday at 3 pm. Please call her back.\n-\nFor: Ella\nFrom: Kate, the College English Club\nMessage: The group lesson is on Monday. Your test is next week. Please text her or send an email or mail. Her number is 136 2210 5547.",
"question": "艾拉的考试在什么时候?",
"options": [
"下周",
"周一",
"周五"
]
},
"writing": {
"prompt": "写两句话:问能不能留言,请对方回电话。",
"example": "Can I leave a message? Can you call me back?",
"itemIds": [
"A1-U20-P06",
"A1-U20-P07"
]
},
"independent": {
"prompt": "用英语给不在的朋友留言:说你是谁,请他回电话,并留下手机号。",
"itemIds": [
"A1-U20-P01",
"A1-U20-P06",
"A1-U20-P07",
"A1-U20-P08"
]
}
},
{
"id": "A1-U20-S3",
"title": "电话里的问题",
"minutes": 11,
"itemIds": [
"A1-U20-P09",
"A1-U20-P10"
],
"listening": {
"text": "Hello? Is that Max? Sorry, wrong number. Oh, sorry! ... Hello, Max? Sorry, I can't hear you. Can you speak slowly?",
"question": "第一个电话出了什么问题?",
"options": [
"打错了",
"听不见",
"没人接"
]
},
"speaking": [
{
"text": "Sorry, I can't hear you."
},
{
"text": "Sorry, wrong number."
},
{
"text": "Can you spell your name, please?"
}
],
"reading": {
"text": "Phone help for your trip\nCan't hear the worker on the telephone? Say \"Sorry, I can't hear you.\" Ask them to speak slowly or to spell a word.\nWrong number? Say sorry. Never mind!\nA course or a class on the phone is not easy. Text or email is OK too.",
"question": "电话里听不清时可以怎么做?",
"options": [
"请对方慢点说或拼出来",
"马上挂电话",
"大声喊"
]
},
"writing": {
"prompt": "写两句话:说你听不见,请对方慢点说。",
"example": "Sorry, I can't hear you. Can you speak slowly?",
"itemIds": [
"A1-U20-P09"
]
},
"independent": {
"prompt": "有人打错电话找“Max”,用英语礼貌地告诉他打错了。",
"itemIds": [
"A1-U20-P10",
"A1-U20-P03"
]
}
}
],
"scenes": [
{
"id": "A1-U20-C1",
"kind": "main",
"title": "打电话到朋友家",
"learnerRole": "你",
"aiRole": "朋友的家人",
"setting": "你打电话找朋友汤姆,接电话的是他的家人。",
"turns": [
{
"ai": "Hello?",
"goal": "说你是谁",
"model": "Hello, this is Chen.",
"zh": "你好,我是陈。",
"itemIds": [
"A1-U20-P01"
]
},
{
"ai": "Hi, Chen.",
"goal": "问能不能和汤姆通话",
"model": "Can I speak to Tom, please?",
"zh": "请问汤姆在吗?",
"itemIds": [
"A1-U20-P02"
]
},
{
"ai": "Sorry, he's not here right now.",
"goal": "问能不能留言",
"model": "Can I leave a message?",
"zh": "我可以留个言吗?",
"itemIds": [
"A1-U20-P06"
]
},
{
"ai": "Sure.",
"goal": "请他回电话",
"model": "Can you ask him to call me back?",
"zh": "你能让他给我回电话吗?",
"itemIds": [
"A1-U20-P07"
]
},
{
"ai": "OK. What's your mobile number?",
"goal": "留下号码,说晚点再打",
"model": "It's 138 2046 7751. Or I'll call again later.",
"zh": "138 2046 7751。或者我晚点再打。",
"itemIds": [
"A1-U20-P11"
]
}
]
},
{
"id": "A1-U20-C2",
"kind": "variant",
"title": "接电话",
"learnerRole": "接电话的人",
"aiRole": "打电话来的人",
"setting": "你在朋友家,电话响了,你帮忙接电话。",
"turns": [
{
"ai": "Hello, can I speak to Lily?",
"goal": "问对方是谁",
"model": "Who's calling, please?",
"zh": "请问您是哪位?",
"itemIds": [
"A1-U20-P03"
]
},
{
"ai": "This is Ben, from her English class.",
"goal": "请对方稍等",
"model": "Hold on, please.",
"zh": "请稍等。",
"itemIds": [
"A1-U20-P04"
]
},
{
"ai": "OK.",
"goal": "说她现在不在",
"model": "Sorry, she's not here right now.",
"zh": "抱歉,她现在不在。",
"itemIds": [
"A1-U20-P05"
]
},
{
"ai": "Oh. Can she call me back?",
"goal": "问对方的手机号",
"model": "Sure. What's your mobile number?",
"zh": "好的。你的手机号是多少?",
"itemIds": [
"A1-U20-P08"
]
},
{
"ai": "It's 136... hello?",
"goal": "说听不见",
"model": "Sorry, I can't hear you.",
"zh": "抱歉,我听不见你说话。",
"itemIds": [
"A1-U20-P09"
]
}
]
},
{
"id": "A1-U20-C3",
"kind": "variant",
"title": "打错电话和发短信",
"learnerRole": "你",
"aiRole": "陌生人/朋友",
"setting": "你打给酒店想确认地址,结果先打错,再打给朋友。",
"turns": [
{
"ai": "Hello?",
"goal": "说你是谁,问能不能和 Sam 通话",
"model": "Hello, this is Chen. Can I speak to Sam?",
"zh": "你好,我是陈。能和 Sam 通话吗?",
"itemIds": [
"A1-U20-P01",
"A1-U20-P02"
]
},
{
"ai": "Sam? There's no Sam here.",
"goal": "说抱歉,打错了",
"model": "Oh, sorry. Wrong number.",
"zh": "哦,抱歉,打错了。",
"itemIds": [
"A1-U20-P10"
]
},
{
"ai": "No problem. Bye.",
"goal": "说你晚点再打",
"model": "OK, I'll call again later.",
"zh": "好,我晚点再打。",
"itemIds": [
"A1-U20-P11"
]
},
{
"ai": "(Sam) Hi Chen! Sorry, I'm busy right now.",
"goal": "请他发短信给你地址",
"model": "Please text me the address.",
"zh": "请把地址发短信给我。",
"itemIds": [
"A1-U20-P12"
]
},
{
"ai": "Sure. I can text you in five minutes.",
"goal": "请他之后给你回电话",
"model": "Thanks. Can you call me back tonight?",
"zh": "谢谢。你今晚能给我回电话吗?",
"itemIds": [
"A1-U20-P07"
]
}
]
}
],
"tasks": [
{
"id": "A1-U20-T1",
"sceneId": "A1-U20-C1",
"goal": "打电话找人,对方不在时留言",
"itemIds": [
"A1-U20-P01",
"A1-U20-P02",
"A1-U20-P06",
"A1-U20-P07",
"A1-U20-P11"
],
"slots": [
"你是谁",
"找谁",
"留言内容"
]
},
{
"id": "A1-U20-T2",
"sceneId": "A1-U20-C2",
"goal": "帮别人接电话并记下对方信息",
"itemIds": [
"A1-U20-P03",
"A1-U20-P04",
"A1-U20-P05",
"A1-U20-P08",
"A1-U20-P09"
],
"slots": [
"对方是谁",
"手机号"
]
},
{
"id": "A1-U20-T3",
"sceneId": "A1-U20-C3",
"goal": "处理打错电话,并请朋友发短信",
"itemIds": [
"A1-U20-P01",
"A1-U20-P02",
"A1-U20-P10",
"A1-U20-P11",
"A1-U20-P12",
"A1-U20-P07"
],
"slots": [
"打错",
"短信",
"回电"
]
}
],
"materials": [
{
"id": "A1-U20-M1",
"mode": "listening",
"title": "一条电话留言",
"text": "Hello, this is a telephone message for Mr Brown. This is Chen from the hotel. Your phone rang, but I couldn't reach you, so I'll leave a short message. Sorry if my voice is not clear. I'm calling about your reservation for next week. My grandma and grandpa will visit, so I moved your room. Please call me back for a short conversation, or text me. My mobile number is 138 — let me repeat, one, three, eight. I have an English class and a haircut this afternoon, so if I don't answer, call again later. Never mind if it's late. Thank you. Bye.",
"glosses": {
"reach": "联系到",
"moved": "换了",
"couldn't": "不能(过去式)",
"clear": "清楚的"
},
"questions": [
{
"type": "gist",
"question": "这条留言是谁留给谁的?",
"options": [
"Chen 留给 Mr Brown",
"Mr Brown 留给 Chen",
"Anna 留给 Ben"
]
},
{
"type": "detail",
"question": "留言的人希望对方做什么?",
"options": [
"给他回电话",
"来酒店",
"发邮件"
]
}
]
},
{
"id": "A1-U20-M2",
"mode": "reading",
"title": "读一段对话:打电话留言",
"text": "Chen: Hello, this is Chen. Can I speak to Mr Brown?\nWorker: Hold on, please... Sorry, he's not here right now. This is his co-worker.\nChen: Can I leave a message? I couldn't reach him by mail.\nWorker: Of course. I'm the office worker today.\nChen: Please ask him to call me back. It's about a college course and a club test next week.\nWorker: Sorry, I can't hear you. Your voice is not clear. Can you say the number again?\nChen: Sure. My mobile is 139... I'll text you too. Is Mr Brown the owner?\nWorker: Yes, he owns the group. Never mind, I'll tell him after his class.\nChen: Thank you. When is he back?\nWorker: Maybe this afternoon, after his lesson.\nChen: OK, I'll call again later. Goodbye.",
"glosses": {
"staff": "员工,服务员",
"goodbye": "再见",
"co-worker": "同事",
"owns": "拥有",
"office": "办公室",
"reach": "联系到",
"clear": "清楚的"
},
"questions": [
{
"type": "detail",
"question": "Mr Brown 在吗?",
"options": [
"不在",
"在,正在开会",
"在,马上来"
]
},
{
"type": "detail",
"question": "Chen 希望 Mr Brown 做什么?",
"options": [
"给他回电话",
"来酒店",
"发邮件给他"
]
}
]
}
],
"excluded": [
{
"en": "voicemail",
"reason": "不在 CEFR-J 表中;A1 用 leave a message 表达"
}
]
}