mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2025-12-19 18:18:27 -05:00
feat(curriculum): Add A2 Spanish Outline (#60303)
Co-authored-by: moT01 <20648924+moT01@users.noreply.github.com>
This commit is contained in:
@@ -35,6 +35,7 @@ const foundationalCSharpBase =
|
||||
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 legacyFrontEndBase = feLibsBase;
|
||||
const legacyFrontEndResponsiveBase = responsiveWebBase;
|
||||
const legacyFrontEndTakeHomeBase = takeHomeBase;
|
||||
@@ -835,6 +836,20 @@ const allStandardCerts = [
|
||||
certSlug: Certification.B1English
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: '681a6b22e5a782fe3459984a',
|
||||
title: 'A2 Professional Spanish',
|
||||
certSlug: Certification.A2Spanish,
|
||||
projects: [
|
||||
{
|
||||
id: '681a8796e5a782fe3459984b',
|
||||
title: 'Dialogue 1: PLACEHOLDER',
|
||||
link: `${a2SpanishBase}/talk-about-who-you-are-by-using-key-verbs
|
||||
/text-1`,
|
||||
certSlug: Certification.A2Spanish
|
||||
}
|
||||
]
|
||||
}
|
||||
] as const;
|
||||
|
||||
|
||||
@@ -4202,6 +4202,25 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"a2-professional-spanish": {
|
||||
"title": "A2 Professional Spanish 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-who-you-are-by-using-key-verbs": {
|
||||
"title": "Talk About Who You Are by Using Key Verbs",
|
||||
"intro": [
|
||||
"Learn how to introduce yourself in Spanish 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-others-by-asking-simple-questions": {
|
||||
"title": "Get to Know Others 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."
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"misc-text": {
|
||||
"browse-other": "Browse our other free certifications",
|
||||
"courses": "Courses",
|
||||
|
||||
@@ -1114,6 +1114,8 @@
|
||||
"b1-english-for-developers-cert": "B1 English for Developers Certification",
|
||||
"full-stack-developer-v9": "Full Stack Developer",
|
||||
"full-stack-developer-v9-cert": "Full Stack Developer Certification",
|
||||
"a2-professional-spanish": "A2 Professional Spanish",
|
||||
"a2-professional-spanish-cert": "A2 Professional Spanish Certification",
|
||||
"legacy-front-end": "Legacy Front End",
|
||||
"legacy-front-end-cert": "Legacy Front End Certification",
|
||||
"legacy-back-end": "Legacy Back End",
|
||||
|
||||
@@ -43,6 +43,7 @@ const iconMap = {
|
||||
[SuperBlocks.FullStackDeveloper]: Code,
|
||||
[SuperBlocks.A2English]: A2EnglishIcon,
|
||||
[SuperBlocks.B1English]: B1EnglishIcon,
|
||||
[SuperBlocks.A2Spanish]: A2EnglishIcon,
|
||||
[SuperBlocks.RosettaCode]: RosettaCodeIcon,
|
||||
[SuperBlocks.PythonForEverybody]: PythonIcon
|
||||
};
|
||||
|
||||
@@ -91,6 +91,7 @@ const createCertifiedMap = ({
|
||||
[Certification.FullStackDeveloper]: false,
|
||||
[Certification.A2English]: false,
|
||||
[Certification.B1English]: false,
|
||||
[Certification.A2Spanish]: false,
|
||||
[Certification.JsAlgoDataStructNew]: isJsAlgoDataStructCertV8
|
||||
});
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
---
|
||||
title: Introduction to Get to Know Others by Asking Simple Questions
|
||||
block: get-to-know-others-by-asking-simple-questions
|
||||
superBlock: a2-professional-spanish
|
||||
---
|
||||
|
||||
## Introduction to Get to Know Others by Asking Simple Questions
|
||||
|
||||
Introduction to Get to Know Others by Asking Simple Questions
|
||||
9
client/src/pages/learn/a2-professional-spanish/index.md
Normal file
9
client/src/pages/learn/a2-professional-spanish/index.md
Normal file
@@ -0,0 +1,9 @@
|
||||
---
|
||||
title: A2 Professional Spanish
|
||||
superBlock: a2-professional-spanish
|
||||
certification: a2-professional-spanish
|
||||
---
|
||||
|
||||
## Introduction to A2 Professional Spanish
|
||||
|
||||
A2 Professional Spanish
|
||||
@@ -0,0 +1,9 @@
|
||||
---
|
||||
title: Introduction to Talk About Who You Are by Using Key Verbs
|
||||
block: talk-about-who-you-are-by-using-key-verbs
|
||||
superBlock: a2-professional-spanish
|
||||
---
|
||||
|
||||
## Introduction to Talk About Who You Are by Using Key Verbs
|
||||
|
||||
Introduction to Talk About Who You Are by Using Key Verbs
|
||||
@@ -23,6 +23,7 @@ export const ConditionalDonationAlert = ({
|
||||
const unfinishedCertifications = [
|
||||
SuperBlocks.A2English,
|
||||
SuperBlocks.B1English,
|
||||
SuperBlocks.A2Spanish,
|
||||
SuperBlocks.FullStackDeveloper
|
||||
];
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"name": "Get to Know Others by Asking Simple Questions",
|
||||
"isUpcomingChange": true,
|
||||
"dashedName": "get-to-know-others-by-asking-simple-questions",
|
||||
"order": 1,
|
||||
"superBlock": "a2-professional-spanish",
|
||||
"challengeOrder": [
|
||||
{
|
||||
"id": "6823914bc8a5c9c820230d99",
|
||||
"title": "Dialogue 1: PLACEHOLDER"
|
||||
}
|
||||
],
|
||||
"helpCategory": "English",
|
||||
"blockLayout": "dialogue-grid"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"name": "Talk About Who You Are by Using Key Verbs",
|
||||
"isUpcomingChange": true,
|
||||
"dashedName": "talk-about-who-you-are-by-using-key-verbs",
|
||||
"order": 0,
|
||||
"superBlock": "a2-professional-spanish",
|
||||
"challengeOrder": [
|
||||
{
|
||||
"id": "681a8796e5a782fe3459984b",
|
||||
"title": "Dialogue 1: PLACEHOLDER"
|
||||
}
|
||||
],
|
||||
"helpCategory": "English",
|
||||
"blockLayout": "dialogue-grid"
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
---
|
||||
id: 681a6b22e5a782fe3459984a
|
||||
title: A2 Professional Spanish Certification
|
||||
certification: a2-professional-spanish-certification
|
||||
challengeType: 7
|
||||
isPrivate: true
|
||||
tests:
|
||||
- id: 681a8796e5a782fe3459984b
|
||||
title: "Dialogue 1: PLACEHOLDER"
|
||||
@@ -0,0 +1,58 @@
|
||||
---
|
||||
id: 6823914bc8a5c9c820230d99
|
||||
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: 681a8796e5a782fe3459984b
|
||||
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
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
@@ -84,7 +84,8 @@ const directoryToSuperblock = {
|
||||
'22-rosetta-code': 'rosetta-code',
|
||||
'23-python-for-everybody': 'python-for-everybody',
|
||||
'24-b1-english-for-developers': 'b1-english-for-developers',
|
||||
'25-front-end-development': 'full-stack-developer'
|
||||
'25-front-end-development': 'full-stack-developer',
|
||||
'26-a2-professional-spanish': 'a2-professional-spanish'
|
||||
};
|
||||
|
||||
function getSuperBlockFromDir(dir) {
|
||||
|
||||
@@ -176,7 +176,7 @@ describe('getSuperBlockFromPath', () => {
|
||||
.filter(item => fs.lstatSync(path.join(englishFolder, item)).isDirectory());
|
||||
|
||||
it('handles all the directories in ./challenges/english', () => {
|
||||
expect.assertions(24);
|
||||
expect.assertions(25);
|
||||
|
||||
for (const directory of directories) {
|
||||
expect(() => getSuperBlockFromDir(directory)).not.toThrow();
|
||||
@@ -184,7 +184,7 @@ describe('getSuperBlockFromPath', () => {
|
||||
});
|
||||
|
||||
it("returns valid superblocks (or 'certifications') for all valid arguments", () => {
|
||||
expect.assertions(24);
|
||||
expect.assertions(25);
|
||||
|
||||
const superBlockPaths = directories.filter(x => x !== '00-certifications');
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ export enum Certification {
|
||||
FullStackDeveloper = 'full-stack-developer-v9',
|
||||
A2English = 'a2-english-for-developers-v8',
|
||||
B1English = 'b1-english-for-developers-v8',
|
||||
A2Spanish = 'a2-professional-spanish-v8',
|
||||
// Legacy certifications
|
||||
LegacyFrontEnd = 'legacy-front-end',
|
||||
JsAlgoDataStruct = 'javascript-algorithms-and-data-structures',
|
||||
@@ -77,7 +78,8 @@ export const legacyFullStackCertification = [
|
||||
export const upcomingCertifications = [
|
||||
Certification.FullStackDeveloper,
|
||||
Certification.A2English,
|
||||
Certification.B1English
|
||||
Certification.B1English,
|
||||
Certification.A2Spanish
|
||||
] as const;
|
||||
|
||||
export const certTypes = {
|
||||
@@ -270,6 +272,7 @@ export const superBlockToCertMap: {
|
||||
[SuperBlocks.FullStackDeveloper]: Certification.FullStackDeveloper,
|
||||
[SuperBlocks.A2English]: Certification.A2English,
|
||||
[SuperBlocks.B1English]: Certification.B1English,
|
||||
[SuperBlocks.A2Spanish]: Certification.A2Spanish,
|
||||
[SuperBlocks.PythonForEverybody]: null,
|
||||
[SuperBlocks.CodingInterviewPrep]: null,
|
||||
[SuperBlocks.ProjectEuler]: null,
|
||||
@@ -301,7 +304,8 @@ export const linkedInCredentialIds = {
|
||||
[Certification.FullStackDeveloper]: 'fsd',
|
||||
[Certification.JsAlgoDataStructNew]: 'jaads',
|
||||
[Certification.A2English]: 'a2efd',
|
||||
[Certification.B1English]: 'b1efd'
|
||||
[Certification.B1English]: 'b1efd',
|
||||
[Certification.A2Spanish]: 'a2ps'
|
||||
};
|
||||
|
||||
export const oldDataVizId = '561add10cb82ac38a17513b3';
|
||||
|
||||
@@ -25,6 +25,7 @@ export enum SuperBlocks {
|
||||
FullStackDeveloper = 'full-stack-developer',
|
||||
A2English = 'a2-english-for-developers',
|
||||
B1English = 'b1-english-for-developers',
|
||||
A2Spanish = 'a2-professional-spanish',
|
||||
RosettaCode = 'rosetta-code',
|
||||
PythonForEverybody = 'python-for-everybody'
|
||||
}
|
||||
@@ -99,7 +100,7 @@ export const superBlockStages: StageMap = {
|
||||
SuperBlocks.PythonForEverybody
|
||||
],
|
||||
[SuperBlockStage.Next]: [],
|
||||
[SuperBlockStage.Upcoming]: []
|
||||
[SuperBlockStage.Upcoming]: [SuperBlocks.A2Spanish]
|
||||
};
|
||||
|
||||
Object.freeze(superBlockStages);
|
||||
@@ -124,6 +125,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
|
||||
SuperBlocks.FullStackDeveloper,
|
||||
SuperBlocks.A2English,
|
||||
SuperBlocks.B1English,
|
||||
SuperBlocks.A2Spanish,
|
||||
SuperBlocks.PythonForEverybody
|
||||
],
|
||||
[Languages.Chinese]: [
|
||||
@@ -133,6 +135,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
|
||||
SuperBlocks.FullStackDeveloper,
|
||||
SuperBlocks.A2English,
|
||||
SuperBlocks.B1English,
|
||||
SuperBlocks.A2Spanish,
|
||||
SuperBlocks.PythonForEverybody
|
||||
],
|
||||
[Languages.ChineseTraditional]: [
|
||||
@@ -142,6 +145,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
|
||||
SuperBlocks.FullStackDeveloper,
|
||||
SuperBlocks.A2English,
|
||||
SuperBlocks.B1English,
|
||||
SuperBlocks.A2Spanish,
|
||||
SuperBlocks.PythonForEverybody
|
||||
],
|
||||
[Languages.Italian]: [
|
||||
@@ -151,6 +155,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
|
||||
SuperBlocks.FullStackDeveloper,
|
||||
SuperBlocks.A2English,
|
||||
SuperBlocks.B1English,
|
||||
SuperBlocks.A2Spanish,
|
||||
SuperBlocks.PythonForEverybody
|
||||
],
|
||||
[Languages.Portuguese]: [
|
||||
@@ -158,20 +163,23 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
|
||||
SuperBlocks.FullStackDeveloper,
|
||||
SuperBlocks.A2English,
|
||||
SuperBlocks.B1English,
|
||||
SuperBlocks.A2Spanish,
|
||||
SuperBlocks.PythonForEverybody
|
||||
],
|
||||
[Languages.Ukrainian]: [
|
||||
SuperBlocks.JsAlgoDataStructNew,
|
||||
SuperBlocks.FullStackDeveloper,
|
||||
SuperBlocks.A2English,
|
||||
SuperBlocks.B1English
|
||||
SuperBlocks.B1English,
|
||||
SuperBlocks.A2Spanish
|
||||
],
|
||||
[Languages.Japanese]: [
|
||||
SuperBlocks.JsAlgoDataStructNew,
|
||||
SuperBlocks.TheOdinProject,
|
||||
SuperBlocks.FullStackDeveloper,
|
||||
SuperBlocks.A2English,
|
||||
SuperBlocks.B1English
|
||||
SuperBlocks.B1English,
|
||||
SuperBlocks.A2Spanish
|
||||
],
|
||||
[Languages.German]: [
|
||||
SuperBlocks.RelationalDb,
|
||||
@@ -187,6 +195,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
|
||||
SuperBlocks.FullStackDeveloper,
|
||||
SuperBlocks.A2English,
|
||||
SuperBlocks.B1English,
|
||||
SuperBlocks.A2Spanish,
|
||||
SuperBlocks.PythonForEverybody
|
||||
],
|
||||
[Languages.Swahili]: [
|
||||
@@ -210,6 +219,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
|
||||
SuperBlocks.FullStackDeveloper,
|
||||
SuperBlocks.A2English,
|
||||
SuperBlocks.B1English,
|
||||
SuperBlocks.A2Spanish,
|
||||
SuperBlocks.PythonForEverybody
|
||||
],
|
||||
[Languages.Korean]: [
|
||||
@@ -231,6 +241,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
|
||||
SuperBlocks.FullStackDeveloper,
|
||||
SuperBlocks.A2English,
|
||||
SuperBlocks.B1English,
|
||||
SuperBlocks.A2Spanish,
|
||||
SuperBlocks.PythonForEverybody,
|
||||
SuperBlocks.DataVis,
|
||||
SuperBlocks.RelationalDb,
|
||||
|
||||
@@ -54,7 +54,8 @@ const superBlockFolderMap = {
|
||||
'rosetta-code': '22-rosetta-code',
|
||||
'python-for-everybody': '23-python-for-everybody',
|
||||
'b1-english-for-developers': '24-b1-english-for-developers',
|
||||
'full-stack-developer': '25-front-end-development'
|
||||
'full-stack-developer': '25-front-end-development',
|
||||
'a2-professional-spanish': '26-a2-professional-spanish'
|
||||
};
|
||||
|
||||
// Adding types for getChallengesForLang is possible, but not worth the effort
|
||||
|
||||
@@ -90,5 +90,9 @@ export const superBlockList = [
|
||||
{
|
||||
name: 'Certified Full Stack Developer',
|
||||
path: '25-front-end-development'
|
||||
},
|
||||
{
|
||||
name: 'A2 Professional Spanish (Beta)',
|
||||
path: '26-a2-professional-spanish'
|
||||
}
|
||||
];
|
||||
|
||||
@@ -13,7 +13,8 @@ const stepBasedSuperblocks = [
|
||||
|
||||
const taskBasedSuperblocks = [
|
||||
'21-a2-english-for-developers',
|
||||
'24-b1-english-for-developers'
|
||||
'24-b1-english-for-developers',
|
||||
'26-a2-professional-spanish'
|
||||
];
|
||||
|
||||
const Block = () => {
|
||||
|
||||
@@ -26,7 +26,8 @@ export function getSuperBlockSubPath(superBlock: SuperBlocks): string {
|
||||
[SuperBlocks.RosettaCode]: '22-rosetta-code',
|
||||
[SuperBlocks.PythonForEverybody]: '23-python-for-everybody',
|
||||
[SuperBlocks.B1English]: '24-b1-english-for-developers',
|
||||
[SuperBlocks.FullStackDeveloper]: '25-front-end-development'
|
||||
[SuperBlocks.FullStackDeveloper]: '25-front-end-development',
|
||||
[SuperBlocks.A2Spanish]: '26-a2-professional-spanish'
|
||||
};
|
||||
return pathMap[superBlock];
|
||||
}
|
||||
|
||||
@@ -44,6 +44,7 @@ export const orderedSuperBlockInfo = [
|
||||
{ dashedName: SuperBlocks.CollegeAlgebraPy, public: true },
|
||||
{ dashedName: SuperBlocks.A2English, public: true },
|
||||
{ dashedName: SuperBlocks.B1English, public: true },
|
||||
{ dashedName: SuperBlocks.A2Spanish, public: true },
|
||||
{ dashedName: SuperBlocks.TheOdinProject, public: true },
|
||||
{ dashedName: SuperBlocks.RespWebDesign, public: true },
|
||||
{ dashedName: SuperBlocks.PythonForEverybody, public: true },
|
||||
|
||||
@@ -103,6 +103,11 @@ export const orderedSuperBlockInfo: Record<
|
||||
dashedName: SuperBlocks.B1English,
|
||||
public: true,
|
||||
title: intros[SuperBlocks.B1English].title
|
||||
},
|
||||
{
|
||||
dashedName: SuperBlocks.A2Spanish,
|
||||
public: true,
|
||||
title: intros[SuperBlocks.A2Spanish].title
|
||||
}
|
||||
],
|
||||
|
||||
|
||||
Reference in New Issue
Block a user