Rebuild the Verbs tab on the prefix rule, and add a verbs on/off switch
Five clusters, named as signed off, taught in the order that makes each one cheapest to learn: Prepositions in Disguise the free ones 25 verbs, one rule Aimed at Someone the list you learn 9 Facing Someone the list you learn 5 Upside Down Verbs the subject swaps 6 The Five Liars where English misleads 5 pairs The organising claim is that a verb beginning with a dative preposition takes the dative, so 25 of the 45 dative verbs cost one rule rather than 25 memorisations. The UI makes that visible instead of stating it: the prefix is printed in the dative colour wherever a verb appears, in the Lernen panel, in the rule modal and in Charts. zuhören, beitreten, widersprechen. The rule has a hole, and the lesson now says so. As a preposition, wider governs the ACCUSATIVE (wider Erwarten), so widersprechen and widerstehen being dative is not something the rule predicts. They carry a ruleExempt flag, are marked ✱ everywhere they appear, and a test fails if a verb lands in the prefix cluster whose prefix is not in DATIVE_PREFIXES without that flag — otherwise the first lesson would be teaching something false. Coverage: the earlier plan parked 19 prefix verbs in Charts as a reference list. That was wrong — a list you read is not a verb you can produce — so there are now two "Der Rest der Familie" lessons that drill them, and Daily Practice draws from all 68 verbs. Lesson one is six exemplars covering six different prefixes; nothing is taught twice and nothing is left untested, which a test asserts by set equality. Verbs on/off, defaulting to OFF. With it off every case in the app comes from a preposition, so a question never asks two unknowns at once, and the Verbs tab is hidden. On, the two tabs whose case source is a free choice go to roughly half and half. Only those two tabs change, and it is worth being precise about why: Präpositionen, Artikel, Adjektive and Komparativ lessons are named after the preposition group or the ending table they drill, so there is no verb-governed variant of "Dativ: mit, von, aus, bei" to mix in. The sign-off board claimed ~50% for every tab; that was my overstatement, not a decision, and the switch is implemented where it means something. Pronouns needed new code for this, as flagged. Every pronoun question was "Ich helfe ___", which leans on knowing helfen is dative, so with the switch off that tab had nothing to generate. PRON_PREP_FRAMES adds nine preposition-governed shapes (four accusative, five dative) — Er wartet auf mich, Er wohnt bei mir — and a test checks each frame's preposition really governs the case it claims. Pronoun questions still carry no noun on either setting, so the guard that fixed the blank screen stays real. Data: 29 new verbs. 25 prefix verbs across eight dative prefixes, ähneln, gehorchen and dienen for Facing Someone, gelingen and leidtun for the flippers (leidtun needed a `tail` field, since its clause closes with a fixed word). 45 dative verbs in total, which is where the "about 50" figure comes from once prefix verbs are counted individually rather than folded into a rule. Four things the corpus diff caught before they shipped: "I obey the child", "I serve the child", "I succeed the girl", and — the real one — "The doctor feels sorry for the doctor", because leidtun had people on both sides and Arzt/Ärztin are two German nouns with one English word. A collision scan over every verb line is now clean. The old test asserting the dative list "matches the reference" is gone; it matched my own subset, not a reference, and it now checks the cluster structure the lessons rely on and says in a comment why no canonical list exists to check against. Two things the browser pass caught that tests could not. The Lernen panel had widersprechen among the six exemplars with its prefix coloured like the rest — presenting the one verb the rule does not predict as proof of the rule, on the same screen as the note saying it is an exception. It is now ausweichen, and a test fails if a ruleExempt verb is ever used as an exemplar. And the prefix colour means "this prefix is a preposition governing THIS case", so wider- now prints in the accusative colour rather than the dative one: it really is a preposition, it just governs the other case, which is the whole reason those two verbs are exceptions. 219 tests pass. Every level in every tab renders and answers on both switch settings — 57 rows with verbs on, 45 with verbs off, no page errors — driven by clicking through the real UI rather than calling the generator. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017Uza6mhTpAvSwMQuFc4Cz8
This commit is contained in:
+269
-40
@@ -4,7 +4,9 @@ import {
|
|||||||
PRONOUNS, POSSESSIVES, POSS_ENDINGS, combinePoss, LEVELS,
|
PRONOUNS, POSSESSIVES, POSS_ENDINGS, combinePoss, LEVELS,
|
||||||
wechselExample, createSession, bumpStreak, currentStreak, weekDots,
|
wechselExample, createSession, bumpStreak, currentStreak, weekDots,
|
||||||
nounForm, ADJ_ENDINGS, ADJ_CLASS_LABEL, ADJ_CLASS_HINT, DER_ENDINGS,
|
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,
|
ADJECTIVES, COMPARISON_IRREGULARS, amForm, enDegree,
|
||||||
} from './engine.js';
|
} from './engine.js';
|
||||||
|
|
||||||
@@ -224,9 +226,17 @@ export default function App() {
|
|||||||
await Storage.set(s);
|
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 hintHidden = k => !!st.hide?.[k];
|
||||||
const toggleHint = k => save({...st, hide:{...(st.hide||{}), [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 hasPaidAccess = !!access?.paid;
|
||||||
const hasAccess = !PAYMENTS_ENABLED || hasPaidAccess;
|
const hasAccess = !PAYMENTS_ENABLED || hasPaidAccess;
|
||||||
const gated = id => PAYMENTS_ENABLED && !hasPaidAccess && !FREE_LEVEL_IDS.has(id);
|
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; }
|
if (!unlocked(id)) { setPayMsg(''); setScr('paywall'); return; }
|
||||||
const lvObj = LEVELS.find(l => l.id === id);
|
const lvObj = LEVELS.find(l => l.id === id);
|
||||||
if (lvObj?.tab) setTab(lvObj.tab);
|
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');
|
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(() => {
|
const doNext = useCallback(() => {
|
||||||
if (res.length >= ROUND) { setScr('summary'); return; }
|
if (res.length >= ROUND) { setScr('summary'); return; }
|
||||||
setInp(''); setRev(false); setOk(false); setPickPrep(null);
|
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());
|
setQ(sessionRef.current.next());
|
||||||
}, [res, lv]);
|
}, [res, lv, verbsOn]);
|
||||||
|
|
||||||
submitRef.current = doSubmit;
|
submitRef.current = doSubmit;
|
||||||
nextRef.current = doNext;
|
nextRef.current = doNext;
|
||||||
@@ -361,9 +371,9 @@ export default function App() {
|
|||||||
const dailyUnlockedFor = t => tabLessons(t).every(l => passedLv(l.id));
|
const dailyUnlockedFor = t => tabLessons(t).every(l => passedLv(l.id));
|
||||||
// The next tab (cycling through the top tabs) with an unlocked Daily Practice.
|
// The next tab (cycling through the top tabs) with an unlocked Daily Practice.
|
||||||
const nextDailyAfter = t => {
|
const nextDailyAfter = t => {
|
||||||
const i = TABS.findIndex(x => x.id === t);
|
const i = visibleTabs.findIndex(x => x.id === t);
|
||||||
for (let k = 1; k < TABS.length; k++) {
|
for (let k = 1; k < visibleTabs.length; k++) {
|
||||||
const cand = TABS[(i + k) % TABS.length];
|
const cand = visibleTabs[(i + k) % visibleTabs.length];
|
||||||
if (dailyUnlockedFor(cand.id)) return { tab: cand, level: dailyFor(cand.id) };
|
if (dailyUnlockedFor(cand.id)) return { tab: cand, level: dailyFor(cand.id) };
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@@ -409,7 +419,7 @@ export default function App() {
|
|||||||
{scr === 'menu' && (
|
{scr === 'menu' && (
|
||||||
<div>
|
<div>
|
||||||
<div style={S.tabs}>
|
<div style={S.tabs}>
|
||||||
{TABS.map(t => (
|
{visibleTabs.map(t => (
|
||||||
<button key={t.id}
|
<button key={t.id}
|
||||||
style={{...S.tab, ...(tab===t.id ? S.tabActive : {})}}
|
style={{...S.tab, ...(tab===t.id ? S.tabActive : {})}}
|
||||||
onClick={()=>setTab(t.id)}>
|
onClick={()=>setTab(t.id)}>
|
||||||
@@ -455,6 +465,15 @@ export default function App() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
{tab === 'verb' && (
|
||||||
|
<div style={{...S.lvRow, cursor:'pointer'}}
|
||||||
|
onClick={()=>setRule('verblearn')}>
|
||||||
|
<div style={{flex:1, minWidth:0}}>
|
||||||
|
<div style={S.lvName}>📚 Lernen</div>
|
||||||
|
<div style={S.lvDesc}>Learn the rule first — then 25 of these verbs come free</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
{LEVELS.filter(l => l.tab === tab && !l.daily).sort((a,b)=>a.id-b.id).map(l => {
|
{LEVELS.filter(l => l.tab === tab && !l.daily).sort((a,b)=>a.id-b.id).map(l => {
|
||||||
const u = unlocked(l.id);
|
const u = unlocked(l.id);
|
||||||
const s = st.sc[l.id];
|
const s = st.sc[l.id];
|
||||||
@@ -475,8 +494,24 @@ export default function App() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button style={S.chartLinkBtn} onClick={()=>setChart(true)}>
|
<button style={S.chartLinkBtn} onClick={()=>setChart(true)}>
|
||||||
View {TABS.find(t=>t.id===tab).label.toLowerCase()} charts
|
View {(visibleTabs.find(t=>t.id===tab) || TABS[0]).label.toLowerCase()} charts
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
{/* The one setting that changes what questions you get. Off means
|
||||||
|
every case in the app is decided by a preposition. */}
|
||||||
|
<div style={S.setRow} onClick={()=>save({...st, verbs: !verbsOn})}>
|
||||||
|
<div style={{flex:1, minWidth:0}}>
|
||||||
|
<div style={{fontSize:14, fontWeight:700}}>Verben entscheiden den Fall</div>
|
||||||
|
<div style={{fontSize:11.5, color:'#999', marginTop:2, lineHeight:1.5}}>
|
||||||
|
{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'}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div style={{...S.sw, ...(verbsOn ? S.swOn : {})}}>
|
||||||
|
<div style={{...S.swKnob, ...(verbsOn ? S.swKnobOn : {})}}/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
@@ -1052,6 +1087,7 @@ export default function App() {
|
|||||||
|
|
||||||
{chart && <ChartModal section={chartSection} q={q} onClose={()=>setChart(false)} onRule={kind => { setChart(false); setRule(kind || true); }}/>}
|
{chart && <ChartModal section={chartSection} q={q} onClose={()=>setChart(false)} onRule={kind => { setChart(false); setRule(kind || true); }}/>}
|
||||||
{rule && (rule === 'adj' ? <AdjRuleModal onClose={()=>setRule(false)}/>
|
{rule && (rule === 'adj' ? <AdjRuleModal onClose={()=>setRule(false)}/>
|
||||||
|
: rule === 'verblearn' ? <VerbLearnModal onClose={()=>setRule(false)}/>
|
||||||
: rule === 'verb' ? <VerbRuleModal onClose={()=>setRule(false)}/>
|
: rule === 'verb' ? <VerbRuleModal onClose={()=>setRule(false)}/>
|
||||||
: rule === 'comp' ? <CompRuleModal onClose={()=>setRule(false)}/>
|
: rule === 'comp' ? <CompRuleModal onClose={()=>setRule(false)}/>
|
||||||
: <WechselRuleModal onClose={()=>setRule(false)}/>)}
|
: <WechselRuleModal onClose={()=>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 <strong style={{fontSize:size}}>{v?.de || name}</strong>;
|
||||||
|
// 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 (
|
||||||
|
<strong style={{fontSize:size}}>
|
||||||
|
<span style={{color:col}}>{pfx}</span>{rest}
|
||||||
|
</strong>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const VerbGloss = ({ name, sep }) => {
|
||||||
|
const v = VERB_BY_NAME[name];
|
||||||
|
return (
|
||||||
|
<span>
|
||||||
|
<PrefixVerb name={name}/> <span style={{color:'#999'}}>{v.en}</span>
|
||||||
|
{v.ruleExempt && <span style={{color:CASE_C.accusative, fontSize:11}}> ✱</span>}
|
||||||
|
{sep}
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
// 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 (
|
||||||
|
<div style={S.overlay} onClick={onClose}>
|
||||||
|
<div style={S.modal} onClick={e=>e.stopPropagation()}>
|
||||||
|
<div style={{display:'flex',justifyContent:'space-between',alignItems:'center',marginBottom:14}}>
|
||||||
|
<div style={{fontSize:17,fontWeight:700}}>Lernen · the rule worth 25 verbs</div>
|
||||||
|
<button onClick={onClose} style={{background:'none',border:'none',fontSize:18,color:'#999',cursor:'pointer'}}>✕</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style={S.ruleLead}>
|
||||||
|
<strong>Akkusativ is the default.</strong> 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 <strong>25 come free</strong>, because they announce themselves.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style={S.ruleH}>Look at the front of the verb</div>
|
||||||
|
<div style={S.ruleBody}>
|
||||||
|
A verb that <strong>begins with one of the dative prepositions</strong> 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.
|
||||||
|
</div>
|
||||||
|
<div style={{...S.ruleEx, lineHeight:2, fontSize:15}}>
|
||||||
|
{prefixes.filter(p => DATIVE_PREFIXES.includes(p)).map((p, i, arr) => (
|
||||||
|
<span key={p}>
|
||||||
|
<span style={{color:CASE_C.dative, fontWeight:700}}>{p}-</span>{i < arr.length - 1 ? ' · ' : ''}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style={S.ruleH}>Six verbs, six prefixes</div>
|
||||||
|
<div style={S.ruleBody}>
|
||||||
|
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.
|
||||||
|
</div>
|
||||||
|
<div style={{display:'grid', gap:8, marginTop:10}}>
|
||||||
|
{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 (
|
||||||
|
<div key={n} style={{border:'1px solid #eee', borderRadius:8, padding:'9px 11px'}}>
|
||||||
|
<div style={{fontSize:15}}>
|
||||||
|
<PrefixVerb name={n}/> <span style={{color:'#999', fontSize:13}}>{v.en}</span>
|
||||||
|
</div>
|
||||||
|
<div style={{fontSize:13, color:'#555', marginTop:3}}>
|
||||||
|
Ich {v.ich} <strong style={{color:CASE_C.dative}}>{art}</strong> {obj}
|
||||||
|
{v.sep ? ` ${v.sep}` : ''}.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style={S.ruleH}>Separable or not</div>
|
||||||
|
<div style={S.ruleBody}>
|
||||||
|
Most of them split: the prefix leaves the verb and closes the sentence — <em>Ich
|
||||||
|
höre dem Mann <strong>zu</strong></em>. A few never split and keep the prefix on the
|
||||||
|
front — <em>Ich <strong>wider</strong>spreche dem Mann</em>. Either way the case is the
|
||||||
|
same, so this changes the word order and not the answer.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style={{...S.ruleH, color:CASE_C.accusative}}>✱ Where the rule does not hold</div>
|
||||||
|
<div style={S.ruleBody}>
|
||||||
|
Honesty, so you do not over-apply it: <strong>wider</strong> is <em>not</em> a dative
|
||||||
|
preposition — on its own it takes the accusative (<em>wider Erwarten</em>). So
|
||||||
|
<VerbGloss name="widersprechen" sep=" " /> and <VerbGloss name="widerstehen" sep="" />{' '}
|
||||||
|
being dative is not something the rule predicts. Two verbs, learnt as a pair, and
|
||||||
|
they are marked ✱ wherever they appear.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style={S.ruleH}>The 20 that are not free</div>
|
||||||
|
<div style={S.ruleBody}>
|
||||||
|
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:
|
||||||
|
</div>
|
||||||
|
<div style={{display:'grid', gap:7, marginTop:10}}>
|
||||||
|
{VERB_CLUSTERS.filter(c => c.key !== 'prefix').map(c => (
|
||||||
|
<div key={c.key} style={{border:'1px solid #eee', borderRadius:8, padding:'9px 11px'}}>
|
||||||
|
<div style={{fontSize:14, fontWeight:700}}>{c.name}</div>
|
||||||
|
<div style={{fontSize:12, color:'#999'}}>{c.sub}</div>
|
||||||
|
<div style={{fontSize:12.5, color:'#555', marginTop:4}}>{c.rule}</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button style={{...S.nextBtn, width:'100%', marginTop:16}} onClick={onClose}>
|
||||||
|
Got it{!IS_TOUCH && <span style={{opacity:0.5,fontSize:12,marginLeft:4}}>esc</span>}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 }) {
|
function VerbRuleModal({ onClose }) {
|
||||||
const dat = CASE_VERBS.filter(v => v.cas === 'dative' && !v.inverted);
|
const byCluster = k => CASE_VERBS.filter(v => v.cluster === k);
|
||||||
const inv = CASE_VERBS.filter(v => v.inverted);
|
const traps = byCluster('liars')
|
||||||
const two = CASE_VERBS.filter(v => v.cas === 'both');
|
|
||||||
const traps = CASE_VERBS.filter(v => v.cas === 'accusative' && v.trap)
|
|
||||||
.map(v => [v, VERB_BY_NAME[v.trap]]).filter(([, t]) => t && t.cas !== 'accusative');
|
.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) => (
|
||||||
|
<div style={{...S.ruleEx, lineHeight:2}}>
|
||||||
|
{verbs.map((v, i) => (
|
||||||
|
<VerbGloss key={v.de} name={v.de} sep={i < verbs.length - 1 ? ' · ' : ''}/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
return (
|
return (
|
||||||
<div style={S.overlay} onClick={onClose}>
|
<div style={S.overlay} onClick={onClose}>
|
||||||
<div style={S.modal} onClick={e=>e.stopPropagation()}>
|
<div style={S.modal} onClick={e=>e.stopPropagation()}>
|
||||||
@@ -1745,25 +1914,48 @@ function VerbRuleModal({ onClose }) {
|
|||||||
|
|
||||||
<div style={S.ruleLead}>
|
<div style={S.ruleLead}>
|
||||||
There is no list of accusative verbs to learn. <strong>Akkusativ is the default</strong> —
|
There is no list of accusative verbs to learn. <strong>Akkusativ is the default</strong> —
|
||||||
hundreds of verbs take it, so you only have to learn the exceptions. The dative
|
hundreds of verbs take it, so you only learn the dative exceptions. There are 45, and
|
||||||
list below is short, and almost everything else is accusative.
|
the first 25 of them follow a rule.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style={S.ruleH}>The dative verbs</div>
|
<div style={S.ruleH}>1 · Prepositions in Disguise <span style={{color:'#bbb',fontWeight:400}}>the free ones</span></div>
|
||||||
<div style={S.ruleBody}>
|
<div style={S.ruleBody}>
|
||||||
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.
|
||||||
</div>
|
</div>
|
||||||
<div style={{...S.ruleEx, lineHeight:1.9}}>
|
{list(byCluster('prefix'))}
|
||||||
{dat.map((v, i) => (
|
<div style={{...S.ruleBody, fontSize:12, color:'#999', marginTop:6}}>
|
||||||
<span key={v.de}>
|
✱ <strong>wider</strong> is not a dative preposition — it takes the accusative on its
|
||||||
<strong>{v.de}</strong> <span style={{color:'#999'}}>{v.en}</span>{i < dat.length - 1 ? ' · ' : ''}
|
own, so these two are exceptions rather than instances of the rule.
|
||||||
</span>
|
|
||||||
))}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style={S.ruleH}>The traps</div>
|
<div style={S.ruleH}>2 · Aimed at Someone <span style={{color:'#bbb',fontWeight:400}}>the list you learn</span></div>
|
||||||
<div style={S.ruleBody}>
|
<div style={S.ruleBody}>
|
||||||
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 <em>ich schlage ihn</em>,
|
||||||
|
where he is changed by it.
|
||||||
|
</div>
|
||||||
|
{list(byCluster('aimed'))}
|
||||||
|
|
||||||
|
<div style={S.ruleH}>3 · Facing Someone <span style={{color:'#bbb',fontWeight:400}}>the list you learn</span></div>
|
||||||
|
<div style={S.ruleBody}>
|
||||||
|
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.
|
||||||
|
</div>
|
||||||
|
{list(byCluster('facing'))}
|
||||||
|
|
||||||
|
<div style={S.ruleH}>4 · Upside Down Verbs <span style={{color:'#bbb',fontWeight:400}}>the subject swaps</span></div>
|
||||||
|
<div style={S.ruleBody}>
|
||||||
|
The thing is the subject and you are the dative, which is why they feel
|
||||||
|
backwards: <em>Das Buch gefällt mir</em> is "<strong>I</strong> like the book", not
|
||||||
|
"the book likes me".
|
||||||
|
</div>
|
||||||
|
{list(byCluster('flip'))}
|
||||||
|
|
||||||
|
<div style={S.ruleH}>5 · The Five Liars <span style={{color:'#bbb',fontWeight:400}}>where English misleads</span></div>
|
||||||
|
<div style={S.ruleBody}>
|
||||||
|
Near-synonyms that disagree. Both halves feel like doing something to a person, so
|
||||||
|
learn them as pairs — this is where marks go.
|
||||||
</div>
|
</div>
|
||||||
<table style={S.fullChart}>
|
<table style={S.fullChart}>
|
||||||
<thead><tr>
|
<thead><tr>
|
||||||
@@ -1774,22 +1966,12 @@ function VerbRuleModal({ onClose }) {
|
|||||||
{traps.map(([a, d]) => (
|
{traps.map(([a, d]) => (
|
||||||
<tr key={a.de}>
|
<tr key={a.de}>
|
||||||
<td style={{...S.fcTd, textAlign:'left'}}><strong>{a.de}</strong> <span style={{color:'#aaa',fontSize:11}}>{a.en}</span></td>
|
<td style={{...S.fcTd, textAlign:'left'}}><strong>{a.de}</strong> <span style={{color:'#aaa',fontSize:11}}>{a.en}</span></td>
|
||||||
<td style={{...S.fcTd, textAlign:'left'}}><strong>{d.de}</strong> <span style={{color:'#aaa',fontSize:11}}>{d.en}</span></td>
|
<td style={{...S.fcTd, textAlign:'left'}}><PrefixVerb name={d.de}/> <span style={{color:'#aaa',fontSize:11}}>{d.en}</span></td>
|
||||||
</tr>
|
</tr>
|
||||||
))}
|
))}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<div style={S.ruleH}>The ones that flip</div>
|
|
||||||
<div style={S.ruleBody}>
|
|
||||||
With these the German subject is the English object, which is why they feel
|
|
||||||
backwards: <em>Das Buch gefällt mir</em> is "<strong>I</strong> like the book",
|
|
||||||
not "the book likes me".
|
|
||||||
</div>
|
|
||||||
<div style={{...S.ruleEx, lineHeight:1.9}}>
|
|
||||||
{inv.map(v => <span key={v.de}><strong>{v.de}</strong> <span style={{color:'#999'}}>{v.en}</span> · </span>)}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style={S.ruleH}>Two objects at once</div>
|
<div style={S.ruleH}>Two objects at once</div>
|
||||||
<div style={S.ruleBody}>
|
<div style={S.ruleBody}>
|
||||||
One rule covers all of them: <strong>the person is Dativ, the thing is Akkusativ.</strong>
|
One rule covers all of them: <strong>the person is Dativ, the thing is Akkusativ.</strong>
|
||||||
@@ -2208,11 +2390,50 @@ function ChartModal({ section, q, onClose, onRule }) {
|
|||||||
<div style={{marginBottom:18}}>
|
<div style={{marginBottom:18}}>
|
||||||
<div style={S.chartH}>Verb Case Government</div>
|
<div style={S.chartH}>Verb Case Government</div>
|
||||||
<div style={{fontSize:11, color:'#999', marginBottom:10, lineHeight:1.5}}>
|
<div style={{fontSize:11, color:'#999', marginBottom:10, lineHeight:1.5}}>
|
||||||
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.
|
||||||
|
</div>
|
||||||
|
{VERB_CLUSTERS.filter(c => c.key !== 'liars').map(c => (
|
||||||
|
<div key={c.key} style={{marginBottom:12}}>
|
||||||
|
<div style={{fontSize:12, fontWeight:700}}>
|
||||||
|
{c.name} <span style={{color:'#bbb', fontWeight:400}}>· {c.sub}</span>
|
||||||
|
</div>
|
||||||
|
<div style={{fontSize:13, lineHeight:2, color:'#444'}}>
|
||||||
|
{verbsInCluster(c.key).map((n, i, arr) => (
|
||||||
|
<VerbGloss key={n} name={n} sep={i < arr.length - 1 ? ' · ' : ''}/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
<div style={{marginBottom:12}}>
|
||||||
|
<div style={{fontSize:12, fontWeight:700}}>
|
||||||
|
The Five Liars <span style={{color:'#bbb', fontWeight:400}}>· where English misleads</span>
|
||||||
|
</div>
|
||||||
|
<div style={{fontSize:13, lineHeight:2, color:'#444'}}>
|
||||||
|
{verbsInCluster('liars').map(n => {
|
||||||
|
const a = VERB_BY_NAME[n], d = VERB_BY_NAME[a.trap];
|
||||||
|
return (
|
||||||
|
<div key={n}>
|
||||||
|
<span style={{color:CASE_C.accusative}}>{a.de}</span>
|
||||||
|
<span style={{color:'#bbb'}}> {a.en} → </span>
|
||||||
|
<PrefixVerb name={d.de}/>
|
||||||
|
<span style={{color:'#bbb'}}> {d.en}</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style={{fontSize:13, lineHeight:2, color:'#444'}}>
|
<div style={{fontSize:13, lineHeight:2, color:'#444'}}>
|
||||||
<div><strong style={{color:CASE_C.dative}}>Dativ:</strong> {DATIVE_VERBS.join(', ')}</div>
|
<div style={{fontSize:12, fontWeight:700}}>
|
||||||
<div><strong style={{color:CASE_C.dative}}>Dativ + Akkusativ:</strong> {CASE_VERBS.filter(v=>v.cas==='both').map(v=>v.de).join(', ')}</div>
|
Dativ + Akkusativ <span style={{color:'#bbb', fontWeight:400}}>· person Dativ, thing Akkusativ</span>
|
||||||
|
</div>
|
||||||
|
{CASE_VERBS.filter(v=>v.cas==='both').map(v=>v.de).join(' · ')}
|
||||||
|
</div>
|
||||||
|
<div style={{fontSize:11, color:'#999', marginTop:8}}>
|
||||||
|
✱ <strong>wider</strong> is a preposition too, but it governs the{' '}
|
||||||
|
<span style={{color:CASE_C.accusative}}>Akkusativ</span> — so these two are
|
||||||
|
exceptions, not instances of the rule.
|
||||||
</div>
|
</div>
|
||||||
{onRule && <button style={{...S.ruleBtn, marginLeft:0, marginTop:10}} onClick={()=>onRule('verb')}>ⓘ Which case does the verb take?</button>}
|
{onRule && <button style={{...S.ruleBtn, marginLeft:0, marginTop:10}} onClick={()=>onRule('verb')}>ⓘ Which case does the verb take?</button>}
|
||||||
</div>
|
</div>
|
||||||
@@ -2373,6 +2594,14 @@ const S = {
|
|||||||
lvName: { fontSize:14, fontWeight:700, color:'#1a1a1a' },
|
lvName: { fontSize:14, fontWeight:700, color:'#1a1a1a' },
|
||||||
lvDesc: { fontSize:12, color:'#999', marginTop:1 },
|
lvDesc: { fontSize:12, color:'#999', marginTop:1 },
|
||||||
lvPct: { fontSize:14, fontWeight:700 },
|
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' },
|
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' },
|
sentence: { fontSize:26, fontWeight:600, color:'#1a1a1a', lineHeight:1.5, margin:'0 0 10px', letterSpacing:'-0.3px' },
|
||||||
|
|||||||
+462
@@ -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|Schwester Ich helfe meiner Schwester. I help my sister.
|
||||||
POSSTPL|-|dative|helfen|Tochter Ich helfe meiner Tochter. I help my daughter.
|
POSSTPL|-|dative|helfen|Tochter Ich helfe meiner Tochter. I help my daughter.
|
||||||
POSSTPL|-|dative|helfen|Vater Ich helfe meinem Vater. I help my father.
|
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|Arzt Ich rufe den Arzt an. I call the doctor.
|
||||||
VERB|anrufen|Ärztin Ich rufe die Ärztin 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.
|
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|Schwester Ich antworte der Schwester. I answer the sister.
|
||||||
VERB|antworten|Tochter Ich antworte der Tochter. I answer the daughter.
|
VERB|antworten|Tochter Ich antworte der Tochter. I answer the daughter.
|
||||||
VERB|antworten|Vater Ich antworte dem Vater. I answer the father.
|
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|Arzt Ich begegne dem Arzt. I meet the doctor.
|
||||||
VERB|begegnen|Ärztin Ich begegne der Ärztin. 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.
|
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|Schwester Ich begegne der Schwester. I meet the sister.
|
||||||
VERB|begegnen|Tochter Ich begegne der Tochter. I meet the daughter.
|
VERB|begegnen|Tochter Ich begegne der Tochter. I meet the daughter.
|
||||||
VERB|begegnen|Vater Ich begegne dem Vater. I meet the father.
|
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|Arzt Ich besuche den Arzt. I visit the doctor.
|
||||||
VERB|besuchen|Ärztin Ich besuche die Ärztin. 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.
|
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|Schwester Ich danke der Schwester. I thank the sister.
|
||||||
VERB|danken|Tochter Ich danke der Tochter. I thank the daughter.
|
VERB|danken|Tochter Ich danke der Tochter. I thank the daughter.
|
||||||
VERB|danken|Vater Ich danke dem Vater. I thank the father.
|
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|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|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.
|
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|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|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|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|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|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.
|
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|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|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|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|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|Ä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.
|
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|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|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|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|Arzt Ich glaube dem Arzt. I believe the doctor.
|
||||||
VERB|glauben|Ärztin Ich glaube der Ärztin. 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.
|
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|Stadt Ich kenne die Stadt. I know the city.
|
||||||
VERB|kennen|Tochter Ich kenne die Tochter. I know the daughter.
|
VERB|kennen|Tochter Ich kenne die Tochter. I know the daughter.
|
||||||
VERB|kennen|Vater Ich kenne den Vater. I know the father.
|
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|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|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.
|
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|Stadt Ich liebe die Stadt. I love the city.
|
||||||
VERB|lieben|Tochter Ich liebe die Tochter. I love the daughter.
|
VERB|lieben|Tochter Ich liebe die Tochter. I love the daughter.
|
||||||
VERB|lieben|Vater Ich liebe den Vater. I love the father.
|
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|Arzt Ich mag den Arzt. I like the doctor.
|
||||||
VERB|mögen|Ärztin Ich mag die Ärztin. 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.
|
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|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|Vater Ich mag den Vater. I like the father.
|
||||||
VERB|mögen|Zug Ich mag den Zug. I like the train.
|
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|Arzt Ich rate dem Arzt. I advise the doctor.
|
||||||
VERB|raten|Ärztin Ich rate der Ärztin. 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.
|
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|Schwester Ich verzeihe der Schwester. I forgive the sister.
|
||||||
VERB|verzeihen|Tochter Ich verzeihe der Tochter. I forgive the daughter.
|
VERB|verzeihen|Tochter Ich verzeihe der Tochter. I forgive the daughter.
|
||||||
VERB|verzeihen|Vater Ich verzeihe dem Vater. I forgive the father.
|
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|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|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.
|
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|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|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|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|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|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.
|
WECH|an|accusative|fahren|See Er fährt an den See. He drives to the lake.
|
||||||
|
|||||||
+247
-51
@@ -114,6 +114,7 @@ export const NOUNS = [
|
|||||||
{w:'Lehrer',g:'masculine',en:'teacher',gen:'Lehrers'},
|
{w:'Lehrer',g:'masculine',en:'teacher',gen:'Lehrers'},
|
||||||
{w:'Vater',g:'masculine',en:'father',gen:'Vaters',noIndef:true},
|
{w:'Vater',g:'masculine',en:'father',gen:'Vaters',noIndef:true},
|
||||||
{w:'Zug',g:'masculine',en:'train',gen:'Zuges'},
|
{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:'Regen',g:'masculine',en:'rain',gen:'Regens',noIndef:true},
|
||||||
{w:'Frau',g:'feminine',en:'woman',enPoss:'wife'},
|
{w:'Frau',g:'feminine',en:'woman',enPoss:'wife'},
|
||||||
{w:'Ärztin',g:'feminine',en:'doctor'},
|
{w:'Ärztin',g:'feminine',en:'doctor'},
|
||||||
@@ -132,6 +133,7 @@ export const NOUNS = [
|
|||||||
{w:'Woche',g:'feminine',en:'week',noIndef:true},
|
{w:'Woche',g:'feminine',en:'week',noIndef:true},
|
||||||
{w:'Arbeit',g:'feminine',en:'work',noIndef:true},
|
{w:'Arbeit',g:'feminine',en:'work',noIndef:true},
|
||||||
{w:'Brücke',g:'feminine',en:'bridge'},
|
{w:'Brücke',g:'feminine',en:'bridge'},
|
||||||
|
{w:'Partei',g:'feminine',en:'party'},
|
||||||
{w:'Kind',g:'neuter',en:'child',gen:'Kindes'},
|
{w:'Kind',g:'neuter',en:'child',gen:'Kindes'},
|
||||||
{w:'Haus',g:'neuter',en:'house',gen:'Hauses'},
|
{w:'Haus',g:'neuter',en:'house',gen:'Hauses'},
|
||||||
{w:'Buch',g:'neuter',en:'book',gen:'Buches'},
|
{w:'Buch',g:'neuter',en:'book',gen:'Buches'},
|
||||||
@@ -181,7 +183,7 @@ export const NOUNS = [
|
|||||||
{w:'Milch',g:'feminine',en:'milk',noIndef:true},
|
{w:'Milch',g:'feminine',en:'milk',noIndef:true},
|
||||||
{w:'Zeit',g:'feminine',en:'time',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) =>
|
export const nounForm = (noun, cas) =>
|
||||||
cas === 'genitive' && noun.gen ? noun.gen : noun.w;
|
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)
|
// cas 'accusative' | 'dative' | 'both' ('both' = person dative, thing accusative)
|
||||||
// inverted : German subject is the English object (Das Buch gefällt mir)
|
// inverted : German subject is the English object (Das Buch gefällt mir)
|
||||||
// trap : the near-synonym that takes the OTHER case
|
// 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'];
|
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:'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']},
|
{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
|
// 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:'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'},
|
{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'},
|
{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'},
|
{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'},
|
{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.
|
// ── Dativ, cluster 'aimed' — AIMED AT SOMEONE.
|
||||||
{de:'helfen', en:'help', ich:'helfe', er:'hilft', cas:'dative', obj:OBJ_ANIMATE, trap:'unterstützen'},
|
// No rule generates these; they are a list. What holds the list together is
|
||||||
{de:'danken', en:'thank', ich:'danke', er:'dankt', cas:'dative', obj:OBJ_PEOPLE},
|
// that something travels TO a person and nothing happens to the person: you
|
||||||
{de:'antworten', en:'answer', ich:'antworte', er:'antwortet', cas:'dative', obj:OBJ_PEOPLE, trap:'fragen'},
|
// give them help, thanks, an answer, advice, your trust, your belief.
|
||||||
{de:'glauben', en:'believe', ich:'glaube', er:'glaubt', cas:'dative', obj:OBJ_PEOPLE},
|
{de:'helfen', en:'help', ich:'helfe', er:'hilft', cas:'dative', cluster:'aimed', obj:OBJ_ANIMATE, trap:'unterstützen'},
|
||||||
{de:'folgen', en:'follow', ich:'folge', er:'folgt', cas:'dative', obj:OBJ_ANIMATE},
|
{de:'danken', en:'thank', ich:'danke', er:'dankt', cas:'dative', cluster:'aimed', obj:OBJ_PEOPLE},
|
||||||
{de:'gratulieren', en:'congratulate', ich:'gratuliere', er:'gratuliert', cas:'dative', obj:OBJ_PEOPLE},
|
{de:'antworten', en:'answer', ich:'antworte', er:'antwortet', cas:'dative', cluster:'aimed', obj:OBJ_PEOPLE, trap:'fragen'},
|
||||||
{de:'vertrauen', en:'trust', ich:'vertraue', er:'vertraut', cas:'dative', obj:OBJ_ANIMATE},
|
{de:'glauben', en:'believe', ich:'glaube', er:'glaubt', cas:'dative', cluster:'aimed', obj:OBJ_PEOPLE},
|
||||||
{de:'verzeihen', en:'forgive', ich:'verzeihe', er:'verzeiht', cas:'dative', obj:OBJ_PEOPLE},
|
{de:'gratulieren', en:'congratulate', ich:'gratuliere', er:'gratuliert', cas:'dative', cluster:'aimed', obj:OBJ_PEOPLE},
|
||||||
{de:'begegnen', en:'meet', ich:'begegne', er:'begegnet', cas:'dative', obj:OBJ_PEOPLE, trap:'treffen'},
|
{de:'vertrauen', en:'trust', ich:'vertraue', er:'vertraut', cas:'dative', cluster:'aimed', obj:OBJ_ANIMATE},
|
||||||
{de:'zuhören', en:'listen to', ich:'höre', er:'hört', cas:'dative', obj:OBJ_PEOPLE, sep:'zu', trap:'anrufen'},
|
{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', 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', obj:OBJ_ANIMATE},
|
{de:'schaden', en:'harm', ich:'schade', er:'schadet', cas:'dative', cluster:'aimed', obj:OBJ_ANIMATE},
|
||||||
|
|
||||||
// ── Dativ, inverted: the German subject is the English object.
|
// ── Dativ, cluster 'facing' — FACING SOMEONE.
|
||||||
{de:'gefallen', en:'please', er:'gefällt', cas:'dative', inverted:true, trap:'mögen',
|
// 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']},
|
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']},
|
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']},
|
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']},
|
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.
|
// ── Dativ + Akkusativ: one rule covers all of them — person dative, thing accusative.
|
||||||
// Only things you can actually hand over, recommend or explain.
|
// 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 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' };
|
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([
|
const verbNouns = (v, key) => [...new Set([
|
||||||
...((v[key] || []).flatMap(g => ADJ_NOUN_GROUPS[g] || [])),
|
...((v[key] || []).flatMap(g => ADJ_NOUN_GROUPS[g] || [])),
|
||||||
...(v[key + 'Nouns'] || []),
|
...(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'})},
|
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'})},
|
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'})},
|
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 SG_PRONOUN_KEYS = ['ich','du','er','sie_sg','es'];
|
||||||
export const PL_PRONOUN_KEYS = ['wir','ihr','sie_pl'];
|
export const PL_PRONOUN_KEYS = ['wir','ihr','sie_pl'];
|
||||||
export const FORMAL_PRONOUN_KEYS = ['Sie_sg','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, 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},
|
{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
|
// Verb case government. Accusative is the default for hundreds of transitive
|
||||||
// dative exceptions, the near-synonyms that disagree, and the sentences where
|
// verbs, so there is no accusative list — you learn the dative exceptions.
|
||||||
// the verb is the ONLY thing deciding the case.
|
// Five clusters, taught in the order that makes each one cheapest: the
|
||||||
{id:30, tab:'verb', name:'Welcher Fall?', desc:'Which case does this verb take?',
|
// generative rule first (25 verbs for one rule), then the two lists that no
|
||||||
verbs:[...CASE_VERBS.filter(v => v.cas !== 'both').map(v => v.de)], type:'verbCase'},
|
// rule covers, then the flip, then the pairs English collapses. The two
|
||||||
{id:31, tab:'verb', name:'Die Fallen', desc:'fragen vs antworten, treffen vs begegnen…',
|
// "Rest der Familie" lessons exist because a rule you have been shown is not
|
||||||
verbs:TRAP_VERBS, type:'verbCase'},
|
// the same as 19 verbs you can produce.
|
||||||
{id:32, tab:'verb', name:'Gefallen & Co.', desc:'Verbs where German flips subject and object',
|
{id:30, tab:'verb', name:'Prepositions in Disguise', desc:'the free ones — six verbs, six prefixes',
|
||||||
verbs:INVERTED_VERBS, type:'verbSentence'},
|
verbs:PREFIX_EXEMPLARS, type:'verbSentence', cluster:'prefix'},
|
||||||
{id:33, tab:'verb', name:'Dativ + Akkusativ', desc:'Two objects: person Dativ, thing Akkusativ',
|
{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'},
|
verbs:TWO_OBJECT_VERBS, type:'verbSentence'},
|
||||||
{id:34, tab:'verb', name:'Im Satz', desc:'No preposition — the verb decides the case',
|
{id:39, tab:'verb', name:'Alles gemischt', desc:'everything mixed — every verb, every pattern',
|
||||||
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',
|
|
||||||
verbs:CASE_VERBS.map(v => v.de), type:'verbSentence'},
|
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
|
// Comparison. The endings are the adjective tables unchanged — what is new is
|
||||||
// building the stem, and knowing which superlative shape a slot wants.
|
// 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
|
// 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
|
// 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).
|
// 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);
|
const lv = LEVELS.find(l => l.id === levelId);
|
||||||
if (lv?.daily) {
|
if (lv?.daily) {
|
||||||
const lessonIds = LEVELS.filter(l => l.tab === lv.tab && !l.daily).map(l => l.id);
|
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);
|
const id = drawBag(meta, 'lvl', lessonIds, meta.last.lvl);
|
||||||
meta.last.lvl = id;
|
meta.last.lvl = id;
|
||||||
if (!states[id]) states[id] = newState(shared);
|
if (!states[id]) states[id] = newState(shared);
|
||||||
return gen(id, states[id]);
|
return gen(id, states[id], opts);
|
||||||
},
|
},
|
||||||
state: meta,
|
state: meta,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
const state = newState();
|
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']},
|
{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 lv = LEVELS.find(l=>l.id===level);
|
||||||
const stem = pickAvoid(lv.possessives, state.last.stem);
|
const stem = pickAvoid(lv.possessives, state.last.stem);
|
||||||
state.last.stem = stem;
|
state.last.stem = stem;
|
||||||
const possMeaning = POSSESSIVES.find(p=>p.stem===stem).en;
|
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) {
|
if (wantPrep) {
|
||||||
const pool = lv.cases.includes('genitive')
|
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];
|
const cas = pick(lv.cases.filter(c => c !== 'genitive')) || lv.cases[0];
|
||||||
let noun, sentence, translation, tplVerb;
|
let noun, sentence, translation, tplVerb;
|
||||||
if (cas === 'accusative') {
|
if (cas === 'accusative') {
|
||||||
@@ -1255,7 +1433,7 @@ export function genPossQ(level, state = newState()) {
|
|||||||
prepKey:null, verb:tplVerb, tw:null, choices:possChoices(stem, ans)};
|
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 lv = LEVELS.find(l=>l.id===level);
|
||||||
const pronKey = drawBag(state, 'pron', lv.pronouns, state.last.pron);
|
const pronKey = drawBag(state, 'pron', lv.pronouns, state.last.pron);
|
||||||
state.last.pron = pronKey;
|
state.last.pron = pronKey;
|
||||||
@@ -1266,6 +1444,23 @@ export function genPronounQ(level, state = newState()) {
|
|||||||
const subjCandidates = SAFE_SUBJECT_KEYS.filter(k => k !== pronKey);
|
const subjCandidates = SAFE_SUBJECT_KEYS.filter(k => k !== pronKey);
|
||||||
const subjKey = pick(subjCandidates);
|
const subjKey = pick(subjCandidates);
|
||||||
const subj = PRONOUNS.find(p=>p.key===subjKey);
|
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;
|
let tpl;
|
||||||
if (cas === 'accusative') {
|
if (cas === 'accusative') {
|
||||||
tpl = pick([{v:'sehen'}, {v:'kennen'}, {v:'lieben'}]);
|
tpl = pick([{v:'sehen'}, {v:'kennen'}, {v:'lieben'}]);
|
||||||
@@ -1500,10 +1695,11 @@ export function genVerbSentenceQ(level, state = newState()) {
|
|||||||
const en = v.enInv.mode === 'flip'
|
const en = v.enInv.mode === 'flip'
|
||||||
? `The ${obj.en} ${v.enInv.v} the ${subj.en}.`
|
? `The ${obj.en} ${v.enInv.v} the ${subj.en}.`
|
||||||
: `The ${subj.en} ${v.enInv.v} the ${obj.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,
|
return { type:'verbSentence', verb:v, cas:'dative', noun:obj, subjNoun:subj, ans,
|
||||||
slot:'dative',
|
slot:'dative',
|
||||||
sentence: `${cap(DEF[subj.g].nominative)} ${subj.w} ${v.er} _____ ${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}.`,
|
answerSentence: `${cap(DEF[subj.g].nominative)} ${subj.w} ${v.er} ${ans} ${obj.w}${tail}.`,
|
||||||
translation: en, choices: articleChoices(ans, 'definite') };
|
translation: en, choices: articleChoices(ans, 'definite') };
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1720,7 +1916,7 @@ export function genCompDeclineQ(level, state = newState()) {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function gen(level, state = newState()) {
|
export function gen(level, state = newState(), opts = {}) {
|
||||||
const lv = LEVELS.find(l=>l.id===level);
|
const lv = LEVELS.find(l=>l.id===level);
|
||||||
if (lv.type==='compForm') return genCompFormQ(level, state);
|
if (lv.type==='compForm') return genCompFormQ(level, state);
|
||||||
if (lv.type==='compPlace') return genCompPlaceQ(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==='contraction') return genContractionQ(state);
|
||||||
if (lv.type==='prep') return genPrepQ(level, state);
|
if (lv.type==='prep') return genPrepQ(level, state);
|
||||||
if (lv.type==='wechselContext') return genWechselContextQ(level, state);
|
if (lv.type==='wechselContext') return genWechselContextQ(level, state);
|
||||||
if (lv.type==='poss') return genPossQ(level, state);
|
if (lv.type==='poss') return genPossQ(level, state, opts);
|
||||||
if (lv.type==='pronoun') return genPronounQ(level, state);
|
if (lv.type==='pronoun') return genPronounQ(level, state, opts);
|
||||||
return genArticleQ(level, state);
|
return genArticleQ(level, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1867,7 +2063,7 @@ export function enumerateCorpus() {
|
|||||||
if (sn === on) continue;
|
if (sn === on) continue;
|
||||||
const subj = NOUN_BY_NAME[sn], obj = NOUN_BY_NAME[on];
|
const subj = NOUN_BY_NAME[sn], obj = NOUN_BY_NAME[on];
|
||||||
add({ key: `VERB|${v.de}|${sn}|${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'
|
en: v.enInv.mode === 'flip'
|
||||||
? `The ${obj.en} ${v.enInv.v} the ${subj.en}.`
|
? `The ${obj.en} ${v.enInv.v} the ${subj.en}.`
|
||||||
: `The ${subj.en} ${v.enInv.v} the ${obj.en}.` });
|
: `The ${subj.en} ${v.enInv.v} the ${obj.en}.` });
|
||||||
|
|||||||
+166
-14
@@ -12,6 +12,9 @@ import {
|
|||||||
EIN_WORD_DETS, ADJ_ALL_ENDINGS,
|
EIN_WORD_DETS, ADJ_ALL_ENDINGS,
|
||||||
CASE_VERBS, VERB_BY_NAME, DATIVE_VERBS, TRAP_VERBS, INVERTED_VERBS, TWO_OBJECT_VERBS,
|
CASE_VERBS, VERB_BY_NAME, DATIVE_VERBS, TRAP_VERBS, INVERTED_VERBS, TWO_OBJECT_VERBS,
|
||||||
COMPARISON_IRREGULARS, amForm, flipUmlaut, enDegree,
|
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';
|
} from './engine.js';
|
||||||
|
|
||||||
const lvl7Has = (qs, p) => qs.some(q => q.prepKey === p);
|
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);
|
expect(new Set(CASE_VERBS.map(v => v.de)).size).toBe(CASE_VERBS.length);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('the dative list matches the reference', () => {
|
// There is no one canonical dative-verb list to check against: published
|
||||||
const REF = ['helfen','danken','antworten','glauben','folgen','gratulieren','vertrauen',
|
// counts run from about 16 to about 50, depending entirely on whether prefix
|
||||||
'verzeihen','begegnen','zuhören','raten','schaden',
|
// verbs are listed individually or folded into a rule. This app lists them
|
||||||
'gefallen','schmecken','fehlen','gehören'];
|
// individually and teaches the rule, which is where 45 comes from — 25 the
|
||||||
expect([...DATIVE_VERBS].sort()).toEqual([...REF].sort());
|
// 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', () => {
|
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)) {
|
for (const q of runSession(id, 300)) {
|
||||||
if (q.type === 'verbCase') {
|
if (q.type === 'verbCase') {
|
||||||
expect(q.ans).toBe(q.verb.cas);
|
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', () => {
|
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');
|
expect(q.verb.cas).toBe('both');
|
||||||
const person = q.slot === 'dative' ? q.noun : q.otherNoun;
|
const person = q.slot === 'dative' ? q.noun : q.otherNoun;
|
||||||
const thing = q.slot === 'dative' ? q.otherNoun : q.noun;
|
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}`);
|
expect(q.answerSentence).toContain(`${DEF[thing.g].accusative} ${thing.w}`);
|
||||||
// and both slots get asked about, not just one
|
// 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']);
|
expect([...slots].sort()).toEqual(['accusative','dative']);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('inverted verbs put the German subject in the English object slot', () => {
|
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.cas).toBe('dative');
|
||||||
expect(q.subjNoun).toBeTruthy();
|
expect(q.subjNoun).toBeTruthy();
|
||||||
if (q.verb.enInv.mode === 'flip') {
|
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);
|
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 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([]);
|
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', () => {
|
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);
|
const lv = LEVELS.find(l => l.id === id);
|
||||||
for (const q of runSession(id, 200)) {
|
for (const q of runSession(id, 200)) {
|
||||||
expect(lv.verbs, `level ${id}`).toContain(q.verb.de);
|
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 ──────────────────────────────
|
// ── Anti-repeat across a round ──────────────────────────────
|
||||||
|
|
||||||
describe('no repeats within 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', () => {
|
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)) {
|
for (const q of runSession(id, 120)) {
|
||||||
expect(q.verb?.de).toBeTruthy();
|
expect(q.verb?.de).toBeTruthy();
|
||||||
expect(q.verb?.en).toBeTruthy();
|
expect(q.verb?.en).toBeTruthy();
|
||||||
|
|||||||
Reference in New Issue
Block a user