feat(curriculum): Add A2 Chinese Outline (#60451)

Co-authored-by: moT01 <20648924+moT01@users.noreply.github.com>
This commit is contained in:
miyaliu666
2025-06-05 03:53:52 +08:00
committed by GitHub
parent a2f2ad45c6
commit 0c6b35630f
22 changed files with 256 additions and 8 deletions
+15
View File
@@ -36,6 +36,7 @@ const fullStackDeveloperBase = '/learn/full-stack-developer';
const a2EnglishBase = '/learn/a2-english-for-developers';
const b1EnglishBase = '/learn/b1-english-for-developers';
const a2SpanishBase = '/learn/a2-professional-spanish';
const a2ChineseBase = '/learn/a2-professional-chinese';
const legacyFrontEndBase = feLibsBase;
const legacyFrontEndResponsiveBase = responsiveWebBase;
const legacyFrontEndTakeHomeBase = takeHomeBase;
@@ -850,6 +851,20 @@ const allStandardCerts = [
certSlug: Certification.A2Spanish
}
]
},
{
id: '682c3153086dd7cabe7f48bc',
title: 'A2 Professional Chinese',
certSlug: Certification.A2Chinese,
projects: [
{
id: '682c2753317b88f1ecdad894',
title: 'Dialogue 1: PLACEHOLDER',
link: `${a2ChineseBase}/talk-about-what-you-do-by-using-key-verbs
/text-1`,
certSlug: Certification.A2Chinese
}
]
}
] as const;
+19
View File
@@ -4264,6 +4264,25 @@
}
}
},
"a2-professional-chinese": {
"title": "A2 Professional Chinese Certification (Beta)",
"note": "This certification is currently in active development. While there isn't a claimable certification available for this section at the moment, one will be available soon. In the meantime, you're welcome to explore the courses we have created below.",
"intro": ["Placeholder intro"],
"blocks": {
"talk-about-what-you-do-by-using-key-verbs": {
"title": "Talk About What You Do by Using Key Verbs",
"intro": [
"Learn how to introduce yourself in Chinese in a simple and professional way. In this module you'll learn how to say who you are, where you are from, what you do, how you feel, and what you like or don't like."
]
},
"get-to-know-colleagues-by-asking-simple-questions": {
"title": "Get to Know Colleagues by Asking Simple Questions",
"intro": [
"Learn how to ask and answer questions in simple conversations. Through five short dialogues, practice talking about routines, feelings, preferences, workspaces, and personal information. You'll also learn to ask polite questions, give short answers, and use negation naturally."
]
}
}
},
"dev-playground": {
"title": "Dev Playground",
"intro": ["Playground for creating and testing challenges"],
@@ -1117,6 +1117,8 @@
"full-stack-developer-v9-cert": "Full Stack Developer Certification",
"a2-professional-spanish": "A2 Professional Spanish",
"a2-professional-spanish-cert": "A2 Professional Spanish Certification",
"a2-professional-chinese": "A2 Professional Chinese",
"a2-professional-chinese-cert": "A2 Professional Chinese Certification",
"legacy-front-end": "Legacy Front End",
"legacy-front-end-cert": "Legacy Front End Certification",
"legacy-back-end": "Legacy Back End",
+1
View File
@@ -44,6 +44,7 @@ const iconMap = {
[SuperBlocks.A2English]: A2EnglishIcon,
[SuperBlocks.B1English]: B1EnglishIcon,
[SuperBlocks.A2Spanish]: A2EnglishIcon,
[SuperBlocks.A2Chinese]: A2EnglishIcon,
[SuperBlocks.RosettaCode]: RosettaCodeIcon,
[SuperBlocks.PythonForEverybody]: PythonIcon,
[SuperBlocks.DevPlayground]: Code
@@ -92,6 +92,7 @@ const createCertifiedMap = ({
[Certification.A2English]: false,
[Certification.B1English]: false,
[Certification.A2Spanish]: false,
[Certification.A2Chinese]: false,
[Certification.JsAlgoDataStructNew]: isJsAlgoDataStructCertV8
});
@@ -0,0 +1,9 @@
---
title: Introduction to Get to Know Colleagues by Asking Simple Questions
block: get-to-know-colleagues-by-asking-simple-questions
superBlock: a2-professional-chinese
---
## Introduction to Get to Know Colleagues by Asking Simple Questions
Introduction to Get to Know Colleagues by Asking Simple Questions
@@ -0,0 +1,9 @@
---
title: A2 Professional Chinese
superBlock: a2-professional-chinese
certification: a2-professional-chinese
---
## Introduction to A2 Professional Chinese
A2 Professional Chinese
@@ -0,0 +1,9 @@
---
title: Introduction to Talk About What You Do by Using Key Verbs
block: talk-about-what-you-do-by-using-key-verbs
superBlock: a2-professional-chinese
---
## Introduction to Talk About What You Do by Using Key Verbs
Introduction to Talk About What You Do by Using Key Verbs
@@ -24,6 +24,7 @@ export const ConditionalDonationAlert = ({
SuperBlocks.A2English,
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.FullStackDeveloper
];
@@ -0,0 +1,15 @@
{
"name": "Get to Know Colleagues by Asking Simple Questions",
"isUpcomingChange": true,
"dashedName": "get-to-know-colleagues-by-asking-simple-questions",
"order": 1,
"superBlock": "a2-professional-chinese",
"challengeOrder": [
{
"id": "682c2671d8010bef0a79f466",
"title": "Dialogue 1: PLACEHOLDER"
}
],
"helpCategory": "English",
"blockLayout": "dialogue-grid"
}
@@ -0,0 +1,15 @@
{
"name": "Talk About What You Do by Using Key Verbs",
"isUpcomingChange": true,
"dashedName": "talk-about-what-you-do-by-using-key-verbs",
"order": 0,
"superBlock": "a2-professional-chinese",
"challengeOrder": [
{
"id": "682c2753317b88f1ecdad894",
"title": "Dialogue 1: PLACEHOLDER"
}
],
"helpCategory": "English",
"blockLayout": "dialogue-grid"
}
@@ -0,0 +1,9 @@
---
id: 682c3153086dd7cabe7f48bc
title: A2 Professional Chinese Certification
certification: a2-professional-chinese-certification
challengeType: 7
isPrivate: true
tests:
- id: 682c2753317b88f1ecdad894
title: "Dialogue 1: PLACEHOLDER"
@@ -0,0 +1,58 @@
---
id: 682c2671d8010bef0a79f466
title: "Dialogue 1: PLACEHOLDER"
challengeType: 21
dashedName: dialogue-1-placeholder
---
# --description--
Watch the video below to understand the context of the upcoming lessons.
# --assignment--
Watch the video
# --scene--
```json
{
"setup": {
"background": "chaos.png",
"characters": [
{
"character": "David",
"position": {"x":50,"y":80,"z":8},
"opacity": 0
}
],
"audio": {
"filename": "1.1-1.mp3",
"startTime": 1,
"startTimestamp": 5.7,
"finishTimestamp": 6.48
}
},
"commands": [
{
"character": "David",
"opacity": 1,
"startTime": 0
},
{
"character": "David",
"startTime": 1,
"finishTime": 0.78,
"dialogue": {
"text": "I'm Tom.",
"align": "center"
}
},
{
"character": "Tom",
"opacity": 0,
"startTime": 1.28
}
]
}
```
@@ -0,0 +1,58 @@
---
id: 682c2753317b88f1ecdad894
title: "Dialogue 1: PLACEHOLDER"
challengeType: 21
dashedName: dialogue-1-placeholder
---
# --description--
Watch the video below to understand the context of the upcoming lessons.
# --assignment--
Watch the video
# --scene--
```json
{
"setup": {
"background": "chaos.png",
"characters": [
{
"character": "David",
"position": {"x":50,"y":80,"z":8},
"opacity": 0
}
],
"audio": {
"filename": "1.1-1.mp3",
"startTime": 1,
"startTimestamp": 5.7,
"finishTimestamp": 6.48
}
},
"commands": [
{
"character": "David",
"opacity": 1,
"startTime": 0
},
{
"character": "David",
"startTime": 1,
"finishTime": 0.78,
"dialogue": {
"text": "I'm Tom.",
"align": "center"
}
},
{
"character": "Tom",
"opacity": 0,
"startTime": 1.28
}
]
}
```
+1
View File
@@ -86,6 +86,7 @@ const directoryToSuperblock = {
'24-b1-english-for-developers': 'b1-english-for-developers',
'25-front-end-development': 'full-stack-developer',
'26-a2-professional-spanish': 'a2-professional-spanish',
'27-a2-professional-chinese': 'a2-professional-chinese',
'99-dev-playground': 'dev-playground'
};
+2 -2
View File
@@ -178,7 +178,7 @@ describe('getSuperBlockFromPath', () => {
.filter(item => fs.lstatSync(path.join(englishFolder, item)).isDirectory());
it('handles all the directories in ./challenges/english', () => {
expect.assertions(26);
expect.assertions(27);
for (const directory of directories) {
expect(() => getSuperBlockFromDir(directory)).not.toThrow();
@@ -186,7 +186,7 @@ describe('getSuperBlockFromPath', () => {
});
it("returns valid superblocks (or 'certifications') for all valid arguments", () => {
expect.assertions(26);
expect.assertions(27);
const superBlockPaths = directories.filter(x => x !== '00-certifications');
+6 -2
View File
@@ -30,6 +30,7 @@ export enum Certification {
A2English = 'a2-english-for-developers-v8',
B1English = 'b1-english-for-developers-v8',
A2Spanish = 'a2-professional-spanish-v8',
A2Chinese = 'a2-professional-chinese-v8',
// Legacy certifications
LegacyFrontEnd = 'legacy-front-end',
JsAlgoDataStruct = 'javascript-algorithms-and-data-structures',
@@ -79,7 +80,8 @@ export const upcomingCertifications = [
Certification.FullStackDeveloper,
Certification.A2English,
Certification.B1English,
Certification.A2Spanish
Certification.A2Spanish,
Certification.A2Chinese
] as const;
export const certTypes = {
@@ -273,6 +275,7 @@ export const superBlockToCertMap: {
[SuperBlocks.A2English]: Certification.A2English,
[SuperBlocks.B1English]: Certification.B1English,
[SuperBlocks.A2Spanish]: Certification.A2Spanish,
[SuperBlocks.A2Chinese]: Certification.A2Chinese,
[SuperBlocks.PythonForEverybody]: null,
[SuperBlocks.CodingInterviewPrep]: null,
[SuperBlocks.ProjectEuler]: null,
@@ -306,7 +309,8 @@ export const linkedInCredentialIds = {
[Certification.JsAlgoDataStructNew]: 'jaads',
[Certification.A2English]: 'a2efd',
[Certification.B1English]: 'b1efd',
[Certification.A2Spanish]: 'a2ps'
[Certification.A2Spanish]: 'a2ps',
[Certification.A2Chinese]: 'a2pc'
};
export const oldDataVizId = '561add10cb82ac38a17513b3';
+18 -3
View File
@@ -26,6 +26,7 @@ export enum SuperBlocks {
A2English = 'a2-english-for-developers',
B1English = 'b1-english-for-developers',
A2Spanish = 'a2-professional-spanish',
A2Chinese = 'a2-professional-chinese',
RosettaCode = 'rosetta-code',
PythonForEverybody = 'python-for-everybody',
DevPlayground = 'dev-playground'
@@ -101,7 +102,11 @@ export const superBlockStages: StageMap = {
SuperBlocks.PythonForEverybody
],
[SuperBlockStage.Next]: [],
[SuperBlockStage.Upcoming]: [SuperBlocks.A2Spanish, SuperBlocks.DevPlayground]
[SuperBlockStage.Upcoming]: [
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.DevPlayground
]
};
Object.freeze(superBlockStages);
@@ -127,6 +132,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.A2English,
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.PythonForEverybody
],
[Languages.Chinese]: [
@@ -137,6 +143,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.A2English,
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.PythonForEverybody
],
[Languages.ChineseTraditional]: [
@@ -147,6 +154,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.A2English,
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.PythonForEverybody
],
[Languages.Italian]: [
@@ -157,6 +165,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.A2English,
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.PythonForEverybody
],
[Languages.Portuguese]: [
@@ -165,6 +174,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.A2English,
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.PythonForEverybody
],
[Languages.Ukrainian]: [
@@ -172,7 +182,8 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.FullStackDeveloper,
SuperBlocks.A2English,
SuperBlocks.B1English,
SuperBlocks.A2Spanish
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese
],
[Languages.Japanese]: [
SuperBlocks.JsAlgoDataStructNew,
@@ -180,7 +191,8 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.FullStackDeveloper,
SuperBlocks.A2English,
SuperBlocks.B1English,
SuperBlocks.A2Spanish
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese
],
[Languages.German]: [
SuperBlocks.RelationalDb,
@@ -197,6 +209,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.A2English,
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.PythonForEverybody
],
[Languages.Swahili]: [
@@ -221,6 +234,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.A2English,
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.PythonForEverybody
],
[Languages.Korean]: [
@@ -243,6 +257,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.A2English,
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.PythonForEverybody,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
+1
View File
@@ -56,6 +56,7 @@ const superBlockFolderMap = {
'b1-english-for-developers': '24-b1-english-for-developers',
'full-stack-developer': '25-front-end-development',
'a2-professional-spanish': '26-a2-professional-spanish',
'a2-professional-chinese': '27-a2-professional-chinese',
'dev-playground': '99-dev-playground'
};
@@ -94,5 +94,9 @@ export const superBlockList = [
{
name: 'A2 Professional Spanish (Beta)',
path: '26-a2-professional-spanish'
},
{
name: 'A2 Professional Chinese (Beta)',
path: '27-a2-professional-chinese'
}
];
@@ -14,7 +14,8 @@ const stepBasedSuperblocks = [
const taskBasedSuperblocks = [
'21-a2-english-for-developers',
'24-b1-english-for-developers',
'26-a2-professional-spanish'
'26-a2-professional-spanish',
'27-a2-professional-chinese'
];
const Block = () => {
@@ -28,6 +28,7 @@ export function getSuperBlockSubPath(superBlock: SuperBlocks): string {
[SuperBlocks.B1English]: '24-b1-english-for-developers',
[SuperBlocks.FullStackDeveloper]: '25-front-end-development',
[SuperBlocks.A2Spanish]: '26-a2-professional-spanish',
[SuperBlocks.A2Chinese]: '27-a2-professional-chinese',
[SuperBlocks.DevPlayground]: '99-dev-playground'
};
return pathMap[superBlock];