diff --git a/src/App.jsx b/src/App.jsx index 30d6594..78befe7 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -4,7 +4,9 @@ import { PRONOUNS, POSSESSIVES, POSS_ENDINGS, combinePoss, LEVELS, wechselExample, createSession, bumpStreak, currentStreak, weekDots, nounForm, ADJ_ENDINGS, ADJ_CLASS_LABEL, ADJ_CLASS_HINT, DER_ENDINGS, - CASE_VERBS, VERB_BY_NAME, VERB_CASE_LABEL, DATIVE_VERBS, + CASE_VERBS, VERB_BY_NAME, VERB_CASE_LABEL, DATIVE_VERBS, NOUN_BY_NAME, + VERB_CLUSTERS, verbsInCluster, DATIVE_PREFIXES, splitPrefix, + PREFIX_VERBS, PREFIX_EXEMPLARS, ADJECTIVES, COMPARISON_IRREGULARS, amForm, enDegree, } from './engine.js'; @@ -224,9 +226,17 @@ export default function App() { await Storage.set(s); },[]); + // Verb case government. Off by default: with it off every question in the app + // is decided by a preposition, so a sentence never asks you two unknowns at + // once. On, it is about half and half, and the Verbs tab appears. + const verbsOn = !!st.verbs; + const visibleTabs = verbsOn ? TABS : TABS.filter(t => t.id !== 'verb'); + const hintHidden = k => !!st.hide?.[k]; const toggleHint = k => save({...st, hide:{...(st.hide||{}), [k]: !st.hide?.[k]}}); + useEffect(() => { if (!verbsOn && tab === 'verb') setTab('prep'); }, [verbsOn, tab]); + const hasPaidAccess = !!access?.paid; const hasAccess = !PAYMENTS_ENABLED || hasPaidAccess; const gated = id => PAYMENTS_ENABLED && !hasPaidAccess && !FREE_LEVEL_IDS.has(id); @@ -248,7 +258,7 @@ export default function App() { if (!unlocked(id)) { setPayMsg(''); setScr('paywall'); return; } const lvObj = LEVELS.find(l => l.id === id); if (lvObj?.tab) setTab(lvObj.tab); - sessionRef.current = createSession(id); + sessionRef.current = createSession(id, { verbs: verbsOn }); setLv(id); setRes([]); setInp(''); setRev(false); setPickPrep(null); setQ(sessionRef.current.next()); setScr('practice'); }; @@ -287,9 +297,9 @@ export default function App() { const doNext = useCallback(() => { if (res.length >= ROUND) { setScr('summary'); return; } setInp(''); setRev(false); setOk(false); setPickPrep(null); - if (!sessionRef.current) sessionRef.current = createSession(lv); + if (!sessionRef.current) sessionRef.current = createSession(lv, { verbs: verbsOn }); setQ(sessionRef.current.next()); - }, [res, lv]); + }, [res, lv, verbsOn]); submitRef.current = doSubmit; nextRef.current = doNext; @@ -361,9 +371,9 @@ export default function App() { const dailyUnlockedFor = t => tabLessons(t).every(l => passedLv(l.id)); // The next tab (cycling through the top tabs) with an unlocked Daily Practice. const nextDailyAfter = t => { - const i = TABS.findIndex(x => x.id === t); - for (let k = 1; k < TABS.length; k++) { - const cand = TABS[(i + k) % TABS.length]; + const i = visibleTabs.findIndex(x => x.id === t); + for (let k = 1; k < visibleTabs.length; k++) { + const cand = visibleTabs[(i + k) % visibleTabs.length]; if (dailyUnlockedFor(cand.id)) return { tab: cand, level: dailyFor(cand.id) }; } return null; @@ -409,7 +419,7 @@ export default function App() { {scr === 'menu' && (
- {TABS.map(t => ( + {visibleTabs.map(t => (
)} + {tab === 'verb' && ( +
setRule('verblearn')}> +
+
📚 Lernen
+
Learn the rule first — then 25 of these verbs come free
+
+
+ )} {LEVELS.filter(l => l.tab === tab && !l.daily).sort((a,b)=>a.id-b.id).map(l => { const u = unlocked(l.id); const s = st.sc[l.id]; @@ -475,8 +494,24 @@ export default function App() { + + {/* The one setting that changes what questions you get. Off means + every case in the app is decided by a preposition. */} +
save({...st, verbs: !verbsOn})}> +
+
Verben entscheiden den Fall
+
+ {verbsOn + ? 'On · about half of each lesson is decided by the verb, and the Verbs tab is shown' + : 'Off · every question is decided by a preposition, so you only learn one thing at a time'} +
+
+
+
+
+
)} @@ -1052,6 +1087,7 @@ export default function App() { {chart && setChart(false)} onRule={kind => { setChart(false); setRule(kind || true); }}/>} {rule && (rule === 'adj' ? setRule(false)}/> + : rule === 'verblearn' ? setRule(false)}/> : rule === 'verb' ? setRule(false)}/> : rule === 'comp' ? setRule(false)}/> : setRule(false)}/>)} @@ -1728,13 +1764,146 @@ function CompRuleModal({ onClose }) { ); } -// Which case a verb governs: the default, the list, the traps, the flippers. +// A verb with its prefix picked out in the dative colour. The whole claim of +// the first lesson is that you can SEE the preposition, so the UI shows it +// rather than telling you about it: zuhören, beitreten, widersprechen. +function PrefixVerb({ name, size }) { + const [pfx, rest] = splitPrefix(name); + const v = typeof name === 'string' ? VERB_BY_NAME[name] : name; + if (!pfx) return {v?.de || name}; + // The colour means "this prefix is a preposition governing THIS case", so + // wider- has to be shown in the accusative colour: it really is a + // preposition, it just governs the other case, which is the whole reason + // widersprechen is an exception rather than an instance of the rule. + const col = v.ruleExempt ? CASE_C.accusative : CASE_C.dative; + return ( + + {pfx}{rest} + + ); +} + +const VerbGloss = ({ name, sep }) => { + const v = VERB_BY_NAME[name]; + return ( + + {v.en} + {v.ruleExempt && ✱} + {sep} + + ); +}; + +// Lernen: the rule, then the six verbs that demonstrate it, then the honest +// exception. Opened from the Lernen row at the top of the Verbs tab. +function VerbLearnModal({ onClose }) { + const prefixes = [...new Set(PREFIX_VERBS.map(n => VERB_BY_NAME[n].pfx))]; + return ( +
+
e.stopPropagation()}> +
+
Lernen · the rule worth 25 verbs
+ +
+ +
+ Akkusativ is the default. Hundreds of verbs take it, so there is no + accusative list — you only ever learn the dative exceptions. There are 45 of them in + this app, and 25 come free, because they announce themselves. +
+ +
Look at the front of the verb
+
+ A verb that begins with one of the dative prepositions takes the + dative. The preposition is still doing its job; it has just been glued to the front of + the verb. You already know these prepositions from the song. +
+
+ {prefixes.filter(p => DATIVE_PREFIXES.includes(p)).map((p, i, arr) => ( + + {p}-{i < arr.length - 1 ? ' · ' : ''} + + ))} +
+ +
Six verbs, six prefixes
+
+ Read the coloured letters, not the verb. Each of these is a dative preposition wearing + a verb: the object after it has to be dative, and you never had to memorise one of them. +
+
+ {PREFIX_EXEMPLARS.map(n => { + const v = VERB_BY_NAME[n]; + const obj = v.objNouns?.[0] || 'Mann'; + const art = DEF[NOUN_BY_NAME[obj].g].dative; + return ( +
+
+ {v.en} +
+
+ Ich {v.ich} {art} {obj} + {v.sep ? ` ${v.sep}` : ''}. +
+
+ ); + })} +
+ +
Separable or not
+
+ Most of them split: the prefix leaves the verb and closes the sentence — Ich + höre dem Mann zu. A few never split and keep the prefix on the + front — Ich widerspreche dem Mann. Either way the case is the + same, so this changes the word order and not the answer. +
+ +
✱ Where the rule does not hold
+
+ Honesty, so you do not over-apply it: wider is not a dative + preposition — on its own it takes the accusative (wider Erwarten). So + and {' '} + being dative is not something the rule predicts. Two verbs, learnt as a pair, and + they are marked ✱ wherever they appear. +
+ +
The 20 that are not free
+
+ Everything the rule does not reach is in four short lessons. No rule generates them, + so they are lists — but each list has a thread that makes it hold together: +
+
+ {VERB_CLUSTERS.filter(c => c.key !== 'prefix').map(c => ( +
+
{c.name}
+
{c.sub}
+
{c.rule}
+
+ ))} +
+ + +
+
+ ); +} + +// The five clusters, which are also the five lessons. Organised the way the +// tab teaches them: the generative rule first, then the lists, then the pairs. function VerbRuleModal({ onClose }) { - const dat = CASE_VERBS.filter(v => v.cas === 'dative' && !v.inverted); - const inv = CASE_VERBS.filter(v => v.inverted); - const two = CASE_VERBS.filter(v => v.cas === 'both'); - const traps = CASE_VERBS.filter(v => v.cas === 'accusative' && v.trap) + const byCluster = k => CASE_VERBS.filter(v => v.cluster === k); + const traps = byCluster('liars') .map(v => [v, VERB_BY_NAME[v.trap]]).filter(([, t]) => t && t.cas !== 'accusative'); + const two = CASE_VERBS.filter(v => v.cas === 'both'); + const list = (verbs) => ( +
+ {verbs.map((v, i) => ( + + ))} +
+ ); return (
e.stopPropagation()}> @@ -1745,25 +1914,48 @@ function VerbRuleModal({ onClose }) {
There is no list of accusative verbs to learn. Akkusativ is the default — - hundreds of verbs take it, so you only have to learn the exceptions. The dative - list below is short, and almost everything else is accusative. + hundreds of verbs take it, so you only learn the dative exceptions. There are 45, and + the first 25 of them follow a rule.
-
The dative verbs
+
1 · Prepositions in Disguise the free ones
- These take a dative object where English gives you no warning at all. + A verb that begins with a dative preposition takes the dative. Read the coloured + letters: the preposition is still doing its job, glued to the front of the verb.
-
- {dat.map((v, i) => ( - - {v.de} {v.en}{i < dat.length - 1 ? ' · ' : ''} - - ))} + {list(byCluster('prefix'))} +
+ ✱ wider is not a dative preposition — it takes the accusative on its + own, so these two are exceptions rather than instances of the rule.
-
The traps
+
2 · Aimed at Someone the list you learn
- Near-synonyms that disagree. Same idea, different case — these are where marks go. + Something travels to the person and nothing happens to the person: you give them help, + thanks, an answer, advice, your trust. Compare the accusative ich schlage ihn, + where he is changed by it. +
+ {list(byCluster('aimed'))} + +
3 · Facing Someone the list you learn
+
+ These place you in relation to the person rather than sending anything to them: like + them, up against them, behind them, under them, for them. +
+ {list(byCluster('facing'))} + +
4 · Upside Down Verbs the subject swaps
+
+ The thing is the subject and you are the dative, which is why they feel + backwards: Das Buch gefällt mir is "I like the book", not + "the book likes me". +
+ {list(byCluster('flip'))} + +
5 · The Five Liars where English misleads
+
+ Near-synonyms that disagree. Both halves feel like doing something to a person, so + learn them as pairs — this is where marks go.
@@ -1774,22 +1966,12 @@ function VerbRuleModal({ onClose }) { {traps.map(([a, d]) => ( - + ))}
{a.de} {a.en}{d.de} {d.en} {d.en}
-
The ones that flip
-
- With these the German subject is the English object, which is why they feel - backwards: Das Buch gefällt mir is "I like the book", - not "the book likes me". -
-
- {inv.map(v => {v.de} {v.en} · )} -
-
Two objects at once
One rule covers all of them: the person is Dativ, the thing is Akkusativ. @@ -2208,11 +2390,50 @@ function ChartModal({ section, q, onClose, onRule }) {
Verb Case Government
- Akkusativ is the default — there is no list for it. Learn the dative verbs. + Akkusativ is the default — there is no list for it. These are the {DATIVE_VERBS.length} dative + verbs, grouped the way the lessons teach them. In the first group the coloured + letters are the reason: the prefix is a dative preposition. +
+ {VERB_CLUSTERS.filter(c => c.key !== 'liars').map(c => ( +
+
+ {c.name} · {c.sub} +
+
+ {verbsInCluster(c.key).map((n, i, arr) => ( + + ))} +
+
+ ))} +
+
+ The Five Liars · where English misleads +
+
+ {verbsInCluster('liars').map(n => { + const a = VERB_BY_NAME[n], d = VERB_BY_NAME[a.trap]; + return ( +
+ {a.de} + {a.en} → + + {d.en} +
+ ); + })} +
-
Dativ: {DATIVE_VERBS.join(', ')}
-
Dativ + Akkusativ: {CASE_VERBS.filter(v=>v.cas==='both').map(v=>v.de).join(', ')}
+
+ Dativ + Akkusativ · person Dativ, thing Akkusativ +
+ {CASE_VERBS.filter(v=>v.cas==='both').map(v=>v.de).join(' · ')} +
+
+ ✱ wider is a preposition too, but it governs the{' '} + Akkusativ — so these two are + exceptions, not instances of the rule.
{onRule && }
@@ -2373,6 +2594,14 @@ const S = { lvName: { fontSize:14, fontWeight:700, color:'#1a1a1a' }, lvDesc: { fontSize:12, color:'#999', marginTop:1 }, lvPct: { fontSize:14, fontWeight:700 }, + setRow: { display:'flex', alignItems:'center', gap:14, marginTop:10, padding:'12px 14px', + border:'1px solid #eee', borderRadius:10, background:'#fafafa', cursor:'pointer' }, + sw: { flex:'none', width:40, height:22, borderRadius:11, background:'#d8d8d8', + position:'relative', transition:'background 0.15s' }, + swOn: { background:GREEN }, + swKnob: { position:'absolute', top:3, left:3, width:16, height:16, borderRadius:8, + background:'#fff', transition:'left 0.15s' }, + swKnobOn: { left:21 }, chartLinkBtn: { width:'100%', padding:12, marginTop:20, background:'#fff', border:'1px solid #eee', borderRadius:10, color:'#888', fontSize:13, cursor:'pointer', fontFamily:'inherit' }, sentence: { fontSize:26, fontWeight:600, color:'#1a1a1a', lineHeight:1.5, margin:'0 0 10px', letterSpacing:'-0.3px' }, diff --git a/src/corpus.txt b/src/corpus.txt index 0d5cd11..bc07d07 100644 --- a/src/corpus.txt +++ b/src/corpus.txt @@ -4516,6 +4516,21 @@ POSSTPL|-|dative|helfen|Mutter Ich helfe meiner Mutter. POSSTPL|-|dative|helfen|Schwester Ich helfe meiner Schwester. I help my sister. POSSTPL|-|dative|helfen|Tochter Ich helfe meiner Tochter. I help my daughter. POSSTPL|-|dative|helfen|Vater Ich helfe meinem Vater. I help my father. +VERB|ähneln|Arzt Ich ähnle dem Arzt. I resemble the doctor. +VERB|ähneln|Ärztin Ich ähnle der Ärztin. I resemble the doctor. +VERB|ähneln|Bruder Ich ähnle dem Bruder. I resemble the brother. +VERB|ähneln|Frau Ich ähnle der Frau. I resemble the woman. +VERB|ähneln|Freund Ich ähnle dem Freund. I resemble the friend. +VERB|ähneln|Freundin Ich ähnle der Freundin. I resemble the friend. +VERB|ähneln|Kind Ich ähnle dem Kind. I resemble the child. +VERB|ähneln|Lehrer Ich ähnle dem Lehrer. I resemble the teacher. +VERB|ähneln|Lehrerin Ich ähnle der Lehrerin. I resemble the teacher. +VERB|ähneln|Mädchen Ich ähnle dem Mädchen. I resemble the girl. +VERB|ähneln|Mann Ich ähnle dem Mann. I resemble the man. +VERB|ähneln|Mutter Ich ähnle der Mutter. I resemble the mother. +VERB|ähneln|Schwester Ich ähnle der Schwester. I resemble the sister. +VERB|ähneln|Tochter Ich ähnle der Tochter. I resemble the daughter. +VERB|ähneln|Vater Ich ähnle dem Vater. I resemble the father. VERB|anrufen|Arzt Ich rufe den Arzt an. I call the doctor. VERB|anrufen|Ärztin Ich rufe die Ärztin an. I call the doctor. VERB|anrufen|Bruder Ich rufe den Bruder an. I call the brother. @@ -4546,6 +4561,23 @@ VERB|antworten|Mutter Ich antworte der Mutter. VERB|antworten|Schwester Ich antworte der Schwester. I answer the sister. VERB|antworten|Tochter Ich antworte der Tochter. I answer the daughter. VERB|antworten|Vater Ich antworte dem Vater. I answer the father. +VERB|ausweichen|Arzt Ich weiche dem Arzt aus. I dodge the doctor. +VERB|ausweichen|Ärztin Ich weiche der Ärztin aus. I dodge the doctor. +VERB|ausweichen|Bruder Ich weiche dem Bruder aus. I dodge the brother. +VERB|ausweichen|Frau Ich weiche der Frau aus. I dodge the woman. +VERB|ausweichen|Freund Ich weiche dem Freund aus. I dodge the friend. +VERB|ausweichen|Freundin Ich weiche der Freundin aus. I dodge the friend. +VERB|ausweichen|Hund Ich weiche dem Hund aus. I dodge the dog. +VERB|ausweichen|Katze Ich weiche der Katze aus. I dodge the cat. +VERB|ausweichen|Kind Ich weiche dem Kind aus. I dodge the child. +VERB|ausweichen|Lehrer Ich weiche dem Lehrer aus. I dodge the teacher. +VERB|ausweichen|Lehrerin Ich weiche der Lehrerin aus. I dodge the teacher. +VERB|ausweichen|Mädchen Ich weiche dem Mädchen aus. I dodge the girl. +VERB|ausweichen|Mann Ich weiche dem Mann aus. I dodge the man. +VERB|ausweichen|Mutter Ich weiche der Mutter aus. I dodge the mother. +VERB|ausweichen|Schwester Ich weiche der Schwester aus. I dodge the sister. +VERB|ausweichen|Tochter Ich weiche der Tochter aus. I dodge the daughter. +VERB|ausweichen|Vater Ich weiche dem Vater aus. I dodge the father. VERB|begegnen|Arzt Ich begegne dem Arzt. I meet the doctor. VERB|begegnen|Ärztin Ich begegne der Ärztin. I meet the doctor. VERB|begegnen|Bruder Ich begegne dem Bruder. I meet the brother. @@ -4561,6 +4593,38 @@ VERB|begegnen|Mutter Ich begegne der Mutter. VERB|begegnen|Schwester Ich begegne der Schwester. I meet the sister. VERB|begegnen|Tochter Ich begegne der Tochter. I meet the daughter. VERB|begegnen|Vater Ich begegne dem Vater. I meet the father. +VERB|beipflichten|Arzt Ich pflichte dem Arzt bei. I side with the doctor. +VERB|beipflichten|Ärztin Ich pflichte der Ärztin bei. I side with the doctor. +VERB|beipflichten|Bruder Ich pflichte dem Bruder bei. I side with the brother. +VERB|beipflichten|Frau Ich pflichte der Frau bei. I side with the woman. +VERB|beipflichten|Freund Ich pflichte dem Freund bei. I side with the friend. +VERB|beipflichten|Freundin Ich pflichte der Freundin bei. I side with the friend. +VERB|beipflichten|Kind Ich pflichte dem Kind bei. I side with the child. +VERB|beipflichten|Lehrer Ich pflichte dem Lehrer bei. I side with the teacher. +VERB|beipflichten|Lehrerin Ich pflichte der Lehrerin bei. I side with the teacher. +VERB|beipflichten|Mädchen Ich pflichte dem Mädchen bei. I side with the girl. +VERB|beipflichten|Mann Ich pflichte dem Mann bei. I side with the man. +VERB|beipflichten|Mutter Ich pflichte der Mutter bei. I side with the mother. +VERB|beipflichten|Schwester Ich pflichte der Schwester bei. I side with the sister. +VERB|beipflichten|Tochter Ich pflichte der Tochter bei. I side with the daughter. +VERB|beipflichten|Vater Ich pflichte dem Vater bei. I side with the father. +VERB|beistehen|Arzt Ich stehe dem Arzt bei. I stand by the doctor. +VERB|beistehen|Ärztin Ich stehe der Ärztin bei. I stand by the doctor. +VERB|beistehen|Bruder Ich stehe dem Bruder bei. I stand by the brother. +VERB|beistehen|Frau Ich stehe der Frau bei. I stand by the woman. +VERB|beistehen|Freund Ich stehe dem Freund bei. I stand by the friend. +VERB|beistehen|Freundin Ich stehe der Freundin bei. I stand by the friend. +VERB|beistehen|Kind Ich stehe dem Kind bei. I stand by the child. +VERB|beistehen|Lehrer Ich stehe dem Lehrer bei. I stand by the teacher. +VERB|beistehen|Lehrerin Ich stehe der Lehrerin bei. I stand by the teacher. +VERB|beistehen|Mädchen Ich stehe dem Mädchen bei. I stand by the girl. +VERB|beistehen|Mann Ich stehe dem Mann bei. I stand by the man. +VERB|beistehen|Mutter Ich stehe der Mutter bei. I stand by the mother. +VERB|beistehen|Schwester Ich stehe der Schwester bei. I stand by the sister. +VERB|beistehen|Tochter Ich stehe der Tochter bei. I stand by the daughter. +VERB|beistehen|Vater Ich stehe dem Vater bei. I stand by the father. +VERB|beitreten|Partei Ich trete der Partei bei. I join the party. +VERB|beitreten|Verein Ich trete dem Verein bei. I join the club. VERB|besuchen|Arzt Ich besuche den Arzt. I visit the doctor. VERB|besuchen|Ärztin Ich besuche die Ärztin. I visit the doctor. VERB|besuchen|Bahnhof Ich besuche den Bahnhof. I visit the station. @@ -4697,6 +4761,12 @@ VERB|danken|Mutter Ich danke der Mutter. VERB|danken|Schwester Ich danke der Schwester. I thank the sister. VERB|danken|Tochter Ich danke der Tochter. I thank the daughter. VERB|danken|Vater Ich danke dem Vater. I thank the father. +VERB|dienen|Arzt Ich diene dem Arzt. I serve the doctor. +VERB|dienen|Ärztin Ich diene der Ärztin. I serve the doctor. +VERB|dienen|Frau Ich diene der Frau. I serve the woman. +VERB|dienen|Lehrer Ich diene dem Lehrer. I serve the teacher. +VERB|dienen|Lehrerin Ich diene der Lehrerin. I serve the teacher. +VERB|dienen|Mann Ich diene dem Mann. I serve the man. VERB|empfehlen|Arzt|Buch Ich empfehle dem Arzt das Buch. I recommend the book to the doctor. VERB|empfehlen|Arzt|Hotel Ich empfehle dem Arzt das Hotel. I recommend the hotel to the doctor. VERB|empfehlen|Arzt|Museum Ich empfehle dem Arzt das Museum. I recommend the museum to the doctor. @@ -4772,6 +4842,36 @@ VERB|empfehlen|Vater|Hotel Ich empfehle dem Vater das Hotel. VERB|empfehlen|Vater|Museum Ich empfehle dem Vater das Museum. I recommend the museum to the father. VERB|empfehlen|Vater|Restaurant Ich empfehle dem Vater das Restaurant. I recommend the restaurant to the father. VERB|empfehlen|Vater|Wein Ich empfehle dem Vater den Wein. I recommend the wine to the father. +VERB|entgegenkommen|Arzt Ich komme dem Arzt entgegen. I come towards the doctor. +VERB|entgegenkommen|Ärztin Ich komme der Ärztin entgegen. I come towards the doctor. +VERB|entgegenkommen|Bruder Ich komme dem Bruder entgegen. I come towards the brother. +VERB|entgegenkommen|Frau Ich komme der Frau entgegen. I come towards the woman. +VERB|entgegenkommen|Freund Ich komme dem Freund entgegen. I come towards the friend. +VERB|entgegenkommen|Freundin Ich komme der Freundin entgegen. I come towards the friend. +VERB|entgegenkommen|Kind Ich komme dem Kind entgegen. I come towards the child. +VERB|entgegenkommen|Lehrer Ich komme dem Lehrer entgegen. I come towards the teacher. +VERB|entgegenkommen|Lehrerin Ich komme der Lehrerin entgegen. I come towards the teacher. +VERB|entgegenkommen|Mädchen Ich komme dem Mädchen entgegen. I come towards the girl. +VERB|entgegenkommen|Mann Ich komme dem Mann entgegen. I come towards the man. +VERB|entgegenkommen|Mutter Ich komme der Mutter entgegen. I come towards the mother. +VERB|entgegenkommen|Schwester Ich komme der Schwester entgegen. I come towards the sister. +VERB|entgegenkommen|Tochter Ich komme der Tochter entgegen. I come towards the daughter. +VERB|entgegenkommen|Vater Ich komme dem Vater entgegen. I come towards the father. +VERB|entgegentreten|Arzt Ich trete dem Arzt entgegen. I confront the doctor. +VERB|entgegentreten|Ärztin Ich trete der Ärztin entgegen. I confront the doctor. +VERB|entgegentreten|Bruder Ich trete dem Bruder entgegen. I confront the brother. +VERB|entgegentreten|Frau Ich trete der Frau entgegen. I confront the woman. +VERB|entgegentreten|Freund Ich trete dem Freund entgegen. I confront the friend. +VERB|entgegentreten|Freundin Ich trete der Freundin entgegen. I confront the friend. +VERB|entgegentreten|Kind Ich trete dem Kind entgegen. I confront the child. +VERB|entgegentreten|Lehrer Ich trete dem Lehrer entgegen. I confront the teacher. +VERB|entgegentreten|Lehrerin Ich trete der Lehrerin entgegen. I confront the teacher. +VERB|entgegentreten|Mädchen Ich trete dem Mädchen entgegen. I confront the girl. +VERB|entgegentreten|Mann Ich trete dem Mann entgegen. I confront the man. +VERB|entgegentreten|Mutter Ich trete der Mutter entgegen. I confront the mother. +VERB|entgegentreten|Schwester Ich trete der Schwester entgegen. I confront the sister. +VERB|entgegentreten|Tochter Ich trete der Tochter entgegen. I confront the daughter. +VERB|entgegentreten|Vater Ich trete dem Vater entgegen. I confront the father. VERB|erklären|Arzt|Arbeit Ich erkläre dem Arzt die Arbeit. I explain the work to the doctor. VERB|erklären|Arzt|Bild Ich erkläre dem Arzt das Bild. I explain the picture to the doctor. VERB|erklären|Arzt|Buch Ich erkläre dem Arzt das Buch. I explain the book to the doctor. @@ -5419,6 +5519,27 @@ VERB|gefallen|Zug|Mutter Der Zug gefällt der Mutter. VERB|gefallen|Zug|Schwester Der Zug gefällt der Schwester. The sister likes the train. VERB|gefallen|Zug|Tochter Der Zug gefällt der Tochter. The daughter likes the train. VERB|gefallen|Zug|Vater Der Zug gefällt dem Vater. The father likes the train. +VERB|gegenüberstehen|Arzt Ich stehe dem Arzt gegenüber. I face the doctor. +VERB|gegenüberstehen|Ärztin Ich stehe der Ärztin gegenüber. I face the doctor. +VERB|gegenüberstehen|Bruder Ich stehe dem Bruder gegenüber. I face the brother. +VERB|gegenüberstehen|Frau Ich stehe der Frau gegenüber. I face the woman. +VERB|gegenüberstehen|Freund Ich stehe dem Freund gegenüber. I face the friend. +VERB|gegenüberstehen|Freundin Ich stehe der Freundin gegenüber. I face the friend. +VERB|gegenüberstehen|Kind Ich stehe dem Kind gegenüber. I face the child. +VERB|gegenüberstehen|Lehrer Ich stehe dem Lehrer gegenüber. I face the teacher. +VERB|gegenüberstehen|Lehrerin Ich stehe der Lehrerin gegenüber. I face the teacher. +VERB|gegenüberstehen|Mädchen Ich stehe dem Mädchen gegenüber. I face the girl. +VERB|gegenüberstehen|Mann Ich stehe dem Mann gegenüber. I face the man. +VERB|gegenüberstehen|Mutter Ich stehe der Mutter gegenüber. I face the mother. +VERB|gegenüberstehen|Schwester Ich stehe der Schwester gegenüber. I face the sister. +VERB|gegenüberstehen|Tochter Ich stehe der Tochter gegenüber. I face the daughter. +VERB|gegenüberstehen|Vater Ich stehe dem Vater gegenüber. I face the father. +VERB|gehorchen|Arzt Ich gehorche dem Arzt. I obey the doctor. +VERB|gehorchen|Ärztin Ich gehorche der Ärztin. I obey the doctor. +VERB|gehorchen|Lehrer Ich gehorche dem Lehrer. I obey the teacher. +VERB|gehorchen|Lehrerin Ich gehorche der Lehrerin. I obey the teacher. +VERB|gehorchen|Mutter Ich gehorche der Mutter. I obey the mother. +VERB|gehorchen|Vater Ich gehorche dem Vater. I obey the father. VERB|gehören|Auto|Arzt Das Auto gehört dem Arzt. The car belongs to the doctor. VERB|gehören|Auto|Ärztin Das Auto gehört der Ärztin. The car belongs to the doctor. VERB|gehören|Auto|Bruder Das Auto gehört dem Bruder. The car belongs to the brother. @@ -5614,6 +5735,51 @@ VERB|gehören|Zug|Mutter Der Zug gehört der Mutter. VERB|gehören|Zug|Schwester Der Zug gehört der Schwester. The train belongs to the sister. VERB|gehören|Zug|Tochter Der Zug gehört der Tochter. The train belongs to the daughter. VERB|gehören|Zug|Vater Der Zug gehört dem Vater. The train belongs to the father. +VERB|gelingen|Arbeit|Arzt Die Arbeit gelingt dem Arzt. The doctor succeeds with the work. +VERB|gelingen|Arbeit|Ärztin Die Arbeit gelingt der Ärztin. The doctor succeeds with the work. +VERB|gelingen|Arbeit|Bruder Die Arbeit gelingt dem Bruder. The brother succeeds with the work. +VERB|gelingen|Arbeit|Frau Die Arbeit gelingt der Frau. The woman succeeds with the work. +VERB|gelingen|Arbeit|Freund Die Arbeit gelingt dem Freund. The friend succeeds with the work. +VERB|gelingen|Arbeit|Freundin Die Arbeit gelingt der Freundin. The friend succeeds with the work. +VERB|gelingen|Arbeit|Kind Die Arbeit gelingt dem Kind. The child succeeds with the work. +VERB|gelingen|Arbeit|Lehrer Die Arbeit gelingt dem Lehrer. The teacher succeeds with the work. +VERB|gelingen|Arbeit|Lehrerin Die Arbeit gelingt der Lehrerin. The teacher succeeds with the work. +VERB|gelingen|Arbeit|Mädchen Die Arbeit gelingt dem Mädchen. The girl succeeds with the work. +VERB|gelingen|Arbeit|Mann Die Arbeit gelingt dem Mann. The man succeeds with the work. +VERB|gelingen|Arbeit|Mutter Die Arbeit gelingt der Mutter. The mother succeeds with the work. +VERB|gelingen|Arbeit|Schwester Die Arbeit gelingt der Schwester. The sister succeeds with the work. +VERB|gelingen|Arbeit|Tochter Die Arbeit gelingt der Tochter. The daughter succeeds with the work. +VERB|gelingen|Arbeit|Vater Die Arbeit gelingt dem Vater. The father succeeds with the work. +VERB|gelingen|Bild|Arzt Das Bild gelingt dem Arzt. The doctor succeeds with the picture. +VERB|gelingen|Bild|Ärztin Das Bild gelingt der Ärztin. The doctor succeeds with the picture. +VERB|gelingen|Bild|Bruder Das Bild gelingt dem Bruder. The brother succeeds with the picture. +VERB|gelingen|Bild|Frau Das Bild gelingt der Frau. The woman succeeds with the picture. +VERB|gelingen|Bild|Freund Das Bild gelingt dem Freund. The friend succeeds with the picture. +VERB|gelingen|Bild|Freundin Das Bild gelingt der Freundin. The friend succeeds with the picture. +VERB|gelingen|Bild|Kind Das Bild gelingt dem Kind. The child succeeds with the picture. +VERB|gelingen|Bild|Lehrer Das Bild gelingt dem Lehrer. The teacher succeeds with the picture. +VERB|gelingen|Bild|Lehrerin Das Bild gelingt der Lehrerin. The teacher succeeds with the picture. +VERB|gelingen|Bild|Mädchen Das Bild gelingt dem Mädchen. The girl succeeds with the picture. +VERB|gelingen|Bild|Mann Das Bild gelingt dem Mann. The man succeeds with the picture. +VERB|gelingen|Bild|Mutter Das Bild gelingt der Mutter. The mother succeeds with the picture. +VERB|gelingen|Bild|Schwester Das Bild gelingt der Schwester. The sister succeeds with the picture. +VERB|gelingen|Bild|Tochter Das Bild gelingt der Tochter. The daughter succeeds with the picture. +VERB|gelingen|Bild|Vater Das Bild gelingt dem Vater. The father succeeds with the picture. +VERB|gelingen|Brot|Arzt Das Brot gelingt dem Arzt. The doctor succeeds with the bread. +VERB|gelingen|Brot|Ärztin Das Brot gelingt der Ärztin. The doctor succeeds with the bread. +VERB|gelingen|Brot|Bruder Das Brot gelingt dem Bruder. The brother succeeds with the bread. +VERB|gelingen|Brot|Frau Das Brot gelingt der Frau. The woman succeeds with the bread. +VERB|gelingen|Brot|Freund Das Brot gelingt dem Freund. The friend succeeds with the bread. +VERB|gelingen|Brot|Freundin Das Brot gelingt der Freundin. The friend succeeds with the bread. +VERB|gelingen|Brot|Kind Das Brot gelingt dem Kind. The child succeeds with the bread. +VERB|gelingen|Brot|Lehrer Das Brot gelingt dem Lehrer. The teacher succeeds with the bread. +VERB|gelingen|Brot|Lehrerin Das Brot gelingt der Lehrerin. The teacher succeeds with the bread. +VERB|gelingen|Brot|Mädchen Das Brot gelingt dem Mädchen. The girl succeeds with the bread. +VERB|gelingen|Brot|Mann Das Brot gelingt dem Mann. The man succeeds with the bread. +VERB|gelingen|Brot|Mutter Das Brot gelingt der Mutter. The mother succeeds with the bread. +VERB|gelingen|Brot|Schwester Das Brot gelingt der Schwester. The sister succeeds with the bread. +VERB|gelingen|Brot|Tochter Das Brot gelingt der Tochter. The daughter succeeds with the bread. +VERB|gelingen|Brot|Vater Das Brot gelingt dem Vater. The father succeeds with the bread. VERB|glauben|Arzt Ich glaube dem Arzt. I believe the doctor. VERB|glauben|Ärztin Ich glaube der Ärztin. I believe the doctor. VERB|glauben|Bruder Ich glaube dem Bruder. I believe the brother. @@ -5698,6 +5864,62 @@ VERB|kennen|Schwester Ich kenne die Schwester. VERB|kennen|Stadt Ich kenne die Stadt. I know the city. VERB|kennen|Tochter Ich kenne die Tochter. I know the daughter. VERB|kennen|Vater Ich kenne den Vater. I know the father. +VERB|leidtun|Bruder|Arzt Der Bruder tut dem Arzt leid. The doctor feels sorry for the brother. +VERB|leidtun|Bruder|Ärztin Der Bruder tut der Ärztin leid. The doctor feels sorry for the brother. +VERB|leidtun|Bruder|Frau Der Bruder tut der Frau leid. The woman feels sorry for the brother. +VERB|leidtun|Bruder|Freund Der Bruder tut dem Freund leid. The friend feels sorry for the brother. +VERB|leidtun|Bruder|Freundin Der Bruder tut der Freundin leid. The friend feels sorry for the brother. +VERB|leidtun|Bruder|Kind Der Bruder tut dem Kind leid. The child feels sorry for the brother. +VERB|leidtun|Bruder|Lehrer Der Bruder tut dem Lehrer leid. The teacher feels sorry for the brother. +VERB|leidtun|Bruder|Lehrerin Der Bruder tut der Lehrerin leid. The teacher feels sorry for the brother. +VERB|leidtun|Bruder|Mädchen Der Bruder tut dem Mädchen leid. The girl feels sorry for the brother. +VERB|leidtun|Bruder|Mann Der Bruder tut dem Mann leid. The man feels sorry for the brother. +VERB|leidtun|Bruder|Mutter Der Bruder tut der Mutter leid. The mother feels sorry for the brother. +VERB|leidtun|Bruder|Schwester Der Bruder tut der Schwester leid. The sister feels sorry for the brother. +VERB|leidtun|Bruder|Tochter Der Bruder tut der Tochter leid. The daughter feels sorry for the brother. +VERB|leidtun|Bruder|Vater Der Bruder tut dem Vater leid. The father feels sorry for the brother. +VERB|leidtun|Kind|Arzt Das Kind tut dem Arzt leid. The doctor feels sorry for the child. +VERB|leidtun|Kind|Ärztin Das Kind tut der Ärztin leid. The doctor feels sorry for the child. +VERB|leidtun|Kind|Bruder Das Kind tut dem Bruder leid. The brother feels sorry for the child. +VERB|leidtun|Kind|Frau Das Kind tut der Frau leid. The woman feels sorry for the child. +VERB|leidtun|Kind|Freund Das Kind tut dem Freund leid. The friend feels sorry for the child. +VERB|leidtun|Kind|Freundin Das Kind tut der Freundin leid. The friend feels sorry for the child. +VERB|leidtun|Kind|Lehrer Das Kind tut dem Lehrer leid. The teacher feels sorry for the child. +VERB|leidtun|Kind|Lehrerin Das Kind tut der Lehrerin leid. The teacher feels sorry for the child. +VERB|leidtun|Kind|Mädchen Das Kind tut dem Mädchen leid. The girl feels sorry for the child. +VERB|leidtun|Kind|Mann Das Kind tut dem Mann leid. The man feels sorry for the child. +VERB|leidtun|Kind|Mutter Das Kind tut der Mutter leid. The mother feels sorry for the child. +VERB|leidtun|Kind|Schwester Das Kind tut der Schwester leid. The sister feels sorry for the child. +VERB|leidtun|Kind|Tochter Das Kind tut der Tochter leid. The daughter feels sorry for the child. +VERB|leidtun|Kind|Vater Das Kind tut dem Vater leid. The father feels sorry for the child. +VERB|leidtun|Mann|Arzt Der Mann tut dem Arzt leid. The doctor feels sorry for the man. +VERB|leidtun|Mann|Ärztin Der Mann tut der Ärztin leid. The doctor feels sorry for the man. +VERB|leidtun|Mann|Bruder Der Mann tut dem Bruder leid. The brother feels sorry for the man. +VERB|leidtun|Mann|Frau Der Mann tut der Frau leid. The woman feels sorry for the man. +VERB|leidtun|Mann|Freund Der Mann tut dem Freund leid. The friend feels sorry for the man. +VERB|leidtun|Mann|Freundin Der Mann tut der Freundin leid. The friend feels sorry for the man. +VERB|leidtun|Mann|Kind Der Mann tut dem Kind leid. The child feels sorry for the man. +VERB|leidtun|Mann|Lehrer Der Mann tut dem Lehrer leid. The teacher feels sorry for the man. +VERB|leidtun|Mann|Lehrerin Der Mann tut der Lehrerin leid. The teacher feels sorry for the man. +VERB|leidtun|Mann|Mädchen Der Mann tut dem Mädchen leid. The girl feels sorry for the man. +VERB|leidtun|Mann|Mutter Der Mann tut der Mutter leid. The mother feels sorry for the man. +VERB|leidtun|Mann|Schwester Der Mann tut der Schwester leid. The sister feels sorry for the man. +VERB|leidtun|Mann|Tochter Der Mann tut der Tochter leid. The daughter feels sorry for the man. +VERB|leidtun|Mann|Vater Der Mann tut dem Vater leid. The father feels sorry for the man. +VERB|leidtun|Vater|Arzt Der Vater tut dem Arzt leid. The doctor feels sorry for the father. +VERB|leidtun|Vater|Ärztin Der Vater tut der Ärztin leid. The doctor feels sorry for the father. +VERB|leidtun|Vater|Bruder Der Vater tut dem Bruder leid. The brother feels sorry for the father. +VERB|leidtun|Vater|Frau Der Vater tut der Frau leid. The woman feels sorry for the father. +VERB|leidtun|Vater|Freund Der Vater tut dem Freund leid. The friend feels sorry for the father. +VERB|leidtun|Vater|Freundin Der Vater tut der Freundin leid. The friend feels sorry for the father. +VERB|leidtun|Vater|Kind Der Vater tut dem Kind leid. The child feels sorry for the father. +VERB|leidtun|Vater|Lehrer Der Vater tut dem Lehrer leid. The teacher feels sorry for the father. +VERB|leidtun|Vater|Lehrerin Der Vater tut der Lehrerin leid. The teacher feels sorry for the father. +VERB|leidtun|Vater|Mädchen Der Vater tut dem Mädchen leid. The girl feels sorry for the father. +VERB|leidtun|Vater|Mann Der Vater tut dem Mann leid. The man feels sorry for the father. +VERB|leidtun|Vater|Mutter Der Vater tut der Mutter leid. The mother feels sorry for the father. +VERB|leidtun|Vater|Schwester Der Vater tut der Schwester leid. The sister feels sorry for the father. +VERB|leidtun|Vater|Tochter Der Vater tut der Tochter leid. The daughter feels sorry for the father. VERB|leihen|Arzt|Auto Ich leihe dem Arzt das Auto. I lend the car to the doctor. VERB|leihen|Arzt|Buch Ich leihe dem Arzt das Buch. I lend the book to the doctor. VERB|leihen|Arzt|Geld Ich leihe dem Arzt das Geld. I lend the money to the doctor. @@ -5777,6 +5999,21 @@ VERB|lieben|Schwester Ich liebe die Schwester. VERB|lieben|Stadt Ich liebe die Stadt. I love the city. VERB|lieben|Tochter Ich liebe die Tochter. I love the daughter. VERB|lieben|Vater Ich liebe den Vater. I love the father. +VERB|mithelfen|Arzt Ich helfe dem Arzt mit. I help out the doctor. +VERB|mithelfen|Ärztin Ich helfe der Ärztin mit. I help out the doctor. +VERB|mithelfen|Bruder Ich helfe dem Bruder mit. I help out the brother. +VERB|mithelfen|Frau Ich helfe der Frau mit. I help out the woman. +VERB|mithelfen|Freund Ich helfe dem Freund mit. I help out the friend. +VERB|mithelfen|Freundin Ich helfe der Freundin mit. I help out the friend. +VERB|mithelfen|Kind Ich helfe dem Kind mit. I help out the child. +VERB|mithelfen|Lehrer Ich helfe dem Lehrer mit. I help out the teacher. +VERB|mithelfen|Lehrerin Ich helfe der Lehrerin mit. I help out the teacher. +VERB|mithelfen|Mädchen Ich helfe dem Mädchen mit. I help out the girl. +VERB|mithelfen|Mann Ich helfe dem Mann mit. I help out the man. +VERB|mithelfen|Mutter Ich helfe der Mutter mit. I help out the mother. +VERB|mithelfen|Schwester Ich helfe der Schwester mit. I help out the sister. +VERB|mithelfen|Tochter Ich helfe der Tochter mit. I help out the daughter. +VERB|mithelfen|Vater Ich helfe dem Vater mit. I help out the father. VERB|mögen|Arzt Ich mag den Arzt. I like the doctor. VERB|mögen|Ärztin Ich mag die Ärztin. I like the doctor. VERB|mögen|Auto Ich mag das Auto. I like the car. @@ -5807,6 +6044,104 @@ VERB|mögen|Tochter Ich mag die Tochter. VERB|mögen|Tür Ich mag die Tür. I like the door. VERB|mögen|Vater Ich mag den Vater. I like the father. VERB|mögen|Zug Ich mag den Zug. I like the train. +VERB|nachfolgen|Arzt Ich folge dem Arzt nach. I succeed the doctor. +VERB|nachfolgen|Ärztin Ich folge der Ärztin nach. I succeed the doctor. +VERB|nachfolgen|Lehrer Ich folge dem Lehrer nach. I succeed the teacher. +VERB|nachfolgen|Lehrerin Ich folge der Lehrerin nach. I succeed the teacher. +VERB|nachfolgen|Mutter Ich folge der Mutter nach. I succeed the mother. +VERB|nachfolgen|Vater Ich folge dem Vater nach. I succeed the father. +VERB|nachgeben|Arzt Ich gebe dem Arzt nach. I give in to the doctor. +VERB|nachgeben|Ärztin Ich gebe der Ärztin nach. I give in to the doctor. +VERB|nachgeben|Bruder Ich gebe dem Bruder nach. I give in to the brother. +VERB|nachgeben|Frau Ich gebe der Frau nach. I give in to the woman. +VERB|nachgeben|Freund Ich gebe dem Freund nach. I give in to the friend. +VERB|nachgeben|Freundin Ich gebe der Freundin nach. I give in to the friend. +VERB|nachgeben|Kind Ich gebe dem Kind nach. I give in to the child. +VERB|nachgeben|Lehrer Ich gebe dem Lehrer nach. I give in to the teacher. +VERB|nachgeben|Lehrerin Ich gebe der Lehrerin nach. I give in to the teacher. +VERB|nachgeben|Mädchen Ich gebe dem Mädchen nach. I give in to the girl. +VERB|nachgeben|Mann Ich gebe dem Mann nach. I give in to the man. +VERB|nachgeben|Mutter Ich gebe der Mutter nach. I give in to the mother. +VERB|nachgeben|Schwester Ich gebe der Schwester nach. I give in to the sister. +VERB|nachgeben|Tochter Ich gebe der Tochter nach. I give in to the daughter. +VERB|nachgeben|Vater Ich gebe dem Vater nach. I give in to the father. +VERB|nachgehen|Arzt Ich gehe dem Arzt nach. I trail the doctor. +VERB|nachgehen|Ärztin Ich gehe der Ärztin nach. I trail the doctor. +VERB|nachgehen|Bruder Ich gehe dem Bruder nach. I trail the brother. +VERB|nachgehen|Frau Ich gehe der Frau nach. I trail the woman. +VERB|nachgehen|Freund Ich gehe dem Freund nach. I trail the friend. +VERB|nachgehen|Freundin Ich gehe der Freundin nach. I trail the friend. +VERB|nachgehen|Kind Ich gehe dem Kind nach. I trail the child. +VERB|nachgehen|Lehrer Ich gehe dem Lehrer nach. I trail the teacher. +VERB|nachgehen|Lehrerin Ich gehe der Lehrerin nach. I trail the teacher. +VERB|nachgehen|Mädchen Ich gehe dem Mädchen nach. I trail the girl. +VERB|nachgehen|Mann Ich gehe dem Mann nach. I trail the man. +VERB|nachgehen|Mutter Ich gehe der Mutter nach. I trail the mother. +VERB|nachgehen|Schwester Ich gehe der Schwester nach. I trail the sister. +VERB|nachgehen|Tochter Ich gehe der Tochter nach. I trail the daughter. +VERB|nachgehen|Vater Ich gehe dem Vater nach. I trail the father. +VERB|nachlaufen|Arzt Ich laufe dem Arzt nach. I run after the doctor. +VERB|nachlaufen|Ärztin Ich laufe der Ärztin nach. I run after the doctor. +VERB|nachlaufen|Bruder Ich laufe dem Bruder nach. I run after the brother. +VERB|nachlaufen|Frau Ich laufe der Frau nach. I run after the woman. +VERB|nachlaufen|Freund Ich laufe dem Freund nach. I run after the friend. +VERB|nachlaufen|Freundin Ich laufe der Freundin nach. I run after the friend. +VERB|nachlaufen|Hund Ich laufe dem Hund nach. I run after the dog. +VERB|nachlaufen|Katze Ich laufe der Katze nach. I run after the cat. +VERB|nachlaufen|Kind Ich laufe dem Kind nach. I run after the child. +VERB|nachlaufen|Lehrer Ich laufe dem Lehrer nach. I run after the teacher. +VERB|nachlaufen|Lehrerin Ich laufe der Lehrerin nach. I run after the teacher. +VERB|nachlaufen|Mädchen Ich laufe dem Mädchen nach. I run after the girl. +VERB|nachlaufen|Mann Ich laufe dem Mann nach. I run after the man. +VERB|nachlaufen|Mutter Ich laufe der Mutter nach. I run after the mother. +VERB|nachlaufen|Schwester Ich laufe der Schwester nach. I run after the sister. +VERB|nachlaufen|Tochter Ich laufe der Tochter nach. I run after the daughter. +VERB|nachlaufen|Vater Ich laufe dem Vater nach. I run after the father. +VERB|nachrufen|Arzt Ich rufe dem Arzt nach. I call after the doctor. +VERB|nachrufen|Ärztin Ich rufe der Ärztin nach. I call after the doctor. +VERB|nachrufen|Bruder Ich rufe dem Bruder nach. I call after the brother. +VERB|nachrufen|Frau Ich rufe der Frau nach. I call after the woman. +VERB|nachrufen|Freund Ich rufe dem Freund nach. I call after the friend. +VERB|nachrufen|Freundin Ich rufe der Freundin nach. I call after the friend. +VERB|nachrufen|Kind Ich rufe dem Kind nach. I call after the child. +VERB|nachrufen|Lehrer Ich rufe dem Lehrer nach. I call after the teacher. +VERB|nachrufen|Lehrerin Ich rufe der Lehrerin nach. I call after the teacher. +VERB|nachrufen|Mädchen Ich rufe dem Mädchen nach. I call after the girl. +VERB|nachrufen|Mann Ich rufe dem Mann nach. I call after the man. +VERB|nachrufen|Mutter Ich rufe der Mutter nach. I call after the mother. +VERB|nachrufen|Schwester Ich rufe der Schwester nach. I call after the sister. +VERB|nachrufen|Tochter Ich rufe der Tochter nach. I call after the daughter. +VERB|nachrufen|Vater Ich rufe dem Vater nach. I call after the father. +VERB|nachsehen|Arzt Ich sehe dem Arzt nach. I gaze after the doctor. +VERB|nachsehen|Ärztin Ich sehe der Ärztin nach. I gaze after the doctor. +VERB|nachsehen|Bruder Ich sehe dem Bruder nach. I gaze after the brother. +VERB|nachsehen|Frau Ich sehe der Frau nach. I gaze after the woman. +VERB|nachsehen|Freund Ich sehe dem Freund nach. I gaze after the friend. +VERB|nachsehen|Freundin Ich sehe der Freundin nach. I gaze after the friend. +VERB|nachsehen|Kind Ich sehe dem Kind nach. I gaze after the child. +VERB|nachsehen|Lehrer Ich sehe dem Lehrer nach. I gaze after the teacher. +VERB|nachsehen|Lehrerin Ich sehe der Lehrerin nach. I gaze after the teacher. +VERB|nachsehen|Mädchen Ich sehe dem Mädchen nach. I gaze after the girl. +VERB|nachsehen|Mann Ich sehe dem Mann nach. I gaze after the man. +VERB|nachsehen|Mutter Ich sehe der Mutter nach. I gaze after the mother. +VERB|nachsehen|Schwester Ich sehe der Schwester nach. I gaze after the sister. +VERB|nachsehen|Tochter Ich sehe der Tochter nach. I gaze after the daughter. +VERB|nachsehen|Vater Ich sehe dem Vater nach. I gaze after the father. +VERB|nahekommen|Arzt Ich komme dem Arzt nahe. I get close to the doctor. +VERB|nahekommen|Ärztin Ich komme der Ärztin nahe. I get close to the doctor. +VERB|nahekommen|Bruder Ich komme dem Bruder nahe. I get close to the brother. +VERB|nahekommen|Frau Ich komme der Frau nahe. I get close to the woman. +VERB|nahekommen|Freund Ich komme dem Freund nahe. I get close to the friend. +VERB|nahekommen|Freundin Ich komme der Freundin nahe. I get close to the friend. +VERB|nahekommen|Kind Ich komme dem Kind nahe. I get close to the child. +VERB|nahekommen|Lehrer Ich komme dem Lehrer nahe. I get close to the teacher. +VERB|nahekommen|Lehrerin Ich komme der Lehrerin nahe. I get close to the teacher. +VERB|nahekommen|Mädchen Ich komme dem Mädchen nahe. I get close to the girl. +VERB|nahekommen|Mann Ich komme dem Mann nahe. I get close to the man. +VERB|nahekommen|Mutter Ich komme der Mutter nahe. I get close to the mother. +VERB|nahekommen|Schwester Ich komme der Schwester nahe. I get close to the sister. +VERB|nahekommen|Tochter Ich komme der Tochter nahe. I get close to the daughter. +VERB|nahekommen|Vater Ich komme dem Vater nahe. I get close to the father. VERB|raten|Arzt Ich rate dem Arzt. I advise the doctor. VERB|raten|Ärztin Ich rate der Ärztin. I advise the doctor. VERB|raten|Bruder Ich rate dem Bruder. I advise the brother. @@ -6170,6 +6505,24 @@ VERB|verzeihen|Mutter Ich verzeihe der Mutter. VERB|verzeihen|Schwester Ich verzeihe der Schwester. I forgive the sister. VERB|verzeihen|Tochter Ich verzeihe der Tochter. I forgive the daughter. VERB|verzeihen|Vater Ich verzeihe dem Vater. I forgive the father. +VERB|widersprechen|Arzt Ich widerspreche dem Arzt. I contradict the doctor. +VERB|widersprechen|Ärztin Ich widerspreche der Ärztin. I contradict the doctor. +VERB|widersprechen|Bruder Ich widerspreche dem Bruder. I contradict the brother. +VERB|widersprechen|Frau Ich widerspreche der Frau. I contradict the woman. +VERB|widersprechen|Freund Ich widerspreche dem Freund. I contradict the friend. +VERB|widersprechen|Freundin Ich widerspreche der Freundin. I contradict the friend. +VERB|widersprechen|Kind Ich widerspreche dem Kind. I contradict the child. +VERB|widersprechen|Lehrer Ich widerspreche dem Lehrer. I contradict the teacher. +VERB|widersprechen|Lehrerin Ich widerspreche der Lehrerin. I contradict the teacher. +VERB|widersprechen|Mädchen Ich widerspreche dem Mädchen. I contradict the girl. +VERB|widersprechen|Mann Ich widerspreche dem Mann. I contradict the man. +VERB|widersprechen|Mutter Ich widerspreche der Mutter. I contradict the mother. +VERB|widersprechen|Schwester Ich widerspreche der Schwester. I contradict the sister. +VERB|widersprechen|Tochter Ich widerspreche der Tochter. I contradict the daughter. +VERB|widersprechen|Vater Ich widerspreche dem Vater. I contradict the father. +VERB|widerstehen|Bier Ich widerstehe dem Bier. I resist the beer. +VERB|widerstehen|Kaffee Ich widerstehe dem Kaffee. I resist the coffee. +VERB|widerstehen|Wein Ich widerstehe dem Wein. I resist the wine. VERB|zeigen|Arzt|Auto Ich zeige dem Arzt das Auto. I show the car to the doctor. VERB|zeigen|Arzt|Bild Ich zeige dem Arzt das Bild. I show the picture to the doctor. VERB|zeigen|Arzt|Buch Ich zeige dem Arzt das Buch. I show the book to the doctor. @@ -6260,6 +6613,115 @@ VERB|zuhören|Mutter Ich höre der Mutter zu. VERB|zuhören|Schwester Ich höre der Schwester zu. I listen to the sister. VERB|zuhören|Tochter Ich höre der Tochter zu. I listen to the daughter. VERB|zuhören|Vater Ich höre dem Vater zu. I listen to the father. +VERB|zulächeln|Arzt Ich lächle dem Arzt zu. I smile at the doctor. +VERB|zulächeln|Ärztin Ich lächle der Ärztin zu. I smile at the doctor. +VERB|zulächeln|Bruder Ich lächle dem Bruder zu. I smile at the brother. +VERB|zulächeln|Frau Ich lächle der Frau zu. I smile at the woman. +VERB|zulächeln|Freund Ich lächle dem Freund zu. I smile at the friend. +VERB|zulächeln|Freundin Ich lächle der Freundin zu. I smile at the friend. +VERB|zulächeln|Kind Ich lächle dem Kind zu. I smile at the child. +VERB|zulächeln|Lehrer Ich lächle dem Lehrer zu. I smile at the teacher. +VERB|zulächeln|Lehrerin Ich lächle der Lehrerin zu. I smile at the teacher. +VERB|zulächeln|Mädchen Ich lächle dem Mädchen zu. I smile at the girl. +VERB|zulächeln|Mann Ich lächle dem Mann zu. I smile at the man. +VERB|zulächeln|Mutter Ich lächle der Mutter zu. I smile at the mother. +VERB|zulächeln|Schwester Ich lächle der Schwester zu. I smile at the sister. +VERB|zulächeln|Tochter Ich lächle der Tochter zu. I smile at the daughter. +VERB|zulächeln|Vater Ich lächle dem Vater zu. I smile at the father. +VERB|zunicken|Arzt Ich nicke dem Arzt zu. I nod to the doctor. +VERB|zunicken|Ärztin Ich nicke der Ärztin zu. I nod to the doctor. +VERB|zunicken|Bruder Ich nicke dem Bruder zu. I nod to the brother. +VERB|zunicken|Frau Ich nicke der Frau zu. I nod to the woman. +VERB|zunicken|Freund Ich nicke dem Freund zu. I nod to the friend. +VERB|zunicken|Freundin Ich nicke der Freundin zu. I nod to the friend. +VERB|zunicken|Kind Ich nicke dem Kind zu. I nod to the child. +VERB|zunicken|Lehrer Ich nicke dem Lehrer zu. I nod to the teacher. +VERB|zunicken|Lehrerin Ich nicke der Lehrerin zu. I nod to the teacher. +VERB|zunicken|Mädchen Ich nicke dem Mädchen zu. I nod to the girl. +VERB|zunicken|Mann Ich nicke dem Mann zu. I nod to the man. +VERB|zunicken|Mutter Ich nicke der Mutter zu. I nod to the mother. +VERB|zunicken|Schwester Ich nicke der Schwester zu. I nod to the sister. +VERB|zunicken|Tochter Ich nicke der Tochter zu. I nod to the daughter. +VERB|zunicken|Vater Ich nicke dem Vater zu. I nod to the father. +VERB|zurufen|Arzt Ich rufe dem Arzt zu. I call out to the doctor. +VERB|zurufen|Ärztin Ich rufe der Ärztin zu. I call out to the doctor. +VERB|zurufen|Bruder Ich rufe dem Bruder zu. I call out to the brother. +VERB|zurufen|Frau Ich rufe der Frau zu. I call out to the woman. +VERB|zurufen|Freund Ich rufe dem Freund zu. I call out to the friend. +VERB|zurufen|Freundin Ich rufe der Freundin zu. I call out to the friend. +VERB|zurufen|Kind Ich rufe dem Kind zu. I call out to the child. +VERB|zurufen|Lehrer Ich rufe dem Lehrer zu. I call out to the teacher. +VERB|zurufen|Lehrerin Ich rufe der Lehrerin zu. I call out to the teacher. +VERB|zurufen|Mädchen Ich rufe dem Mädchen zu. I call out to the girl. +VERB|zurufen|Mann Ich rufe dem Mann zu. I call out to the man. +VERB|zurufen|Mutter Ich rufe der Mutter zu. I call out to the mother. +VERB|zurufen|Schwester Ich rufe der Schwester zu. I call out to the sister. +VERB|zurufen|Tochter Ich rufe der Tochter zu. I call out to the daughter. +VERB|zurufen|Vater Ich rufe dem Vater zu. I call out to the father. +VERB|zuschauen|Arzt Ich schaue dem Arzt zu. I watch the doctor. +VERB|zuschauen|Ärztin Ich schaue der Ärztin zu. I watch the doctor. +VERB|zuschauen|Bruder Ich schaue dem Bruder zu. I watch the brother. +VERB|zuschauen|Frau Ich schaue der Frau zu. I watch the woman. +VERB|zuschauen|Freund Ich schaue dem Freund zu. I watch the friend. +VERB|zuschauen|Freundin Ich schaue der Freundin zu. I watch the friend. +VERB|zuschauen|Hund Ich schaue dem Hund zu. I watch the dog. +VERB|zuschauen|Katze Ich schaue der Katze zu. I watch the cat. +VERB|zuschauen|Kind Ich schaue dem Kind zu. I watch the child. +VERB|zuschauen|Lehrer Ich schaue dem Lehrer zu. I watch the teacher. +VERB|zuschauen|Lehrerin Ich schaue der Lehrerin zu. I watch the teacher. +VERB|zuschauen|Mädchen Ich schaue dem Mädchen zu. I watch the girl. +VERB|zuschauen|Mann Ich schaue dem Mann zu. I watch the man. +VERB|zuschauen|Mutter Ich schaue der Mutter zu. I watch the mother. +VERB|zuschauen|Schwester Ich schaue der Schwester zu. I watch the sister. +VERB|zuschauen|Tochter Ich schaue der Tochter zu. I watch the daughter. +VERB|zuschauen|Vater Ich schaue dem Vater zu. I watch the father. +VERB|zusehen|Arzt Ich sehe dem Arzt zu. I observe the doctor. +VERB|zusehen|Ärztin Ich sehe der Ärztin zu. I observe the doctor. +VERB|zusehen|Bruder Ich sehe dem Bruder zu. I observe the brother. +VERB|zusehen|Frau Ich sehe der Frau zu. I observe the woman. +VERB|zusehen|Freund Ich sehe dem Freund zu. I observe the friend. +VERB|zusehen|Freundin Ich sehe der Freundin zu. I observe the friend. +VERB|zusehen|Hund Ich sehe dem Hund zu. I observe the dog. +VERB|zusehen|Katze Ich sehe der Katze zu. I observe the cat. +VERB|zusehen|Kind Ich sehe dem Kind zu. I observe the child. +VERB|zusehen|Lehrer Ich sehe dem Lehrer zu. I observe the teacher. +VERB|zusehen|Lehrerin Ich sehe der Lehrerin zu. I observe the teacher. +VERB|zusehen|Mädchen Ich sehe dem Mädchen zu. I observe the girl. +VERB|zusehen|Mann Ich sehe dem Mann zu. I observe the man. +VERB|zusehen|Mutter Ich sehe der Mutter zu. I observe the mother. +VERB|zusehen|Schwester Ich sehe der Schwester zu. I observe the sister. +VERB|zusehen|Tochter Ich sehe der Tochter zu. I observe the daughter. +VERB|zusehen|Vater Ich sehe dem Vater zu. I observe the father. +VERB|zustimmen|Arzt Ich stimme dem Arzt zu. I agree with the doctor. +VERB|zustimmen|Ärztin Ich stimme der Ärztin zu. I agree with the doctor. +VERB|zustimmen|Bruder Ich stimme dem Bruder zu. I agree with the brother. +VERB|zustimmen|Frau Ich stimme der Frau zu. I agree with the woman. +VERB|zustimmen|Freund Ich stimme dem Freund zu. I agree with the friend. +VERB|zustimmen|Freundin Ich stimme der Freundin zu. I agree with the friend. +VERB|zustimmen|Kind Ich stimme dem Kind zu. I agree with the child. +VERB|zustimmen|Lehrer Ich stimme dem Lehrer zu. I agree with the teacher. +VERB|zustimmen|Lehrerin Ich stimme der Lehrerin zu. I agree with the teacher. +VERB|zustimmen|Mädchen Ich stimme dem Mädchen zu. I agree with the girl. +VERB|zustimmen|Mann Ich stimme dem Mann zu. I agree with the man. +VERB|zustimmen|Mutter Ich stimme der Mutter zu. I agree with the mother. +VERB|zustimmen|Schwester Ich stimme der Schwester zu. I agree with the sister. +VERB|zustimmen|Tochter Ich stimme der Tochter zu. I agree with the daughter. +VERB|zustimmen|Vater Ich stimme dem Vater zu. I agree with the father. +VERB|zuwinken|Arzt Ich winke dem Arzt zu. I wave to the doctor. +VERB|zuwinken|Ärztin Ich winke der Ärztin zu. I wave to the doctor. +VERB|zuwinken|Bruder Ich winke dem Bruder zu. I wave to the brother. +VERB|zuwinken|Frau Ich winke der Frau zu. I wave to the woman. +VERB|zuwinken|Freund Ich winke dem Freund zu. I wave to the friend. +VERB|zuwinken|Freundin Ich winke der Freundin zu. I wave to the friend. +VERB|zuwinken|Kind Ich winke dem Kind zu. I wave to the child. +VERB|zuwinken|Lehrer Ich winke dem Lehrer zu. I wave to the teacher. +VERB|zuwinken|Lehrerin Ich winke der Lehrerin zu. I wave to the teacher. +VERB|zuwinken|Mädchen Ich winke dem Mädchen zu. I wave to the girl. +VERB|zuwinken|Mann Ich winke dem Mann zu. I wave to the man. +VERB|zuwinken|Mutter Ich winke der Mutter zu. I wave to the mother. +VERB|zuwinken|Schwester Ich winke der Schwester zu. I wave to the sister. +VERB|zuwinken|Tochter Ich winke der Tochter zu. I wave to the daughter. +VERB|zuwinken|Vater Ich winke dem Vater zu. I wave to the father. WECH|an|accusative|fahren|Fluss Er fährt an den Fluss. He drives to the river. WECH|an|accusative|fahren|Meer Er fährt ans Meer. He drives to the sea. WECH|an|accusative|fahren|See Er fährt an den See. He drives to the lake. diff --git a/src/engine.js b/src/engine.js index 6390f64..2573ad3 100644 --- a/src/engine.js +++ b/src/engine.js @@ -114,6 +114,7 @@ export const NOUNS = [ {w:'Lehrer',g:'masculine',en:'teacher',gen:'Lehrers'}, {w:'Vater',g:'masculine',en:'father',gen:'Vaters',noIndef:true}, {w:'Zug',g:'masculine',en:'train',gen:'Zuges'}, + {w:'Verein',g:'masculine',en:'club',gen:'Vereins'}, {w:'Regen',g:'masculine',en:'rain',gen:'Regens',noIndef:true}, {w:'Frau',g:'feminine',en:'woman',enPoss:'wife'}, {w:'Ärztin',g:'feminine',en:'doctor'}, @@ -132,6 +133,7 @@ export const NOUNS = [ {w:'Woche',g:'feminine',en:'week',noIndef:true}, {w:'Arbeit',g:'feminine',en:'work',noIndef:true}, {w:'Brücke',g:'feminine',en:'bridge'}, + {w:'Partei',g:'feminine',en:'party'}, {w:'Kind',g:'neuter',en:'child',gen:'Kindes'}, {w:'Haus',g:'neuter',en:'house',gen:'Hauses'}, {w:'Buch',g:'neuter',en:'book',gen:'Buches'}, @@ -181,7 +183,7 @@ export const NOUNS = [ {w:'Milch',g:'feminine',en:'milk',noIndef:true}, {w:'Zeit',g:'feminine',en:'time',noIndef:true}, ]; -const NOUN_BY_NAME = Object.fromEntries(NOUNS.map(n => [n.w, n])); +export const NOUN_BY_NAME = Object.fromEntries(NOUNS.map(n => [n.w, n])); export const nounForm = (noun, cas) => cas === 'genitive' && noun.gen ? noun.gen : noun.w; @@ -404,6 +406,14 @@ ADJ_FRAMES.forEach((f, i) => { f.id = i; }); // cas 'accusative' | 'dative' | 'both' ('both' = person dative, thing accusative) // inverted : German subject is the English object (Das Buch gefällt mir) // trap : the near-synonym that takes the OTHER case +// cluster : which lesson teaches it — see VERB_CLUSTERS below +// pfx : for cluster 'prefix', the dative preposition the verb starts +// with. The UI highlights exactly these letters, because the +// point of the whole cluster is that you can SEE the preposition. +// sep : separable prefix, which goes to the end of the clause +// (ich höre dem Mann zu). A verb with pfx but no sep is +// inseparable and keeps the prefix attached (ich widerspreche). +// tail : a fixed word that closes the clause (leidtun → … leid) // ═══════════════════════════════════════════ const OBJ_PEOPLE = ['people']; @@ -422,35 +432,93 @@ export const CASE_VERBS = [ {de:'verstehen', en:'understand', ich:'verstehe', er:'versteht', cas:'accusative', obj:['people']}, {de:'kaufen', en:'buy', ich:'kaufe', er:'kauft', cas:'accusative', obj:['things'], objNouns:['Brot','Wein','Kaffee']}, // the traps: English makes these feel dative, German says accusative - {de:'fragen', en:'ask', ich:'frage', er:'fragt', cas:'accusative', obj:OBJ_PEOPLE, trap:'antworten'}, - {de:'anrufen', en:'call', ich:'rufe', er:'ruft', cas:'accusative', obj:OBJ_PEOPLE, sep:'an', trap:'zuhören'}, - {de:'treffen', en:'meet', ich:'treffe', er:'trifft', cas:'accusative', obj:OBJ_PEOPLE, trap:'begegnen'}, - {de:'unterstützen', en:'support', ich:'unterstütze', er:'unterstützt', cas:'accusative', obj:OBJ_PEOPLE, trap:'helfen'}, - {de:'mögen', en:'like', ich:'mag', er:'mag', cas:'accusative', obj:['people','animals','things'], trap:'gefallen'}, + {de:'fragen', en:'ask', ich:'frage', er:'fragt', cas:'accusative', obj:OBJ_PEOPLE, trap:'antworten', cluster:'liars'}, + {de:'anrufen', en:'call', ich:'rufe', er:'ruft', cas:'accusative', obj:OBJ_PEOPLE, sep:'an', trap:'zuhören', cluster:'liars'}, + {de:'treffen', en:'meet', ich:'treffe', er:'trifft', cas:'accusative', obj:OBJ_PEOPLE, trap:'begegnen', cluster:'liars'}, + {de:'unterstützen', en:'support', ich:'unterstütze', er:'unterstützt', cas:'accusative', obj:OBJ_PEOPLE, trap:'helfen', cluster:'liars'}, + {de:'mögen', en:'like', ich:'mag', er:'mag', cas:'accusative', obj:['people','animals','things'], trap:'gefallen', cluster:'liars'}, - // ── Dativ: the list that actually has to be learned. - {de:'helfen', en:'help', ich:'helfe', er:'hilft', cas:'dative', obj:OBJ_ANIMATE, trap:'unterstützen'}, - {de:'danken', en:'thank', ich:'danke', er:'dankt', cas:'dative', obj:OBJ_PEOPLE}, - {de:'antworten', en:'answer', ich:'antworte', er:'antwortet', cas:'dative', obj:OBJ_PEOPLE, trap:'fragen'}, - {de:'glauben', en:'believe', ich:'glaube', er:'glaubt', cas:'dative', obj:OBJ_PEOPLE}, - {de:'folgen', en:'follow', ich:'folge', er:'folgt', cas:'dative', obj:OBJ_ANIMATE}, - {de:'gratulieren', en:'congratulate', ich:'gratuliere', er:'gratuliert', cas:'dative', obj:OBJ_PEOPLE}, - {de:'vertrauen', en:'trust', ich:'vertraue', er:'vertraut', cas:'dative', obj:OBJ_ANIMATE}, - {de:'verzeihen', en:'forgive', ich:'verzeihe', er:'verzeiht', cas:'dative', obj:OBJ_PEOPLE}, - {de:'begegnen', en:'meet', ich:'begegne', er:'begegnet', cas:'dative', obj:OBJ_PEOPLE, trap:'treffen'}, - {de:'zuhören', en:'listen to', ich:'höre', er:'hört', cas:'dative', obj:OBJ_PEOPLE, sep:'zu', trap:'anrufen'}, - {de:'raten', en:'advise', ich:'rate', er:'rät', cas:'dative', obj:OBJ_PEOPLE}, - {de:'schaden', en:'harm', ich:'schade', er:'schadet', cas:'dative', obj:OBJ_ANIMATE}, + // ── Dativ, cluster 'aimed' — AIMED AT SOMEONE. + // No rule generates these; they are a list. What holds the list together is + // that something travels TO a person and nothing happens to the person: you + // give them help, thanks, an answer, advice, your trust, your belief. + {de:'helfen', en:'help', ich:'helfe', er:'hilft', cas:'dative', cluster:'aimed', obj:OBJ_ANIMATE, trap:'unterstützen'}, + {de:'danken', en:'thank', ich:'danke', er:'dankt', cas:'dative', cluster:'aimed', obj:OBJ_PEOPLE}, + {de:'antworten', en:'answer', ich:'antworte', er:'antwortet', cas:'dative', cluster:'aimed', obj:OBJ_PEOPLE, trap:'fragen'}, + {de:'glauben', en:'believe', ich:'glaube', er:'glaubt', cas:'dative', cluster:'aimed', obj:OBJ_PEOPLE}, + {de:'gratulieren', en:'congratulate', ich:'gratuliere', er:'gratuliert', cas:'dative', cluster:'aimed', obj:OBJ_PEOPLE}, + {de:'vertrauen', en:'trust', ich:'vertraue', er:'vertraut', cas:'dative', cluster:'aimed', obj:OBJ_ANIMATE}, + {de:'verzeihen', en:'forgive', ich:'verzeihe', er:'verzeiht', cas:'dative', cluster:'aimed', obj:OBJ_PEOPLE}, + {de:'raten', en:'advise', ich:'rate', er:'rät', cas:'dative', cluster:'aimed', obj:OBJ_PEOPLE}, + {de:'schaden', en:'harm', ich:'schade', er:'schadet', cas:'dative', cluster:'aimed', obj:OBJ_ANIMATE}, - // ── Dativ, inverted: the German subject is the English object. - {de:'gefallen', en:'please', er:'gefällt', cas:'dative', inverted:true, trap:'mögen', + // ── Dativ, cluster 'facing' — FACING SOMEONE. + // The other list. These place you in relation to a person rather than + // sending anything to them: like them, up against them, behind them, + // under them, for them. + {de:'ähneln', en:'resemble', ich:'ähnle', er:'ähnelt', cas:'dative', cluster:'facing', obj:OBJ_PEOPLE}, + {de:'begegnen', en:'meet', ich:'begegne', er:'begegnet', cas:'dative', cluster:'facing', obj:OBJ_PEOPLE, trap:'treffen'}, + {de:'folgen', en:'follow', ich:'folge', er:'folgt', cas:'dative', cluster:'facing', obj:OBJ_ANIMATE}, + {de:'gehorchen', en:'obey', ich:'gehorche', er:'gehorcht', cas:'dative', cluster:'facing', objNouns:['Arzt','Ärztin','Lehrer','Lehrerin','Vater','Mutter']}, + {de:'dienen', en:'serve', ich:'diene', er:'dient', cas:'dative', cluster:'facing', objNouns:['Mann','Frau','Arzt','Ärztin','Lehrer','Lehrerin']}, + + // ── Dativ, cluster 'prefix' — PREPOSITIONS IN DISGUISE. + // The generative one, and the reason this section is worth building: a verb + // that BEGINS with one of the dative prepositions from the song takes the + // dative. Learn the rule once and all 25 come free — which is why the tail + // of this list is drilled in its own lessons rather than parked in a table. + // zu- + {de:'zuhören', en:'listen to', ich:'höre', er:'hört', cas:'dative', cluster:'prefix', pfx:'zu', sep:'zu', obj:OBJ_PEOPLE, trap:'anrufen'}, + {de:'zuschauen', en:'watch', ich:'schaue', er:'schaut', cas:'dative', cluster:'prefix', pfx:'zu', sep:'zu', obj:OBJ_ANIMATE}, + {de:'zusehen', en:'observe', ich:'sehe', er:'sieht', cas:'dative', cluster:'prefix', pfx:'zu', sep:'zu', obj:OBJ_ANIMATE}, + {de:'zustimmen', en:'agree with', ich:'stimme', er:'stimmt', cas:'dative', cluster:'prefix', pfx:'zu', sep:'zu', obj:OBJ_PEOPLE}, + {de:'zulächeln', en:'smile at', ich:'lächle', er:'lächelt', cas:'dative', cluster:'prefix', pfx:'zu', sep:'zu', obj:OBJ_PEOPLE}, + {de:'zuwinken', en:'wave to', ich:'winke', er:'winkt', cas:'dative', cluster:'prefix', pfx:'zu', sep:'zu', obj:OBJ_PEOPLE}, + {de:'zunicken', en:'nod to', ich:'nicke', er:'nickt', cas:'dative', cluster:'prefix', pfx:'zu', sep:'zu', obj:OBJ_PEOPLE}, + {de:'zurufen', en:'call out to', ich:'rufe', er:'ruft', cas:'dative', cluster:'prefix', pfx:'zu', sep:'zu', obj:OBJ_PEOPLE}, + // bei- + {de:'beitreten', en:'join', ich:'trete', er:'tritt', cas:'dative', cluster:'prefix', pfx:'bei', sep:'bei', objNouns:['Verein','Partei']}, + {de:'beistehen', en:'stand by', ich:'stehe', er:'steht', cas:'dative', cluster:'prefix', pfx:'bei', sep:'bei', obj:OBJ_PEOPLE}, + {de:'beipflichten', en:'side with', ich:'pflichte', er:'pflichtet', cas:'dative', cluster:'prefix', pfx:'bei', sep:'bei', obj:OBJ_PEOPLE}, + // nach- + {de:'nachlaufen', en:'run after', ich:'laufe', er:'läuft', cas:'dative', cluster:'prefix', pfx:'nach', sep:'nach', obj:OBJ_ANIMATE}, + {de:'nachgehen', en:'trail', ich:'gehe', er:'geht', cas:'dative', cluster:'prefix', pfx:'nach', sep:'nach', obj:OBJ_PEOPLE}, + {de:'nachgeben', en:'give in to', ich:'gebe', er:'gibt', cas:'dative', cluster:'prefix', pfx:'nach', sep:'nach', obj:OBJ_PEOPLE}, + {de:'nachsehen', en:'gaze after', ich:'sehe', er:'sieht', cas:'dative', cluster:'prefix', pfx:'nach', sep:'nach', obj:OBJ_PEOPLE}, + {de:'nachfolgen', en:'succeed', ich:'folge', er:'folgt', cas:'dative', cluster:'prefix', pfx:'nach', sep:'nach', objNouns:['Arzt','Ärztin','Lehrer','Lehrerin','Vater','Mutter']}, + {de:'nachrufen', en:'call after', ich:'rufe', er:'ruft', cas:'dative', cluster:'prefix', pfx:'nach', sep:'nach', obj:OBJ_PEOPLE}, + // mit- + {de:'mithelfen', en:'help out', ich:'helfe', er:'hilft', cas:'dative', cluster:'prefix', pfx:'mit', sep:'mit', obj:OBJ_PEOPLE}, + // wider-: inseparable, so the prefix stays visible inside the verb — and the + // one place the rule does NOT hold. As a preposition, wider governs the + // ACCUSATIVE (wider Erwarten), so these two being dative is not something + // the rule predicts. ruleExempt makes the lesson say so instead of quietly + // claiming a pattern that would mislead on wider- generally. + {de:'widersprechen',en:'contradict', ich:'widerspreche',er:'widerspricht',cas:'dative', cluster:'prefix', pfx:'wider', ruleExempt:true, obj:OBJ_PEOPLE}, + {de:'widerstehen', en:'resist', ich:'widerstehe', er:'widersteht', cas:'dative', cluster:'prefix', pfx:'wider', ruleExempt:true, objNouns:['Kaffee','Wein','Bier']}, + // entgegen-, gegenüber-, aus-, nahe- + {de:'entgegenkommen',en:'come towards',ich:'komme', er:'kommt', cas:'dative', cluster:'prefix', pfx:'entgegen', sep:'entgegen', obj:OBJ_PEOPLE}, + {de:'entgegentreten',en:'confront', ich:'trete', er:'tritt', cas:'dative', cluster:'prefix', pfx:'entgegen', sep:'entgegen', obj:OBJ_PEOPLE}, + {de:'gegenüberstehen',en:'face', ich:'stehe', er:'steht', cas:'dative', cluster:'prefix', pfx:'gegenüber', sep:'gegenüber', obj:OBJ_PEOPLE}, + {de:'ausweichen', en:'dodge', ich:'weiche', er:'weicht', cas:'dative', cluster:'prefix', pfx:'aus', sep:'aus', obj:OBJ_ANIMATE}, + {de:'nahekommen', en:'get close to', ich:'komme', er:'kommt', cas:'dative', cluster:'prefix', pfx:'nahe', sep:'nahe', obj:OBJ_PEOPLE}, + + // ── Dativ, cluster 'flip' — UPSIDE DOWN VERBS. + // English makes you the subject and German does not. "I like the film" is + // der Film gefällt mir: the film does the pleasing, to me. + {de:'gefallen', en:'please', er:'gefällt', cas:'dative', cluster:'flip', inverted:true, trap:'mögen', enInv:{mode:'flip', v:'likes'}, obj:OBJ_PEOPLE, subj:['things','buildings'], subjNouns:['Musik','Bild','Auto','Haus']}, - {de:'schmecken', en:'taste good to', er:'schmeckt', cas:'dative', inverted:true, + {de:'schmecken', en:'taste good to', er:'schmeckt', cas:'dative', cluster:'flip', inverted:true, enInv:{mode:'flip', v:'likes'}, obj:OBJ_PEOPLE, subjNouns:['Kaffee','Tee','Brot','Milch']}, - {de:'fehlen', en:'be missing to', er:'fehlt', cas:'dative', inverted:true, + {de:'fehlen', en:'be missing to', er:'fehlt', cas:'dative', cluster:'flip', inverted:true, enInv:{mode:'flip', v:'is missing'}, obj:OBJ_PEOPLE, subjNouns:['Geld','Buch','Auto','Tasche']}, - {de:'gehören', en:'belong to', er:'gehört', cas:'dative', inverted:true, + {de:'gehören', en:'belong to', er:'gehört', cas:'dative', cluster:'flip', inverted:true, enInv:{mode:'same', v:'belongs to'}, obj:OBJ_PEOPLE, subj:['things']}, + {de:'gelingen', en:'succeed for', er:'gelingt', cas:'dative', cluster:'flip', inverted:true, + enInv:{mode:'flip', v:'succeeds with'}, obj:OBJ_PEOPLE, subjNouns:['Arbeit','Bild','Brot']}, + // tail: the only verb here whose clause closes with a fixed word. + {de:'leidtun', en:'be a sorrow to',er:'tut', cas:'dative', cluster:'flip', inverted:true, tail:'leid', + enInv:{mode:'flip', v:'feels sorry for'}, obj:OBJ_PEOPLE, subjNouns:['Mann','Kind','Bruder','Vater']}, // ── Dativ + Akkusativ: one rule covers all of them — person dative, thing accusative. // Only things you can actually hand over, recommend or explain. @@ -471,6 +539,56 @@ export const INVERTED_VERBS = CASE_VERBS.filter(v => v.inverted).map(v => v.de); export const TWO_OBJECT_VERBS = CASE_VERBS.filter(v => v.cas === 'both').map(v => v.de); export const VERB_CASE_LABEL = { accusative:'Akkusativ', dative:'Dativ', both:'Dativ + Akkusativ' }; +// The prefixes the rule actually covers: dative prepositions. entgegen and +// nahe are genuine dative prepositions that the preposition lessons do not +// drill (too rare to be worth a level), so the Lernen panel introduces them +// here. wider is deliberately NOT in this list — see ruleExempt above. +export const DATIVE_PREFIXES = ['zu','bei','nach','mit','entgegen','gegenüber','aus','nahe']; + +export const verbsInCluster = key => CASE_VERBS.filter(v => v.cluster === key).map(v => v.de); +export const PREFIX_VERBS = verbsInCluster('prefix'); + +// Six verbs, six different prefixes — the smallest set that demonstrates the +// rule. The first lesson drills these; the remaining 19 get their own two +// lessons, because a verb you have only read about is not a verb you can use. +// Six genuine instances of the rule — six different prefixes, every one of +// them a dative preposition. widersprechen is deliberately NOT here: it is the +// verb the rule does not predict, so showing it as proof of the rule would +// contradict the exception note on the same screen. +export const PREFIX_EXEMPLARS = ['zuhören','beitreten','nachlaufen','mithelfen','entgegenkommen','ausweichen']; +export const PREFIX_TAIL = PREFIX_VERBS.filter(v => !PREFIX_EXEMPLARS.includes(v)); +export const PREFIX_TAIL_1 = PREFIX_TAIL.slice(0, 10); +export const PREFIX_TAIL_2 = PREFIX_TAIL.slice(10); + +// The five lessons, in teaching order. name/sub are what the UI shows; rule is +// the single claim the lesson makes, and it is what the feedback repeats back. +export const VERB_CLUSTERS = [ + {key:'prefix', name:'Prepositions in Disguise', sub:'the free ones', + rule:'A verb that begins with a dative preposition takes the dative.', + why:'The prefix IS the preposition — zuhören is zu, beitreten is bei, nachlaufen is nach. Twenty-five verbs for the price of one rule.'}, + {key:'aimed', name:'Aimed at Someone', sub:'the list you learn', + rule:'Something travels to the person, and nothing happens to the person.', + why:'You give them help, thanks, an answer, advice, your trust. The person is a destination, not a target — compare the accusative ich schlage ihn, where he is changed by it.'}, + {key:'facing', name:'Facing Someone', sub:'the list you learn', + rule:'You are placed in relation to the person, not acting on them.', + why:'Like them, up against them, behind them, under them, for them. Nothing is sent and nothing is touched; the dative marks where you stand.'}, + {key:'flip', name:'Upside Down Verbs', sub:'the subject swaps', + rule:'The thing is the subject. You are the dative.', + why:'English makes you the subject and German does not: "I like the film" is der Film gefällt mir — the film does the pleasing, to me.'}, + {key:'liars', name:'The Five Liars', sub:'where English misleads', + rule:'Five pairs English collapses. Only one half takes the dative.', + why:'Both halves feel like doing something to a person. Learn them as pairs — that closes the gap every shortcut rule leaves open.'}, +]; +export const CLUSTER_BY_KEY = Object.fromEntries(VERB_CLUSTERS.map(c => [c.key, c])); + +// The letters the UI highlights, so "prepositions in disguise" is something you +// can see rather than something you are told. zuhören → ['zu', 'hören']. +export function splitPrefix(verb) { + const v = typeof verb === 'string' ? VERB_BY_NAME[verb] : verb; + if (!v?.pfx || !v.de.startsWith(v.pfx)) return [null, v?.de || '']; + return [v.pfx, v.de.slice(v.pfx.length)]; +} + const verbNouns = (v, key) => [...new Set([ ...((v[key] || []).flatMap(g => ADJ_NOUN_GROUPS[g] || [])), ...(v[key + 'Nouns'] || []), @@ -547,8 +665,31 @@ export const VC = { lieben: {de:mkv({ich:'liebe',du:'liebst',er:'liebt',wir:'lieben',ihr:'liebt'}), en:mkv({ich:'love',du:'love',er:'loves',wir:'love',ihr:'love'})}, helfen: {de:mkv({ich:'helfe',du:'hilfst',er:'hilft',wir:'helfen',ihr:'helft'}), en:mkv({ich:'help',du:'help',er:'helps',wir:'help',ihr:'help'})}, geben: {de:mkv({ich:'gebe',du:'gibst',er:'gibt',wir:'geben',ihr:'gebt'}), en:mkv({ich:'give',du:'give',er:'gives',wir:'give',ihr:'give'})}, + // Used only by the pronoun preposition frames below, which exist so that the + // pronoun tab still works with verb government switched off. + arbeiten:{de:mkv({ich:'arbeite',du:'arbeitest',er:'arbeitet',wir:'arbeiten',ihr:'arbeitet'}), en:mkv({ich:'work',du:'work',er:'works',wir:'work',ihr:'work'})}, + warten: {de:mkv({ich:'warte',du:'wartest',er:'wartet',wir:'warten',ihr:'wartet'}), en:mkv({ich:'wait',du:'wait',er:'waits',wir:'wait',ihr:'wait'})}, + sprechen:{de:mkv({ich:'spreche',du:'sprichst',er:'spricht',wir:'sprechen',ihr:'sprecht'}), en:mkv({ich:'speak',du:'speak',er:'speaks',wir:'speak',ihr:'speak'})}, + wohnen: {de:mkv({ich:'wohne',du:'wohnst',er:'wohnt',wir:'wohnen',ihr:'wohnt'}), en:mkv({ich:'live',du:'live',er:'lives',wir:'live',ihr:'live'})}, + fragen: {de:mkv({ich:'frage',du:'fragst',er:'fragt',wir:'fragen',ihr:'fragt'}), en:mkv({ich:'ask',du:'ask',er:'asks',wir:'ask',ihr:'ask'})}, }; +// Pronoun questions after a PREPOSITION rather than after a verb. Without +// these the pronoun tab is 100% verb-governed, so it could not run at all with +// verb government switched off — "Ich helfe ___" only works if you already +// know helfen is dative. Four accusative prepositions, five dative. +export const PRON_PREP_FRAMES = [ + {prep:'für', cas:'accusative', v:'arbeiten', en:'for'}, + {prep:'ohne', cas:'accusative', v:'kommen', en:'without'}, + {prep:'gegen', cas:'accusative', v:'sein', en:'against'}, + {prep:'auf', cas:'accusative', v:'warten', en:'for'}, + {prep:'mit', cas:'dative', v:'sprechen', en:'with'}, + {prep:'bei', cas:'dative', v:'wohnen', en:'with'}, + {prep:'zu', cas:'dative', v:'kommen', en:'to'}, + {prep:'von', cas:'dative', v:'sprechen', en:'about'}, + {prep:'nach', cas:'dative', v:'fragen', en:'after'}, +]; + export const SG_PRONOUN_KEYS = ['ich','du','er','sie_sg','es']; export const PL_PRONOUN_KEYS = ['wir','ihr','sie_pl']; export const FORMAL_PRONOUN_KEYS = ['Sie_sg','Sie_pl']; @@ -598,22 +739,34 @@ export const LEVELS = [ {id:25, tab:'adj', name:'Alles gemischt', desc:'All three tables, including Genitiv', classes:['weak','mixed','strong'], cases:['nominative','accusative','dative','genitive'], type:'adjective'}, {id:25.5, tab:'adj', name:'Daily Practice', desc:'Every adjective lesson, mixed · one-tap', daily:true}, - // Verb case government. Accusative is the default, so these levels drill the - // dative exceptions, the near-synonyms that disagree, and the sentences where - // the verb is the ONLY thing deciding the case. - {id:30, tab:'verb', name:'Welcher Fall?', desc:'Which case does this verb take?', - verbs:[...CASE_VERBS.filter(v => v.cas !== 'both').map(v => v.de)], type:'verbCase'}, - {id:31, tab:'verb', name:'Die Fallen', desc:'fragen vs antworten, treffen vs begegnen…', - verbs:TRAP_VERBS, type:'verbCase'}, - {id:32, tab:'verb', name:'Gefallen & Co.', desc:'Verbs where German flips subject and object', - verbs:INVERTED_VERBS, type:'verbSentence'}, - {id:33, tab:'verb', name:'Dativ + Akkusativ', desc:'Two objects: person Dativ, thing Akkusativ', + // Verb case government. Accusative is the default for hundreds of transitive + // verbs, so there is no accusative list — you learn the dative exceptions. + // Five clusters, taught in the order that makes each one cheapest: the + // generative rule first (25 verbs for one rule), then the two lists that no + // rule covers, then the flip, then the pairs English collapses. The two + // "Rest der Familie" lessons exist because a rule you have been shown is not + // the same as 19 verbs you can produce. + {id:30, tab:'verb', name:'Prepositions in Disguise', desc:'the free ones — six verbs, six prefixes', + verbs:PREFIX_EXEMPLARS, type:'verbSentence', cluster:'prefix'}, + {id:31, tab:'verb', name:'Aimed at Someone', desc:'the list you learn — help, thanks, an answer', + verbs:verbsInCluster('aimed'), type:'verbSentence', cluster:'aimed'}, + {id:32, tab:'verb', name:'Facing Someone', desc:'the list you learn — like, after, under, for', + verbs:verbsInCluster('facing'), type:'verbSentence', cluster:'facing'}, + {id:33, tab:'verb', name:'Upside Down Verbs', desc:'the subject swaps — der Film gefällt mir', + verbs:verbsInCluster('flip'), type:'verbSentence', cluster:'flip'}, + {id:34, tab:'verb', name:'The Five Liars', desc:'where English misleads — fragen vs antworten', + verbs:TRAP_VERBS, type:'verbCase', cluster:'liars'}, + {id:35, tab:'verb', name:'Der Rest der Familie I', desc:'the rest of the family — ten more prefix verbs', + verbs:PREFIX_TAIL_1, type:'verbSentence', cluster:'prefix'}, + {id:36, tab:'verb', name:'Der Rest der Familie II', desc:'the rest of the family — the last nine', + verbs:PREFIX_TAIL_2, type:'verbSentence', cluster:'prefix'}, + {id:37, tab:'verb', name:'Welcher Fall?', desc:'which case does this verb take?', + verbs:CASE_VERBS.filter(v => v.cas !== 'both').map(v => v.de), type:'verbCase'}, + {id:38, tab:'verb', name:'Dativ + Akkusativ', desc:'two objects: person Dativ, thing Akkusativ', verbs:TWO_OBJECT_VERBS, type:'verbSentence'}, - {id:34, tab:'verb', name:'Im Satz', desc:'No preposition — the verb decides the case', - verbs:CASE_VERBS.filter(v => v.cas !== 'both' && !v.inverted).map(v => v.de), type:'verbSentence'}, - {id:35, tab:'verb', name:'Alles gemischt', desc:'Every verb, every pattern', + {id:39, tab:'verb', name:'Alles gemischt', desc:'everything mixed — every verb, every pattern', verbs:CASE_VERBS.map(v => v.de), type:'verbSentence'}, - {id:35.5, tab:'verb', name:'Daily Practice', desc:'Every verb lesson, mixed · one-tap', daily:true}, + {id:39.5, tab:'verb', name:'Daily Practice', desc:'every verb lesson, mixed · one-tap', daily:true}, // Comparison. The endings are the adjective tables unchanged — what is new is // building the stem, and knowing which superlative shape a slot wants. @@ -948,7 +1101,7 @@ export const sharedMemory = () => ({ last:{ prep:null, verb:null, noun:null, sub // Daily levels mix questions from every lesson in their tab: a shuffle-bag // deals the lesson ids so no lesson repeats back-to-back, and each lesson // keeps its own state (their bag pools differ, so they can't share one). -export function createSession(levelId) { +export function createSession(levelId, opts = {}) { const lv = LEVELS.find(l => l.id === levelId); if (lv?.daily) { const lessonIds = LEVELS.filter(l => l.tab === lv.tab && !l.daily).map(l => l.id); @@ -961,13 +1114,13 @@ export function createSession(levelId) { const id = drawBag(meta, 'lvl', lessonIds, meta.last.lvl); meta.last.lvl = id; if (!states[id]) states[id] = newState(shared); - return gen(id, states[id]); + return gen(id, states[id], opts); }, state: meta, }; } const state = newState(); - return { next: () => gen(levelId, state), state }; + return { next: () => gen(levelId, state, opts), state }; } // ═══════════════════════════════════════════ @@ -1204,12 +1357,16 @@ const POSS_ACC_TEMPLATES = [ {de:'höre', en:'hear', nouns:['Musik','Hund','Katze','Kind']}, ]; -export function genPossQ(level, state = newState()) { +export function genPossQ(level, state = newState(), opts = {}) { const lv = LEVELS.find(l=>l.id===level); const stem = pickAvoid(lv.possessives, state.last.stem); state.last.stem = stem; const possMeaning = POSSESSIVES.find(p=>p.stem===stem).en; - const wantPrep = Math.random() > 0.5; + // With verb government off, the case must always come from a preposition — + // the template path below is "Ich helfe _____ Bruder", which is exactly the + // verb-governed sentence the switch exists to suppress. + const prepOnly = opts.verbs === false; + const wantPrep = prepOnly || Math.random() > 0.5; if (wantPrep) { const pool = lv.cases.includes('genitive') @@ -1233,7 +1390,28 @@ export function genPossQ(level, state = newState()) { } } - // No preposition: simple object sentence. + // No preposition: simple object sentence — the case comes from the verb. + // Unreachable with the switch off: one more pass over the whole preposition + // pool first, since a single unlucky draw must not fall back to a verb. + if (prepOnly) { + const pool = [...SENTENCE_ACC_PREPS, ...PREPS_BY_CASE.dative, ...PREPS_BY_CASE.wechsel] + .filter(k => lv.cases.includes(PREPS[k].c) || PREPS[k].c === 'wechsel'); + for (const prepKey of shuffle(pool)) { + const pc = PREPS[prepKey].c; + const tw = pc === 'wechsel' ? Math.random() > 0.5 : null; + const cas = pc === 'wechsel' ? (tw ? 'accusative' : 'dative') : pc; + if (!lv.cases.includes(cas)) continue; + const r = realizeFrame(prepKey, cas, tw, state, { possOnly:true }); + if (!r) continue; + state.last.prep = prepKey; + const ans = combinePoss(stem, POSS_ENDINGS[r.noun.g][cas]); + return {type:'poss', noun:r.noun, stem, possMeaning, cas, ans, + sentence: `${r.subjDe} ${r.verbDe}${r.midDe} ${prepKey} _____ ${nounForm(r.noun, cas)}${r.postDe}.`, + translation: `${r.subjEn} ${r.verbEn}${r.midEn} ${r.enPrep} ${possMeaning} ${possNounEn(r.noun)}${r.postEn}.`, + rule: `${stem}- + ${CL[cas]} + ${r.noun.g} → ${ans}`, + prepKey, verb:r.verbKey, tw, choices:possChoices(stem, ans)}; + } + } const cas = pick(lv.cases.filter(c => c !== 'genitive')) || lv.cases[0]; let noun, sentence, translation, tplVerb; if (cas === 'accusative') { @@ -1255,7 +1433,7 @@ export function genPossQ(level, state = newState()) { prepKey:null, verb:tplVerb, tw:null, choices:possChoices(stem, ans)}; } -export function genPronounQ(level, state = newState()) { +export function genPronounQ(level, state = newState(), opts = {}) { const lv = LEVELS.find(l=>l.id===level); const pronKey = drawBag(state, 'pron', lv.pronouns, state.last.pron); state.last.pron = pronKey; @@ -1266,6 +1444,23 @@ export function genPronounQ(level, state = newState()) { const subjCandidates = SAFE_SUBJECT_KEYS.filter(k => k !== pronKey); const subjKey = pick(subjCandidates); const subj = PRONOUNS.find(p=>p.key===subjKey); + + // Preposition-governed: the only shape available with verb government off, + // and half the mix when it is on. + const prepOnly = opts.verbs === false; + if (prepOnly || Math.random() > 0.5) { + const frames = PRON_PREP_FRAMES.filter(f => f.cas === cas); + const f = pickAvoid(frames, frames.length > 1 ? state.last.pronprep : null); + if (f) { + state.last.pronprep = f; + const vd = VC[f.v].de[subjKey], ve = VC[f.v].en[subjKey]; + return {type:'pronoun', pronKey, pron, cas, ans, prepKey:f.prep, + sentence: `${cap(subj.nom)} ${vd} ${f.prep} _____.`, + translation: `${cap(subj.en)} ${ve} ${f.en} ${pron.enObj}.`, + choices:pronounChoices(pron, ans)}; + } + } + let tpl; if (cas === 'accusative') { tpl = pick([{v:'sehen'}, {v:'kennen'}, {v:'lieben'}]); @@ -1500,10 +1695,11 @@ export function genVerbSentenceQ(level, state = newState()) { const en = v.enInv.mode === 'flip' ? `The ${obj.en} ${v.enInv.v} the ${subj.en}.` : `The ${subj.en} ${v.enInv.v} the ${obj.en}.`; + const tail = v.tail ? ` ${v.tail}` : ''; return { type:'verbSentence', verb:v, cas:'dative', noun:obj, subjNoun:subj, ans, slot:'dative', - sentence: `${cap(DEF[subj.g].nominative)} ${subj.w} ${v.er} _____ ${obj.w}.`, - answerSentence: `${cap(DEF[subj.g].nominative)} ${subj.w} ${v.er} ${ans} ${obj.w}.`, + sentence: `${cap(DEF[subj.g].nominative)} ${subj.w} ${v.er} _____ ${obj.w}${tail}.`, + answerSentence: `${cap(DEF[subj.g].nominative)} ${subj.w} ${v.er} ${ans} ${obj.w}${tail}.`, translation: en, choices: articleChoices(ans, 'definite') }; } @@ -1720,7 +1916,7 @@ export function genCompDeclineQ(level, state = newState()) { return null; } -export function gen(level, state = newState()) { +export function gen(level, state = newState(), opts = {}) { const lv = LEVELS.find(l=>l.id===level); if (lv.type==='compForm') return genCompFormQ(level, state); if (lv.type==='compPlace') return genCompPlaceQ(level, state); @@ -1733,8 +1929,8 @@ export function gen(level, state = newState()) { if (lv.type==='contraction') return genContractionQ(state); if (lv.type==='prep') return genPrepQ(level, state); if (lv.type==='wechselContext') return genWechselContextQ(level, state); - if (lv.type==='poss') return genPossQ(level, state); - if (lv.type==='pronoun') return genPronounQ(level, state); + if (lv.type==='poss') return genPossQ(level, state, opts); + if (lv.type==='pronoun') return genPronounQ(level, state, opts); return genArticleQ(level, state); } @@ -1867,7 +2063,7 @@ export function enumerateCorpus() { if (sn === on) continue; const subj = NOUN_BY_NAME[sn], obj = NOUN_BY_NAME[on]; add({ key: `VERB|${v.de}|${sn}|${on}`, - de: `${cap(DEF[subj.g].nominative)} ${subj.w} ${v.er} ${DEF[obj.g].dative} ${obj.w}.`, + de: `${cap(DEF[subj.g].nominative)} ${subj.w} ${v.er} ${DEF[obj.g].dative} ${obj.w}${v.tail ? ' ' + v.tail : ''}.`, en: v.enInv.mode === 'flip' ? `The ${obj.en} ${v.enInv.v} the ${subj.en}.` : `The ${subj.en} ${v.enInv.v} the ${obj.en}.` }); diff --git a/src/engine.test.js b/src/engine.test.js index c4a9579..65ae406 100644 --- a/src/engine.test.js +++ b/src/engine.test.js @@ -12,6 +12,9 @@ import { EIN_WORD_DETS, ADJ_ALL_ENDINGS, CASE_VERBS, VERB_BY_NAME, DATIVE_VERBS, TRAP_VERBS, INVERTED_VERBS, TWO_OBJECT_VERBS, COMPARISON_IRREGULARS, amForm, flipUmlaut, enDegree, + VERB_CLUSTERS, verbsInCluster, DATIVE_PREFIXES, splitPrefix, + PREFIX_VERBS, PREFIX_EXEMPLARS, PREFIX_TAIL_1, PREFIX_TAIL_2, + PRON_PREP_FRAMES, VC, } from './engine.js'; const lvl7Has = (qs, p) => qs.some(q => q.prepKey === p); @@ -813,11 +816,64 @@ describe('verb case government', () => { expect(new Set(CASE_VERBS.map(v => v.de)).size).toBe(CASE_VERBS.length); }); - it('the dative list matches the reference', () => { - const REF = ['helfen','danken','antworten','glauben','folgen','gratulieren','vertrauen', - 'verzeihen','begegnen','zuhören','raten','schaden', - 'gefallen','schmecken','fehlen','gehören']; - expect([...DATIVE_VERBS].sort()).toEqual([...REF].sort()); + // There is no one canonical dative-verb list to check against: published + // counts run from about 16 to about 50, depending entirely on whether prefix + // verbs are listed individually or folded into a rule. This app lists them + // individually and teaches the rule, which is where 45 comes from — 25 the + // rule generates, 20 that have to be learnt. So the test below checks the + // structure the lessons rely on, and does not pretend to check a reference. + it('every dative verb sits in exactly one cluster, and the clusters are the lesson plan', () => { + for (const name of DATIVE_VERBS) { + const v = VERB_BY_NAME[name]; + expect(['prefix','aimed','facing','flip'], `${name} has cluster ${v.cluster}`).toContain(v.cluster); + } + expect(verbsInCluster('prefix').length, 'prefix family').toBe(25); + expect(verbsInCluster('aimed').length, 'aimed at someone').toBe(9); + expect(verbsInCluster('facing').length, 'facing someone').toBe(5); + expect(verbsInCluster('flip').length, 'upside down').toBe(6); + expect(DATIVE_VERBS.length).toBe(45); + // every cluster is reachable from a lesson, and every lesson's verbs exist + for (const c of VERB_CLUSTERS) { + expect(LEVELS.some(l => l.cluster === c.key), `no lesson teaches ${c.key}`).toBe(true); + expect(c.name).toBeTruthy(); + expect(c.sub).toBeTruthy(); + expect(c.rule).toBeTruthy(); + } + }); + + // The whole claim of the first lesson. If a verb lands in the prefix cluster + // whose prefix is not a dative preposition, the lesson is teaching something + // false — unless it is flagged as the exception it is. + it('every prefix verb either follows the rule or is flagged as an exception', () => { + for (const name of verbsInCluster('prefix')) { + const v = VERB_BY_NAME[name]; + expect(v.pfx, `${name} has no pfx`).toBeTruthy(); + expect(v.de.startsWith(v.pfx), `${name} does not start with ${v.pfx}`).toBe(true); + if (!v.ruleExempt) { + expect(DATIVE_PREFIXES, `${name}: ${v.pfx} is not a dative preposition`).toContain(v.pfx); + } + const [pfx, rest] = splitPrefix(name); + expect(pfx).toBe(v.pfx); + expect(pfx + rest).toBe(v.de); + } + // the exceptions are few enough to be learnable as a pair, and named + const exempt = verbsInCluster('prefix').filter(n => VERB_BY_NAME[n].ruleExempt); + expect(exempt).toEqual(['widersprechen','widerstehen']); + }); + + it('the six exemplars show six different prefixes, and the tail is the rest', () => { + const pfxs = PREFIX_EXEMPLARS.map(n => VERB_BY_NAME[n].pfx); + expect(new Set(pfxs).size, 'exemplars should not repeat a prefix').toBe(PREFIX_EXEMPLARS.length); + // The lesson that teaches the rule must not use a counterexample to do it: + // every exemplar's prefix is a real dative preposition, none is flagged. + for (const n of PREFIX_EXEMPLARS) { + expect(VERB_BY_NAME[n].ruleExempt, `${n} is an exception, not an exemplar`).toBeFalsy(); + expect(DATIVE_PREFIXES).toContain(VERB_BY_NAME[n].pfx); + } + // nothing is taught twice and nothing is left untested + expect([...PREFIX_EXEMPLARS, ...PREFIX_TAIL_1, ...PREFIX_TAIL_2].sort()) + .toEqual([...PREFIX_VERBS].sort()); + expect(new Set([...PREFIX_TAIL_1, ...PREFIX_TAIL_2]).size).toBe(19); }); it('every trap points at a real verb that takes the OTHER case', () => { @@ -839,7 +895,7 @@ describe('verb case government', () => { } }); - it.each([30, 31, 32, 33, 34, 35])('level %s: the answer follows the verb', (id) => { + it.each([30, 31, 32, 33, 34, 35, 36, 37, 38, 39])('level %s: the answer follows the verb', (id) => { for (const q of runSession(id, 300)) { if (q.type === 'verbCase') { expect(q.ans).toBe(q.verb.cas); @@ -855,7 +911,7 @@ describe('verb case government', () => { }); it('two-object verbs are always person Dativ, thing Akkusativ', () => { - for (const q of runSession(33, 400)) { + for (const q of runSession(38, 400)) { expect(q.verb.cas).toBe('both'); const person = q.slot === 'dative' ? q.noun : q.otherNoun; const thing = q.slot === 'dative' ? q.otherNoun : q.noun; @@ -863,12 +919,12 @@ describe('verb case government', () => { expect(q.answerSentence).toContain(`${DEF[thing.g].accusative} ${thing.w}`); // and both slots get asked about, not just one } - const slots = new Set(runSession(33, 200).map(q => q.slot)); + const slots = new Set(runSession(38, 200).map(q => q.slot)); expect([...slots].sort()).toEqual(['accusative','dative']); }); it('inverted verbs put the German subject in the English object slot', () => { - for (const q of runSession(32, 300)) { + for (const q of runSession(33, 300)) { expect(q.cas).toBe('dative'); expect(q.subjNoun).toBeTruthy(); if (q.verb.enInv.mode === 'flip') { @@ -880,17 +936,35 @@ describe('verb case government', () => { } }); - it('"Im Satz" never smuggles in a preposition — the verb is the only clue', () => { + // Every verb lesson is an in-sentence lesson now, so this applies to all of + // them: if a preposition appears, the question stops being about the verb. + // A separable prefix sitting at the end of the clause is not a preposition + // doing work — it is the verb, which is the entire point of lesson one. + it.each([30, 31, 32, 33, 35, 36, 38, 39])('level %s never smuggles in a preposition', (id) => { const PREP_WORDS = Object.keys(PREPS); - for (const q of runSession(34, 300)) { + for (const q of runSession(id, 300)) { const words = q.answerSentence.toLowerCase().replace(/[.,]/g, '').split(' '); - const found = words.filter(w => PREP_WORDS.includes(w) && w !== q.verb.sep); + const found = words.filter(w => PREP_WORDS.includes(w) && w !== q.verb.sep && w !== q.verb.tail); expect(found, `"${q.answerSentence}" contains ${found.join(',')}`).toEqual([]); } }); + it('separable prefixes go to the end and inseparable ones stay attached', () => { + for (const q of runSession(39, 800)) { + const v = q.verb; + if (!v.pfx) continue; + if (v.sep) { + expect(q.answerSentence, `${v.de} should close with ${v.sep}`).toContain(` ${v.sep}.`); + expect(q.answerSentence).not.toContain(v.de); + } else { + // widersprechen: the conjugated form keeps the prefix on the front + expect(q.answerSentence, `${v.de} should keep ${v.pfx} attached`).toContain(v.ich.startsWith(v.pfx) ? v.ich : v.er); + } + } + }); + it('each verb level drills only the verbs it lists', () => { - for (const id of [30, 31, 32, 33, 34, 35]) { + for (const id of [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]) { const lv = LEVELS.find(l => l.id === id); for (const q of runSession(id, 200)) { expect(lv.verbs, `level ${id}`).toContain(q.verb.de); @@ -899,6 +973,84 @@ describe('verb case government', () => { }); }); +// ── The verbs on/off switch ───────────────────────────────── + +describe('verb government switch', () => { + const runOpts = (levelId, n, opts) => { + const sess = createSession(levelId, opts); + return Array.from({ length: n }, () => sess.next()); + }; + // Every tab whose lessons are not themselves about verbs. + const NON_VERB_LEVELS = LEVELS.filter(l => l.tab !== 'verb').map(l => l.id); + + it('every preposition frame for pronouns is a real preposition governing the case it claims', () => { + for (const f of PRON_PREP_FRAMES) { + expect(PREPS[f.prep], `${f.prep} is not a preposition`).toBeTruthy(); + const c = PREPS[f.prep].c; + // a Wechselpräposition can serve either case; a fixed one must match + expect(c === 'wechsel' || c === f.cas, `${f.prep} governs ${c}, not ${f.cas}`).toBe(true); + expect(VC[f.v], `${f.prep}: no conjugation for ${f.v}`).toBeTruthy(); + expect(f.en).toBeTruthy(); + } + // both cases are reachable, or one of them could never be asked + expect(new Set(PRON_PREP_FRAMES.map(f => f.cas))).toEqual(new Set(['accusative','dative'])); + }); + + it('with verbs OFF, nothing outside the Verbs tab is decided by a verb', () => { + for (const id of NON_VERB_LEVELS) { + for (const q of runOpts(id, 200, { verbs: false })) { + if (q.type === 'poss' || q.type === 'pronoun') { + expect(q.prepKey, `level ${id} fell back to a verb: ${q.sentence}`).toBeTruthy(); + } + } + } + }); + + it('with verbs OFF, every level outside the Verbs tab still generates cleanly', () => { + for (const id of NON_VERB_LEVELS) { + for (const q of runOpts(id, 120, { verbs: false })) { + expect(q, `level ${id} produced nothing`).toBeTruthy(); + expect(q.ans, `level ${id} has no answer`).toBeTruthy(); + if (q.sentence) expect(q.sentence).toContain('_____'); + // the blank-screen class of bug: the shared screen reads q.noun + if (q.type !== 'pronoun' && q.type !== 'contraction' && q.type !== 'prep' + && q.type !== 'verbCase' && q.type !== 'compForm') { + expect(q.noun?.g, `level ${id} (${q.type}) has no noun`).toBeTruthy(); + } + } + } + }); + + it('pronoun questions keep no noun on either setting, so the guard stays real', () => { + for (const opts of [{ verbs: false }, { verbs: true }]) { + for (const q of runOpts(17, 200, opts)) { + expect(q.noun).toBeUndefined(); + expect(q.pron?.nom).toBeTruthy(); + } + } + }); + + // "Turn verbs on and each tab becomes about 50% verbs." Measured, not + // asserted exactly: the draw is random, so this is a band wide enough not + // to flake and narrow enough to catch a path that stopped being reachable. + it('with verbs ON, the two mixable tabs are roughly half and half', () => { + for (const id of [13, 17]) { + const qs = runOpts(id, 1200, { verbs: true }); + const share = qs.filter(q => !q.prepKey).length / qs.length; + expect(share, `level ${id} verb-governed share was ${share.toFixed(2)}`).toBeGreaterThan(0.3); + expect(share, `level ${id} verb-governed share was ${share.toFixed(2)}`).toBeLessThan(0.7); + } + }); + + it('with verbs OFF, the preposition path still reaches both cases and many prepositions', () => { + const qs = runOpts(17, 600, { verbs: false }); + expect(new Set(qs.map(q => q.cas))).toEqual(new Set(['accusative','dative'])); + expect(new Set(qs.map(q => q.prepKey)).size).toBeGreaterThanOrEqual(8); + const poss = runOpts(13, 600, { verbs: false }); + expect(new Set(poss.map(q => q.prepKey)).size).toBeGreaterThanOrEqual(10); + }); +}); + // ── Anti-repeat across a round ────────────────────────────── describe('no repeats within a round', () => { @@ -1007,7 +1159,7 @@ describe('question field contract', () => { }); it('verbCase questions carry the verb, not a noun', () => { - for (const id of [30, 31]) { + for (const id of [34, 37]) { for (const q of runSession(id, 120)) { expect(q.verb?.de).toBeTruthy(); expect(q.verb?.en).toBeTruthy();