mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2026-05-28 18:26:54 +00:00
feat(curriculum): release A1 Chinese (#64764)
Co-authored-by: Huyen Nguyen <25715018+huyenltnguyen@users.noreply.github.com>
This commit is contained in:
@@ -8767,37 +8767,29 @@
|
||||
"zh-a1-module-discussing-team-skills": "Discussing Team Skills"
|
||||
},
|
||||
"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": {
|
||||
"note": "Coming Winter 2025",
|
||||
"intro": ["PLACEHOLDER: Write the module intro here."]
|
||||
"note": "Coming 2026",
|
||||
"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": {
|
||||
"note": "Coming Winter 2025",
|
||||
"intro": ["PLACEHOLDER: Write the module intro here."]
|
||||
"note": "Coming 2026",
|
||||
"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": {
|
||||
"note": "Coming Winter 2025",
|
||||
"intro": ["PLACEHOLDER: Write the module intro here."]
|
||||
"note": "Coming 2026",
|
||||
"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": {
|
||||
"note": "Coming Winter 2025",
|
||||
"intro": ["PLACEHOLDER: Write the module intro here."]
|
||||
"note": "Coming 2026",
|
||||
"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": {
|
||||
|
||||
@@ -208,6 +208,7 @@
|
||||
"core-certs-heading": "Recommended curriculum (still in beta):",
|
||||
"learn-english-heading": "Learn English for Developers:",
|
||||
"learn-spanish-heading": "Learn Professional Spanish:",
|
||||
"learn-chinese-heading": "Learn Professional Chinese:",
|
||||
"professional-certs-heading": "Professional certifications:",
|
||||
"interview-prep-heading": "Prepare for the developer interview job search:",
|
||||
"legacy-curriculum-heading": "Our archived coursework:",
|
||||
|
||||
@@ -32,6 +32,7 @@ const superBlockHeadings: { [key in SuperBlockStage]: string } = {
|
||||
[SuperBlockStage.Core]: 'landing.core-certs-heading',
|
||||
[SuperBlockStage.English]: 'landing.learn-english-heading',
|
||||
[SuperBlockStage.Spanish]: 'landing.learn-spanish-heading',
|
||||
[SuperBlockStage.Chinese]: 'landing.learn-chinese-heading',
|
||||
[SuperBlockStage.Professional]: 'landing.professional-certs-heading',
|
||||
[SuperBlockStage.Extra]: 'landing.interview-prep-heading',
|
||||
[SuperBlockStage.Legacy]: 'landing.legacy-curriculum-heading',
|
||||
|
||||
@@ -147,7 +147,8 @@ describe('external curriculum data build', () => {
|
||||
stage !== SuperBlockStage.Upcoming &&
|
||||
stage !== SuperBlockStage.Catalog &&
|
||||
stage !== SuperBlockStage.Core &&
|
||||
stage !== SuperBlockStage.Spanish
|
||||
stage !== SuperBlockStage.Spanish &&
|
||||
stage !== SuperBlockStage.Chinese
|
||||
);
|
||||
})
|
||||
.flatMap(([, superBlocks]) => superBlocks);
|
||||
|
||||
@@ -270,6 +270,7 @@ describe('external curriculum data build', () => {
|
||||
core: SuperBlockStage.Core,
|
||||
english: SuperBlockStage.English,
|
||||
spanish: SuperBlockStage.Spanish,
|
||||
chinese: SuperBlockStage.Chinese,
|
||||
professional: SuperBlockStage.Professional,
|
||||
extra: SuperBlockStage.Extra,
|
||||
legacy: SuperBlockStage.Legacy,
|
||||
|
||||
@@ -93,6 +93,7 @@ enum SuperBlockStage {
|
||||
Core = 'core',
|
||||
English = 'english',
|
||||
Spanish = 'spanish',
|
||||
Chinese = 'chinese',
|
||||
Professional = 'professional',
|
||||
Extra = 'extra',
|
||||
Legacy = 'legacy'
|
||||
@@ -175,6 +176,14 @@ export const orderedSuperBlockInfo: OrderedSuperBlocks = {
|
||||
}
|
||||
],
|
||||
|
||||
[SuperBlockStage.Chinese]: [
|
||||
{
|
||||
dashedName: SuperBlocks.A1Chinese,
|
||||
public: false,
|
||||
title: intros[SuperBlocks.A1Chinese].title
|
||||
}
|
||||
],
|
||||
|
||||
[SuperBlockStage.Extra]: [
|
||||
{
|
||||
dashedName: SuperBlocks.TheOdinProject,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Certification Introduction",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-learn-certification-introduction",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "challenge-list",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Compound Finals",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-learn-compound-finals",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "challenge-grid",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Initials",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-learn-initials",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "challenge-grid",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Nasal Finals",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-learn-nasal-finals",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "challenge-grid",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Simple Finals",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-learn-simple-finals",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "challenge-grid",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Special Spelling Rules",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-learn-special-spelling-rules",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "challenge-grid",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Understanding the Greetings and Introductions",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-learn-understanding-greetings-and-introductions",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "challenge-grid",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Understanding the Questions and Answers",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-learn-understanding-questions-and-answers",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "challenge-grid",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Exchanging Basic Information",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-practice-exchanging-basic-information",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "challenge-grid",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Building Your Self-Introduction",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-practice-introducing-yourself",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "challenge-grid",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Pinyin Practice",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-practice-pinyin",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "challenge-grid",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Greetings and Introductions Quiz",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-quiz-greetings-and-introductions",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "link",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Introduction Questions Quiz",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-quiz-introduction-questions",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "link",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Greetings and Introductions Review",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-review-greetings-and-introductions",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "challenge-list",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Introduction Questions Review",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-review-introduction-questions",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "challenge-list",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Greeting New Colleagues",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-warm-up-greeting-new-colleagues",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "challenge-grid",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Meeting New Teammates",
|
||||
"isUpcomingChange": true,
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "zh-a1-warm-up-meeting-new-teammates",
|
||||
"helpCategory": "Chinese Curriculum",
|
||||
"blockLayout": "challenge-grid",
|
||||
|
||||
@@ -52,9 +52,11 @@
|
||||
},
|
||||
{
|
||||
"dashedName": "zh-a1-chapter-introducing-colleagues-and-family",
|
||||
"comingSoon": true,
|
||||
"modules": [
|
||||
{
|
||||
"dashedName": "zh-a1-module-introducing-others",
|
||||
"comingSoon": true,
|
||||
"blocks": [
|
||||
"zh-a1-warm-up-introducing-others-basics",
|
||||
"zh-a1-learn-meeting-the-team",
|
||||
@@ -67,6 +69,7 @@
|
||||
},
|
||||
{
|
||||
"dashedName": "zh-a1-module-getting-to-know-the-team",
|
||||
"comingSoon": true,
|
||||
"blocks": [
|
||||
"zh-a1-warm-up-knowing-the-team-basics",
|
||||
"zh-a1-learn-asking-about-the-team",
|
||||
@@ -79,9 +82,11 @@
|
||||
},
|
||||
{
|
||||
"dashedName": "zh-a1-chapter-expressing-what-you-can-and-cant-do",
|
||||
"comingSoon": true,
|
||||
"modules": [
|
||||
{
|
||||
"dashedName": "zh-a1-module-talking-about-personal-skills",
|
||||
"comingSoon": true,
|
||||
"blocks": [
|
||||
"zh-a1-warm-up-personal-skills-basics",
|
||||
"zh-a1-learn-can-or-cannot",
|
||||
@@ -92,6 +97,7 @@
|
||||
},
|
||||
{
|
||||
"dashedName": "zh-a1-module-discussing-team-skills",
|
||||
"comingSoon": true,
|
||||
"blocks": [
|
||||
"zh-a1-warm-up-team-skills-basics",
|
||||
"zh-a1-learn-who-can-do-what-on-the-team",
|
||||
|
||||
@@ -28,6 +28,7 @@ const nonArchivedSuperBlocks = [
|
||||
intro[SuperBlocks.A2English].title,
|
||||
intro[SuperBlocks.B1English].title,
|
||||
intro[SuperBlocks.A1Spanish].title,
|
||||
intro[SuperBlocks.A1Chinese].title,
|
||||
intro[SuperBlocks.TheOdinProject].title,
|
||||
intro[SuperBlocks.CodingInterviewPrep].title,
|
||||
intro[SuperBlocks.ProjectEuler].title,
|
||||
|
||||
+5
-1
@@ -46,6 +46,10 @@ const LANDING_PAGE_LINKS = [
|
||||
slug: 'a1-professional-spanish',
|
||||
name: 'A1 Professional Spanish Certification (Beta)'
|
||||
},
|
||||
{
|
||||
slug: 'a1-professional-chinese',
|
||||
name: 'A1 Professional Chinese Certification (Beta)'
|
||||
},
|
||||
{
|
||||
slug: 'foundational-c-sharp-with-microsoft',
|
||||
name: 'Free Foundational C# with Microsoft Certification'
|
||||
@@ -68,7 +72,7 @@ test.describe('Map Component', () => {
|
||||
page.getByText(translations.landing['interview-prep-heading'])
|
||||
).toBeVisible();
|
||||
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) {
|
||||
const superblockLink = page.getByRole('link', {
|
||||
|
||||
@@ -83,6 +83,7 @@ export enum SuperBlockStage {
|
||||
Core,
|
||||
English,
|
||||
Spanish,
|
||||
Chinese,
|
||||
Professional,
|
||||
Extra,
|
||||
Legacy,
|
||||
@@ -95,6 +96,7 @@ const defaultStageOrder = [
|
||||
SuperBlockStage.Core,
|
||||
SuperBlockStage.English,
|
||||
SuperBlockStage.Spanish,
|
||||
SuperBlockStage.Chinese,
|
||||
SuperBlockStage.Extra,
|
||||
SuperBlockStage.Legacy,
|
||||
SuperBlockStage.Professional,
|
||||
@@ -129,6 +131,7 @@ export const superBlockStages: StageMap = {
|
||||
],
|
||||
[SuperBlockStage.English]: [SuperBlocks.A2English, SuperBlocks.B1English],
|
||||
[SuperBlockStage.Spanish]: [SuperBlocks.A1Spanish],
|
||||
[SuperBlockStage.Chinese]: [SuperBlocks.A1Chinese],
|
||||
[SuperBlockStage.Professional]: [SuperBlocks.FoundationalCSharp],
|
||||
[SuperBlockStage.Extra]: [
|
||||
SuperBlocks.TheOdinProject,
|
||||
@@ -158,7 +161,6 @@ export const superBlockStages: StageMap = {
|
||||
SuperBlocks.FullStackOpen,
|
||||
SuperBlocks.A2Spanish,
|
||||
SuperBlocks.A2Chinese,
|
||||
SuperBlocks.A1Chinese,
|
||||
SuperBlocks.DevPlayground,
|
||||
SuperBlocks.FullStackDeveloper
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user