add language learner project
Some checks failed
Test and deploy staging / staging (push) Has been cancelled

Dutch and Korean (explained in English) and English (explained in Dutch)
from A1 to C1, with a Hangul level for Korean. Lessons with notes, words
and sentences generate multiple-choice, typing, sentence building, cloze,
listening and matching exercises. Endless challenges: a seeded daily
challenge, sprint, survival, mixed practice, level tests, spaced-repetition
reviews and generated drills (numbers, clock times, de/het, plurals, Dutch
and Korean conjugation, particles, Hangul reading, irregular verbs).
Progress is stored in localStorage with export/import.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-24 17:34:56 +00:00
parent afb1f191df
commit 438623d857
69 changed files with 12669 additions and 4 deletions

View File

@@ -0,0 +1,334 @@
import { lesson, level } from '../../course';
export default level(
'hangul',
'Hangul',
'The alphabet',
'Learn to read Korean in five short lessons. Everything after this is written in Hangul.',
[
lesson({
id: 'ko-vowels',
title: 'Basic vowels',
summary: 'ㅏ ㅓ ㅗ ㅜ ㅡ ㅣ and how syllables are built',
notes: `
Hangul was invented in 1443 by King Sejong so that anyone could learn to read. It has 24 basic letters, grouped into **syllable blocks**.
Every block starts with a consonant. If a syllable starts with a vowel sound, it uses the silent **ㅇ** as a placeholder: **아** = ㅇ + ㅏ = "a".
| letter | sound | block |
|---|---|---|
| ㅏ | a (father) | 아 |
| ㅓ | eo (like "u" in "up") | 어 |
| ㅗ | o (more rounded) | 오 |
| ㅜ | u (food) | 우 |
| ㅡ | eu (unrounded "oo", lips flat) | 으 |
| ㅣ | i (see) | 이 |
**Vertical** vowels (ㅏ ㅓ ㅣ) go to the **right** of the consonant: 아, 어, 이.
**Horizontal** vowels (ㅗ ㅜ ㅡ) go **below** it: 오, 우, 으.
`,
script: `
ㅏ | a
ㅓ | eo | like the u in "up"
ㅗ | o
ㅜ | u
ㅡ | eu | lips spread, like a flat "oo"
ㅣ | i
아 | a
어 | eo
오 | o
우 | u
으 | eu
이 | i
`,
words: `
아이 | child
오이 | cucumber
이 | two; tooth
오 | five
`,
drills: `
Which vowel goes below the consonant? | ㅗ | ㅏ; ㅓ; ㅣ | Horizontal vowels go below.
What does ㅇ sound like at the start of a syllable? | nothing (silent) | ng; o; h
How is 어 read? | eo | a; o; u
How is 으 read? | eu | u; o; i
`
}),
lesson({
id: 'ko-consonants',
title: 'Basic consonants',
summary: 'ㄱ ㄴ ㄷ ㄹ ㅁ ㅂ ㅅ ㅇ ㅈ ㅎ',
notes: `
The consonant shapes show the mouth: **ㄱ** is the tongue touching the back of the mouth, **ㄴ** the tongue on the ridge behind the teeth, **ㅁ** the closed lips.
| letter | sound | example |
|---|---|---|
| ㄱ | g / k | 가 ga |
| ㄴ | n | 나 na |
| ㄷ | d / t | 다 da |
| ㄹ | r / l | 라 ra |
| ㅁ | m | 마 ma |
| ㅂ | b / p | 바 ba |
| ㅅ | s (sh before ㅣ) | 사 sa, 시 si |
| ㅇ | silent / ng | 아 a |
| ㅈ | j | 자 ja |
| ㅎ | h | 하 ha |
ㄱ ㄷ ㅂ ㅈ sound softer than English k t p ch: somewhere between g/k, d/t, b/p.
ㄹ is a quick flap between r and l, like the "tt" in American "butter".
`,
script: `
ㄱ | g; k
ㄴ | n
ㄷ | d; t
ㄹ | r; l
ㅁ | m
ㅂ | b; p
ㅅ | s
ㅈ | j
ㅎ | h
가 | ga
나 | na
다 | da
라 | ra
마 | ma
바 | ba
사 | sa
자 | ja
하 | ha
고 | go
두 | du
미 | mi
`,
words: `
나라 | country
나무 | tree
바다 | sea
모자 | hat
어머니 | mother
아버지 | father
가수 | singer
하나 | one
두부 | tofu
지도 | map
누나 | older sister (said by a male)
라디오 | radio
`,
sentences: `
어머니 아버지 | mother and father
`,
drills: `
How is 나무 read? | namu | nabu; lamu; namo
How is 바다 read? | bada | pata; bara; mada
Which letter is "m"? | ㅁ | ㅂ; ㄴ; ㅇ
Which letter is the r/l sound? | ㄹ | ㄷ; ㄴ; ㅎ
`
}),
lesson({
id: 'ko-strong-consonants',
title: 'Aspirated and tense consonants',
summary: 'ㅋ ㅌ ㅍ ㅊ and ㄲ ㄸ ㅃ ㅆ ㅉ',
notes: `
Adding a stroke makes a consonant **aspirated** (with a puff of air). Doubling it makes it **tense** (no air, tight throat).
| plain | aspirated | tense |
|---|---|---|
| ㄱ g | ㅋ k | ㄲ kk |
| ㄷ d | ㅌ t | ㄸ tt |
| ㅂ b | ㅍ p | ㅃ pp |
| ㅈ j | ㅊ ch | ㅉ jj |
| ㅅ s | | ㅆ ss |
Hold a hand in front of your mouth: **카** should give a strong puff, **까** almost none (like the k in "skate").
These three-way contrasts change meaning: **불** (fire), **풀** (grass), **뿔** (horn).
`,
script: `
ㅋ | k
ㅌ | t
ㅍ | p
ㅊ | ch
ㄲ | kk
ㄸ | tt
ㅃ | pp
ㅆ | ss
ㅉ | jj
카 | ka
타 | ta
파 | pa
차 | cha
까 | kka
따 | tta
빠 | ppa
싸 | ssa
짜 | jja
`,
words: `
커피 | coffee
차 | tea; car
토마토 | tomato
피자 | pizza
아빠 | dad
오빠 | older brother (said by a female)
코 | nose
치마 | skirt
토끼 | rabbit
기차 | train
머리 | head; hair
아저씨 | mister; middle-aged man
`,
sentences: `
커피 주세요 | Coffee, please.
`,
drills: `
Which one is aspirated (with a puff of air)? | ㅋ | ㄲ; ㄱ; ㅇ
Which one is tense? | ㄸ | ㅌ; ㄷ; ㄹ
How is 아빠 read? | appa | aba; apa; abba
How is 치마 read? | chima | jima; kima; tima
How is 토끼 read? | tokki | dogi; toki; tokgi
`
}),
lesson({
id: 'ko-compound-vowels',
title: 'More vowels',
summary: 'ㅐ ㅔ, the y-vowels and the w-vowels',
notes: `
**One extra stroke adds a "y"**: ㅏ → ㅑ (ya), ㅓ → ㅕ (yeo), ㅗ → ㅛ (yo), ㅜ → ㅠ (yu).
**ㅐ (ae)** and **ㅔ (e)** sound almost the same today (both like "e" in "bed"). ㅒ (yae) and ㅖ (ye) likewise.
**W-vowels** combine ㅗ or ㅜ with another vowel:
| | | |
|---|---|---|
| ㅘ = ㅗ+ㅏ | wa | 와 |
| ㅙ = ㅗ+ㅐ | wae | 왜 |
| ㅚ = ㅗ+ㅣ | oe (said "we") | 외 |
| ㅝ = ㅜ+ㅓ | wo | 워 |
| ㅞ = ㅜ+ㅔ | we | 웨 |
| ㅟ = ㅜ+ㅣ | wi | 위 |
| ㅢ = ㅡ+ㅣ | ui | 의 |
**ㅢ** is read "ui" at the start of a word, "i" after a consonant (희 = hi), and "e" as the possessive particle 의.
`,
script: `
ㅐ | ae
ㅔ | e
ㅑ | ya
ㅕ | yeo
ㅛ | yo
ㅠ | yu
ㅘ | wa
ㅝ | wo
ㅟ | wi
ㅢ | ui
ㅚ | oe
ㅙ | wae
애 | ae
에 | e
야 | ya
여 | yeo
요 | yo
유 | yu
와 | wa
워 | wo
위 | wi
의 | ui
왜 | wae
`,
words: `
우유 | milk
여우 | fox
요리 | cooking
개 | dog
게 | crab
사과 | apple
돼지 | pig
의자 | chair
회사 | company
뭐 | what
귀 | ear
야구 | baseball
왜 | why
세계 | world
`,
sentences: `
우유 주세요 | Milk, please.
이게 뭐예요? | What is this?
`,
drills: `
Adding a stroke to ㅏ gives: | ㅑ | ㅐ; ㅓ; ㅘ
ㅗ + ㅏ = | ㅘ | ㅝ; ㅚ; ㅙ
How is 의자 read? | uija | euija; wija; eja
How is 돼지 read? | dwaeji | doeji; dweji; dwaji
How is 여우 read? | yeou | yau; yeowu; yoou
`
}),
lesson({
id: 'ko-batchim',
title: 'Final consonants (batchim)',
summary: 'Consonants at the bottom of a block and how they link',
notes: `
A consonant at the bottom of a block is a **batchim** (받침). Whatever the letter, a final consonant is pronounced as one of **seven sounds**:
| sound | letters | example |
|---|---|---|
| k | ㄱ ㅋ ㄲ | 책 chaek, 부엌 bueok |
| n | ㄴ | 산 san |
| t | ㄷ ㅌ ㅅ ㅆ ㅈ ㅊ ㅎ | 옷 ot, 꽃 kkot |
| l | ㄹ | 물 mul |
| m | ㅁ | 밤 bam |
| p | ㅂ ㅍ | 밥 bap, 앞 ap |
| ng | ㅇ | 강 gang |
### Linking (연음)
If the next syllable starts with the silent **ㅇ**, the batchim **moves over** and is pronounced in full:
- 한국어 → [한구거] **hangugeo**
- 음악 → [으막] **eumak**
- 옷이 → [오시] **osi**
### Nasalization
A k/t/p sound before ㄴ or ㅁ becomes ng/n/m: **감사합니다** → [감사함니다] **gamsahamnida**.
`,
script: `
각 | gak
간 | gan
갈 | gal
감 | gam
갑 | gap
강 | gang
옷 | ot
밖 | bak
앞 | ap
꽃 | kkot
`,
words: `
한국 | Korea
사람 | person
물 | water
밥 | rice; meal
책 | book
빵 | bread
김치 | kimchi
선생님 | teacher
학생 | student
음식 | food
옷 | clothes
꽃 | flower
서울 | Seoul
한국어 | Korean (language)
음악 | music
`,
sentences: `
감사합니다 | Thank you.
한국 사람 | a Korean person
`,
drills: `
The final ㅅ in 옷 sounds like: | t | s; ch; sh
The final ㅂ in 밥 sounds like: | p | b; m; silent
How is 음악 read? | eumak | eum-ak; eumag; umak | The ㅁ links to the next syllable.
How is 감사합니다 read? | gamsahamnida | gamsahapnida; kamsahabnida; gamsahabnida | ㅂ before ㄴ becomes m.
How is 한국어 read? | hangugeo | hanguk-eo; hangukeo; hangukgeo
`
})
]
);