G2G

Chapter Forty-Four

The Repetition

Die Wiederholung

A spiral ascending through the night sky, traced in warm gold against deep blue. Each loop returns to the same position—yet higher. Repetition that elevates. The word "wieder-" (again) contains a paradox: you cannot step in the same river twice. Yet seven German words teach the language of return, recovery, and renewal. How does repetition make you advance?

· · ·

Imagine a spiral path carved into obsidian, glowing from within with warm gold light. Each turn of the spiral follows the exact same curve as the turn before it, yet with each revolution, the path rises higher into the night sky. You trace the same pattern again and again, and yet you are never at the same place twice. This is the paradox of the spiral, and it is the central metaphor for understanding wieder- (again) in German.

Wieder- means "again," and it is one of the most paradoxical prefixes in any language. When you do something wieder (again), you are not returning to the exact starting point. You are repeating an action, but from a different position in time and space. The spiral never touches itself; it only circles back. This is profoundly different from simply repeating the same action identically. In German, wieder contains within it the knowledge that repetition is transformation. Every return is a new beginning at a higher elevation.

When a child learns to walk, she falls repeatedly. Each fall is a repetition, yet each is different. Her muscles are stronger now. Her balance has improved. Her understanding of weight and motion has deepened. When she falls the tenth time, she has returned to the same action—falling—yet she is no longer the same person who fell the first time. This is the truth that wieder encodes: repetition is spiral, not circle.

This chapter is about the spiral of language. Each of these seven words carries within it the image of circular motion combined with vertical ascent. They teach us that repetition is not monotony. Repetition is the path to mastery. Repetition is how we climb.

· · ·

Wiederholen is "to repeat," literally "to fetch-again." This is a word of retrieval. When you repeat something, you are not creating it anew from the void. You are fetching it from where it was left, retrieving it from the past, bringing it forward into the present moment. A student asks her teacher to wiederholen the explanation. She is not asking for a brand-new explanation, but for the teacher to fetch back the explanation that was already given, to retrieve it from the moment it was first spoken and bring it forward again. The student is asking: "Fetch back that knowledge you already shared with me. Let me receive it once more, and perhaps this time I will understand it better."

In a music rehearsal, the conductor says Wiederholen wir! (Let us repeat!) The musicians do not play a new piece. They fetch back the passage they just played and play it again. Yet because they are more skilled now, more attentive to detail, more unified as an ensemble, the second playing is richer than the first. The spiral rises. The notes are the same, but the musicians have climbed.

This word appears constantly in educational contexts because education is fundamentally about repetition with elevation. You learn a concept once. You practice it. You revisit it. Each time you wiederholen, you are not wasting time in futile duplication. You are climbing the spiral. You are incorporating the knowledge deeper into your being. The word wiederholen dignifies this process. It says: repetition is not failure. Repetition is the only path to mastery.

wiederholen /ˈviːdɐhoːlən/
verb — to repeat, to fetch again, to retrieve; to do something again; to restore or revive
PIE *kel- + *kʷel- — "to drive" (holen) + "to turn back" (wieder) — to drive back, to fetch back
ENG again + haul — semantic parallel: "to haul again" carries similar retrieval sense
DEU wieder-holen — literally "again-fetch"; common verb in instruction and practice contexts; reveals teaching as retrieval
ZHO 重复 / 重新 — chóngfù / chóngxīn — "again-do" / "again-new" — both emphasize the circular return
The word wiederholen reveals an ancient understanding of repetition: not as mindless mechanical duplication, but as active retrieval. To repeat is to fetch back, to go to where something was and bring it forward again. This is why wiederholen is the verb used in teaching: when a student asks you to repeat, they are asking you to journey back to where you left the knowledge and bring it forward once more. The spiral image captures this perfectly—you return to the same point (the original teaching moment) but retrieve it at a higher level of understanding. A German speaker saying "Ich fange an zu wiederholen" (I'm beginning to repeat) is not admitting defeat. They are acknowledging that they are climbing the spiral of mastery.

The key insight: Wiederholen means that when you repeat something, you are actively going back to fetch it. This is not passive rote memorization. This is conscious retrieval. Each time you wiederholen, you are demonstrating that you have the power to access what was, to call it back into the present, and to make it new again through fresh understanding.

· · ·

Wiedersehen is "to see again," but in German culture and speech, it carries a weight that the English translation cannot fully convey. The phrase Auf Wiedersehen! (literally "To seeing again!") is the most common farewell in German. When you say goodbye to someone in German, you are not simply saying "goodbye" in the sense of "farewell forever." You are saying: "I am certain we will see each other again. This separation is temporary. Our reunion is inevitable."

This is a fundamentally optimistic view of separation. Unlike "goodbye" (which comes from "God be with you" and has a valedictory, almost funeral quality), Auf Wiedersehen says: "Until we see each other again." The assumption is reunion. The expectation is return. The spiral turns once, separating the two people, but already the next loop is anticipated—the moment when they will see each other once more.

In German literature and philosophy, Wiedersehen has even deeper resonance. Goethe and the Romantics used this word to describe not just the physical act of seeing someone again, but the spiritual reunion with a beloved, the recovery of what was lost, the recognition of a soul once known in a past life or a distant place. When two people recognize each other across time and distance—when they suddenly see the truth of their connection—they sehen sich wieder (see each other again) in a sense that goes far beyond mere vision. They recognize something eternal.

The Chinese farewell 再见 (zàijiàn) uses the identical structure: 再 (zài) meaning "again" and 见 (jiàn) meaning "to see." This is not coincidence. It is a profound convergence of wisdom across cultures. Both languages, independently developing their primary farewell, arrived at the same image: goodbye is seeing-again, return is a new meeting, separation is only temporary because the spiral will bring us back around.

wiedersehen /ˈviːdɐzeːən/
verb — to see again, to encounter again, to be reunited; farewell phrase "Auf Wiedersehen!" (until we meet again)
PIE *kʷel- + *sekʷ- — "to turn back" (wieder) + "to see" (sehen) — to turn back to see, to look again
ENG again + see — English "see you again" carries similar reunion sense but without the verb form
DEU wieder-sehen — "again-see"; transformed into the cultural farewell "Auf Wiedersehen!" — the most common German goodbye
ZHO 再见 (zàijiàn) — literally "again-see" — IDENTICAL structure to wiedersehen! Chinese and German independently converged on this image for farewell.
The word wiedersehen is remarkable because it shows how language encodes cultural values and philosophical assumptions. In German, the farewell is not "goodbye" but "until we see each other again"—carrying with it the assumption that separation is temporary and reunion is certain. This optimistic spirit is embedded in the very grammar of the word. The Chinese farewell 再见 (zàijiàn) uses the identical structure: "again-see," demonstrating that this pattern of thought appears across cultures and languages, reflecting a deep human hope that what is separated will be reunited. When you say "Auf Wiedersehen," you are participating in thousands of years of human wisdom about how to part with grace and optimism.

The key insight: Wiedersehen carries an assumption of inevitability. When you see someone again, it is not accidental. It is part of the great spiral of return. The verb speaks to recognition, to reunion, to the certainty that those who are meant to meet will meet again. Every goodbye is a temporary pause in the spiral, not an ending.

· · ·

Zurückkommen is "to come back," or more precisely, "to come-back." The word contains zurück (back) and kommen (to come). But unlike wiederkommen (to come again), which would suggest a return to the same cycle, zurückkommen emphasizes the physical, spatial return to a place that was left. It is about the journey itself, the traversal of distance in reverse.

When a traveler who has been abroad for years kommt zurück (comes back), they are moving through space back to the place they left. The verb emphasizes the direction of return, the retracing of steps, the motion back toward the starting point. A thought that was lost in your mind kommt zurück (comes back) to you—it re-emerges, moves forward into consciousness again, reappears after a period of absence. A prisoner who is released kommt (comes) back to freedom. In every case, the verb emphasizes the spatial integrity of the return, the journey itself, the motion that carries you homeward.

Unlike wiedersehen (which focuses on recognition and reunion), zurückkommen emphasizes the journey itself, the act of retracing steps, the motion back toward the starting point. The spiral's geometric precision—each loop must return to its origin before it can rise higher—is captured in this word. There is a mathematical accuracy to zurückkommen, a sense that paths can be retraced, that what was traveled forward can be traveled backward.

zurückkommen /ˈtsuːɐ̯ʏkˌkɔmən/
verb — to come back, to return to a place; to come back to a topic; to recur or reappear; to return to consciousness
PIE *gʷem- + spatial back — "to come" + "back" — movement in reverse direction toward origin
ENG come back — English phrase, not a single verb; German fuses them into unified concept of spatial return
DEU zurück-kommen — "back-come"; emphasizes spatial return and movement in reverse direction; common in travel, memory, and discourse
ZHO 回来 (huílái) — "return-come" — similar spatial emphasis on directional movement back and homecoming
Zurückkommen differs from wiedersehen or wiederkommen in its emphasis on spatial return. While wiedersehen focuses on recognition and reunion with a person, zurückkommen focuses on the physical act of returning to a place. The word is especially common in discussions of travel, memory, and thought: "to come back to" a topic means to return to discussing it, to retrace your steps mentally through an argument. A person who has emigrated and kommt zurück is making a spatial and emotional journey home. The verb captures the integrity of the spiral—each loop must return to where it began before it can rise higher.

The key insight: Zurückkommen emphasizes the spatial integrity of return. When you come back, you are retracing a path, closing a circle, preparing the ground for the next spiral upward. This word is about journey, about direction, about the physical or mental motion that carries you home.

· · ·

Zurückgeben is "to give back," or "to return something to its owner." The word combines zurück (back) with geben (to give). When you gibst etwas zurück (give something back), you are placing something that was borrowed or taken back into the hands of the one who originally possessed it. This is the verb of restoration and restitution.

You borrow a book from a friend, you read it, and when you are finished, you gibst es zurück (give it back). The word contains no judgment, no sense of shame. It is simply the completion of the cycle: what was given is returned, the balance is restored, the relationship is honored. A player in a sport gibt den Ball zurück (gives the ball back), returning it to the game, returning it to its rightful place in the flow of play. A heart that has been broken by loss might ask for Frieden zurückgeben (to give back peace), asking for justice that will restore what was taken.

In German education and culture, the concept of zurückgeben extends metaphorically. A writer who has been influenced by a teacher might gibt etwas zurück (give something back) to the community—not in the sense of returning it to its original state, but in the sense of contributing, of sharing what was learned, of continuing the cycle of knowledge and growth. The spiral continues because each person who receives gives back in turn. Your gift today becomes tomorrow's gift that someone else will pass on to another. This is the eternal spiral of human culture.

zurückgeben /ˈtsuːɐ̯ʏkˌɡeːbən/
verb — to give back, to return something; to restore; to give in response (to answer); metaphorical: to contribute back to community
PIE *gʷem- + *gʰebʰ- — "to come/return" + "to give" — to give in the direction of return, to restore and rebalance
ENG give back — English phrase; German verb form suggests unified concept of restoration
DEU zurück-geben — "back-give"; appears in legal, educational, and everyday contexts of restitution and reciprocity
ZHO 还给 (háigěi) / 归还 — "return-give" / "restore-return" — both emphasize restitution and the continuation of cycles
Zurückgeben transforms the simple act of returning an object into a concept of cycle and reciprocity. When you give something back, you are not just completing a transaction—you are acknowledging that the object belongs to someone else and maintaining the social bonds of trust and community. In German culture, zurückgeben extends to the metaphorical realm: when someone has been given an opportunity or knowledge, they eventually geben zurück (give back) through their contributions to others. A teacher gives to a student; the student grows up and gives to new students. This captures the essence of the spiral: what goes around comes around, but each time it rises higher, enriched by what was learned in the cycle before.

The key insight: Zurückgeben is about completing the circle while maintaining its integrity. Every gift, every loan, every opportunity carries within it the implicit obligation to give back. The spiral of giving and receiving sustains human community and culture. When you give back, you are not diminishing yourself. You are ensuring that the spiral continues to rise.

· · ·

Weitermachen is "to continue," or more literally, "to make further." Weitergehen is "to carry on," or "to go further." Both words use weiter- (further, onward) combined with verbs of motion and action. Together, they capture the paradoxical truth of the spiral: that moving forward sometimes means making the same motion again, that progress requires persistence, that advancement is often simply the continuation of what you have already begun.

A teacher might say to a struggling student: Mach weiter! (Keep going!) or Geh weiter! (Carry on!) These commands are not asking the student to do something new, but to persist with what they have already started. There is something almost defiant in this combination of words—a refusal to stop, a commitment to keep moving, even when the path is difficult.

In the context of German literature and philosophy, weitermachen has taken on additional significance. During the post-war period, German writers and philosophers grappled with the question of how to continue living and creating after catastrophe. The word weitermachen—simply continuing, making further, persisting—became almost a moral imperative. Not forgetting, not denying, but continuing. Not turning away from history, but walking through it and emerging on the other side. The spiral does not stop; it transforms the tragedy it has passed through into a higher level of consciousness and responsibility.

weitermachen / weitergehen /ˈvaɪ̯tɐˌmaːxən / ˈvaɪ̯tɐˌɡeːən/
verb — to continue, to carry on, to keep going, to persist; to proceed further; to not give up
PIE *wid- + *gʰedʰ- — "against, further" + "to go" — to go onward, to make forward progress despite resistance
ENG further + go / make — English phrase construction; German combines into unified verbs of persistent forward motion
DEU weiter-machen / weiter-gehen — "further-make/go"; common in motivation, instruction, narrative continuation, and philosophical discourse
ZHO 继续 (jìxù) / 前进 — "continue" / "go-forward" — both capture the relentless persistence of forward motion
Weitermachen and weitergehen capture something essential about the spiral: it does not stop at the top of each revolution. It must continue. Progress is not a destination but a perpetual motion, a commitment to keep moving forward. These verbs are deceptively simple, but they encode a philosophy of persistence. To say Mach weiter! (Keep going!) is to acknowledge that the journey continues, that difficulties will be overcome not by extraordinary effort but by ordinary persistence, that the spiral rises through the simple, daily commitment to move further. German thinkers and writers, confronting trauma and loss, chose this word—weitermachen—as an emblem of survival and moral responsibility.

The key insight: Weitermachen and weitergehen teach that the spiral's elevation comes not from magical transformations but from persistence. Keep making. Keep going. The elevation will come through the continuation itself. You do not need extraordinary strength. You need only to refuse to stop.

· · ·

Wiedervereinigung is "reunification," one of the most significant words in modern German history. The word breaks down into three components: wieder- (again), ver- (together, thoroughly), and einigung (unification, from "eins," one). To reunify is to make one again, to restore what was unified before, to bring together what was separated. It is the ultimate expression of the spiral metaphor.

For German speakers, particularly those born before 1989, Wiedervereinigung is not merely a historical term. It is deeply personal. The word encompasses the experience of families divided by a wall for nearly three decades, separated by ideology, by geography, by the Cold War. Grandparents could not see grandchildren. Siblings grew up in different worlds under different regimes, speaking slightly different German, shaped by different histories. Wiedervereinigung is the moment when that wall fell, when families could embrace again, when a nation could reclaim its unity.

But the word also points to something deeper about the German cultural consciousness. Germany has been unified and divided many times throughout history. The idea of Wiedervereinigung—reunion, reunification—speaks to a deep longing for integration, for the restoration of wholeness. It is the ultimate spiral: what was one, became two, and through the forward motion of history, becomes one again. But the spiral means that this new unity is not identical to the old. It is a higher revolution, carrying within it the memory of separation, transformed into a commitment to never allow such division again. The reunified nation is not the same as the divided nations before the wall; it is wiser, more careful, more conscious of what unity requires.

Wiedervereinigung /ˈviːdɐfɛɐ̯ˌaɪ̯nɪɡʊŋ/
noun — reunification, the act of making one again; restoration of unity; historically, the reunification of Germany (1990)
PIE *kʷel- + *wer- + *h₁ey- — "again" + "together" + "one" — to make one again, to restore original unity at a higher level
ENG re-unification — similar structure but German emphasizes both return and the act of unifying thoroughly
DEU wieder-ver-einigung — "again-together-oneness"; formal, historical, and emotionally charged term; the official term for Germany's 1990 reunification
ZHO 统一 (tǒngyī) / 重聚 — "unify" / "re-gather" — both address the restoration of original wholeness
Wiedervereinigung is perhaps the most emotionally charged word in this chapter. It is a historical term that carries within it human memory, family separation, ideological struggle, and ultimately hope and reconciliation. The word was used officially to describe Germany's reunification in 1990, but it resonates far beyond that specific historical moment. It speaks to the universal human longing to restore what was broken, to reunite what was divided, to make whole again what was separated. The spiral's metaphor is particularly powerful here: Germany's path was not a simple return to the pre-1945 state, but a spiral that incorporated the lessons of division, the experience of separation, and the commitment to prevent such fracture in the future. When the wall fell and Germans crossed from East to West and West to East, embracing strangers who were somehow family, they were experiencing the truth of the spiral: what returns is transformed forever by what came between.

The key insight: Wiedervereinigung is the ultimate expression of the spiral's paradox. It means making one again, but the unity that emerges from separation is qualitatively different—deeper, more conscious, more precious—than the original unity could have been. The price of separation is paid with the currency of transformation. What returns is forever changed.

· · ·

All seven words in this chapter share a common root: the image of return. Yet each approaches return from a different angle, revealing different facets of the same universal truth.

Wiederholen teaches that return is an act of retrieval. When you repeat, you fetch back. You do not create anew; you resurrect what was.

Wiedersehen teaches that return is reunion. When you see someone again, you recognize an eternal connection. Separation is temporary; reunion is inevitable.

Zurückkommen teaches that return is spatial journey. When you come back, you retrace paths, close circles, prepare the ground for the next spiral upward.

Zurückgeben teaches that return is restitution. When you give back, you honor obligations, maintain community, ensure that gifts continue to circulate.

Weitermachen teaches that forward progress requires persistent motion. You continue not because the destination is near, but because continuation is the only path that rises.

Weitergehen teaches that the journey has no final destination. There is always further to go. The spiral continues infinitely upward.

Wiedervereinigung teaches that the highest form of return is the restoration of unity at a higher level of consciousness. What was separated and then reunited is forever transformed.

The spiral image unites them all. Each word speaks to a different facet of the same universal truth: that repetition is not mere duplication; it is transformation. That return is not regression; it is elevation. That the same action, done again, carries you higher.

· · ·

Now that you have absorbed the patterns of this chapter, try these guesses. Use the spiral metaphor as your guide. What would these words mean if they all carry within them the image of return combined with elevation?

These words are not in our official collection for this chapter, but they follow the same patterns you are learning. As you make your guesses, you are training your German intuition—learning to recognize how the language builds meaning from small, repeating components. The spiral does not just repeat; it grows more complex with each revolution.

· · ·

Now that you have absorbed the patterns of this chapter, try these more challenging guesses. These words extend the concept of return and repetition into new semantic territory.

As you make these guesses, notice how the prefix patterns expand into domains you may not have considered. Return is not just physical or temporal. Return is legal (rejection of a lawsuit), medical (revival of a patient), emotional (resumption of a relationship), and technical (re-recording of a song). The spiral is everywhere—in every aspect of German thought and culture.

· · ·

Check Your Understanding

Test your mastery of Die Wiederholung. Aim for 80% to demonstrate true comprehension of the spiral.

Words from Die Wiederholung (The Repetition)

wiederholen
repeat, fetch again
Wiedersehen
see again, reunion
zurückkommen
come back
zurückgeben
give back
weitermachen
continue, persist
weitergehen
carry on, go further
Wiedervereinigung
reunification
Patterns Discovered
Repetition as Elevation — The spiral is not a circle. When you wiederholen (repeat), you return to the same point but at a higher level of understanding. Repetition is not monotony; it is the path to mastery.

Return as RecognitionZurück- and wieder- carry opposite emphases. While zurück emphasizes spatial return and retracing steps, wieder emphasizes the eternal return, the inevitability of reunion. Auf Wiedersehen assumes that separation is temporary.

Continuation as ResistanceWeitermachen and weitergehen teach that progress comes not from extraordinary effort but from ordinary persistence. The spiral rises through the simple, daily refusal to stop.

Giving Back Sustains the SpiralZurückgeben reveals that the spiral continues only because those who receive eventually give. Knowledge, gifts, and opportunity circulate through communities because each person completes the cycle by giving back to others.

Bauwerkstatt

Building Workshop — Three Levels of Production Exercises
1 Wortbaukasten — Word Building Kit
Build the German phrase by clicking words in order:
Available words:
Build: "I see you again"
Available words:
Build: "We must continue"
Available words:
Build: "They repeat the material"
Available words:
2 Lückensatz — Gap Sentence
Fill in the blank: "Ich _______ dich bald _______." (I ___ you again soon.)
Fill in the blank: "Wir _______ nach einer Woche _______." (We ___ after a week.)
Fill in the blank: "Du musst _______." (You must ___)
Fill in the blank: "Die Schüler _______ das Material mehrmals." (The students ___ the material many times.)
3 Freies Bauen — Free Building
Translate to German: "to see again"
Translate to German: "to come back"
Translate to German: "to continue"
Translate to German: "to repeat"
Your Progress: 0 / 12 Correct

Lesen & Hören — Read and Listen

Ich sehe dich bald wieder.
Er kommt morgen zurück.
Wir müssen weitergehen.
Die Schüler wiederholen das Material.

Verständnisfragen — Comprehension Questions

1. What prefix patterns were used in the passage?
The prefixes from this chapter
Random prefixes
No prefixes at all
2. Identify a verb with a chapter prefix:
Any verb from the passage using this chapter's prefixes
A verb without prefixes
A noun instead of a verb
3. Fill in the blank with a conjugated verb from this chapter:
4. Understand the spatial or temporal relationships expressed:
The prefixes encode different meanings related to time or space
The prefixes have no meaning
The prefixes are decorative

Diktat — Dictation Exercise

Listen to a sentence and type what you hear. Click the button to hear each sentence once.

Sentence 1 of 2
A G2G Advisory Project
Your Progress
Words Collected 415 / 850 (49%)
Click to see all words ▾
Patterns & Grammar 96 / 145 (66%)
Click to see all patterns ▾
/* === BAUWERKSTATT SYSTEM === */ // Levenshtein distance function for fuzzy matching function levenshteinDistance(a, b) { const aL = a.toLowerCase(), bL = b.toLowerCase(); const track = Array(bL.length + 1).fill(null).map(() => Array(aL.length + 1).fill(0)); for (let i = 0; i <= aL.length; i++) track[0][i] = i; for (let j = 0; j <= bL.length; j++) track[j][0] = j; for (let j = 1; j <= bL.length; j++) { for (let i = 1; i <= aL.length; i++) { const indicator = aL[i - 1] === bL[j - 1] ? 0 : 1; track[j][i] = Math.min( track[j][i - 1] + 1, track[j - 1][i] + 1, track[j - 1][i - 1] + indicator ); } } return track[bL.length][aL.length]; } // Bauwerkstatt exercise data (to be filled with chapter-specific data) const bauwerkstattData = { level1: [], level2: [], level3: [] }; // State tracking let bauwerkstattState = { level1: { completed: [false, false, false, false], score: 0 }, level2: { completed: [false, false, false, false], score: 0 }, level3: { completed: [false, false, false, false], score: 0 }, assembled: [[], [], [], []] }; // Initialize Bauwerkstatt function initBauwerkstatt() { if (bauwerkstattData.level1.length === 0) return; // Level 1: Word Assembly bauwerkstattData.level1.forEach((ex) => { const bankId = `word-bank-${ex.id}`; const bank = document.getElementById(bankId); if (bank) { bank.innerHTML = ''; ex.words.forEach(word => { const chip = document.createElement('div'); chip.className = 'word-chip'; chip.textContent = word; chip.onclick = () => addToAssembly(ex.id, word); bank.appendChild(chip); }); } bauwerkstattState.assembled[ex.id - 1] = []; }); updateProgress(); } function addToAssembly(exId, word) { const areaId = `assembly-area-${exId}`; const area = document.getElementById(areaId); const bankId = `word-bank-${exId}`; const bank = document.getElementById(bankId); if (!bauwerkstattState.assembled[exId - 1]) { bauwerkstattState.assembled[exId - 1] = []; } // Add to assembly area const chip = document.createElement('div'); chip.className = 'word-chip placed'; chip.textContent = word; chip.onclick = () => removeFromAssembly(exId, word, chip); area.appendChild(chip); bauwerkstattState.assembled[exId - 1].push(word); // Mark as unavailable in bank const bankChips = bank.querySelectorAll('.word-chip'); bankChips.forEach(c => { if (c.textContent === word) c.classList.add('unavailable'); }); } function removeFromAssembly(exId, word, chipEl) { const bankId = `word-bank-${exId}`; const bank = document.getElementById(bankId); chipEl.remove(); const idx = bauwerkstattState.assembled[exId - 1].indexOf(word); if (idx > -1) bauwerkstattState.assembled[exId - 1].splice(idx, 1); // Re-enable in bank const bankChips = bank.querySelectorAll('.word-chip'); bankChips.forEach(c => { if (c.textContent === word) c.classList.remove('unavailable'); }); } function undoWordAssembly(exId) { const areaId = `assembly-area-${exId}`; const area = document.getElementById(areaId); const bankId = `word-bank-${exId}`; const bank = document.getElementById(bankId); area.innerHTML = ''; bauwerkstattState.assembled[exId - 1] = []; // Reset all chips in bank const bankChips = bank.querySelectorAll('.word-chip'); bankChips.forEach(c => c.classList.remove('unavailable')); const feedbackId = `feedback-${exId}`; const fb = document.getElementById(feedbackId); if (fb) fb.classList.remove('show', 'correct', 'close', 'incorrect'); } function checkWordAssembly(exId) { const ex = bauwerkstattData.level1[exId - 1]; if (!ex) return; const assembled = bauwerkstattState.assembled[exId - 1].join(' ').toLowerCase(); const correct = ex.correct.join(' ').toLowerCase(); const feedbackId = `feedback-${exId}`; const fb = document.getElementById(feedbackId); if (!fb) return; if (assembled === correct) { fb.className = 'exercise-feedback show correct'; fb.innerHTML = `
✓ Correct!
${ex.explanation}
`; if (!bauwerkstattState.level1.completed[exId - 1]) { bauwerkstattState.level1.completed[exId - 1] = true; bauwerkstattState.level1.score++; updateProgress(); } } else { fb.className = 'exercise-feedback show incorrect'; fb.innerHTML = `
Not quite yet.
Try again. The correct phrase is: ${ex.answer}
`; } } // Level 2 & 3: Gap sentences and free building function handleGapKeypress(event, exId) { if (event.key === 'Enter') checkGapSentence(exId); } function handleFreeKeypress(event, exId) { if (event.key === 'Enter') checkFreeBuilding(exId); } function checkGapSentence(exId) { const ex = bauwerkstattData.level2[exId - 1]; if (!ex) return; const input = document.getElementById(`gap-input-${exId}`); const answer = input.value.trim(); const feedbackId = `gap-feedback-${exId}`; const fb = document.getElementById(feedbackId); const accepted = ex.accepted_answers; const isCorrect = accepted.some(a => a.toLowerCase() === answer.toLowerCase()); if (isCorrect) { fb.className = 'exercise-feedback show correct'; fb.innerHTML = `
✓ Correct!
${answer.charAt(0).toUpperCase() + answer.slice(1)}. ${ex.explanation}
`; if (!bauwerkstattState.level2.completed[exId - 1]) { bauwerkstattState.level2.completed[exId - 1] = true; bauwerkstattState.level2.score++; updateProgress(); } } else { // Check for close matches let closest = null; let minDist = Infinity; for (const a of accepted) { const dist = levenshteinDistance(answer, a); if (dist < minDist) { minDist = dist; closest = a; } } if (minDist <= 2) { // Check if there's a specific error message let specificFeedback = null; if (ex.close_errors) { for (const err of ex.close_errors) { if (err.wrong.toLowerCase() === answer.toLowerCase()) { specificFeedback = err.feedback; break; } } } fb.className = 'exercise-feedback show close'; fb.innerHTML = `
Almost!
${specificFeedback || `You wrote '${answer}' — the right form is '${closest}'. ${ex.explanation}`}
`; } else { fb.className = 'exercise-feedback show incorrect'; fb.innerHTML = `
Not quite.
The answer is ${closest}. ${ex.explanation}
`; } } } function checkFreeBuilding(exId) { const ex = bauwerkstattData.level3[exId - 1]; if (!ex) return; const input = document.getElementById(`free-input-${exId}`); const answer = input.value.trim(); const feedbackId = `free-feedback-${exId}`; const fb = document.getElementById(feedbackId); const accepted = ex.accepted_answers; const isCorrect = accepted.some(a => a.toLowerCase() === answer.toLowerCase()); if (isCorrect) { fb.className = 'exercise-feedback show correct'; fb.innerHTML = `
✓ Correct!
${ex.explanation}
`; if (!bauwerkstattState.level3.completed[exId - 1]) { bauwerkstattState.level3.completed[exId - 1] = true; bauwerkstattState.level3.score++; updateProgress(); } } else { // Check for close matches let closest = null; let minDist = Infinity; for (const a of accepted) { const dist = levenshteinDistance(answer, a); if (dist < minDist) { minDist = dist; closest = a; } } if (minDist <= 2) { // Check for specific error feedback let specificFeedback = null; if (ex.close_errors) { for (const err of ex.close_errors) { if (err.wrong.toLowerCase() === answer.toLowerCase()) { specificFeedback = err.feedback; break; } } } fb.className = 'exercise-feedback show close'; fb.innerHTML = `
Almost!
${specificFeedback || `You wrote '${answer}' — the right answer is '${closest}'. ${ex.explanation}`}
`; } else { fb.className = 'exercise-feedback show incorrect'; fb.innerHTML = `
Not quite.
The answer is ${closest}. ${ex.explanation}
`; } } } function updateProgress() { const total = 12; // 4 + 4 + 4 const score = bauwerkstattState.level1.score + bauwerkstattState.level2.score + bauwerkstattState.level3.score; const scoreEl = document.getElementById('bauwerkstatt-score'); if (scoreEl) scoreEl.textContent = score; const bar = document.getElementById('bauwerkstatt-progress-bar'); if (bar) { bar.innerHTML = ''; const allCompleted = [ ...bauwerkstattState.level1.completed, ...bauwerkstattState.level2.completed, ...bauwerkstattState.level3.completed ]; allCompleted.forEach(completed => { const dot = document.createElement('div'); dot.className = 'progress-dot' + (completed ? ' completed' : ''); bar.appendChild(dot); }); } } // Initialize on page load document.addEventListener('DOMContentLoaded', () => { initBauwerkstatt(); }); /* === LESEN & HÖREN SECTION === */ const dictationSentences = []; let currentSpeed = 0.95; let isListening = false; let currentDictationIndex = 0; let isSpeaking = false; /** * Word-level diff for showing what changed */ function wordDiff(actual, expected) { const actualWords = actual.toLowerCase().split(/\s+/); const expectedWords = expected.toLowerCase().split(/\s+/); const result = []; const maxLen = Math.max(actualWords.length, expectedWords.length); for (let i = 0; i < maxLen; i++) { const aWord = actualWords[i] || ''; const eWord = expectedWords[i] || ''; if (aWord === eWord) { result.push(`${eWord}`); } else { result.push(`${aWord}`); } } return result.join(' '); } /** * Start listening to the passage */ function startListening() { if (isSpeaking) return; isListening = true; document.getElementById('listen-btn').style.display = 'none'; document.getElementById('stop-btn').style.display = 'inline-block'; const sentences = document.querySelectorAll('.passage-sentence'); sentences.forEach(s => s.classList.remove('reading')); // Speak with pauses between sentences const utterances = []; sentences.forEach((sentenceEl, idx) => { const text = sentenceEl.textContent.trim(); const utterance = new SpeechSynthesisUtterance(text); utterance.lang = 'de-DE'; utterance.rate = currentSpeed; utterance.onstart = () => { sentenceEl.classList.add('reading'); }; utterance.onend = () => { sentenceEl.classList.remove('reading'); // Add a pause between sentences if (idx < sentences.length - 1) { setTimeout(() => { if (isListening && idx + 1 < utterances.length) { speechSynthesis.speak(utterances[idx + 1]); } }, 300); } }; utterances.push(utterance); }); isSpeaking = true; if (utterances.length > 0) { speechSynthesis.speak(utterances[0]); } } /** * Stop listening */ function stopListening() { isListening = false; isSpeaking = false; speechSynthesis.cancel(); document.getElementById('listen-btn').style.display = 'inline-block'; document.getElementById('stop-btn').style.display = 'none'; document.querySelectorAll('.passage-sentence').forEach(s => s.classList.remove('reading')); } /** * Set speech rate */ function setSpeed(rate) { currentSpeed = rate; document.querySelectorAll('.speed-btn').forEach(btn => btn.classList.remove('active')); if (rate === 0.7) { document.getElementById('speed-slow').classList.add('active'); } else { document.getElementById('speed-normal').classList.add('active'); } // If currently speaking, restart with new rate if (isListening) { stopListening(); setTimeout(() => startListening(), 300); } } /** * Check comprehension question */ function checkComprehension(qNum, element, isCorrect) { // Disable all options for this question const options = element.parentElement.querySelectorAll('.comp-option'); options.forEach(opt => { opt.style.pointerEvents = 'none'; opt.style.opacity = '0.7'; }); const feedback = document.getElementById(`comp-feedback-${qNum}`); if (isCorrect) { element.classList.add('correct'); feedback.textContent = '✓ Correct!'; feedback.classList.add('show', 'correct'); } else { element.classList.add('incorrect'); feedback.textContent = '✗ Incorrect.'; feedback.classList.add('show', 'incorrect'); } } /** * Check fill-in-the-blank answer */ function checkFillBlank() { const input = document.getElementById('fill-blank-input'); const answer = 'kommt'; const userAnswer = input.value.trim().toLowerCase(); const feedback = document.getElementById('comp-feedback-3'); const distance = levenshteinDistance(userAnswer, answer); if (distance === 0) { feedback.textContent = '✓ Perfect!'; feedback.classList.add('show', 'correct'); input.style.borderColor = 'rgba(74, 180, 100, 0.5)'; } else if (distance <= 2) { feedback.textContent = `✓ Very close! The answer is: ${answer}`; feedback.classList.add('show', 'correct'); input.style.borderColor = 'rgba(74, 180, 100, 0.5)'; } else { feedback.textContent = `The correct answer is: ${answer}`; feedback.classList.add('show', 'incorrect'); input.style.borderColor = 'rgba(232, 164, 74, 0.5)'; } input.disabled = true; } /** * Play dictation sentence */ function playDictation() { if (currentDictationIndex >= dictationSentences.length) { return; } const sentence = dictationSentences[currentDictationIndex]; const utterance = new SpeechSynthesisUtterance(sentence); utterance.lang = 'de-DE'; utterance.rate = 0.8; document.getElementById('dictation-play-btn').disabled = true; utterance.onend = () => { document.getElementById('dictation-play-btn').disabled = false; }; speechSynthesis.speak(utterance); } /** * Check dictation answer */ function checkDictation() { const input = document.getElementById('dictation-input'); const userAnswer = input.value.trim(); const expectedAnswer = dictationSentences[currentDictationIndex]; const feedback = document.getElementById('dictation-feedback'); const result = document.getElementById('dictation-result'); if (!userAnswer) { feedback.textContent = 'Please type something first.'; feedback.classList.add('show', 'incorrect'); return; } const distance = levenshteinDistance(userAnswer, expectedAnswer); const maxDistance = Math.ceil(expectedAnswer.length * 0.15); feedback.classList.remove('correct', 'incorrect'); result.classList.remove('show'); if (distance === 0) { feedback.textContent = '✓ Perfect! You got it exactly right.'; feedback.classList.add('show', 'correct'); result.classList.add('show'); result.innerHTML = `Correct sentence: ${expectedAnswer}`; } else if (distance <= 3) { feedback.textContent = `✓ Very close! Only a few words different.`; feedback.classList.add('show', 'correct'); result.classList.add('show'); result.innerHTML = `What you wrote: ${wordDiff(userAnswer, expectedAnswer)}
Expected: ${expectedAnswer}`; } else { feedback.textContent = '✗ Not quite. Try again or listen once more.'; feedback.classList.add('show', 'incorrect'); result.classList.add('show'); result.innerHTML = `Expected: ${expectedAnswer}`; } // Update counter and prepare for next if (currentDictationIndex < dictationSentences.length - 1) { // Show "Next Sentence" button instead of auto-advancing let nextBtn = document.getElementById('dictation-next-btn'); if (!nextBtn) { nextBtn = document.createElement('button'); nextBtn.id = 'dictation-next-btn'; nextBtn.textContent = 'Next Sentence →'; nextBtn.style.cssText = 'margin-top:16px;padding:10px 24px;background:rgba(232,164,74,0.15);color:#e8a44a;border:1px solid rgba(232,164,74,0.3);border-radius:8px;cursor:pointer;font-family:inherit;font-size:0.95rem;display:block;'; nextBtn.onmouseover = function() { this.style.background = 'rgba(232,164,74,0.25)'; }; nextBtn.onmouseout = function() { this.style.background = 'rgba(232,164,74,0.15)'; }; feedback.parentNode.insertBefore(nextBtn, feedback.nextSibling); } nextBtn.style.display = 'block'; nextBtn.onclick = function() { currentDictationIndex++; updateDictationCounter(); input.value = ''; feedback.classList.remove('show'); result.classList.remove('show'); this.style.display = 'none'; }; } else { document.getElementById('dictation-play-btn').textContent = '✓ Dictation Complete!'; document.getElementById('dictation-play-btn').disabled = true; } } /** * Update dictation counter */ function updateDictationCounter() { const counter = document.getElementById('dictation-counter'); counter.textContent = `Sentence ${currentDictationIndex + 1} of ${dictationSentences.length}`; } // Initialize dictation counter on page load document.addEventListener('DOMContentLoaded', () => { updateDictationCounter(); });