feat(curriculum): Add A1 Chinese Outline (#61655)

Co-authored-by: Huyen Nguyen <25715018+huyenltnguyen@users.noreply.github.com>
This commit is contained in:
miyaliu666
2025-08-09 03:12:33 +08:00
committed by GitHub
parent 06561edaeb
commit 03bbdbe584
17 changed files with 162 additions and 6 deletions
+15
View File
@@ -37,6 +37,7 @@ 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 a1ChineseBase = '/learn/a1-professional-chinese';
const legacyFrontEndBase = feLibsBase;
const legacyFrontEndResponsiveBase = responsiveWebBase;
const legacyFrontEndTakeHomeBase = takeHomeBase;
@@ -865,6 +866,20 @@ const allStandardCerts = [
certSlug: Certification.A2Chinese
}
]
},
{
id: '682c3153086dd7cabe7f48bc',
title: 'A1 Professional Chinese',
certSlug: Certification.A1Chinese,
projects: [
{
id: '682c2753317b88f1ecdad894',
title: 'Dialogue 1: PLACEHOLDER',
link: `${a1ChineseBase}/learn-essential-courtesies-at-the-office
/text-1`,
certSlug: Certification.A1Chinese
}
]
}
] as const;
+13
View File
@@ -4771,6 +4771,19 @@
}
}
},
"a1-professional-chinese": {
"title": "A1 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": {
"learn-essential-courtesies-at-the-office": {
"title": "Learn Essential Courtesies at the Office",
"intro": [
"Learn simple and polite ways to communicate at work. In this module, you'll learn essential phrases for greeting colleagues, expressing thanks, apologizing, and saying goodbye."
]
}
}
},
"basic-html": {
"title": "Basic HTML",
"summary": [
@@ -1184,6 +1184,8 @@
"a2-professional-spanish-cert": "A2 Professional Spanish Certification",
"a2-professional-chinese": "A2 Professional Chinese",
"a2-professional-chinese-cert": "A2 Professional Chinese Certification",
"a1-professional-chinese": "A1 Professional Chinese",
"a1-professional-chinese-cert": "A1 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
@@ -45,6 +45,7 @@ const iconMap = {
[SuperBlocks.B1English]: B1EnglishIcon,
[SuperBlocks.A2Spanish]: A2EnglishIcon,
[SuperBlocks.A2Chinese]: A2EnglishIcon,
[SuperBlocks.A1Chinese]: A2EnglishIcon,
[SuperBlocks.RosettaCode]: RosettaCodeIcon,
[SuperBlocks.PythonForEverybody]: PythonIcon,
[SuperBlocks.BasicHtml]: Code,
@@ -93,6 +93,7 @@ const createCertifiedMap = ({
[Certification.B1English]: false,
[Certification.A2Spanish]: false,
[Certification.A2Chinese]: false,
[Certification.A1Chinese]: false,
[Certification.JsAlgoDataStructNew]: isJsAlgoDataStructCertV8
});
@@ -0,0 +1,9 @@
---
title: A1 Professional Chinese
superBlock: a1-professional-chinese
certification: a1-professional-chinese
---
## Introduction to A1 Professional Chinese
A1 Professional Chinese
@@ -0,0 +1,9 @@
---
title: Introduction to Learn Essential Courtesies at the Office
block: get-to-know-colleagues-by-asking-simple-questions
superBlock: a1-professional-chinese
---
## Introduction to Learn Essential Courtesies at the Office
Introduction to Learn Essential Courtesies at the Office
@@ -57,6 +57,7 @@ export const ConditionalDonationAlert = ({
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.A1Chinese,
SuperBlocks.FullStackDeveloper
];
@@ -0,0 +1,15 @@
{
"name": "Learn Essential Courtesies at the Office",
"isUpcomingChange": true,
"dashedName": "learn-essential-courtesies-at-the-office",
"order": 1,
"superBlock": "a1-professional-chinese",
"challengeOrder": [
{
"id": "688f1daf0133dbe2a36b140b",
"title": "Dialogue 1: PLACEHOLDER"
}
],
"helpCategory": "English",
"blockLayout": "dialogue-grid"
}
@@ -0,0 +1,9 @@
---
id: 688f1daf0133dbe2a36b140b
title: A1 Professional Chinese Certification
certification: a1-professional-chinese-certification
challengeType: 7
isPrivate: true
tests:
- id: 688f1daf0133dbe2a36b140b
title: "Dialogue 1: PLACEHOLDER"
@@ -0,0 +1,58 @@
---
id: 688f1daf0133dbe2a36b140b
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
}
]
}
```
+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(29);
expect.assertions(30);
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(29);
expect.assertions(30);
const superBlockPaths = directories.filter(x => x !== '00-certifications');
+6 -2
View File
@@ -31,6 +31,7 @@ export enum Certification {
B1English = 'b1-english-for-developers-v8',
A2Spanish = 'a2-professional-spanish-v8',
A2Chinese = 'a2-professional-chinese-v8',
A1Chinese = 'a1-professional-chinese-v8',
// Legacy certifications
LegacyFrontEnd = 'legacy-front-end',
JsAlgoDataStruct = 'javascript-algorithms-and-data-structures',
@@ -81,7 +82,8 @@ export const upcomingCertifications = [
Certification.A2English,
Certification.B1English,
Certification.A2Spanish,
Certification.A2Chinese
Certification.A2Chinese,
Certification.A1Chinese
] as const;
export const certTypes = {
@@ -276,6 +278,7 @@ export const superBlockToCertMap: {
[SuperBlocks.B1English]: Certification.B1English,
[SuperBlocks.A2Spanish]: Certification.A2Spanish,
[SuperBlocks.A2Chinese]: Certification.A2Chinese,
[SuperBlocks.A1Chinese]: Certification.A1Chinese,
[SuperBlocks.PythonForEverybody]: null,
[SuperBlocks.CodingInterviewPrep]: null,
[SuperBlocks.ProjectEuler]: null,
@@ -312,7 +315,8 @@ export const linkedInCredentialIds = {
[Certification.A2English]: 'a2efd',
[Certification.B1English]: 'b1efd',
[Certification.A2Spanish]: 'a2ps',
[Certification.A2Chinese]: 'a2pc'
[Certification.A2Chinese]: 'a2pc',
[Certification.A1Chinese]: 'a1pc'
};
export const oldDataVizId = '561add10cb82ac38a17513b3';
+13
View File
@@ -27,6 +27,7 @@ export enum SuperBlocks {
B1English = 'b1-english-for-developers',
A2Spanish = 'a2-professional-spanish',
A2Chinese = 'a2-professional-chinese',
A1Chinese = 'a1-professional-chinese',
RosettaCode = 'rosetta-code',
PythonForEverybody = 'python-for-everybody',
BasicHtml = 'basic-html',
@@ -65,6 +66,7 @@ export const superBlockToFolderMap = {
[SuperBlocks.A2Chinese]: '27-a2-professional-chinese',
[SuperBlocks.BasicHtml]: '28-basic-html',
[SuperBlocks.SemanticHtml]: '29-semantic-html',
[SuperBlocks.A1Chinese]: '30-a1-professional-chinese',
[SuperBlocks.DevPlayground]: '99-dev-playground'
};
@@ -155,6 +157,7 @@ export const superBlockStages: StageMap = {
[SuperBlockStage.Upcoming]: [
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.A1Chinese,
SuperBlocks.DevPlayground
],
// Catalog is treated like upcoming for now
@@ -188,6 +191,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.A1Chinese,
SuperBlocks.PythonForEverybody,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
@@ -202,6 +206,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.A1Chinese,
SuperBlocks.PythonForEverybody,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
@@ -216,6 +221,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.A1Chinese,
SuperBlocks.PythonForEverybody,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
@@ -230,6 +236,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.A1Chinese,
SuperBlocks.PythonForEverybody,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
@@ -242,6 +249,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.A1Chinese,
SuperBlocks.PythonForEverybody,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
@@ -254,6 +262,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.A1Chinese,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
SuperBlocks.DevPlayground
@@ -266,6 +275,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.A1Chinese,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
SuperBlocks.DevPlayground
@@ -286,6 +296,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.A1Chinese,
SuperBlocks.PythonForEverybody,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
@@ -314,6 +325,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.A1Chinese,
SuperBlocks.PythonForEverybody,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
@@ -340,6 +352,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.B1English,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
SuperBlocks.A1Chinese,
SuperBlocks.PythonForEverybody,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
@@ -106,5 +106,9 @@ export const superBlockList = [
{
name: 'Semantic HTML',
path: '29-semantic-html'
},
{
name: 'A1 Professional Chinese (Beta)',
path: '30-a1-professional-chinese'
}
];
@@ -15,7 +15,8 @@ const taskBasedSuperblocks = [
'21-a2-english-for-developers',
'24-b1-english-for-developers',
'26-a2-professional-spanish',
'27-a2-professional-chinese'
'27-a2-professional-chinese',
'30-a1-professional-chinese'
];
const Block = () => {
@@ -26,5 +26,6 @@ export const superBlockNameMap: { [key: string]: string } = {
'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'
'27-a2-professional-chinese': 'a2-professional-chinese',
'30-a1-professional-chinese': 'a1-professional-chinese'
};