mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2026-05-28 18:26:54 +00:00
feat(curriculum): Add A2 Chinese Outline (#60451)
Co-authored-by: moT01 <20648924+moT01@users.noreply.github.com>
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
});
|
||||
|
||||
|
||||
+9
@@ -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
|
||||
+9
@@ -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
|
||||
];
|
||||
|
||||
|
||||
+15
@@ -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"
|
||||
}
|
||||
+9
@@ -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"
|
||||
+58
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
+58
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
@@ -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'
|
||||
};
|
||||
|
||||
|
||||
@@ -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');
|
||||
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user