feat(curriculum): release A1 Chinese (#64764)

Co-authored-by: Huyen Nguyen <25715018+huyenltnguyen@users.noreply.github.com>
This commit is contained in:
miyaliu666
2025-12-22 03:43:52 +08:00
committed by GitHub
parent f021d667af
commit 3ebcc0ec55
27 changed files with 62 additions and 44 deletions
+16 -24
View File
@@ -8767,37 +8767,29 @@
"zh-a1-module-discussing-team-skills": "Discussing Team Skills" "zh-a1-module-discussing-team-skills": "Discussing Team Skills"
}, },
"module-intros": { "module-intros": {
"zh-a1-module-introduction-and-certification-overview": {
"note": "Coming Winter 2025",
"intro": ["PLACEHOLDER: Write the module intro here."]
},
"zh-a1-module-initials-and-finals": {
"note": "Coming Winter 2025",
"intro": ["PLACEHOLDER: Write the module intro here."]
},
"zh-a1-module-greetings-and-basic-introductions": {
"note": "Coming Winter 2025",
"intro": ["PLACEHOLDER: Write the module intro here."]
},
"zh-a1-module-asking-and-giving-basic-information": {
"note": "Coming Winter 2025",
"intro": ["PLACEHOLDER: Write the module intro here."]
},
"zh-a1-module-introducing-others": { "zh-a1-module-introducing-others": {
"note": "Coming Winter 2025", "note": "Coming 2026",
"intro": ["PLACEHOLDER: Write the module intro here."] "intro": [
"In this module, you will practice understanding short monologues that introduce information about other people, such as name, role, nationality, and age."
]
}, },
"zh-a1-module-getting-to-know-the-team": { "zh-a1-module-getting-to-know-the-team": {
"note": "Coming Winter 2025", "note": "Coming 2026",
"intro": ["PLACEHOLDER: Write the module intro here."] "intro": [
"In this module, you will practice understanding a short conversation that asks and answers simple questions about colleagues."
]
}, },
"zh-a1-module-talking-about-personal-skills": { "zh-a1-module-talking-about-personal-skills": {
"note": "Coming Winter 2025", "note": "Coming 2026",
"intro": ["PLACEHOLDER: Write the module intro here."] "intro": [
"In this module, you will practice understanding short monologues about what people can and cannot do, such as languages and work skills."
]
}, },
"zh-a1-module-discussing-team-skills": { "zh-a1-module-discussing-team-skills": {
"note": "Coming Winter 2025", "note": "Coming 2026",
"intro": ["PLACEHOLDER: Write the module intro here."] "intro": [
"In this module, you will practice understanding a short conversation about who can do which tasks on a team and how a project starts."
]
} }
}, },
"blocks": { "blocks": {
@@ -208,6 +208,7 @@
"core-certs-heading": "Recommended curriculum (still in beta):", "core-certs-heading": "Recommended curriculum (still in beta):",
"learn-english-heading": "Learn English for Developers:", "learn-english-heading": "Learn English for Developers:",
"learn-spanish-heading": "Learn Professional Spanish:", "learn-spanish-heading": "Learn Professional Spanish:",
"learn-chinese-heading": "Learn Professional Chinese:",
"professional-certs-heading": "Professional certifications:", "professional-certs-heading": "Professional certifications:",
"interview-prep-heading": "Prepare for the developer interview job search:", "interview-prep-heading": "Prepare for the developer interview job search:",
"legacy-curriculum-heading": "Our archived coursework:", "legacy-curriculum-heading": "Our archived coursework:",
+1
View File
@@ -32,6 +32,7 @@ const superBlockHeadings: { [key in SuperBlockStage]: string } = {
[SuperBlockStage.Core]: 'landing.core-certs-heading', [SuperBlockStage.Core]: 'landing.core-certs-heading',
[SuperBlockStage.English]: 'landing.learn-english-heading', [SuperBlockStage.English]: 'landing.learn-english-heading',
[SuperBlockStage.Spanish]: 'landing.learn-spanish-heading', [SuperBlockStage.Spanish]: 'landing.learn-spanish-heading',
[SuperBlockStage.Chinese]: 'landing.learn-chinese-heading',
[SuperBlockStage.Professional]: 'landing.professional-certs-heading', [SuperBlockStage.Professional]: 'landing.professional-certs-heading',
[SuperBlockStage.Extra]: 'landing.interview-prep-heading', [SuperBlockStage.Extra]: 'landing.interview-prep-heading',
[SuperBlockStage.Legacy]: 'landing.legacy-curriculum-heading', [SuperBlockStage.Legacy]: 'landing.legacy-curriculum-heading',
@@ -147,7 +147,8 @@ describe('external curriculum data build', () => {
stage !== SuperBlockStage.Upcoming && stage !== SuperBlockStage.Upcoming &&
stage !== SuperBlockStage.Catalog && stage !== SuperBlockStage.Catalog &&
stage !== SuperBlockStage.Core && stage !== SuperBlockStage.Core &&
stage !== SuperBlockStage.Spanish stage !== SuperBlockStage.Spanish &&
stage !== SuperBlockStage.Chinese
); );
}) })
.flatMap(([, superBlocks]) => superBlocks); .flatMap(([, superBlocks]) => superBlocks);
@@ -270,6 +270,7 @@ describe('external curriculum data build', () => {
core: SuperBlockStage.Core, core: SuperBlockStage.Core,
english: SuperBlockStage.English, english: SuperBlockStage.English,
spanish: SuperBlockStage.Spanish, spanish: SuperBlockStage.Spanish,
chinese: SuperBlockStage.Chinese,
professional: SuperBlockStage.Professional, professional: SuperBlockStage.Professional,
extra: SuperBlockStage.Extra, extra: SuperBlockStage.Extra,
legacy: SuperBlockStage.Legacy, legacy: SuperBlockStage.Legacy,
@@ -93,6 +93,7 @@ enum SuperBlockStage {
Core = 'core', Core = 'core',
English = 'english', English = 'english',
Spanish = 'spanish', Spanish = 'spanish',
Chinese = 'chinese',
Professional = 'professional', Professional = 'professional',
Extra = 'extra', Extra = 'extra',
Legacy = 'legacy' Legacy = 'legacy'
@@ -175,6 +176,14 @@ export const orderedSuperBlockInfo: OrderedSuperBlocks = {
} }
], ],
[SuperBlockStage.Chinese]: [
{
dashedName: SuperBlocks.A1Chinese,
public: false,
title: intros[SuperBlocks.A1Chinese].title
}
],
[SuperBlockStage.Extra]: [ [SuperBlockStage.Extra]: [
{ {
dashedName: SuperBlocks.TheOdinProject, dashedName: SuperBlocks.TheOdinProject,
@@ -1,6 +1,6 @@
{ {
"name": "Certification Introduction", "name": "Certification Introduction",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-learn-certification-introduction", "dashedName": "zh-a1-learn-certification-introduction",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "challenge-list", "blockLayout": "challenge-list",
@@ -1,6 +1,6 @@
{ {
"name": "Compound Finals", "name": "Compound Finals",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-learn-compound-finals", "dashedName": "zh-a1-learn-compound-finals",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "challenge-grid", "blockLayout": "challenge-grid",
@@ -1,6 +1,6 @@
{ {
"name": "Initials", "name": "Initials",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-learn-initials", "dashedName": "zh-a1-learn-initials",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "challenge-grid", "blockLayout": "challenge-grid",
@@ -1,6 +1,6 @@
{ {
"name": "Nasal Finals", "name": "Nasal Finals",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-learn-nasal-finals", "dashedName": "zh-a1-learn-nasal-finals",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "challenge-grid", "blockLayout": "challenge-grid",
@@ -1,6 +1,6 @@
{ {
"name": "Simple Finals", "name": "Simple Finals",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-learn-simple-finals", "dashedName": "zh-a1-learn-simple-finals",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "challenge-grid", "blockLayout": "challenge-grid",
@@ -1,6 +1,6 @@
{ {
"name": "Special Spelling Rules", "name": "Special Spelling Rules",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-learn-special-spelling-rules", "dashedName": "zh-a1-learn-special-spelling-rules",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "challenge-grid", "blockLayout": "challenge-grid",
@@ -1,6 +1,6 @@
{ {
"name": "Understanding the Greetings and Introductions", "name": "Understanding the Greetings and Introductions",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-learn-understanding-greetings-and-introductions", "dashedName": "zh-a1-learn-understanding-greetings-and-introductions",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "challenge-grid", "blockLayout": "challenge-grid",
@@ -1,6 +1,6 @@
{ {
"name": "Understanding the Questions and Answers", "name": "Understanding the Questions and Answers",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-learn-understanding-questions-and-answers", "dashedName": "zh-a1-learn-understanding-questions-and-answers",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "challenge-grid", "blockLayout": "challenge-grid",
@@ -1,6 +1,6 @@
{ {
"name": "Exchanging Basic Information", "name": "Exchanging Basic Information",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-practice-exchanging-basic-information", "dashedName": "zh-a1-practice-exchanging-basic-information",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "challenge-grid", "blockLayout": "challenge-grid",
@@ -1,6 +1,6 @@
{ {
"name": "Building Your Self-Introduction", "name": "Building Your Self-Introduction",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-practice-introducing-yourself", "dashedName": "zh-a1-practice-introducing-yourself",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "challenge-grid", "blockLayout": "challenge-grid",
@@ -1,6 +1,6 @@
{ {
"name": "Pinyin Practice", "name": "Pinyin Practice",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-practice-pinyin", "dashedName": "zh-a1-practice-pinyin",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "challenge-grid", "blockLayout": "challenge-grid",
@@ -1,6 +1,6 @@
{ {
"name": "Greetings and Introductions Quiz", "name": "Greetings and Introductions Quiz",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-quiz-greetings-and-introductions", "dashedName": "zh-a1-quiz-greetings-and-introductions",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "link", "blockLayout": "link",
@@ -1,6 +1,6 @@
{ {
"name": "Introduction Questions Quiz", "name": "Introduction Questions Quiz",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-quiz-introduction-questions", "dashedName": "zh-a1-quiz-introduction-questions",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "link", "blockLayout": "link",
@@ -1,6 +1,6 @@
{ {
"name": "Greetings and Introductions Review", "name": "Greetings and Introductions Review",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-review-greetings-and-introductions", "dashedName": "zh-a1-review-greetings-and-introductions",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "challenge-list", "blockLayout": "challenge-list",
@@ -1,6 +1,6 @@
{ {
"name": "Introduction Questions Review", "name": "Introduction Questions Review",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-review-introduction-questions", "dashedName": "zh-a1-review-introduction-questions",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "challenge-list", "blockLayout": "challenge-list",
@@ -1,6 +1,6 @@
{ {
"name": "Greeting New Colleagues", "name": "Greeting New Colleagues",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-warm-up-greeting-new-colleagues", "dashedName": "zh-a1-warm-up-greeting-new-colleagues",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "challenge-grid", "blockLayout": "challenge-grid",
@@ -1,6 +1,6 @@
{ {
"name": "Meeting New Teammates", "name": "Meeting New Teammates",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "zh-a1-warm-up-meeting-new-teammates", "dashedName": "zh-a1-warm-up-meeting-new-teammates",
"helpCategory": "Chinese Curriculum", "helpCategory": "Chinese Curriculum",
"blockLayout": "challenge-grid", "blockLayout": "challenge-grid",
@@ -52,9 +52,11 @@
}, },
{ {
"dashedName": "zh-a1-chapter-introducing-colleagues-and-family", "dashedName": "zh-a1-chapter-introducing-colleagues-and-family",
"comingSoon": true,
"modules": [ "modules": [
{ {
"dashedName": "zh-a1-module-introducing-others", "dashedName": "zh-a1-module-introducing-others",
"comingSoon": true,
"blocks": [ "blocks": [
"zh-a1-warm-up-introducing-others-basics", "zh-a1-warm-up-introducing-others-basics",
"zh-a1-learn-meeting-the-team", "zh-a1-learn-meeting-the-team",
@@ -67,6 +69,7 @@
}, },
{ {
"dashedName": "zh-a1-module-getting-to-know-the-team", "dashedName": "zh-a1-module-getting-to-know-the-team",
"comingSoon": true,
"blocks": [ "blocks": [
"zh-a1-warm-up-knowing-the-team-basics", "zh-a1-warm-up-knowing-the-team-basics",
"zh-a1-learn-asking-about-the-team", "zh-a1-learn-asking-about-the-team",
@@ -79,9 +82,11 @@
}, },
{ {
"dashedName": "zh-a1-chapter-expressing-what-you-can-and-cant-do", "dashedName": "zh-a1-chapter-expressing-what-you-can-and-cant-do",
"comingSoon": true,
"modules": [ "modules": [
{ {
"dashedName": "zh-a1-module-talking-about-personal-skills", "dashedName": "zh-a1-module-talking-about-personal-skills",
"comingSoon": true,
"blocks": [ "blocks": [
"zh-a1-warm-up-personal-skills-basics", "zh-a1-warm-up-personal-skills-basics",
"zh-a1-learn-can-or-cannot", "zh-a1-learn-can-or-cannot",
@@ -92,6 +97,7 @@
}, },
{ {
"dashedName": "zh-a1-module-discussing-team-skills", "dashedName": "zh-a1-module-discussing-team-skills",
"comingSoon": true,
"blocks": [ "blocks": [
"zh-a1-warm-up-team-skills-basics", "zh-a1-warm-up-team-skills-basics",
"zh-a1-learn-who-can-do-what-on-the-team", "zh-a1-learn-who-can-do-what-on-the-team",
+1
View File
@@ -28,6 +28,7 @@ const nonArchivedSuperBlocks = [
intro[SuperBlocks.A2English].title, intro[SuperBlocks.A2English].title,
intro[SuperBlocks.B1English].title, intro[SuperBlocks.B1English].title,
intro[SuperBlocks.A1Spanish].title, intro[SuperBlocks.A1Spanish].title,
intro[SuperBlocks.A1Chinese].title,
intro[SuperBlocks.TheOdinProject].title, intro[SuperBlocks.TheOdinProject].title,
intro[SuperBlocks.CodingInterviewPrep].title, intro[SuperBlocks.CodingInterviewPrep].title,
intro[SuperBlocks.ProjectEuler].title, intro[SuperBlocks.ProjectEuler].title,
+5 -1
View File
@@ -46,6 +46,10 @@ const LANDING_PAGE_LINKS = [
slug: 'a1-professional-spanish', slug: 'a1-professional-spanish',
name: 'A1 Professional Spanish Certification (Beta)' name: 'A1 Professional Spanish Certification (Beta)'
}, },
{
slug: 'a1-professional-chinese',
name: 'A1 Professional Chinese Certification (Beta)'
},
{ {
slug: 'foundational-c-sharp-with-microsoft', slug: 'foundational-c-sharp-with-microsoft',
name: 'Free Foundational C# with Microsoft Certification' name: 'Free Foundational C# with Microsoft Certification'
@@ -68,7 +72,7 @@ test.describe('Map Component', () => {
page.getByText(translations.landing['interview-prep-heading']) page.getByText(translations.landing['interview-prep-heading'])
).toBeVisible(); ).toBeVisible();
const curriculumBtns = page.getByTestId('curriculum-map-button'); const curriculumBtns = page.getByTestId('curriculum-map-button');
await expect(curriculumBtns).toHaveCount(15); await expect(curriculumBtns).toHaveCount(16);
for (const { name, slug } of LANDING_PAGE_LINKS) { for (const { name, slug } of LANDING_PAGE_LINKS) {
const superblockLink = page.getByRole('link', { const superblockLink = page.getByRole('link', {
+3 -1
View File
@@ -83,6 +83,7 @@ export enum SuperBlockStage {
Core, Core,
English, English,
Spanish, Spanish,
Chinese,
Professional, Professional,
Extra, Extra,
Legacy, Legacy,
@@ -95,6 +96,7 @@ const defaultStageOrder = [
SuperBlockStage.Core, SuperBlockStage.Core,
SuperBlockStage.English, SuperBlockStage.English,
SuperBlockStage.Spanish, SuperBlockStage.Spanish,
SuperBlockStage.Chinese,
SuperBlockStage.Extra, SuperBlockStage.Extra,
SuperBlockStage.Legacy, SuperBlockStage.Legacy,
SuperBlockStage.Professional, SuperBlockStage.Professional,
@@ -129,6 +131,7 @@ export const superBlockStages: StageMap = {
], ],
[SuperBlockStage.English]: [SuperBlocks.A2English, SuperBlocks.B1English], [SuperBlockStage.English]: [SuperBlocks.A2English, SuperBlocks.B1English],
[SuperBlockStage.Spanish]: [SuperBlocks.A1Spanish], [SuperBlockStage.Spanish]: [SuperBlocks.A1Spanish],
[SuperBlockStage.Chinese]: [SuperBlocks.A1Chinese],
[SuperBlockStage.Professional]: [SuperBlocks.FoundationalCSharp], [SuperBlockStage.Professional]: [SuperBlocks.FoundationalCSharp],
[SuperBlockStage.Extra]: [ [SuperBlockStage.Extra]: [
SuperBlocks.TheOdinProject, SuperBlocks.TheOdinProject,
@@ -158,7 +161,6 @@ export const superBlockStages: StageMap = {
SuperBlocks.FullStackOpen, SuperBlocks.FullStackOpen,
SuperBlocks.A2Spanish, SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese, SuperBlocks.A2Chinese,
SuperBlocks.A1Chinese,
SuperBlocks.DevPlayground, SuperBlocks.DevPlayground,
SuperBlocks.FullStackDeveloper SuperBlocks.FullStackDeveloper
], ],