From 79e1f6cc84f95aba834f4dbb9206781c52379a70 Mon Sep 17 00:00:00 2001 From: Huyen Nguyen <25715018+huyenltnguyen@users.noreply.github.com> Date: Fri, 6 Mar 2026 03:48:19 +0700 Subject: [PATCH 1/4] docs: add language curricula guide --- .../how-to-work-on-language-curricula.mdx | 105 ++++++++++++++++++ src/sidebar.ts | 1 + 2 files changed, 106 insertions(+) create mode 100644 src/content/docs/how-to-work-on-language-curricula.mdx diff --git a/src/content/docs/how-to-work-on-language-curricula.mdx b/src/content/docs/how-to-work-on-language-curricula.mdx new file mode 100644 index 00000000..ae55bb6d --- /dev/null +++ b/src/content/docs/how-to-work-on-language-curricula.mdx @@ -0,0 +1,105 @@ +--- +title: How to Work on Language Curricula +sidebar: + label: Work on Language Curricula +--- + +import { Steps } from '@astrojs/starlight/components'; +import { Aside } from '@astrojs/starlight/components'; + +## Using Challenge Helper Scripts + +All commands must be run from the `tools/challenge-helper-scripts` directory. To navigate to this directory, run: + +```bash +cd tools/challenge-helper-scripts +``` + +## Creating a New Block + +To create a new block, run: + +```bash +pnpm run create-language-block +``` + +The script walks you through a series of prompts: + +| Prompt | What to provide | +| ----------------- | ------------------------------------------------------------ | +| Super block | The super block this block belongs to (e.g., A2 English) | +| Block label | The type of block: `practice`, `learn`, `quiz`, etc. | +| Block dashed name | A unique kebab-case identifier for the block | +| Block title | A human-readable title (defaults to the dashed name) | +| Help category | The support category for this block's forum posts | +| Block layout | The visual layout used to display challenges | +| Chapter | The chapter this block belongs to (you can create a new one) | +| Module | The module within that chapter (you can create a new one) | +| Position | Where in the module this block appears (1-based) | + +### Block Naming + +Block names for language curricula follow an automatic prefix based on the super block and block label. For example, a `learn` block in A2 English gets the prefix `en-a2-learn-`. When prompted, enter only the unique part of the name after the prefix. + + + +### Creating a New Chapter + +Chapters are selected from a list during the block creation flow. If the chapter you need doesn't exist yet: + +- Run `pnpm run create-language-block` +- Choose **-- Create new chapter --** when prompted + +You will then be asked for: + +| Prompt | What to provide | +| ------------------- | -------------------------------------------------------- | +| Chapter dashed name | A unique kebab-case identifier (e.g., `getting-started`) | +| Chapter title | A human-readable display title (e.g., `Getting Started`) | + +The chapter is created and the new block is placed inside it. + +### Creating a New Module + +Modules are selected from a list scoped to the chosen chapter during the block creation flow. If the module you need doesn't exist yet: + +- Run `pnpm run create-language-block` +- Choose **-- Create new module --** when prompted + +You will be asked for: + +| Prompt | What to provide | +| ------------------ | -------------------------------------------------------------------- | +| Module dashed name | A unique kebab-case identifier (e.g., `greetings-and-introductions`) | +| Module title | A human-readable display title (e.g., `Greetings and Introductions`) | + +## Renaming a Block + +The `rename-block` script renames an existing block and updates every file that references it, including the block metadata, the challenge directory, all superblock structures, and the locale intro file. + +To rename a block, run: + +```bash +pnpm run rename-block +``` + +The script prompts you for: + +| Prompt | What to provide | +| --------------------- | --------------------------------------------------------- | +| Old block dashed name | The current dashed name of the block (must already exist) | +| New display name | The new human-readable title for the block | +| New dashed name | The new kebab-case identifier for the block | + +## Publishing New Content + +When a chapter, module, or block is created via the script, it is hidden by default, meaning it won't be visible on the production site until you choose to publish it. + +When you're ready to publish: + +- For blocks, change the `isUpcomingChange` property to `false` in the block's structure file (located in `curriculum/structure/blocks/`). +- For chapters and modules, remove the `comingSoon` property from the super block structure file (located in `curriculum/structure/superblocks/`). diff --git a/src/sidebar.ts b/src/sidebar.ts index 1ba38b58..f457b15b 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -17,6 +17,7 @@ const sidebar = [ 'how-to-work-on-workshops', 'how-to-setup-freecodecamp-mobile-app-locally', 'how-to-work-on-localized-client-webapp', + 'how-to-work-on-language-curricula', 'how-to-add-playwright-tests', 'how-to-work-on-the-docs-site', 'how-to-open-a-pull-request', From 492734cb0ad5ccebc4afe989ebe4040b29025e8c Mon Sep 17 00:00:00 2001 From: Huyen Nguyen <25715018+huyenltnguyen@users.noreply.github.com> Date: Mon, 9 Mar 2026 19:29:07 +0700 Subject: [PATCH 2/4] document more scripts and add CJK writing convention --- .../how-to-work-on-language-curricula.mdx | 202 ++++++++++++++++-- 1 file changed, 186 insertions(+), 16 deletions(-) diff --git a/src/content/docs/how-to-work-on-language-curricula.mdx b/src/content/docs/how-to-work-on-language-curricula.mdx index ae55bb6d..7e16c70c 100644 --- a/src/content/docs/how-to-work-on-language-curricula.mdx +++ b/src/content/docs/how-to-work-on-language-curricula.mdx @@ -7,15 +7,33 @@ sidebar: import { Steps } from '@astrojs/starlight/components'; import { Aside } from '@astrojs/starlight/components'; -## Using Challenge Helper Scripts +## Curriculum Structure -All commands must be run from the `tools/challenge-helper-scripts` directory. To navigate to this directory, run: +Language curricula follow a five-level hierarchy: + +- **Superblock** — The top-level course (e.g., _A2 English for Developers_) +- **Chapter** — A broad thematic group within a superblock +- **Module** — A focused topic within a chapter +- **Block** — A set of tasks covering a specific lesson topic +- **Task** — An individual challenge within a block (multiple-choice, fill-in-the-blank, quiz, etc.) + +For file structure, see [Curriculum File Structure](./curriculum-file-structure.mdx). + +## Modifying Curriculum Outer Layer + +To add or edit an outer layer (chapter, module, or block), we use the challenge helper scripts. + +### Creating a New Block + + To create a new block, run: @@ -25,21 +43,21 @@ pnpm run create-language-block The script walks you through a series of prompts: -| Prompt | What to provide | -| ----------------- | ------------------------------------------------------------ | -| Super block | The super block this block belongs to (e.g., A2 English) | -| Block label | The type of block: `practice`, `learn`, `quiz`, etc. | -| Block dashed name | A unique kebab-case identifier for the block | -| Block title | A human-readable title (defaults to the dashed name) | -| Help category | The support category for this block's forum posts | -| Block layout | The visual layout used to display challenges | -| Chapter | The chapter this block belongs to (you can create a new one) | -| Module | The module within that chapter (you can create a new one) | -| Position | Where in the module this block appears (1-based) | +| Prompt | What to provide | +| ----------------- | ---------------------------------------------------------------------------------------------- | +| Superblock | The superblock this block belongs to (e.g., A2 English) | +| Block label | The type of block: `practice`, `learn`, `quiz`, etc. | +| Block dashed name | A unique kebab-case identifier for the block (e.g., `en-a2-learn-greetings-and-introductions`) | +| Block title | A human-readable title (e.g., `Greetings and Introductions`) | +| Help category | The support category for this block's forum posts | +| Block layout | The visual layout used to display challenges | +| Chapter | The chapter this block belongs to (you can create a new one) | +| Module | The module within that chapter (you can create a new one) | +| Position | Where in the module this block appears (1-based) | ### Block Naming -Block names for language curricula follow an automatic prefix based on the super block and block label. For example, a `learn` block in A2 English gets the prefix `en-a2-learn-`. When prompted, enter only the unique part of the name after the prefix. +Block names for language curricula follow an automatic prefix based on the superblock and block label. For example, a `learn` block in A2 English gets the prefix `en-a2-learn-`. When prompted, enter only the unique part of the name after the prefix.