chore: scaffold, CI, and the export bundle verbatim

The export bundle is the input to this port, not a sketch: the curriculum,
the tutor prompt and the five logic modules are finished and tested. They
land here byte-identical and stay that way.

  diff -r export/data data && diff -r export/lib lib
  diff -r export/prompt prompt && diff export/validate.mjs validate.mjs

data/, lib/, prompt/ and validate.mjs sit at the repo root so validate.mjs
runs verbatim with no path edits. All four are excluded from lint and
formatting — they are not ours to restyle. Types for lib/ live alongside in
types/ rather than as sibling .d.ts files, so the verbatim check stays a
plain directory diff.

CI runs the curriculum gate first, before anything else can pass:

  node validate.mjs   PASS — 0 blocking, 0 advisory

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
MechaCat02
2026-09-08 19:11:40 +02:00
commit b80deb2f6f
22 changed files with 7984 additions and 0 deletions

1426
data/curriculum.json Normal file

File diff suppressed because it is too large Load Diff

2363
data/deck.json Normal file

File diff suppressed because it is too large Load Diff

841
data/gloss-extra.json Normal file
View File

@@ -0,0 +1,841 @@
{
"note": "Roadmap words the curated deck does not cover. Gloss only — these are NOT SRS cards. In the port these seed the hand-written grammar lexicon (REVIEW.md item 6); the rest should come from KRDICT.",
"count": 167,
"entries": [
{
"ko": "나무",
"en": "tree",
"note": ""
},
{
"ko": "소리",
"en": "sound, noise",
"note": ""
},
{
"ko": "바다",
"en": "sea",
"note": ""
},
{
"ko": "다리",
"en": "leg; bridge",
"note": ""
},
{
"ko": "개",
"en": "dog",
"note": ""
},
{
"ko": "새",
"en": "bird",
"note": ""
},
{
"ko": "세",
"en": "three",
"note": "native numeral, before a counter"
},
{
"ko": "의사",
"en": "doctor",
"note": ""
},
{
"ko": "위",
"en": "above, on top",
"note": ""
},
{
"ko": "돼지",
"en": "pig",
"note": ""
},
{
"ko": "가위",
"en": "scissors",
"note": ""
},
{
"ko": "매미",
"en": "cicada",
"note": ""
},
{
"ko": "제비",
"en": "swallow",
"note": "the bird"
},
{
"ko": "포도",
"en": "grapes",
"note": ""
},
{
"ko": "치마",
"en": "skirt",
"note": ""
},
{
"ko": "까치",
"en": "magpie",
"note": ""
},
{
"ko": "토끼",
"en": "rabbit",
"note": ""
},
{
"ko": "꼬리",
"en": "tail",
"note": ""
},
{
"ko": "찌개",
"en": "stew",
"note": ""
},
{
"ko": "피자",
"en": "pizza",
"note": ""
},
{
"ko": "쿠키",
"en": "cookie",
"note": ""
},
{
"ko": "산",
"en": "mountain",
"note": ""
},
{
"ko": "강",
"en": "river",
"note": ""
},
{
"ko": "문",
"en": "door",
"note": ""
},
{
"ko": "방",
"en": "room",
"note": ""
},
{
"ko": "곰",
"en": "bear",
"note": ""
},
{
"ko": "꽃",
"en": "flower",
"note": ""
},
{
"ko": "앞",
"en": "front, in front of",
"note": ""
},
{
"ko": "낮",
"en": "daytime",
"note": ""
},
{
"ko": "밖",
"en": "outside",
"note": ""
},
{
"ko": "한국어",
"en": "the Korean language",
"note": ""
},
{
"ko": "음악",
"en": "music",
"note": ""
},
{
"ko": "국어",
"en": "national language",
"note": "Korean as a school subject"
},
{
"ko": "단어",
"en": "word",
"note": ""
},
{
"ko": "언어",
"en": "language",
"note": ""
},
{
"ko": "발음",
"en": "pronunciation",
"note": ""
},
{
"ko": "얼음",
"en": "ice",
"note": ""
},
{
"ko": "직업",
"en": "job, occupation",
"note": ""
},
{
"ko": "목요일",
"en": "Thursday",
"note": ""
},
{
"ko": "작은",
"en": "small",
"note": "modifying form of 작다"
},
{
"ko": "입니다",
"en": "is",
"note": "the formal copula ending"
},
{
"ko": "국물",
"en": "broth",
"note": ""
},
{
"ko": "십만",
"en": "a hundred thousand",
"note": ""
},
{
"ko": "작년",
"en": "last year",
"note": ""
},
{
"ko": "몇 명",
"en": "how many people",
"note": ""
},
{
"ko": "습니다",
"en": "the formal polite verb ending",
"note": "attaches to the stem: 갑니다, 먹습니다"
},
{
"ko": "한국말",
"en": "Korean",
"note": "the spoken language"
},
{
"ko": "꽃말",
"en": "the meaning of a flower",
"note": ""
},
{
"ko": "값",
"en": "price, value",
"note": ""
},
{
"ko": "닭",
"en": "chicken",
"note": ""
},
{
"ko": "삶",
"en": "life",
"note": ""
},
{
"ko": "넓다",
"en": "to be wide",
"note": ""
},
{
"ko": "짧다",
"en": "to be short",
"note": ""
},
{
"ko": "신라",
"en": "Silla",
"note": "an ancient Korean kingdom"
},
{
"ko": "설날",
"en": "Lunar New Year",
"note": ""
},
{
"ko": "못해",
"en": "can't do it",
"note": ""
},
{
"ko": "축하",
"en": "congratulations",
"note": ""
},
{
"ko": "놓다",
"en": "to put down, to let go",
"note": ""
},
{
"ko": "앉히다",
"en": "to seat someone",
"note": "causative of 앉다"
},
{
"ko": "나라",
"en": "country",
"note": ""
},
{
"ko": "얼굴",
"en": "face",
"note": ""
},
{
"ko": "목소리",
"en": "voice",
"note": ""
},
{
"ko": "이야기",
"en": "story, talk",
"note": ""
},
{
"ko": "아니",
"en": "no",
"note": "반말"
},
{
"ko": "맞아",
"en": "that's right",
"note": ""
},
{
"ko": "이번",
"en": "this time",
"note": ""
},
{
"ko": "다음",
"en": "next",
"note": ""
},
{
"ko": "월",
"en": "month",
"note": "in dates: 삼월 = March"
},
{
"ko": "원",
"en": "won",
"note": "the currency"
},
{
"ko": "명",
"en": "people",
"note": "counter"
},
{
"ko": "마리",
"en": "animals",
"note": "counter"
},
{
"ko": "살",
"en": "years of age",
"note": "counter"
},
{
"ko": "잔",
"en": "cups, glasses",
"note": "counter"
},
{
"ko": "번",
"en": "times, occasions",
"note": "counter"
},
{
"ko": "시",
"en": "o'clock",
"note": "counter"
},
{
"ko": "못",
"en": "cannot",
"note": "placed before the verb"
},
{
"ko": "아직",
"en": "still, not yet",
"note": ""
},
{
"ko": "벌써",
"en": "already",
"note": ""
},
{
"ko": "전혀",
"en": "not at all",
"note": "with a negative"
},
{
"ko": "별로",
"en": "not particularly",
"note": "with a negative"
},
{
"ko": "다르다",
"en": "to be different",
"note": "르 irregular"
},
{
"ko": "빠르다",
"en": "to be fast",
"note": "르 irregular"
},
{
"ko": "맵다",
"en": "to be spicy",
"note": "ㅂ irregular"
},
{
"ko": "걷다",
"en": "to walk",
"note": "ㄷ irregular"
},
{
"ko": "묻다",
"en": "to ask",
"note": "ㄷ irregular"
},
{
"ko": "낫다",
"en": "to be better; to heal",
"note": "ㅅ irregular"
},
{
"ko": "짓다",
"en": "to build",
"note": "ㅅ irregular"
},
{
"ko": "그렇다",
"en": "to be so",
"note": "ㅎ irregular"
},
{
"ko": "어떻다",
"en": "to be how",
"note": "ㅎ irregular"
},
{
"ko": "빨갛다",
"en": "to be red",
"note": "ㅎ irregular"
},
{
"ko": "하얗다",
"en": "to be white",
"note": "ㅎ irregular"
},
{
"ko": "까맣다",
"en": "to be black",
"note": "ㅎ irregular"
},
{
"ko": "놀다",
"en": "to play",
"note": "ㄹ irregular"
},
{
"ko": "멀다",
"en": "to be far",
"note": "ㄹ irregular"
},
{
"ko": "길다",
"en": "to be long",
"note": "ㄹ irregular"
},
{
"ko": "만들다",
"en": "to make",
"note": "ㄹ irregular"
},
{
"ko": "아까",
"en": "a while ago",
"note": ""
},
{
"ko": "방금",
"en": "just now",
"note": ""
},
{
"ko": "나중에",
"en": "later",
"note": ""
},
{
"ko": "곧",
"en": "soon",
"note": ""
},
{
"ko": "이따가",
"en": "in a little while",
"note": ""
},
{
"ko": "정말",
"en": "really",
"note": ""
},
{
"ko": "찾다",
"en": "to look for, to find",
"note": ""
},
{
"ko": "열다",
"en": "to open",
"note": "ㄹ irregular"
},
{
"ko": "닫다",
"en": "to close",
"note": ""
},
{
"ko": "시작하다",
"en": "to start",
"note": ""
},
{
"ko": "끝나다",
"en": "to end",
"note": ""
},
{
"ko": "요즘",
"en": "these days",
"note": ""
},
{
"ko": "원래",
"en": "originally",
"note": ""
},
{
"ko": "보통",
"en": "usually",
"note": ""
},
{
"ko": "누가",
"en": "who",
"note": "subject form of 누구"
},
{
"ko": "제가",
"en": "I",
"note": "humble, subject form"
},
{
"ko": "뭘",
"en": "what",
"note": "contraction of 무엇을"
},
{
"ko": "절",
"en": "me",
"note": "humble, contraction of 저를"
},
{
"ko": "아래",
"en": "below",
"note": ""
},
{
"ko": "옆",
"en": "beside, next to",
"note": ""
},
{
"ko": "뒤",
"en": "behind",
"note": ""
},
{
"ko": "사이",
"en": "between",
"note": ""
},
{
"ko": "혼자",
"en": "alone",
"note": ""
},
{
"ko": "하고",
"en": "and; with",
"note": "particle"
},
{
"ko": "랑",
"en": "and; with",
"note": "casual particle"
},
{
"ko": "로",
"en": "by, with, toward",
"note": "particle"
},
{
"ko": "부터",
"en": "from",
"note": "particle"
},
{
"ko": "까지",
"en": "until, up to",
"note": "particle"
},
{
"ko": "처럼",
"en": "like, as",
"note": "particle"
},
{
"ko": "그때",
"en": "at that time",
"note": ""
},
{
"ko": "걔",
"en": "that kid",
"note": "contraction of 그 애"
},
{
"ko": "얘",
"en": "this kid",
"note": "contraction of 이 애"
},
{
"ko": "그렇습니다",
"en": "that is so",
"note": "formal"
},
{
"ko": "말씀",
"en": "words",
"note": "honorific"
},
{
"ko": "님",
"en": "honorific suffix",
"note": "선생님, 형님"
},
{
"ko": "드리다",
"en": "to give",
"note": "humble, to someone above you"
},
{
"ko": "계시다",
"en": "to be, to stay",
"note": "honorific of 있다"
},
{
"ko": "주무시다",
"en": "to sleep",
"note": "honorific of 자다"
},
{
"ko": "걱정하다",
"en": "to worry",
"note": ""
},
{
"ko": "신경 쓰다",
"en": "to be bothered, to care about",
"note": ""
},
{
"ko": "싶다",
"en": "to want",
"note": "used after -고"
},
{
"ko": "수",
"en": "possibility",
"note": "used in -ㄹ 수 있다"
},
{
"ko": "필요하다",
"en": "to be necessary",
"note": ""
},
{
"ko": "그렇지만",
"en": "but, however",
"note": ""
},
{
"ko": "왜냐하면",
"en": "because",
"note": "opens the reason"
},
{
"ko": "때문에",
"en": "because of",
"note": "after a noun"
},
{
"ko": "만약",
"en": "if",
"note": "paired with -면"
},
{
"ko": "혹시",
"en": "by any chance",
"note": ""
},
{
"ko": "아마",
"en": "probably",
"note": ""
},
{
"ko": "기분",
"en": "mood, feeling",
"note": ""
},
{
"ko": "걱정",
"en": "worry",
"note": ""
},
{
"ko": "미안하다",
"en": "to be sorry",
"note": ""
},
{
"ko": "고맙다",
"en": "to be thankful",
"note": "ㅂ irregular"
},
{
"ko": "것",
"en": "thing",
"note": "bound noun"
},
{
"ko": "거",
"en": "thing",
"note": "casual 것"
},
{
"ko": "때",
"en": "time, when",
"note": ""
},
{
"ko": "곳",
"en": "place",
"note": ""
},
{
"ko": "적",
"en": "an occasion",
"note": "used in -ㄴ 적 있다"
},
{
"ko": "라고",
"en": "quoting particle",
"note": "marks what someone said"
},
{
"ko": "대",
"en": "he says that…",
"note": "reported statement, contracted from -다고 해"
},
{
"ko": "래",
"en": "he says to…",
"note": "reported suggestion or request, from -라고 해"
},
{
"ko": "냬",
"en": "he asks whether…",
"note": "reported question, from -냐고 해"
},
{
"ko": "재",
"en": "he suggests that we…",
"note": "reported proposal, from -자고 해"
},
{
"ko": "이다",
"en": "to be",
"note": "the copula, dictionary form"
},
{
"ko": "했다",
"en": "did",
"note": "plain written past"
},
{
"ko": "한다",
"en": "does",
"note": "plain written present"
},
{
"ko": "였다",
"en": "was",
"note": "plain written past of 이다"
},
{
"ko": "난",
"en": "I",
"note": "contraction of 나는"
},
{
"ko": "넌",
"en": "you",
"note": "contraction of 너는"
},
{
"ko": "건",
"en": "the thing",
"note": "contraction of 것은"
},
{
"ko": "이건",
"en": "this thing",
"note": "contraction of 이것은"
}
]
}

961
data/grammar.json Normal file
View File

@@ -0,0 +1,961 @@
{
"note": "Reference grammar points. read:1 marks reading-priority items.",
"points": [
{
"id": "g-eun",
"cat": "조사 Particles",
"form": "은 / 는",
"name": "topic marker",
"why": "Names what the sentence is about, and quietly sets it against something else. 은 after a consonant, 는 after a vowel. A Korean sentence can drop it once the topic is obvious.",
"ex": [
[
"저는 학생이에요.",
"jeoneun haksaeng-ieyo.",
"I'm a student."
],
[
"김치는 매워요.",
"gimchineun maewoyo.",
"Kimchi — that one's spicy."
]
]
},
{
"id": "g-iga",
"cat": "조사 Particles",
"form": "이 / 가",
"name": "subject marker",
"why": "Marks who or what performs the verb, and introduces information that is new. 이 after a consonant, 가 after a vowel. 저 + 가 becomes 제가.",
"ex": [
[
"친구가 왔어요.",
"chinguga wasseoyo.",
"A friend came."
],
[
"시간이 없어요.",
"sigani eopseoyo.",
"There's no time."
]
]
},
{
"id": "g-eul",
"cat": "조사 Particles",
"form": "을 / 를",
"name": "object marker",
"why": "Marks the thing the verb acts on. 을 after a consonant, 를 after a vowel. Dropped constantly in speech.",
"ex": [
[
"밥을 먹어요.",
"babeul meogeoyo.",
"I'm eating."
],
[
"커피를 마셔요.",
"keopireul masyeoyo.",
"I'm drinking coffee."
]
]
},
{
"id": "g-e",
"cat": "조사 Particles",
"form": "에",
"name": "at, to, in (destination & time)",
"why": "Points at a destination, a point in time, or a static location with 있다 / 없다. Never used for where an action takes place — that is 에서.",
"ex": [
[
"학교에 가요.",
"hakgyoe gayo.",
"I go to school."
],
[
"세 시에 만나요.",
"se sie mannayo.",
"Let's meet at three."
]
]
},
{
"id": "g-eseo",
"cat": "조사 Particles",
"form": "에서",
"name": "at, in (action), from",
"why": "Where something happens, or where it started. Pair it with 에 to feel the split: 집에 있어요 (I'm at home) vs 집에서 일해요 (I work at home).",
"ex": [
[
"카페에서 공부해요.",
"kapeeseo gongbuhaeyo.",
"I study at the cafe."
],
[
"독일에서 왔어요.",
"dogireseo wasseoyo.",
"I'm from Germany."
]
]
},
{
"id": "g-do",
"cat": "조사 Particles",
"form": "도",
"name": "also, too",
"why": "Replaces 은/는, 이/가 and 을/를 rather than stacking onto them. 저는도 is wrong; 저도 is right.",
"ex": [
[
"저도 가요.",
"jeodo gayo.",
"I'm going too."
],
[
"물도 주세요.",
"muldo juseyo.",
"Water as well, please."
]
]
},
{
"id": "g-man",
"cat": "조사 Particles",
"form": "만",
"name": "only, just",
"why": "Also replaces the subject and object markers. Attaches after time and counters happily.",
"ex": [
[
"물만 마셔요.",
"mulman masyeoyo.",
"I only drink water."
],
[
"십 분만 기다려 주세요.",
"sip bunman gidaryeo juseyo.",
"Please wait just ten minutes."
]
]
},
{
"id": "g-hago",
"cat": "조사 Particles",
"form": "하고 · 와/과 · (이)랑",
"name": "and, with",
"why": "Three ways to join two nouns. 와 after a vowel, 과 after a consonant — the written pair. 하고 is neutral, (이)랑 is casual speech.",
"ex": [
[
"빵하고 우유를 샀어요.",
"ppanghago uyureul sasseoyo.",
"I bought bread and milk."
],
[
"친구와 같이 갔어요.",
"chinguwa gachi gasseoyo.",
"I went together with a friend."
]
]
},
{
"id": "g-ui",
"cat": "조사 Particles",
"form": "의",
"name": "possessive 's",
"why": "Written 의 but pronounced [에] here. Often dropped entirely: 친구 가방 is perfectly natural. 저의 contracts to 제, 나의 to 내.",
"ex": [
[
"친구의 가방이에요.",
"chinguui gabang-ieyo.",
"It's my friend's bag."
],
[
"한국의 날씨는 어때요?",
"hangugui nalssineun eottaeyo?",
"How is the weather in Korea?"
]
]
},
{
"id": "g-buteo",
"cat": "조사 Particles",
"form": "부터 ~ 까지",
"name": "from ~ until",
"why": "부터 ~ 까지 spans time; 에서 ~ 까지 spans distance. Mixing them up is the classic beginner tell.",
"ex": [
[
"아홉 시부터 여섯 시까지 일해요.",
"ahop sibuteo yeoseot sikkaji ilhaeyo.",
"I work from nine until six."
],
[
"집에서 회사까지 삼십 분 걸려요.",
"jibeseo hoesakkaji samsip bun geollyeoyo.",
"It takes thirty minutes from home to the office."
]
]
},
{
"id": "g-boda",
"cat": "조사 Particles",
"form": "보다 (더)",
"name": "more than",
"why": "Attaches to the thing being beaten, not the winner: A는 B보다 — A beats B. 더 is optional but very common.",
"ex": [
[
"오늘이 어제보다 더워요.",
"oneuri eojeboda deowoyo.",
"Today is hotter than yesterday."
],
[
"저는 커피보다 차를 더 좋아해요.",
"jeoneun keopiboda chareul deo joahaeyo.",
"I like tea more than coffee."
]
]
},
{
"id": "g-cheoreom",
"cat": "조사 Particles",
"form": "처럼 · 같이",
"name": "like, as",
"why": "Both attach directly to a noun. 같이 here is the adverb 'like', the same word as 'together' — context separates them.",
"ex": [
[
"한국 사람처럼 말해요.",
"hanguk saramcheoreom malhaeyo.",
"You speak like a Korean."
],
[
"얼음같이 차가워요.",
"eoreumgachi chagawoyo.",
"It's cold as ice."
]
]
},
{
"id": "g-ieyo",
"cat": "서술 Predicates",
"form": "N + 이에요 / 예요",
"name": "to be",
"why": "The copula. 이에요 after a consonant, 예요 after a vowel. Formal register: 입니다. Negative: N이/가 아니에요.",
"ex": [
[
"저는 파비안이에요.",
"jeoneun pabian-ieyo.",
"I'm Fabian."
],
[
"여기가 우리 집이에요.",
"yeogiga uri jibieyo.",
"This is our house."
]
]
},
{
"id": "g-ayo",
"cat": "서술 Predicates",
"form": "V/A + 아요 / 어요",
"name": "polite present (해요체)",
"why": "The everyday polite ending, and the one to master first. Stem vowel ㅏ or ㅗ takes 아요; everything else takes 어요; 하다 becomes 해요. Same form covers present tense, near future and a gentle suggestion.",
"ex": [
[
"지금 밥을 먹어요.",
"jigeum babeul meogeoyo.",
"I'm eating now."
],
[
"매일 운동해요.",
"maeil undonghaeyo.",
"I exercise every day."
]
]
},
{
"id": "g-past",
"cat": "서술 Predicates",
"form": "V/A + 았 / 었어요",
"name": "past tense",
"why": "Take the 아/어 form, insert ㅆ, add 어요. 먹어요 → 먹었어요, 가요 → 갔어요, 해요 → 했어요.",
"ex": [
[
"어제 영화를 봤어요.",
"eoje yeonghwareul bwasseoyo.",
"I watched a film yesterday."
],
[
"밥을 안 먹었어요.",
"babeul an meogeosseoyo.",
"I didn't eat."
]
]
},
{
"id": "g-future",
"cat": "서술 Predicates",
"form": "V + (으)ㄹ 거예요",
"name": "future, intention",
"why": "Plans and predictions. Add ㄹ 거예요 to a vowel-final stem, 을 거예요 after a consonant. Softer and more common than the bookish -겠-.",
"ex": [
[
"내일 한국에 갈 거예요.",
"naeil hanguge gal geoyeyo.",
"I'll go to Korea tomorrow."
],
[
"주말에 쉴 거예요.",
"jumare swil geoyeyo.",
"I'm going to rest at the weekend."
]
]
},
{
"id": "g-nida",
"cat": "서술 Predicates",
"form": "V/A + ㅂ니다 / 습니다",
"name": "formal polite (합쇼체)",
"why": "The register of announcements, presentations, the news and the army. Vowel stem takes ㅂ니다, consonant stem 습니다. Questions end -ㅂ니까?",
"ex": [
[
"감사합니다.",
"gamsahamnida.",
"Thank you."
],
[
"저는 독일에서 왔습니다.",
"jeoneun dogireseo watseumnida.",
"I came from Germany."
]
]
},
{
"id": "g-an",
"cat": "부정 Negation",
"form": "안 + V/A · V/A + 지 않다",
"name": "simple negation",
"why": "안 goes in front and is the spoken default; -지 않다 goes behind and reads a touch more formal. For 하다 verbs, 안 slips inside: 공부 안 해요, not 안 공부해요.",
"ex": [
[
"오늘은 안 바빠요.",
"oneureun an bappayo.",
"I'm not busy today."
],
[
"그 영화는 재미있지 않았어요.",
"geu yeonghwaneun jaemiitji anasseoyo.",
"That film wasn't interesting."
]
]
},
{
"id": "g-mot",
"cat": "부정 Negation",
"form": "못 + V · V + 지 못하다",
"name": "cannot (ability, circumstance)",
"why": "안 is 'I don't'; 못 is 'I can't, even though I might want to'. Pronounced [몯] before a consonant, [모ㅅ] links forward before a vowel.",
"ex": [
[
"매운 음식을 못 먹어요.",
"maeun eumsigeul mot meogeoyo.",
"I can't eat spicy food."
],
[
"어제 못 갔어요.",
"eoje mot gasseoyo.",
"I couldn't go yesterday."
]
]
},
{
"id": "g-jima",
"cat": "부정 Negation",
"form": "V + 지 마세요",
"name": "please don't",
"why": "The negative command. Attaches to the plain verb stem. Blunter: -지 마.",
"ex": [
[
"여기에서 사진을 찍지 마세요.",
"yeogieseo sajineul jjikji maseyo.",
"Please don't take photos here."
],
[
"걱정하지 마세요.",
"geokjeonghaji maseyo.",
"Don't worry."
]
]
},
{
"id": "g-gosipda",
"cat": "표현 Expressions",
"form": "V + 고 싶다",
"name": "want to",
"why": "Only for I and you. Talking about a third person's wants needs -고 싶어하다, because Korean does not claim to know another person's inner state.",
"ex": [
[
"한국에 가고 싶어요.",
"hanguge gago sipeoyo.",
"I want to go to Korea."
],
[
"뭐 먹고 싶어요?",
"mwo meokgo sipeoyo?",
"What do you want to eat?"
]
]
},
{
"id": "g-lsu",
"cat": "표현 Expressions",
"form": "V + (으)ㄹ 수 있다 / 없다",
"name": "can / cannot",
"why": "Literally 'there is a way to'. Vowel stem takes ㄹ 수, consonant stem 을 수.",
"ex": [
[
"한국어를 조금 할 수 있어요.",
"hangugeoreul jogeum hal su isseoyo.",
"I can speak a little Korean."
],
[
"오늘은 갈 수 없어요.",
"oneureun gal su eopseoyo.",
"I can't go today."
]
]
},
{
"id": "g-ayadoeda",
"cat": "표현 Expressions",
"form": "V/A + 아 / 어야 되다",
"name": "must, have to",
"why": "Built on the 아/어 form. 되다 and 하다 are interchangeable here; 되다 is more spoken.",
"ex": [
[
"지금 가야 돼요.",
"jigeum gaya dwaeyo.",
"I have to go now."
],
[
"약을 먹어야 해요.",
"yageul meogeoya haeyo.",
"You need to take the medicine."
]
]
},
{
"id": "g-euseyo",
"cat": "표현 Expressions",
"form": "V + (으)세요",
"name": "polite request & honorific",
"why": "Two jobs at once: a soft command to the listener, and the honorific present when the subject deserves respect. A few verbs go irregular — 먹다 → 드세요, 자다 → 주무세요, 있다 → 계세요.",
"ex": [
[
"여기 앉으세요.",
"yeogi anjeuseyo.",
"Please sit here."
],
[
"할머니는 지금 주무세요.",
"halmeonineun jigeum jumuseyo.",
"Grandmother is sleeping."
]
]
},
{
"id": "g-juseyo",
"cat": "표현 Expressions",
"form": "V + 아 / 어 주세요",
"name": "please do it for me",
"why": "The single most useful thing to say in a shop, a taxi or a classroom. Adds a sense of favour that plain -(으)세요 lacks.",
"ex": [
[
"천천히 말해 주세요.",
"cheoncheonhi malhae juseyo.",
"Please speak slowly."
],
[
"이것 좀 보여 주세요.",
"igeot jom boyeo juseyo.",
"Could you show me this one."
]
]
},
{
"id": "g-ryeogo",
"cat": "표현 Expressions",
"form": "V + (으)려고 하다",
"name": "intend to, be about to",
"why": "A plan already formed, not a fresh decision. Both clauses must share a subject.",
"ex": [
[
"한국어를 배우려고 해요.",
"hangugeoreul baeuryeogo haeyo.",
"I intend to learn Korean."
],
[
"나가려고 했어요.",
"nagaryeogo haesseoyo.",
"I was about to go out."
]
]
},
{
"id": "g-reo",
"cat": "표현 Expressions",
"form": "V + (으)러 가다 / 오다",
"name": "go in order to",
"why": "Only pairs with verbs of movement — 가다, 오다, 다니다. The purpose comes first, the movement second.",
"ex": [
[
"밥 먹으러 가요.",
"bap meogeureo gayo.",
"Let's go eat."
],
[
"친구를 만나러 왔어요.",
"chingureul mannareo wasseoyo.",
"I came to meet a friend."
]
]
},
{
"id": "g-geotgatda",
"cat": "표현 Expressions",
"form": "A/V + 것 같다",
"name": "it seems, I think",
"why": "Korean prefers a hedge to a flat assertion, so this shows up far more than 'I think' does in English. 올 것 같다 for a guess ahead, 온 것 같다 for a guess about what already happened.",
"ex": [
[
"비가 올 것 같아요.",
"biga ol geot gatayo.",
"It looks like rain."
],
[
"이 책이 좋은 것 같아요.",
"i chaegi joeun geot gatayo.",
"I think this book is good."
]
]
},
{
"id": "g-lkkayo",
"cat": "표현 Expressions",
"form": "V + (으)ㄹ까요?",
"name": "shall we? I wonder?",
"why": "With a first-person plural sense it proposes; with a third-person subject it wonders aloud.",
"ex": [
[
"같이 갈까요?",
"gachi galkkayo?",
"Shall we go together?"
],
[
"비가 올까요?",
"biga olkkayo?",
"Do you think it'll rain?"
]
]
},
{
"id": "g-neyo",
"cat": "표현 Expressions",
"form": "A/V + 네요",
"name": "realisation, mild surprise",
"why": "Marks something you have just noticed. Warm and very common — the difference between 좋아요 (it's good) and 좋네요 (oh, that's nice).",
"ex": [
[
"날씨가 좋네요.",
"nalssiga jonneyo.",
"The weather's lovely, isn't it."
],
[
"한국어를 잘하네요.",
"hangugeoreul jalhaneyo.",
"Oh — your Korean is good."
]
]
},
{
"id": "g-go",
"cat": "연결 Connectives",
"form": "V/A + 고",
"name": "and (listing, sequence)",
"why": "Joins two clauses with no cause-and-effect claim. Tense is carried only by the final verb.",
"ex": [
[
"밥을 먹고 커피를 마셨어요.",
"babeul meokgo keopireul masyeosseoyo.",
"I ate and then drank coffee."
],
[
"이 카페는 조용하고 싸요.",
"i kapeneun joyonghago ssayo.",
"This cafe is quiet and cheap."
]
]
},
{
"id": "g-jiman",
"cat": "연결 Connectives",
"form": "V/A + 지만",
"name": "but",
"why": "Attaches straight to the stem, and unlike -아/어서 it does take tense: 했지만.",
"ex": [
[
"한국어는 어렵지만 재미있어요.",
"hangugeoneun eoryeopjiman jaemiisseoyo.",
"Korean is hard but it's fun."
],
[
"갔지만 못 만났어요.",
"gatjiman mot mannasseoyo.",
"I went, but I couldn't meet them."
]
]
},
{
"id": "g-aseo",
"cat": "연결 Connectives",
"form": "V/A + 아 / 어서",
"name": "because; and then",
"why": "Two readings from one form: a reason, or a sequence where the first action sets up the second. Never carries past tense before 서, and never precedes a command or a suggestion — that is what -(으)니까 is for.",
"ex": [
[
"배가 아파서 병원에 갔어요.",
"baega apaseo byeongwone gasseoyo.",
"I went to the hospital because my stomach hurt."
],
[
"친구를 만나서 밥을 먹었어요.",
"chingureul mannaseo babeul meogeosseoyo.",
"I met a friend and we ate."
]
]
},
{
"id": "g-nikka",
"cat": "연결 Connectives",
"form": "V/A + (으)니까",
"name": "because (before commands)",
"why": "The reason ending that is allowed to precede 하세요, 합시다 and -(으)ㄹ까요. It also accepts past tense, which -아/어서 refuses.",
"ex": [
[
"비가 오니까 택시를 탑시다.",
"biga onikka taeksireul tapsida.",
"It's raining, so let's take a taxi."
],
[
"시간이 없으니까 빨리 가세요.",
"sigani eopseunikka ppalli gaseyo.",
"There's no time, so please hurry."
]
]
},
{
"id": "g-neunde",
"cat": "연결 Connectives",
"form": "V + 는데 · A + (으)ㄴ데",
"name": "background, contrast, soft lead-in",
"why": "The hardest-working ending in conversational Korean. It sets the scene, softens a contrast, or simply opens a topic and trails off. Verbs take 는데, adjectives (으)ㄴ데, past tense 았/었는데.",
"ex": [
[
"지금 공부하는데 좀 어려워요.",
"jigeum gongbuhaneunde jom eoryeowoyo.",
"I'm studying now, and it's a bit hard."
],
[
"이 옷은 예쁜데 비싸요.",
"i oseun yeppeunde bissayo.",
"These clothes are pretty, but expensive."
]
]
},
{
"id": "g-gijeone",
"cat": "연결 Connectives",
"form": "V + 기 전에",
"name": "before doing",
"why": "Always the plain stem + 기 전에, with no tense marking. With a noun, drop the 기: 식사 전에.",
"ex": [
[
"자기 전에 책을 읽어요.",
"jagi jeone chaegeul ilgeoyo.",
"I read before going to sleep."
],
[
"가기 전에 전화하세요.",
"gagi jeone jeonhwahaseyo.",
"Call before you go."
]
]
},
{
"id": "g-nhue",
"cat": "연결 Connectives",
"form": "V + (으)ㄴ 후에",
"name": "after doing",
"why": "Mirror of 기 전에, but built on the past-modifier form: 먹은 후에, 간 후에. -(으)ㄴ 다음에 means the same thing.",
"ex": [
[
"밥을 먹은 후에 산책해요.",
"babeul meogeun hue sanchaekaeyo.",
"After eating I go for a walk."
],
[
"일이 끝난 후에 만나요.",
"iri kkeunnan hue mannayo.",
"Let's meet after work finishes."
]
]
},
{
"id": "g-numsys",
"cat": "수 Numbers & counters",
"form": "일이삼 vs 하나둘셋",
"name": "the two number systems",
"why": "Korean runs two full sets of numbers side by side. Sino-Korean handles dates, money, minutes, phone numbers, floors and anything above 99 in counting. Native Korean handles counted objects, people, hours and age. A clock reading uses both at once.",
"ex": [
[
"세 시 삼십 분이에요.",
"se si samsip bunieyo.",
"It's 3:30. (native hour, Sino minute)"
],
[
"스물다섯 살이에요.",
"seumuldaseot sarieyo.",
"I'm twenty-five."
]
]
},
{
"id": "g-counters",
"cat": "수 Numbers & counters",
"form": "개 · 명 · 마리 · 잔 · 권 · 살",
"name": "counters",
"why": "Nothing is counted bare — a counter word sits between the number and the verb. Before a counter, 하나·둘·셋·넷·스물 shorten to 한·두·세·네·스무. Order: noun, number, counter.",
"ex": [
[
"커피 두 잔 주세요.",
"keopi du jan juseyo.",
"Two coffees, please."
],
[
"고양이 세 마리가 있어요.",
"goyangi se mariga isseoyo.",
"There are three cats."
]
]
},
{
"id": "g-banmal",
"cat": "반말 Casual speech",
"form": "V/A + 아 / 어",
"name": "반말 — plain casual speech",
"read": 1,
"why": "Take the polite 아/어요 form and drop the 요. That is 반말, and it is what almost every line of manhwa dialogue is written in. Between friends, from an older speaker to a younger one, and in a character's own thoughts.",
"ex": [
[
"밥 먹어.",
"",
"Eat. / I'm eating."
],
[
"어디 가?",
"",
"Where are you going?"
]
]
},
{
"id": "g-ya",
"cat": "반말 Casual speech",
"form": "N + 야 / 이야",
"name": "casual 'to be'",
"read": 1,
"why": "The 반말 copula: 이에요/예요 with the 요 gone and the vowel shortened. 야 after a vowel, 이야 after a consonant. Questions are identical — only the rising tone and the question mark differ.",
"ex": [
[
"우리 친구야.",
"",
"We're friends."
],
[
"범인은 저 사람이야.",
"",
"The culprit is that person."
]
]
},
{
"id": "g-eosseo",
"cat": "반말 Casual speech",
"form": "V/A + 았 / 었어",
"name": "casual past",
"read": 1,
"why": "The past tense minus the 요. This is the workhorse of manhwa narration and flashbacks.",
"ex": [
[
"소문 들었어?",
"",
"Did you hear the rumour?"
],
[
"나 회귀했어.",
"",
"I regressed."
]
]
},
{
"id": "g-lge",
"cat": "반말 Casual speech",
"form": "V + (으)ㄹ게",
"name": "I'll do it (a promise to you)",
"read": 1,
"why": "A first-person commitment made for the listener's benefit — not a neutral prediction. Very common in the panel right before someone does something heroic.",
"ex": [
[
"내가 지킬게.",
"",
"I'll protect you."
],
[
"나 갈게.",
"",
"I'm off."
]
]
},
{
"id": "g-lgeoya",
"cat": "반말 Casual speech",
"form": "V + (으)ㄹ 거야",
"name": "casual future / intention",
"read": 1,
"why": "-(으)ㄹ 거예요 in 반말. Declaring what you are going to do, often as a threat or a vow.",
"ex": [
[
"복수할 거야.",
"",
"I'm going to take revenge."
],
[
"안 갈 거야.",
"",
"I'm not going."
]
]
},
{
"id": "g-ja",
"cat": "반말 Casual speech",
"form": "V + 자",
"name": "let's",
"read": 1,
"why": "The casual suggestion. 가자, 하자, 먹자 — three syllables that move a whole scene along.",
"ex": [
[
"우리 헤어지자.",
"",
"Let's break up."
],
[
"가자.",
"",
"Let's go."
]
]
},
{
"id": "g-janha",
"cat": "반말 Casual speech",
"form": "V/A + 잖아",
"name": "you know, as you're aware",
"read": 1,
"why": "Appeals to something the listener already knows, often impatiently. Reading it as plain 'because' loses the exasperation the panel is drawing.",
"ex": [
[
"내가 말했잖아.",
"",
"I told you, didn't I."
],
[
"위험하잖아.",
"",
"It's dangerous, you know."
]
]
},
{
"id": "g-geodeun",
"cat": "반말 Casual speech",
"form": "V/A + 거든",
"name": "the thing is…",
"read": 1,
"why": "Supplies a reason the listener did not have, sometimes with a note of defiance. Often ends a speech bubble on its own.",
"ex": [
[
"나 바쁘거든.",
"",
"I'm busy, that's why."
],
[
"걔가 먼저 그랬거든.",
"",
"He started it, actually."
]
]
},
{
"id": "g-deora",
"cat": "반말 Casual speech",
"form": "V/A + 더라",
"name": "I saw it myself",
"read": 1,
"why": "Reports something the speaker personally witnessed, recalled with a little surprise. A flag that the line is a memory or an eyewitness account.",
"ex": [
[
"그 사람 진짜 강하더라.",
"",
"That person was seriously strong, I saw it."
]
]
},
{
"id": "g-quote",
"cat": "반말 Casual speech",
"form": "V + 대 / 래 / 냬 / 재",
"name": "hearsay — 'they say'",
"read": 1,
"why": "Contracted quotation, everywhere in gossip panels. -대 reports a statement, -래 a command or an 'is', -냬 a question, -재 a suggestion. If a line ends in one of these, someone else said it first.",
"ex": [
[
"시험 어렵대.",
"",
"They say the exam is hard."
],
[
"같이 가재.",
"",
"He says let's go together."
]
]
},
{
"id": "g-neun",
"cat": "반말 Casual speech",
"form": "V + 는 / A + (으)ㄴ + N",
"name": "modifying a noun",
"read": 1,
"why": "Korean puts the whole description in front of the noun, where English puts it after: 내가 죽인 몬스터 is 'the monster I killed'. Once you can see where the modifier ends and the noun begins, long manhwa narration stops being a wall.",
"ex": [
[
"내가 죽인 몬스터.",
"",
"The monster I killed."
],
[
"강한 사람.",
"",
"A strong person."
]
]
}
]
}

492
data/hangul.json Normal file
View File

@@ -0,0 +1,492 @@
{
"consonants": [
{
"jamo": "ㄱ",
"roman": "g / k",
"name": "기역",
"tense": false
},
{
"jamo": "ㄲ",
"roman": "kk",
"name": "쌍기역",
"tense": true
},
{
"jamo": "ㄴ",
"roman": "n",
"name": "니은",
"tense": false
},
{
"jamo": "ㄷ",
"roman": "d / t",
"name": "디귿",
"tense": false
},
{
"jamo": "ㄸ",
"roman": "tt",
"name": "쌍디귿",
"tense": true
},
{
"jamo": "ㄹ",
"roman": "r / l",
"name": "리을",
"tense": false
},
{
"jamo": "ㅁ",
"roman": "m",
"name": "미음",
"tense": false
},
{
"jamo": "ㅂ",
"roman": "b / p",
"name": "비읍",
"tense": false
},
{
"jamo": "ㅃ",
"roman": "pp",
"name": "쌍비읍",
"tense": true
},
{
"jamo": "ㅅ",
"roman": "s",
"name": "시옷",
"tense": false
},
{
"jamo": "ㅆ",
"roman": "ss",
"name": "쌍시옷",
"tense": true
},
{
"jamo": "ㅇ",
"roman": "— / ng",
"name": "이응",
"tense": false
},
{
"jamo": "ㅈ",
"roman": "j",
"name": "지읒",
"tense": false
},
{
"jamo": "ㅉ",
"roman": "jj",
"name": "쌍지읒",
"tense": true
},
{
"jamo": "ㅊ",
"roman": "ch",
"name": "치읓",
"tense": false
},
{
"jamo": "ㅋ",
"roman": "k",
"name": "키읔",
"tense": false
},
{
"jamo": "ㅌ",
"roman": "t",
"name": "티읕",
"tense": false
},
{
"jamo": "ㅍ",
"roman": "p",
"name": "피읖",
"tense": false
},
{
"jamo": "ㅎ",
"roman": "h",
"name": "히읗",
"tense": false
}
],
"vowels": [
{
"jamo": "ㅏ",
"roman": "a",
"kind": "basic"
},
{
"jamo": "ㅑ",
"roman": "ya",
"kind": "basic"
},
{
"jamo": "ㅓ",
"roman": "eo",
"kind": "basic"
},
{
"jamo": "ㅕ",
"roman": "yeo",
"kind": "basic"
},
{
"jamo": "ㅗ",
"roman": "o",
"kind": "basic"
},
{
"jamo": "ㅛ",
"roman": "yo",
"kind": "basic"
},
{
"jamo": "ㅜ",
"roman": "u",
"kind": "basic"
},
{
"jamo": "ㅠ",
"roman": "yu",
"kind": "basic"
},
{
"jamo": "ㅡ",
"roman": "eu",
"kind": "basic"
},
{
"jamo": "ㅣ",
"roman": "i",
"kind": "basic"
},
{
"jamo": "ㅐ",
"roman": "ae",
"kind": "compound"
},
{
"jamo": "ㅒ",
"roman": "yae",
"kind": "compound"
},
{
"jamo": "ㅔ",
"roman": "e",
"kind": "compound"
},
{
"jamo": "ㅖ",
"roman": "ye",
"kind": "compound"
},
{
"jamo": "ㅘ",
"roman": "wa",
"kind": "compound"
},
{
"jamo": "ㅙ",
"roman": "wae",
"kind": "compound"
},
{
"jamo": "ㅚ",
"roman": "oe",
"kind": "compound"
},
{
"jamo": "ㅝ",
"roman": "wo",
"kind": "compound"
},
{
"jamo": "ㅞ",
"roman": "we",
"kind": "compound"
},
{
"jamo": "ㅟ",
"roman": "wi",
"kind": "compound"
},
{
"jamo": "ㅢ",
"roman": "ui",
"kind": "compound"
}
],
"batchim": [
{
"sound": "ㄱ",
"roman": "k",
"writtenAs": "ㄱ ㅋ ㄲ ㄳ ㄺ"
},
{
"sound": "ㄴ",
"roman": "n",
"writtenAs": "ㄴ ㄵ ㄶ"
},
{
"sound": "ㄷ",
"roman": "t",
"writtenAs": "ㄷ ㅅ ㅆ ㅈ ㅊ ㅌ ㅎ"
},
{
"sound": "ㄹ",
"roman": "l",
"writtenAs": "ㄹ ㄼ ㄽ ㄾ ㅀ"
},
{
"sound": "ㅁ",
"roman": "m",
"writtenAs": "ㅁ ㄻ"
},
{
"sound": "ㅂ",
"roman": "p",
"writtenAs": "ㅂ ㅍ ㅄ ㄿ"
},
{
"sound": "ㅇ",
"roman": "ng",
"writtenAs": "ㅇ"
}
],
"soundRules": [
{
"n": "Liaison",
"k": "연음",
"p": "A batchim followed by a silent ㅇ slides across into the next block. This is why written Korean and spoken Korean look so different.",
"a": "한국어",
"b": "한구거",
"r": "han-gu-geo"
},
{
"n": "Nasalisation",
"k": "비음화",
"p": "Before ㄴ or ㅁ, a stop batchim turns nasal: ㄱ→ㅇ, ㄷ→ㄴ, ㅂ→ㅁ.",
"a": "감사합니다",
"b": "감사함니다",
"r": "gam-sa-ham-ni-da"
},
{
"n": "Lateralisation",
"k": "유음화",
"p": "ㄴ next to ㄹ, in either order, becomes ㄹㄹ.",
"a": "신라",
"b": "실라",
"r": "sil-la"
},
{
"n": "Aspiration",
"k": "격음화",
"p": "ㅎ meeting ㄱ ㄷ ㅈ ㅂ fuses into the aspirated ㅋ ㅌ ㅊ ㅍ.",
"a": "좋다",
"b": "조타",
"r": "jo-ta"
},
{
"n": "Tensification",
"k": "경음화",
"p": "After a ㄱ ㄷ ㅂ batchim, a following ㄱ ㄷ ㅂ ㅅ ㅈ tenses to ㄲ ㄸ ㅃ ㅆ ㅉ.",
"a": "학교",
"b": "학꾜",
"r": "hak-kkyo"
},
{
"n": "Palatalisation",
"k": "구개음화",
"p": "A ㄷ or ㅌ batchim before 이 becomes 지 or 치.",
"a": "같이",
"b": "가치",
"r": "ga-chi"
},
{
"n": "ㅎ dropping",
"k": "ㅎ 탈락",
"p": "ㅎ between vowels, or after ㄴ ㄹ ㅁ ㅇ, is simply not pronounced.",
"a": "좋아요",
"b": "조아요",
"r": "jo-a-yo"
}
],
"soundPairs": [
{
"written": "한국어",
"spoken": "한구거",
"rule": "연음"
},
{
"written": "음악",
"spoken": "으막",
"rule": "연음"
},
{
"written": "읽어",
"spoken": "일거",
"rule": "연음"
},
{
"written": "앉아",
"spoken": "안자",
"rule": "연음"
},
{
"written": "꽃이",
"spoken": "꼬치",
"rule": "연음"
},
{
"written": "옷을",
"spoken": "오슬",
"rule": "연음"
},
{
"written": "앞에",
"spoken": "아페",
"rule": "연음"
},
{
"written": "낮에",
"spoken": "나제",
"rule": "연음"
},
{
"written": "있어",
"spoken": "이써",
"rule": "연음"
},
{
"written": "없어",
"spoken": "업써",
"rule": "연음"
},
{
"written": "맛있어",
"spoken": "마시써",
"rule": "연음"
},
{
"written": "끝났어",
"spoken": "끈나써",
"rule": "비음화"
},
{
"written": "감사합니다",
"spoken": "감사함니다",
"rule": "비음화"
},
{
"written": "입니다",
"spoken": "임니다",
"rule": "비음화"
},
{
"written": "십만",
"spoken": "심만",
"rule": "비음화"
},
{
"written": "국물",
"spoken": "궁물",
"rule": "비음화"
},
{
"written": "작년",
"spoken": "장년",
"rule": "비음화"
},
{
"written": "백만",
"spoken": "뱅만",
"rule": "비음화"
},
{
"written": "몇 명",
"spoken": "면 명",
"rule": "비음화"
},
{
"written": "독립",
"spoken": "동닙",
"rule": "비음화"
},
{
"written": "설날",
"spoken": "설랄",
"rule": "유음화"
},
{
"written": "신라",
"spoken": "실라",
"rule": "유음화"
},
{
"written": "좋다",
"spoken": "조타",
"rule": "격음화"
},
{
"written": "못해",
"spoken": "모태",
"rule": "격음화"
},
{
"written": "같아요",
"spoken": "가타요",
"rule": "연음"
},
{
"written": "학교",
"spoken": "학꾜",
"rule": "경음화"
},
{
"written": "할 수 있어",
"spoken": "할 쑤 이써",
"rule": "경음화"
},
{
"written": "밥 먹어",
"spoken": "밤머거",
"rule": "비음화"
},
{
"written": "같이",
"spoken": "가치",
"rule": "구개음화"
},
{
"written": "좋아요",
"spoken": "조아요",
"rule": "ㅎ 탈락"
},
{
"written": "싫어",
"spoken": "시러",
"rule": "ㅎ 탈락"
},
{
"written": "많이",
"spoken": "마니",
"rule": "ㅎ 탈락"
},
{
"written": "좋은",
"spoken": "조은",
"rule": "ㅎ 탈락"
},
{
"written": "넣어",
"spoken": "너어",
"rule": "ㅎ 탈락"
}
]
}

149
data/irregulars.json Normal file
View File

@@ -0,0 +1,149 @@
{
"classes": [
{
"k": "ㅡ",
"n": "ㅡ drops",
"p": "A stem ending in ㅡ loses it. The 아/어 choice then follows the vowel BEFORE it.",
"ex": [
[
"크다",
"커"
],
[
"바쁘다",
"바빠"
],
[
"슬프다",
"슬퍼"
],
[
"쓰다",
"써"
]
]
},
{
"k": "ㅂ",
"n": "ㅂ → 우",
"p": "A ㅂ batchim turns into 우, which fuses with the ending: 워. Almost all are adjectives.",
"ex": [
[
"덥다",
"더워"
],
[
"어렵다",
"어려워"
],
[
"무섭다",
"무서워"
],
[
"쉽다",
"쉬워"
]
]
},
{
"k": "ㄷ",
"n": "ㄷ → ㄹ",
"p": "A ㄷ batchim becomes ㄹ before a vowel. 받다 and 닫다 are regular — they do not change.",
"ex": [
[
"듣다",
"들어"
],
[
"걷다",
"걸어"
],
[
"묻다",
"물어"
]
]
},
{
"k": "르",
"n": "르 doubles ㄹ",
"p": "The 르 drops its ㅡ and an extra ㄹ lands on the previous syllable.",
"ex": [
[
"모르다",
"몰라"
],
[
"부르다",
"불러"
],
[
"다르다",
"달라"
],
[
"빠르다",
"빨라"
]
]
},
{
"k": "ㅅ",
"n": "ㅅ drops",
"p": "A ㅅ batchim disappears before a vowel, and no contraction follows. 웃다 and 씻다 are regular.",
"ex": [
[
"낫다",
"나아"
],
[
"짓다",
"지어"
],
[
"붓다",
"부어"
]
]
},
{
"k": "ㅎ",
"n": "ㅎ drops, vowel shifts",
"p": "Colour adjectives and 그렇다-type words: the ㅎ goes and the vowel becomes ㅐ.",
"ex": [
[
"그렇다",
"그래"
],
[
"빨갛다",
"빨개"
],
[
"어떻다",
"어때"
]
]
},
{
"k": "ㄹ",
"n": "ㄹ drops before ㄴ ㅂ ㅅ",
"p": "The 아/어 form is regular; the ㄹ only vanishes before certain endings.",
"ex": [
[
"살다",
"살아 · 사는"
],
[
"알다",
"알아 · 아는"
],
[
"멀다",
"멀어 · 먼"
]
]
}
]
}

765
data/sentences.json Normal file
View File

@@ -0,0 +1,765 @@
{
"note": "Glossed sentences. parts[] are [chunk, gloss]; the LAST chunk is the 서술어 (predicate).",
"levels": {
"A": "subject + ending word",
"B": "manhwa dialogue"
},
"sentences": [
{
"lvl": "A",
"ko": "나 배고파.",
"en": "I'm hungry.",
"parts": [
[
"나",
"I"
],
[
"배고파",
"am hungry"
]
]
},
{
"lvl": "A",
"ko": "너 어디 가?",
"en": "Where are you going?",
"parts": [
[
"너",
"you"
],
[
"어디",
"where"
],
[
"가",
"go"
]
]
},
{
"lvl": "A",
"ko": "이거 뭐야?",
"en": "What is this?",
"parts": [
[
"이거",
"this thing"
],
[
"뭐야",
"is what"
]
]
},
{
"lvl": "A",
"ko": "그 사람 누구야?",
"en": "Who is that person?",
"parts": [
[
"그",
"that"
],
[
"사람",
"person"
],
[
"누구야",
"is who"
]
]
},
{
"lvl": "A",
"ko": "우리 친구야.",
"en": "We're friends.",
"parts": [
[
"우리",
"we"
],
[
"친구야",
"are friends"
]
]
},
{
"lvl": "A",
"ko": "나 진짜 슬퍼.",
"en": "I'm really sad.",
"parts": [
[
"나",
"I"
],
[
"진짜",
"really"
],
[
"슬퍼",
"am sad"
]
]
},
{
"lvl": "A",
"ko": "이 책 좋아.",
"en": "This book is good. / I like this book.",
"parts": [
[
"이",
"this"
],
[
"책",
"book"
],
[
"좋아",
"is good"
]
]
},
{
"lvl": "A",
"ko": "저 사람 커.",
"en": "That person is big.",
"parts": [
[
"저",
"that over there"
],
[
"사람",
"person"
],
[
"커",
"is big"
]
]
},
{
"lvl": "A",
"ko": "여기 위험해.",
"en": "It's dangerous here.",
"parts": [
[
"여기",
"here"
],
[
"위험해",
"is dangerous"
]
]
},
{
"lvl": "A",
"ko": "너 왜 그래?",
"en": "What's wrong with you?",
"parts": [
[
"너",
"you"
],
[
"왜",
"why"
],
[
"그래",
"are like that"
]
]
},
{
"lvl": "A",
"ko": "밥 먹어.",
"en": "Eat. / I'm eating.",
"parts": [
[
"밥",
"rice, a meal"
],
[
"먹어",
"eat"
]
]
},
{
"lvl": "A",
"ko": "물 마셔.",
"en": "Drink some water.",
"parts": [
[
"물",
"water"
],
[
"마셔",
"drink"
]
]
},
{
"lvl": "A",
"ko": "나 갈게.",
"en": "I'm off.",
"parts": [
[
"나",
"I"
],
[
"갈게",
"will go"
]
]
},
{
"lvl": "A",
"ko": "그거 안 돼.",
"en": "That won't work.",
"parts": [
[
"그거",
"that thing"
],
[
"안",
"not"
],
[
"돼",
"becomes, works"
]
]
},
{
"lvl": "A",
"ko": "시험 언제야?",
"en": "When's the exam?",
"parts": [
[
"시험",
"exam"
],
[
"언제야",
"is when"
]
]
},
{
"lvl": "A",
"ko": "소문 들었어?",
"en": "Did you hear the rumour?",
"parts": [
[
"소문",
"rumour"
],
[
"들었어",
"heard"
]
]
},
{
"lvl": "A",
"ko": "쟤 우리 반이야.",
"en": "That kid is in our class.",
"parts": [
[
"쟤",
"that kid"
],
[
"우리",
"our"
],
[
"반이야",
"is class"
]
]
},
{
"lvl": "A",
"ko": "증거 없어.",
"en": "There's no evidence.",
"parts": [
[
"증거",
"evidence"
],
[
"없어",
"does not exist"
]
]
},
{
"lvl": "A",
"ko": "이제 끝났어.",
"en": "It's over now.",
"parts": [
[
"이제",
"now"
],
[
"끝났어",
"has ended"
]
]
},
{
"lvl": "A",
"ko": "검 들어.",
"en": "Pick up the sword.",
"parts": [
[
"검",
"sword"
],
[
"들어",
"lift, pick up"
]
]
},
{
"lvl": "B",
"ko": "나 회귀했어.",
"en": "I've regressed.",
"parts": [
[
"나",
"I"
],
[
"회귀했어",
"did regression"
]
]
},
{
"lvl": "B",
"ko": "이번엔 죽지 않아.",
"en": "This time I won't die.",
"parts": [
[
"이번엔",
"this time"
],
[
"죽지 않아",
"do not die"
]
]
},
{
"lvl": "B",
"ko": "던전이 열렸어.",
"en": "The dungeon has opened.",
"parts": [
[
"던전이",
"the dungeon"
],
[
"열렸어",
"has opened"
]
]
},
{
"lvl": "B",
"ko": "저 몬스터 보스야.",
"en": "That monster is the boss.",
"parts": [
[
"저",
"that over there"
],
[
"몬스터",
"monster"
],
[
"보스야",
"is the boss"
]
]
},
{
"lvl": "B",
"ko": "스킬 각성했어?",
"en": "Did you awaken a skill?",
"parts": [
[
"스킬",
"skill"
],
[
"각성했어",
"did awaken"
]
]
},
{
"lvl": "B",
"ko": "길드에서 연락 왔어.",
"en": "The guild got in touch.",
"parts": [
[
"길드에서",
"from the guild"
],
[
"연락",
"contact"
],
[
"왔어",
"came"
]
]
},
{
"lvl": "B",
"ko": "그 녀석 진짜 강해.",
"en": "That guy is seriously strong.",
"parts": [
[
"그",
"that"
],
[
"녀석",
"guy"
],
[
"진짜",
"really"
],
[
"강해",
"is strong"
]
]
},
{
"lvl": "B",
"ko": "도망쳐! 빨리!",
"en": "Run! Quickly!",
"parts": [
[
"도망쳐",
"run away"
],
[
"빨리",
"quickly"
]
]
},
{
"lvl": "B",
"ko": "내가 지킬게.",
"en": "I'll protect you.",
"parts": [
[
"내가",
"I (as the one doing it)"
],
[
"지킬게",
"will protect"
]
]
},
{
"lvl": "B",
"ko": "널 믿어.",
"en": "I trust you.",
"parts": [
[
"널",
"you (object)"
],
[
"믿어",
"trust"
]
]
},
{
"lvl": "B",
"ko": "잠깐만, 너 지금 뭐 했어?",
"en": "Hold on — what did you just do?",
"parts": [
[
"잠깐만",
"hold on"
],
[
"너",
"you"
],
[
"지금",
"now"
],
[
"뭐",
"what"
],
[
"했어",
"did"
]
]
},
{
"lvl": "B",
"ko": "말도 안 돼. 네가 어떻게 여기 있어?",
"en": "No way. How are you here?",
"parts": [
[
"말도 안 돼",
"that's absurd"
],
[
"네가",
"you"
],
[
"어떻게",
"how"
],
[
"여기",
"here"
],
[
"있어",
"are, exist"
]
]
},
{
"lvl": "B",
"ko": "나 너 좋아해.",
"en": "I like you.",
"parts": [
[
"나",
"I"
],
[
"너",
"you"
],
[
"좋아해",
"like"
]
]
},
{
"lvl": "B",
"ko": "우리 헤어지자.",
"en": "Let's break up.",
"parts": [
[
"우리",
"we"
],
[
"헤어지자",
"let's part"
]
]
},
{
"lvl": "B",
"ko": "오해야. 진짜야.",
"en": "It's a misunderstanding. Really.",
"parts": [
[
"오해야",
"is a misunderstanding"
],
[
"진짜야",
"is true"
]
]
},
{
"lvl": "B",
"ko": "왜 말 안 했어?",
"en": "Why didn't you say anything?",
"parts": [
[
"왜",
"why"
],
[
"말",
"words"
],
[
"안",
"not"
],
[
"했어",
"did"
]
]
},
{
"lvl": "B",
"ko": "심장이 두근두근해.",
"en": "My heart is pounding.",
"parts": [
[
"심장이",
"the heart"
],
[
"두근두근해",
"goes thump-thump"
]
]
},
{
"lvl": "B",
"ko": "그 사람이랑 계약결혼 했어.",
"en": "I did a contract marriage with him.",
"parts": [
[
"그 사람이랑",
"with that person"
],
[
"계약결혼",
"contract marriage"
],
[
"했어",
"did"
]
]
},
{
"lvl": "B",
"ko": "선배가 불렀어.",
"en": "The senior was calling for you.",
"parts": [
[
"선배가",
"the senior"
],
[
"불렀어",
"called"
]
]
},
{
"lvl": "B",
"ko": "범인은 저 사람이야.",
"en": "The culprit is that person.",
"parts": [
[
"범인은",
"as for the culprit"
],
[
"저 사람이야",
"is that person"
]
]
},
{
"lvl": "B",
"ko": "복수할 거야.",
"en": "I'm going to take revenge.",
"parts": [
[
"복수할",
"to take revenge"
],
[
"거야",
"is the plan"
]
]
},
{
"lvl": "B",
"ko": "배신자는 죽어.",
"en": "Traitors die.",
"parts": [
[
"배신자는",
"as for traitors"
],
[
"죽어",
"die"
]
]
},
{
"lvl": "B",
"ko": "형사님, 여기 좀 보세요.",
"en": "Detective, take a look over here.",
"parts": [
[
"형사님",
"detective (respectful)"
],
[
"여기",
"here"
],
[
"좀",
"just, a bit"
],
[
"보세요",
"please look"
]
]
},
{
"lvl": "B",
"ko": "괜찮아? 다쳤어?",
"en": "Are you okay? Are you hurt?",
"parts": [
[
"괜찮아",
"are you fine"
],
[
"다쳤어",
"got hurt"
]
]
}
]
}

85
data/sfx.json Normal file
View File

@@ -0,0 +1,85 @@
{
"note": "의성어 · 의태어 — lettered into the artwork, absent from most textbooks.",
"items": [
{
"ko": "쿵",
"en": "a heavy thud"
},
{
"ko": "쾅",
"en": "a bang, a crash"
},
{
"ko": "헉",
"en": "a gasp"
},
{
"ko": "헐",
"en": "disbelief"
},
{
"ko": "두근두근",
"en": "a pounding heart"
},
{
"ko": "반짝",
"en": "a sparkle"
},
{
"ko": "스윽",
"en": "a smooth, quiet movement"
},
{
"ko": "털썩",
"en": "slumping down"
},
{
"ko": "씨익",
"en": "a slow grin spreading"
},
{
"ko": "꿀꺽",
"en": "a gulp"
},
{
"ko": "덜덜",
"en": "trembling"
},
{
"ko": "빙글",
"en": "turning around"
},
{
"ko": "화악",
"en": "a sudden rush or flush"
},
{
"ko": "철썩",
"en": "a slap"
},
{
"ko": "바스락",
"en": "a rustle"
},
{
"ko": "싸늘",
"en": "a chill in the air"
},
{
"ko": "울컥",
"en": "a surge of emotion"
},
{
"ko": "찌릿",
"en": "a jolt, a tingle"
},
{
"ko": "멍",
"en": "blanked out, dazed"
},
{
"ko": "끄덕",
"en": "a nod"
}
]
}