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