You are an expert language tutor who specializes in teaching travelers. I am visiting [Germany] and want to learn the most essential phrases in [german] that will help me survive and communicate comfortably during my trip, all within 60 minutes of learning. Your task: Give me a concise list of 80–90 must-know phrases grouped by situation (e.g., introducing ,greetings, directions, restaurants, shopping, emergencies, medical , nursing ,casual talk). For each phrase, include: The phrase in [german] The English meaning The phonetic pronunciation (easy to say for English speakers with real pronounceaction) Highlight the 20 phrases I must memorize first (mark them with ⭐). At the end, summarize with: 15 quick pronunciation tips 15 local etiquette or cultural notes I should know. Tone: Simple, friendly, beginner-friendly A1-B1 level. Format: Use a clean table or clear sections for quick memorization.

Searching the Web

essential German travel phrases pronunciation tips cultural etiquette for tourists

Here is your complete 60-Minute German Survival Guide — everything organized, phonetic, and ready to memorize.

🇩🇪 German Survival Phrases for Travelers

A1–B1 Level | 60-Minute Study Plan

How to use this guide: Start with all ⭐ phrases first (~20 min), then scan the rest by situation (~30 min), then read the tips (~10 min).

1. 👋 Greetings

#GermanEnglishPhonetic Pronunciation
1⭐ Hallo!Hello!HA-lo
2⭐ Guten Morgen!Good morning!GOO-ten MOR-gen
3Guten Tag!Good day / Hello!GOO-ten TAHK
4Guten Abend!Good evening!GOO-ten AH-bent
5⭐ Tschüss! / Auf Wiedersehen!Bye! / Goodbye!CHÜSS / owf VEE-der-zay-en
6⭐ Bitte!Please / You're welcomeBIT-teh
7⭐ Danke (schön)!Thank you (very much)!DAHN-keh (shurn)
8Bitte schön!Here you go / You're welcomeBIT-teh shurn
9⭐ Entschuldigung!Excuse me / Sorry!ent-SHOOL-dee-goong
10Es tut mir leid.I'm sorry.es toot meer lyte

2. 🤝 Introducing Yourself

#GermanEnglishPhonetic Pronunciation
11⭐ Ich heiße…My name is…ikh HY-seh
12Wie heißen Sie?What is your name? (formal)vee HY-sen zee
13Wie geht es Ihnen?How are you? (formal)vee gayt es EE-nen
14⭐ Mir geht es gut, danke!I'm doing well, thanks!meer gayt es goot, DAHN-keh
15Ich komme aus… (England/Amerika)I come from…ikh KO-meh owss
16Ich spreche kein Deutsch.I don't speak German.ikh SHPREH-kheh kyne DOYTCH
17⭐ Sprechen Sie Englisch?Do you speak English?SHPREH-khen zee ENG-lish
18Freut mich!Nice to meet you!froyt mikh

3. 🗣️ Basic Communication & Understanding

#GermanEnglishPhonetic Pronunciation
19⭐ Können Sie das wiederholen?Can you repeat that?KUR-nen zee dahs VEE-der-ho-len
20⭐ Langsamer, bitte!Slower, please!LANG-zah-mer, BIT-teh
21Ich verstehe nicht.I don't understand.ikh fer-SHTAY-eh nikht
22Was bedeutet das?What does that mean?vahs beh-DOY-tet dahs
23Können Sie das aufschreiben?Can you write that down?KUR-nen zee dahs OWF-shry-ben
24Ja / NeinYes / Noyah / nyne
25VielleichtMaybefee-LYKHT
26Ich weiß nicht.I don't know.ikh vyss nikht

4. 🗺️ Directions & Getting Around

#GermanEnglishPhonetic Pronunciation
27⭐ Wo ist…?Where is…?voh ist
28⭐ Wie komme ich zum/zur…?How do I get to…?vee KO-meh ikh tsoom/tsoor
29Links / Rechts / GeradeausLeft / Right / Straight aheadlinks / rekhts / geh-RAH-deh-owss
30Die nächste StraßeThe next streetdee NEKH-steh SHTRAH-seh
31⭐ Wo ist die U-Bahn?Where is the subway/metro?voh ist dee OO-bahn
32Wo ist der Bahnhof?Where is the train station?voh ist dair BAHN-hof
33Wo ist das Hotel?Where is the hotel?voh ist dahs ho-TEL
34Weit / NahFar / Nearvyte / nah
35Können Sie mir helfen?Can you help me?KUR-nen zee meer HEL-fen
36Ein Taxi, bitte!A taxi, please!yne TAK-see, BIT-teh

5. 🍽️ Restaurants & Food

#GermanEnglishPhonetic Pronunciation
37⭐ Einen Tisch für… Personen, bitte.A table for… people, please.EYE-nen tish fyoor… per-ZOH-nen
38⭐ Die Speisekarte, bitte!The menu, please!dee SHPY-zeh-kar-teh, BIT-teh
39Ich möchte… bestellen.I would like to order…ikh MURCH-teh… beh-SHTEL-en
40Was empfehlen Sie?What do you recommend?vahs em-PFAY-len zee
41⭐ Zahlen, bitte!The bill, please!TSAH-len, BIT-teh
42Getrennt oder zusammen?Separate or together (bill)?geh-TRENT OH-der tsoo-ZAH-men
43Ich bin Vegetarier/Vegetarierin.I am vegetarian. (m/f)ikh bin veh-geh-TAH-ree-er/in
44Ich habe eine Allergie gegen…I have an allergy to…ikh HAH-beh EYE-neh al-er-GEE GAY-gen
45Ohne Fleisch, bitte.Without meat, please.OH-neh flysh, BIT-teh
46Sehr lecker!Very delicious!zair LEK-er
47Ein Wasser / Ein Bier, bitte.A water / A beer, please.yne VAH-ser / yne beer
48Zum Wohl! / Prost!Cheers!tsoom vohl / prohst

6. 🛍️ Shopping

#GermanEnglishPhonetic Pronunciation
49⭐ Wie viel kostet das?How much does this cost?vee feel KOS-tet dahs
50Zu teuer.Too expensive.tsoo TOY-er
51Haben Sie das in einer anderen Größe?Do you have this in another size?HAH-ben zee dahs in EYE-ner AN-der-en GRUR-seh
52Ich schaue nur.I'm just looking.ikh SHOW-eh noor
53Ich nehme das.I'll take this.ikh NAY-meh dahs
54Wo ist die Kasse?Where is the checkout?voh ist dee KAH-seh
55Kann ich mit Karte bezahlen?Can I pay by card?kahn ikh mit KAR-teh beh-TSAH-len
56Haben Sie eine Quittung?Do you have a receipt?HAH-ben zee EYE-neh KVIT-toong
57Rabatt / SaleDiscount / Salerah-BAHT / zayl

7. 🏨 Hotels & Accommodation

#GermanEnglishPhonetic Pronunciation
58Ich habe eine Reservierung.I have a reservation.ikh HAH-beh EYE-neh reh-zer-VEER-oong
59Ein Zimmer für… Nächte, bitte.A room for… nights, please.yne TSIM-er fyoor… NEKH-teh
60Wann ist Check-out?When is checkout?vahn ist CHEK-owt
61Der Schlüssel, bitte.The key, please.dair SHLÜS-el, BIT-teh
62Das Zimmer ist zu laut/kalt/heiß.The room is too loud/cold/hot.dahs TSIM-er ist tsoo lowt/kalt/hyss
63Wo ist das WLAN-Passwort?What is the WiFi password?voh ist dahs VEE-lahn PAHS-vort

8. 🚨 Emergencies

#GermanEnglishPhonetic Pronunciation
64⭐ Hilfe!Help!HIL-feh
65⭐ Rufen Sie die Polizei!Call the police!ROO-fen zee dee po-li-TSYE
66⭐ Rufen Sie einen Krankenwagen!Call an ambulance!ROO-fen zee EYE-nen KRAHN-ken-vah-gen
67⭐ Ich brauche einen Arzt!I need a doctor!ikh BROW-kheh EYE-nen artst
68Feuer!Fire!FOY-er
69Ich bin verletzt.I am injured.ikh bin fer-LETST
70Wo ist das nächste Krankenhaus?Where is the nearest hospital?voh ist dahs NEKH-steh KRAHN-ken-howss
71Mein Pass / Mein Portemonnaie wurde gestohlen.My passport / wallet was stolen.myne pahs / myne por-teh-MOH-neh VOOR-deh geh-SHTOH-len

9. 🩺 Medical & Health

#GermanEnglishPhonetic Pronunciation
72⭐ Ich habe Schmerzen hier.I have pain here.ikh HAH-beh SHMER-tsen heer
73Ich habe Fieber.I have a fever.ikh HAH-beh FEE-ber
74Ich habe eine Lebensmittelallergie.I have a food allergy.ikh HAH-beh EYE-neh LAY-bens-mit-el-al-er-GEE
75Ich nehme dieses Medikament.I take this medication.ikh NAY-meh DEE-zes meh-dee-kah-MENT
76Wo ist die nächste Apotheke?Where is the nearest pharmacy?voh ist dee NEKH-steh ah-po-TAY-keh
77Ich bin schwanger.I am pregnant.ikh bin SHVAHN-ger
78Ich brauche ein Rezept.I need a prescription.ikh BROW-kheh yne reh-TSEPT

10. 💬 Casual Talk & Polite Extras

#GermanEnglishPhonetic Pronunciation
79Schönes Wetter heute, oder?Nice weather today, right?SHUR-nes VET-er HOY-teh, OH-der
80Das ist wunderschön!That is beautiful!dahs ist VOON-der-shurn
81Können Sie ein Foto von mir machen?Can you take a photo of me?KUR-nen zee yne FOH-to fon meer MAH-khen
82Wo kann ich… kaufen?Where can I buy…?voh kahn ikh… KOW-fen
83Ich liebe Deutschland!I love Germany!ikh LEE-beh DOYTCH-lant
84Alles klar!All good! / Got it!AH-les klahr
85Kein Problem!No problem!kyne pro-BLAYM
86Einen Moment, bitte.One moment, please.EYE-nen mo-MENT, BIT-teh
87Was kostet der Eintritt?What is the entry fee?vahs KOS-tet dair EYE-N-trit
88Gibt es hier ein Touristenbüro?Is there a tourist office here?gipt es heer yne too-RIS-ten-bü-roh

⭐ The 20 Must-Memorize First (Priority List)

#GermanEnglish
1Hallo!Hello!
2Guten Morgen!Good morning!
3Tschüss!Goodbye!
4Bitte!Please / You're welcome
5Danke schön!Thank you very much!
6Entschuldigung!Excuse me / Sorry!
7Ich heiße…My name is…
8Sprechen Sie Englisch?Do you speak English?
9Mir geht es gut, danke!I'm fine, thanks!
10Können Sie das wiederholen?Can you repeat that?
11Langsamer, bitte!Slower, please!
12Wo ist…?Where is…?
13Wie komme ich zum/zur…?How do I get to…?
14Wo ist die U-Bahn?Where is the subway?
15Die Speisekarte, bitte!The menu, please!
16Zahlen, bitte!The bill, please!
17Wie viel kostet das?How much does this cost?
18Hilfe!Help!
19Rufen Sie einen Krankenwagen!Call an ambulance!
20Ich habe Schmerzen hier.I have pain here.

🔤 15 Quick Pronunciation Tips

  1. "ch" after a, o, u sounds like a throaty Scottish "loch" → Buch (book) = bookh
  2. "ch" after e, i sounds softer, like "hyuh" → ich = ikh (a light breathy sound)
  3. "w" in German = English "v"Wasser = VAH-ser, not "WAH-ser"
  4. "v" in German = English "f"vier (four) = feer
  5. "z" = "ts"Zimmer = TSIM-er, not "ZIM-er"
  6. "ß" (Eszett) = sharp "ss"Straße = SHTRAH-seh
  7. "ü" = say "ee" with rounded lipsTschüss = CHÜSS (like "choose" with pursed lips)
  8. "ö" = say "e" with rounded lipsschön = shurn
  9. "ä" = like English "air"Mädchen = MAYD-khen
  10. "ei" = English "eye"mein = mine, nein = nine
  11. "ie" = English "ee"Sie = zee, Bier = beer
  12. "eu" / "äu" = English "oy"Freude = FROY-deh, Fräulein = FROY-line
  13. "sp" and "st" at the start of a word = "shp" and "sht"Straße = SHTRAH-seh, sprechen = SHPREH-khen
  14. German vowels are PURE — no gliding. "o" stays "oh," never "oh-wuh"
  15. Every letter is (mostly) pronounced — unlike English, German spelling is very consistent. What you see is what you say!

🤝 15 Local Etiquette & Cultural Notes for Germany

  1. Firm handshake is standard — when meeting someone for the first time, a brief firm handshake with eye contact is expected. Hugging strangers is uncommon.
  2. Use "Sie" (formal you) with strangers — always address adults you don't know with Sie, not du. Switching to du is a big deal and usually initiated by the older/senior person.
  3. Punctuality is sacred — being late is considered rude. Arriving 5 minutes early is ideal, especially for appointments.
  4. Sundays are quiet — most shops are closed on Sundays. Stock up on Saturday. This is legally enforced in most states.
  5. Tipping is appreciated but not mandatory — round up the bill or add 5–10%. Say "Stimmt so" (SHTIMMT zo — "keep the change") when paying.
  6. You pay separately by default — Germans often split bills individually at restaurants. The waiter will ask "Getrennt oder zusammen?"
  7. Recycling is serious business — Germany has one of the world's strictest recycling systems. Use the correct bins (yellow for plastic, blue for paper, brown for organic, grey/black for general waste).
  8. Pfand (bottle deposit) — many bottles have a small deposit. Return them at supermarket machines to get your money back.
  9. Don't jaywalk — Germans largely wait for the green pedestrian light, even with no cars in sight. Crossing on red (especially with children nearby) draws disapproving looks.
  10. Eye contact when toasting — when saying Prost! or Zum Wohl!, make eye contact with each person. Not doing so is considered bad luck (and rude).
  11. Quiet hours (Ruhezeit) — noise is restricted between roughly 10 PM and 7 AM, and on Sunday afternoons. Loud music or DIY work during these times can lead to complaints.
  12. Greeting in small shops — say Hallo or Guten Tag when entering a small shop and Tschüss when leaving. Ignoring staff is considered impolite.
  13. Cash is still king in many places — many smaller restaurants, cafés, and markets are cash-only. Always carry some euros, especially outside big cities.
  14. Bread is a cultural treasure — Germany has over 300 varieties of bread. Trying the local bakery (Bäckerei) in the morning is a genuine cultural experience.
  15. Personal space matters — Germans value their personal space and privacy. Don't ask overly personal questions early in a conversation, and don't be offended if people seem reserved at first — warmth comes with familiarity.

🕐 Your 60-Minute Study Plan:
  • 0–20 min → Memorize the 20 ⭐ starred phrases
  • 20–45 min → Scan each category and say each phrase out loud
  • 45–55 min → Read the 15 pronunciation tips
  • 55–60 min → Skim the 15 cultural notes
Viel Spaß auf deiner Reise! 🎉 (Enjoy your trip! — feel-shpahs owf DY-ner RY-zeh)

We want to learn and memories the German in 1 month for goethe exam A1 to B1 level and bases on right manner and exam terms and pronounciations all about 😇🤌🏻

Searching the Web

Goethe exam A1 B1 German topics vocabulary grammar structure 2024 2025

Searching the Web

Goethe Zertifikat A1 A2 B1 exam format speaking writing reading listening sections requirements

Reading Web Page

https://www.deutschgym.com/post/about-goethe-exam

Here is your complete, structured 1-month Goethe Exam preparation guide — covering A1 → A2 → B1, all four skills, grammar, vocabulary, pronunciation, and daily study plans. 🎯

🇩🇪 Learn German in 1 Month: Goethe Exam A1 → B1

Complete Exam-Focused Study System


📋 PART 1 — Understanding the Goethe Exam

What is the Goethe-Zertifikat?

It is the official German language certificate issued by the Goethe-Institut, recognized worldwide for visas, citizenship, universities, and employment. It follows the CEFR scale (A1 → C2).

Exam Structure at Each Level

LevelWho It's ForReadingListeningWritingSpeakingPass Mark
A1Absolute beginners20–25 min20 min20 min15 min60% total
A2Pre-intermediate30 min30 min30 min15 min60% total
B1Independent user65 min40 min60 min15 min60% total

What Each Section Tests

📖 Reading (Lesen)
  • A1: Notices, posters, short classified ads, simple forms
  • A2: Short emails, newspaper headlines, ads, announcements
  • B1: Blog posts, newspaper articles, emails with opinions, written instructions
🎧 Listening (Hören)
  • A1: Everyday conversations, phone messages, public announcements
  • A2: Radio interviews, short dialogues, daily announcements
  • B1: Short presentations, informal conversations, announcements, monologues
✍️ Writing (Schreiben)
  • A1: Fill in simple forms, write a short text about yourself
  • A2: Write short messages about your daily environment
  • B1: Write a formal email/letter AND a forum post with an opinion
🗣️ Speaking (Sprechen)
  • A1: Introduce yourself, answer questions about everyday topics
  • A2: Ask/answer questions, negotiate with a partner
  • B1: Short presentation on an everyday topic + partner conversation (questions, suggestions, opinions)

📅 PART 2 — Your 4-Week Master Study Plan

Assumption: ~2–3 hours/day. Adjust pace if you have more or less time. Goal: Cover A1 (Week 1) → A2 (Week 2) → B1 bridge (Week 3) → Full exam practice (Week 4)

📆 WEEK 1 — A1 Foundation (Days 1–7)

Theme: Surviving basic communication
DayGrammar FocusVocabulary TopicSkill Practice
Day 1Alphabet + Pronunciation rulesNumbers 1–100, colors, days of the weekListen: spell your name aloud
Day 2Personal pronouns + verb "sein" (to be)Greetings, introductions, countriesSpeak: introduce yourself for 1 min
Day 3Present tense regular verbs (-en endings)Family members, professionsWrite: 5 sentences about your family
Day 4Articles: der/die/das + indefinite ein/eineHousehold items, rooms, furnitureRead: simple labeled diagrams
Day 5Negation: nicht / keinFood & drink vocabularyWrite: what you like/dislike eating
Day 6Question words: Wer? Was? Wo? Wann? Wie?Colors, clothing, weatherSpeak: ask & answer 10 questions
Day 7Review + A1 Mock TestAll Week 1 vocabularyPractice all 4 skills for 1 hour
Week 1 A1 Core Grammar Checklist:
  • Verb conjugation: ich bin, du bist, er/sie/es ist, wir sind, ihr seid, sie/Sie sind
  • Regular verbs: machen, spielen, wohnen, heißen, arbeiten, kommen
  • Nominative case (subject): Der Mann, die Frau, das Kind
  • Basic sentence: Subject + Verb + Object
  • Question formation: Verb first → Sprechen Sie Englisch?

📆 WEEK 2 — A2 Expansion (Days 8–14)

Theme: Navigating daily life
DayGrammar FocusVocabulary TopicSkill Practice
Day 8Accusative case (object): den/die/dasShopping, prices, quantitiesWrite: a shopping list + dialogue
Day 9Dative case: dem/der/demDirections, prepositions (in, auf, an, bei)Speak: give directions to your hotel
Day 10Modal verbs: können, müssen, wollen, dürfen, sollen, mögenTransport, travel, timetablesRead: a train schedule notice
Day 11Perfect tense (Perfekt): haben/sein + Partizip IIDaily routines, free time activitiesWrite: what you did yesterday
Day 12Separable verbs: aufstehen, ankommen, anrufenHealth, body parts, at the doctorSpeak: describe a daily routine
Day 13Comparative & superlative: groß → größer → am größtenWeather, seasons, adjectivesListen: A2 level dialogues
Day 14Review + A2 Mock TestAll Week 2 vocabulary4-skill practice session
Week 2 A2 Core Grammar Checklist:
  • Four cases: Nominative, Accusative, Dative, Genitive (intro)
  • Modal verbs in present tense
  • Perfekt with haben: Ich habe gegessen / gespielt / gemacht
  • Perfekt with sein: Ich bin gefahren / gegangen / gekommen
  • Separable verbs: Ich stehe um 7 Uhr auf
  • Imperative: Komm! / Gehen Sie! / Geht!
  • Coordinating conjunctions: und, aber, oder, denn, sondern

📆 WEEK 3 — B1 Bridge (Days 15–21)

Theme: Expressing opinions, reasoning, storytelling
DayGrammar FocusVocabulary TopicSkill Practice
Day 15Simple past (Präteritum): war, hatte, gingWork, job applications, office lifeRead: a job ad, write a short reply
Day 16Subordinate clauses: weil, dass, obwohl, wennMedia, news, social issuesWrite: give 3 reasons with "weil"
Day 17Relative clauses: der/die/das Mann, der…Environment, nature, travelSpeak: describe a person using a relative clause
Day 18Konjunktiv II: würde, könnte, hätte, wäreWishes, hypotheticals, polite requestsWrite: what you would do if you had a day off
Day 19Passive voice (intro): wird gemacht / wurde gebautTechnology, culture, historyRead: a short encyclopedic passage
Day 20Reflexive verbs: sich freuen, sich vorstellen, sich interessierenEmotions, relationships, hobbiesSpeak: talk about your interests for 2 min
Day 21Review + B1 Mock TestAll Week 3 vocabularyFull 4-skill timed practice
Week 3 B1 Core Grammar Checklist:
  • Präteritum of irregular verbs: gehen→ging, kommen→kam, sehen→sah
  • sein/haben in Präteritum: war, waren / hatte, hatten
  • Subordinating conjunctions: weil, dass, obwohl, wenn, als, nachdem, bevor
  • Verb moves to END in subordinate clause: Ich lerne Deutsch, weil es interessant ist.
  • Konjunktiv II: Ich würde gern nach Berlin fahren.
  • Relative clauses: Der Mann, der hier wohnt, ist nett.

📆 WEEK 4 — Full Exam Simulation & Refinement (Days 22–30)

DayFocus
Day 22Timed Reading practice: A1 + A2 + B1 texts
Day 23Timed Listening practice: A1 + A2 + B1 audio
Day 24Writing practice: Formal email (B1) + short form (A1)
Day 25Speaking practice: Record yourself, self-assessment
Day 26Grammar weak points revision (review your errors)
Day 27Full A1 mock exam (timed, all 4 modules)
Day 28Full B1 mock exam (timed, all 4 modules)
Day 29Pronunciation drill + Speaking partner practice
Day 30Light review + rest + confidence boost 🎉

📚 PART 3 — Essential Vocabulary by Topic (Goethe A1–B1)

Topic 1: Personal Information & Family

GermanEnglishPronunciation
der Namethe namedair NAH-meh
die Adressethe addressdee ah-DRES-seh
das Alterthe agedahs AL-ter
der Berufthe job/professiondair beh-ROOF
verheiratet / ledigmarried / singlefer-HY-rah-tet / LAY-dikh
der Ehemann / die Ehefrauhusband / wifedair AY-eh-man / dee AY-eh-frow
die Geschwistersiblingsdee geh-SHVIS-ter
der Sohn / die Tochterson / daughterdair zohn / dee TOKH-ter
der Großvater / die Großmuttergrandfather / grandmotherdair GROHSS-fah-ter / dee GROHSS-moot-er

Topic 2: Daily Routine & Time

GermanEnglishPronunciation
aufstehento get upOWF-shtay-en
frühstückento have breakfastFRÜH-shtü-ken
zur Arbeit gehento go to worktsoor AR-byt GAY-en
schlafen gehento go to sleepSHLAH-fen GAY-en
um … Uhrat … o'clockoom … oor
morgens / abendsin the morning / eveningMOR-gens / AH-bents
täglichdailyTAYK-likh
die Freizeitfree time / leisuredee FRY-tsyte

Topic 3: Travel & Transport (Exam Favorite!)

GermanEnglishPronunciation
der Bahnhoftrain stationdair BAHN-hof
der Flughafenairportdair FLOOK-hah-fen
die Abfahrt / die Ankunftdeparture / arrivaldee AB-fahrt / dee AN-koonft
das Gleisplatform/trackdahs glyss
einsteigen / aussteigento board / to get offEYN-shty-gen / OWSS-shty-gen
umsteigento transfer/change trainsOOM-shty-gen
die Fahrkarteticketdee FAHR-kar-teh
verspätetdelayedfer-SHPAY-tet
Hin- und Rückfahrtround triphin oont RÜK-fahrt

Topic 4: Health & Body (Exam Favorite!)

GermanEnglishPronunciation
der Arzt / die Ärztindoctor (m/f)dair artst / dee AIRTS-tin
die Schmerzenpain/achesdee SHMER-tsen
das Rezeptprescriptiondahs reh-TSEPT
die Apothekepharmacydee ah-po-TAY-keh
krank / gesundsick / healthykrahnk / geh-ZOONT
der Hustencoughdair HOOS-ten
das Fieberfeverdahs FEE-ber
die Versicherunginsurancedee fer-ZIH-kher-oong
Termin machento make an appointmentter-MEEN MAH-khen

Topic 5: Work & Education (B1 key topic)

GermanEnglishPronunciation
die Ausbildungvocational trainingdee OWSS-bil-doong
der LebenslaufCV / résumédair LAY-bens-lowf
bewerben (sich)to apply for a jobbeh-VER-ben
die Stelle / der Jobposition / jobdee SHTEL-eh / dair job
das Gehaltsalarydahs geh-HALT
der Kollegecolleaguedair ko-LAY-geh
kündigento resign / quitKÜN-di-gen
die Fortbildungcontinuing educationdee FORT-bil-doong

Topic 6: Opinions & Argumentation (B1 Writing/Speaking)

GermanEnglishPronunciation
Ich finde, dass…I think that…ikh FIN-deh dahs
Meiner Meinung nach…In my opinion…MY-ner MY-noong nahkh
Einerseits… andererseits…On one hand… on the other…EYE-ner-zyts… AN-der-er-zyts
Ich bin dafür / dagegen.I am for / against it.ikh bin dah-FÜR / dah-GAY-gen
Das stimmt / Das stimmt nicht.That's true / That's not true.dahs shtimt / dahs shtimt nikht
Außerdem…Furthermore…OW-ser-dem
Deshalb / Deswegen…Therefore / That's why…DESS-halb / DESS-vay-gen
Zum Beispiel (z.B.)For exampletsoom BY-shpeel

📝 PART 4 — Exam Writing Templates

✉️ A1/A2 — Short Message Template

Betreff: [Subject]

Liebe/r [Name],

ich heiße [your name] und ich komme aus [country].
Ich wohne in [city] und ich arbeite als [job].
Ich [main sentence about topic].

Viele Grüße,
[Your name]

📧 B1 — Formal Email Template

Betreff: [Subject]

Sehr geehrte Damen und Herren,
(or: Sehr geehrte/r Frau/Herr [Name],)

ich schreibe Ihnen bezüglich [topic/reason].
[Explain the situation — 2–3 sentences]
Ich würde mich freuen, wenn Sie [your request].
[Thank them and close]

Mit freundlichen Grüßen,
[Your name]

💬 B1 — Forum Post / Opinion Template

Meiner Meinung nach ist [topic] sehr wichtig/problematisch.
Einerseits [argument 1], aber andererseits [argument 2].
Ich finde, dass [your conclusion + reason with "weil/da"].
Deshalb bin ich der Ansicht, dass [final opinion].

🗣️ PART 5 — Speaking Exam Tips by Level

A1 Speaking — What They Expect

You will introduce yourself and answer simple questions. Practice saying:
  • Name, age, country, city, job, hobbies
  • Ich heiße… / Ich bin… Jahre alt. / Ich komme aus… / Ich wohne in… / Ich arbeite als… / Ich mag…

A2 Speaking — What They Expect

You will negotiate with a partner on an everyday topic (e.g., planning a trip together). Use:
  • Sollen wir…? / Was denkst du? / Ich schlage vor… / Das ist eine gute Idee!

B1 Speaking — What They Expect

Two parts:
  1. Short presentation (1–2 min) on a given everyday topic (health, technology, travel, environment)
  2. Partner discussion — ask questions, make suggestions, agree/disagree politely
B1 Speaking Phrase Bank:
FunctionGerman Phrase
StartingIch möchte über [Thema] sprechen.
Adding infoAußerdem möchte ich erwähnen, dass…
Asking partnerWas meinen Sie dazu?
AgreeingDa haben Sie recht. / Ich stimme zu.
Disagreeing politelyDas sehe ich etwas anders, weil…
Making suggestionWie wäre es, wenn wir…?
ConcludingZusammenfassend kann ich sagen, dass…

🔤 PART 6 — Complete Pronunciation System

The German Alphabet (with sounds)

LetterPronunciationExample
AahApfel (apple)
Äair (like "air")Ärzt (doctor)
BbayBuch (book)
CtsayChef
DdayDanke
EayEssen (food)
FeffFrau
GgayGut
HhahHaus (house)
IeeIch
JyotJa (yes) — sounds like English Y
KkahKind (child)
LellLesen (read)
MemmMann
NennNein (no)
OohOfen (oven)
Öur (like "fur")Österreich
PpayPass
QkooQuelle
Rerr (guttural)Rot (red)
SessSehen (see)
TtayTag (day)
UooUhr (clock)
Üü (say "ee" with lips puckered)Übung (exercise)
VfowVater (father) — sounds like F
WvayWasser — sounds like V
Xiksexakt
YüpsilonYoga
ZtsetZeit (time) — sounds like TS

20 Critical Pronunciation Rules

#RuleExampleEnglish Guide
1W = V soundWasserVAH-ser
2V = F soundVaterFAH-ter
3Z = TS soundZeitTSYTE
4S before vowel = Z soundsehenZAY-en
5ß = sharp SSStraßeSHTRAH-seh
6sp/st at start = SHP/SHTsprechen, SteinSHPREH-khen, SHTYNE
7ch after a/o/u = gutturalBuch, auchbookh, owkh
8ch after e/i = soft hissich, nichtikh, nikht
9ei = "eye"mein, neinmine, nine
10ie = "ee"Bier, siebeer, zee
11eu/äu = "oy"neu, häufignoy, HOY-fikh
12ä = "air"MädchenMAYD-khen
13ö = "ur" (round lips)schönshurn
14ü = "ee" (round lips)überÜ-ber
15Final b/d/g → p/t/kHund, Taghoont, tahk
16r at end of word = soft "ah"Vater, WasserFAH-tah, VAH-sah
17qu = KVQualitätkva-li-TAYT
18j = Y soundja, Jahryah, yahr
19-ig at end = -ikhrichtig, lustigRIK-tikh, LUS-tikh
20No silent lettersunlike English, all letters are pronounced

⚡ PART 7 — Grammar Master Reference Card

Verb Conjugation Table (Present Tense)

Pronounsein (to be)haben (to have)machen (to do)gehen (to go)
ichbinhabemachegehe
dubisthastmachstgehst
er/sie/esisthatmachtgeht
wirsindhabenmachengehen
ihrseidhabtmachtgeht
sie/Siesindhabenmachengehen

Articles — All Four Cases

CaseMasc.Fem.NeuterPlural
Nominative (subject)derdiedasdie
Accusative (direct object)dendiedasdie
Dative (indirect object)demderdemden
Genitive (possession)desderdesder

Modal Verbs Quick Reference

könnenmüssenwollendürfensollenmögen
ichkannmusswilldarfsollmag
dukannstmusstwillstdarfstsollstmagst
er/siekannmusswilldarfsollmag
wirkönnenmüssenwollendürfensollenmögen

Key Sentence Patterns

PatternRuleExample
Main clauseVerb in position 2Ich lerne jeden Tag Deutsch.
QuestionVerb firstSprechen Sie Deutsch?
weil (because)Verb goes to ENDIch lerne, weil es wichtig ist.
dass (that)Verb goes to ENDIch denke, dass du Recht hast.
obwohl (although)Verb goes to ENDObwohl es schwer ist, lerne ich.
Perfekthaben/sein + Partizip II at ENDIch habe Deutsch gelernt.
Konjunktiv IIwürde + infinitive at ENDIch würde gern reisen.

📱 PART 8 — Best Free Resources for Goethe Prep

ResourceWhat It's ForLink
Goethe-Institut OfficialFree sample exams (A1–B1) for all levelsgoethe.de
Deutsche Welle (DW)Free A1–B1 video/audio course "Nicos Weg"dw.com/deutsch-lernen
Anki FlashcardsVocabulary spaced repetitionanki.app
Langsam gesprochene NachrichtenSlow German news for listening practicedw.com
Goethe B1 Word ListOfficial 1200-word vocabulary listdownloadable PDF from goethe.de
YouTube: Learn German with AnjaPronunciation + grammar videosyoutube.com
DuolingoDaily habit building (supplement only)duolingo.com
italkiFind a German speaking partner or tutoritalki.com

🎯 PART 9 — Daily Routine Template (2.5 hours/day)

⏰ 30 min  — Vocabulary (Anki flashcards, 20–30 new words)
⏰ 30 min  — Grammar (1 rule + exercises)
⏰ 30 min  — Listening (DW audio / Goethe sample)
⏰ 30 min  — Reading (short text → answer questions)
⏰ 30 min  — Speaking/Writing (alternate daily)

✅ PART 10 — 1-Month Checklist

A1 Must-Know (✅ before Week 2)

  • Introduce yourself fully in German (name, age, city, job, family)
  • Count to 1000, say dates and times
  • Use der/die/das correctly for 50 common nouns
  • Write a simple personal form (name, address, nationality)
  • Understand slow, simple conversations

A2 Must-Know (✅ before Week 3)

  • Use all modal verbs correctly
  • Form Perfekt tense for 30+ common verbs
  • Give and follow directions
  • Write a short informal message/email
  • Discuss daily routine, likes/dislikes

B1 Must-Know (✅ before exam)

  • Write a formal email (200 words)
  • Write a forum opinion post (150 words) using "weil," "obwohl," "deshalb"
  • Give a 90-second presentation on an everyday topic
  • Use subordinate clauses naturally in speech
  • Understand 80%+ of B1-level listening passages
  • Know 1200+ vocabulary words (Goethe official word list)

🌟 Final Motivation

A1 → B1 in 1 month is intense but absolutely possible with focused daily practice. The Goethe exam rewards consistency over perfection — you only need 60% to pass. Speak out loud every day, even to yourself. The ear learns faster than the eye.
Viel Erfolg bei deiner Prüfung! 🎓 (Much success on your exam! — feel er-FOLK by DY-ner PRÜF-oong)

Generate a printable A1-B1 grammar cheat sheet PDF

Reading File
Reading File
Running Command

ls -la /home/daytona/workspace/ 2>/dev/null || mkdir -p /home/daytona/workspace/…

Running Command

mkdir -p /home/daytona/workspace/german-cheatsheet && echo "dir created"

Writing File

~/german-cheatsheet/generate_cheatsheet.py

#!/usr/bin/env python3
"""
German Grammar Cheat Sheet A1-B1 (Goethe Exam Prep)
Printable A4 PDF — multi-page, colour-coded, exam-focused
"""

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    PageBreak, HRFlowable, KeepTogether
)
from reportlab.lib.colors import HexColor

# ── Colour Palette ────────────────────────────────────────────────────────────
C_BLACK      = HexColor("#1A1A2E")
C_DARK_BLUE  = HexColor("#16213E")
C_MID_BLUE   = HexColor("#0F3460")
C_ACCENT     = HexColor("#E94560")        # red-pink accent
C_A1         = HexColor("#27AE60")        # green  → A1
C_A2         = HexColor("#2980B9")        # blue   → A2
C_B1         = HexColor("#8E44AD")        # purple → B1
C_HEADER_BG  = HexColor("#1A1A2E")
C_STRIPE1    = HexColor("#F2F7FF")
C_STRIPE2    = HexColor("#FFFFFF")
C_YELLOW     = HexColor("#F39C12")
C_LIGHT_GREY = HexColor("#ECF0F1")
C_TIP        = HexColor("#FEF9E7")
C_TIP_BORDER = HexColor("#F39C12")

PAGE_W, PAGE_H = A4
MARGIN = 12 * mm

# ── Document ──────────────────────────────────────────────────────────────────
OUTPUT = "/home/daytona/workspace/german-cheatsheet/German_Grammar_A1-B1_Cheatsheet.pdf"

doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=A4,
    leftMargin=MARGIN, rightMargin=MARGIN,
    topMargin=14*mm, bottomMargin=12*mm,
    title="German Grammar Cheat Sheet A1–B1",
    author="Goethe Exam Prep",
)

# ── Styles ────────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()

def S(name, **kw):
    return ParagraphStyle(name, **kw)

style_cover_title = S("CoverTitle", fontSize=34, leading=40, textColor=colors.white,
                       alignment=TA_CENTER, fontName="Helvetica-Bold", spaceAfter=6)
style_cover_sub   = S("CoverSub", fontSize=15, leading=20, textColor=HexColor("#BDC3C7"),
                       alignment=TA_CENTER, fontName="Helvetica", spaceAfter=4)
style_cover_note  = S("CoverNote", fontSize=11, leading=14, textColor=HexColor("#ECF0F1"),
                       alignment=TA_CENTER, fontName="Helvetica-Oblique")

style_section     = S("Section", fontSize=13, leading=16, textColor=colors.white,
                       fontName="Helvetica-Bold", spaceAfter=2, spaceBefore=6)
style_subsection  = S("SubSection", fontSize=10, leading=13, textColor=C_DARK_BLUE,
                       fontName="Helvetica-Bold", spaceAfter=2, spaceBefore=4)
style_body        = S("Body", fontSize=8.5, leading=11, textColor=C_BLACK,
                       fontName="Helvetica", spaceAfter=1)
style_tip         = S("Tip", fontSize=8, leading=11, textColor=HexColor("#784212"),
                       fontName="Helvetica-Oblique", spaceAfter=1)
style_small       = S("Small", fontSize=7.5, leading=10, textColor=C_BLACK,
                       fontName="Helvetica")
style_footer      = S("Footer", fontSize=7, leading=9, textColor=HexColor("#7F8C8D"),
                       alignment=TA_CENTER, fontName="Helvetica-Oblique")

# ── Helper: Section Banner ────────────────────────────────────────────────────
def section_banner(text, bg=C_HEADER_BG, fg=colors.white, level_color=None):
    display = text
    elems = []
    data = [[Paragraph(f'<font color="white"><b>{display}</b></font>', style_section)]]
    tbl = Table(data, colWidths=[PAGE_W - 2*MARGIN])
    tbl.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), bg),
        ("LEFTPADDING", (0,0), (-1,-1), 8),
        ("RIGHTPADDING", (0,0), (-1,-1), 8),
        ("TOPPADDING", (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("ROWBACKGROUNDS", (0,0), (-1,-1), [bg]),
    ]))
    elems.append(tbl)
    elems.append(Spacer(1, 3))
    return elems

def level_badge(level):
    """Returns coloured inline badge text."""
    clr = {"A1": "#27AE60", "A2": "#2980B9", "B1": "#8E44AD"}.get(level, "#555")
    return f'<font color="{clr}"><b>[{level}]</b></font>'

# ── Helper: Grammar Table ─────────────────────────────────────────────────────
def grammar_table(headers, rows, col_widths=None, stripe=True):
    avail = PAGE_W - 2*MARGIN
    if col_widths is None:
        n = len(headers)
        col_widths = [avail / n] * n

    header_row = [Paragraph(f'<font color="white"><b>{h}</b></font>',
                             S("TH", fontSize=8, leading=10, textColor=colors.white,
                               fontName="Helvetica-Bold", alignment=TA_CENTER))
                  for h in headers]
    data = [header_row]
    for row in rows:
        data.append([Paragraph(str(cell), style_small) for cell in row])

    tbl = Table(data, colWidths=col_widths, repeatRows=1)
    ts = [
        ("BACKGROUND", (0,0), (-1,0), C_MID_BLUE),
        ("TEXTCOLOR", (0,0), (-1,0), colors.white),
        ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
        ("FONTSIZE", (0,0), (-1,-1), 8),
        ("LEADING", (0,0), (-1,-1), 10),
        ("LEFTPADDING", (0,0), (-1,-1), 4),
        ("RIGHTPADDING", (0,0), (-1,-1), 4),
        ("TOPPADDING", (0,0), (-1,-1), 3),
        ("BOTTOMPADDING", (0,0), (-1,-1), 3),
        ("GRID", (0,0), (-1,-1), 0.5, HexColor("#BDC3C7")),
        ("VALIGN", (0,0), (-1,-1), "MIDDLE"),
    ]
    if stripe:
        for i in range(1, len(data)):
            bg = C_STRIPE1 if i % 2 == 1 else C_STRIPE2
            ts.append(("BACKGROUND", (0,i), (-1,i), bg))
    tbl.setStyle(TableStyle(ts))
    return tbl

def tip_box(text):
    data = [[Paragraph(f"<b>Tip:</b> {text}", style_tip)]]
    tbl = Table(data, colWidths=[PAGE_W - 2*MARGIN - 4])
    tbl.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), C_TIP),
        ("LEFTPADDING", (0,0), (-1,-1), 8),
        ("RIGHTPADDING", (0,0), (-1,-1), 8),
        ("TOPPADDING", (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("BOX", (0,0), (-1,-1), 1, C_TIP_BORDER),
        ("ROUNDEDCORNERS", [4]),
    ]))
    return tbl

# ═══════════════════════════════════════════════════════════════════════════════
# CONTENT
# ═══════════════════════════════════════════════════════════════════════════════
story = []

# ─── COVER PAGE ───────────────────────────────────────────────────────────────
# Full-page dark background table
cover_content = [
    Spacer(1, 30*mm),
    Paragraph("🇩🇪  GERMAN GRAMMAR", style_cover_title),
    Paragraph("CHEAT SHEET", S("CS2", fontSize=28, leading=34, textColor=C_ACCENT,
                                alignment=TA_CENTER, fontName="Helvetica-Bold")),
    Spacer(1, 6*mm),
    Paragraph("Goethe-Zertifikat  A1 · A2 · B1", style_cover_sub),
    Spacer(1, 4*mm),
    HRFlowable(width="60%", thickness=1, color=C_ACCENT, hAlign="CENTER"),
    Spacer(1, 6*mm),
    Paragraph("Complete Grammar Reference · Exam Templates · Pronunciation Guide",
              style_cover_note),
    Spacer(1, 4*mm),
    Paragraph("All four skills: Reading · Listening · Writing · Speaking",
              style_cover_note),
    Spacer(1, 30*mm),
    Paragraph(
        '<font color="#27AE60"><b>A1</b></font>  Beginner   '
        '<font color="#2980B9"><b>A2</b></font>  Pre-Intermediate   '
        '<font color="#8E44AD"><b>B1</b></font>  Independent User',
        S("Lvls", fontSize=12, leading=16, textColor=colors.white,
          alignment=TA_CENTER, fontName="Helvetica-Bold")),
]

cover_data = [[c] for c in cover_content]
# Use a simple approach: just add content with dark background on whole page
cover_bg = Table([[Spacer(1, 0)]], colWidths=[PAGE_W - 2*MARGIN], rowHeights=[PAGE_H - 26*mm])
cover_bg.setStyle(TableStyle([("BACKGROUND", (0,0), (-1,-1), C_DARK_BLUE)]))

for item in cover_content:
    story.append(item)

story.append(PageBreak())

# ─── PAGE 2: ALPHABET & PRONUNCIATION ────────────────────────────────────────
story += section_banner("1.  ALPHABET & PRONUNCIATION  " + level_badge("A1"), bg=C_A1)

pron_data = [
    ["Letters / Sound", "Rule", "Example", "English Guide"],
    ["W", "Sounds like English V", "Wasser (water)", "VAH-ser"],
    ["V", "Sounds like English F", "Vater (father)", "FAH-ter"],
    ["Z", "Sounds like TS", "Zeit (time)", "TSYTE"],
    ["S + vowel", "Sounds like English Z", "sehen (to see)", "ZAY-en"],
    ["ss / ss", "Sharp S (never buzzy)", "Wasser, Strasse", "VAH-ser"],
    ["sp / st (start)", "SHP / SHT", "sprechen, Stein", "SHPREH-khen, SHTYNE"],
    ["ch (after a/o/u)", "Guttural — like Scottish loch", "Buch, auch", "bookh, owkh"],
    ["ch (after e/i)", "Soft hiss — like huge", "ich, nicht", "ikh, nikht"],
    ["ei", "Long 'eye'", "mein, nein", "mine, nine"],
    ["ie", "Long 'ee'", "Bier, sie", "beer, zee"],
    ["eu / au", "'oy' / 'ow'", "neu, Haus", "noy, howss"],
    ["a with umlaut (ae)", "'air'", "Madchen", "MAYD-khen"],
    ["o with umlaut (oe)", "'ur' — round lips", "schon", "shurn"],
    ["u with umlaut (ue)", "'ee' — round lips", "uber", "UE-ber"],
    ["-ig (word end)", "'ikh'", "richtig, lustig", "RIK-tikh, LUS-tikh"],
    ["Final b/d/g", "Devoice to p/t/k", "Hund, Tag", "hoont, tahk"],
    ["r (end of word)", "Soft 'ah'", "Vater, Wasser", "FAH-tah, VAH-sah"],
    ["j", "Like English Y", "ja, Jahr", "yah, yahr"],
    ["qu", "Like KV", "Qualitat", "kva-li-TAYT"],
]
story.append(grammar_table(
    pron_data[0], pron_data[1:],
    col_widths=[45*mm, 60*mm, 45*mm, 40*mm]
))
story.append(Spacer(1, 3))
story.append(tip_box("Every letter in German is pronounced — unlike English, there are almost NO silent letters. Speak what you see!"))
story.append(Spacer(1, 4))

# ─── PAGE 2 cont: VERB CONJUGATION ───────────────────────────────────────────
story += section_banner("2.  VERB CONJUGATION — PRESENT TENSE  " + level_badge("A1"), bg=C_A1)

conj_data = [
    ["Pronoun", "sein (be)", "haben (have)", "machen (do)", "gehen (go)", "kommen (come)"],
    ["ich", "bin", "habe", "mache", "gehe", "komme"],
    ["du", "bist", "hast", "machst", "gehst", "kommst"],
    ["er/sie/es", "ist", "hat", "macht", "geht", "kommt"],
    ["wir", "sind", "haben", "machen", "gehen", "kommen"],
    ["ihr", "seid", "habt", "macht", "geht", "kommt"],
    ["sie/Sie", "sind", "haben", "machen", "gehen", "kommen"],
]
avail = PAGE_W - 2*MARGIN
story.append(grammar_table(
    conj_data[0], conj_data[1:],
    col_widths=[avail*0.14, avail*0.17, avail*0.17, avail*0.17, avail*0.17, avail*0.18]
))
story.append(Spacer(1,3))
story.append(tip_box("Regular -en verbs: remove -en, then add: -e / -st / -t / -en / -t / -en"))
story.append(Spacer(1,4))

# ARTICLES TABLE
story += section_banner("3.  ARTICLES — DER / DIE / DAS  " + level_badge("A1") + "  " + level_badge("A2"), bg=C_A2)

art_data = [
    ["Case", "Use", "Masc. (der)", "Fem. (die)", "Neuter (das)", "Plural (die)"],
    ["Nominative", "Subject", "der / ein", "die / eine", "das / ein", "die / —"],
    ["Accusative", "Direct Object", "den / einen", "die / eine", "das / ein", "die / —"],
    ["Dative", "Indirect Object", "dem / einem", "der / einer", "dem / einem", "den / —"],
    ["Genitive", "Possession", "des / eines", "der / einer", "des / eines", "der / —"],
]
story.append(grammar_table(
    art_data[0], art_data[1:],
    col_widths=[30*mm, 38*mm, 32*mm, 28*mm, 32*mm, 30*mm]
))
story.append(Spacer(1,3))
story.append(tip_box("Memory trick — only ACCUSATIVE changes the masculine: der → DEN, ein → EINEN. All others stay the same!"))

story.append(PageBreak())

# ─── PAGE 3: MODAL VERBS ─────────────────────────────────────────────────────
story += section_banner("4.  MODAL VERBS  " + level_badge("A2"), bg=C_A2)

modal_data = [
    ["Pronoun", "konnen (can)", "mussen (must)", "wollen (want)", "durfen (may)", "sollen (shall)", "mogen (like)"],
    ["ich", "kann", "muss", "will", "darf", "soll", "mag"],
    ["du", "kannst", "musst", "willst", "darfst", "sollst", "magst"],
    ["er/sie/es", "kann", "muss", "will", "darf", "soll", "mag"],
    ["wir", "konnen", "mussen", "wollen", "durfen", "sollen", "mogen"],
    ["ihr", "konnt", "musst", "wollt", "durft", "sollt", "mogt"],
    ["sie/Sie", "konnen", "mussen", "wollen", "durfen", "sollen", "mogen"],
]
avail = PAGE_W - 2*MARGIN
cw = avail / 7
story.append(grammar_table(modal_data[0], modal_data[1:], col_widths=[cw]*7))
story.append(Spacer(1,3))
story.append(tip_box("Modal verb ALWAYS in position 2; infinitive goes to END: Ich KANN heute nicht KOMMEN."))
story.append(Spacer(1,4))

# PERFEKT TENSE
story += section_banner("5.  PERFEKT TENSE (Past)  " + level_badge("A2"), bg=C_A2)

perf_data = [
    ["Pattern", "When to Use", "Formula", "Example"],
    ["haben + Partizip II", "Most verbs (transitive, non-motion)", "Ich habe + [ge...t/en]", "Ich habe gegessen. (I ate)"],
    ["sein + Partizip II", "Motion verbs & change of state", "Ich bin + [ge...en]", "Ich bin gegangen. (I went)"],
]
story.append(grammar_table(perf_data[0], perf_data[1:], col_widths=[44*mm, 58*mm, 52*mm, 56*mm]))
story.append(Spacer(1,3))

partizip_data = [
    ["Infinitive", "Partizip II", "Haben/Sein", "Infinitive", "Partizip II", "Haben/Sein"],
    ["machen", "gemacht", "haben", "gehen", "gegangen", "sein"],
    ["spielen", "gespielt", "haben", "fahren", "gefahren", "sein"],
    ["kaufen", "gekauft", "haben", "kommen", "gekommen", "sein"],
    ["essen", "gegessen", "haben", "laufen", "gelaufen", "sein"],
    ["trinken", "getrunken", "haben", "fliegen", "geflogen", "sein"],
    ["sehen", "gesehen", "haben", "bleiben", "geblieben", "sein"],
    ["lesen", "gelesen", "haben", "werden", "geworden", "sein"],
    ["schreiben", "geschrieben", "haben", "steigen", "gestiegen", "sein"],
    ["arbeiten", "gearbeitet", "haben", "reisen", "gereist", "sein"],
]
cw2 = avail / 6
story.append(grammar_table(partizip_data[0], partizip_data[1:], col_widths=[cw2]*6))
story.append(Spacer(1,3))
story.append(tip_box("Regular Partizip II = ge + stem + t  |  Irregular = ge + changed stem + en  |  Verbs with be-/ver-/er- prefix: NO 'ge'!"))
story.append(Spacer(1,4))

# PRATERITUM
story += section_banner("6.  PRATERITUM — Simple Past  " + level_badge("B1"), bg=C_B1)

prat_data = [
    ["Verb", "ich", "du", "er/sie/es", "wir", "ihr", "sie/Sie"],
    ["sein (be)", "war", "warst", "war", "waren", "wart", "waren"],
    ["haben (have)", "hatte", "hattest", "hatte", "hatten", "hattet", "hatten"],
    ["gehen (go)", "ging", "gingst", "ging", "gingen", "gingt", "gingen"],
    ["kommen (come)", "kam", "kamst", "kam", "kamen", "kamt", "kamen"],
    ["fahren (drive)", "fuhr", "fuhrst", "fuhr", "fuhren", "fuhrt", "fuhren"],
    ["sehen (see)", "sah", "sahst", "sah", "sahen", "saht", "sahen"],
    ["nehmen (take)", "nahm", "nahmst", "nahm", "nahmen", "nahmt", "nahmen"],
    ["wissen (know)", "wusste", "wusstest", "wusste", "wussten", "wusstet", "wussten"],
]
cw3 = [38*mm] + [(avail - 38*mm)/6]*6
story.append(grammar_table(prat_data[0], prat_data[1:], col_widths=cw3))
story.append(Spacer(1,3))
story.append(tip_box("In SPOKEN German, use Perfekt for almost everything. Use Prateritum mainly for: sein, haben, modal verbs, and formal/written German."))

story.append(PageBreak())

# ─── PAGE 4: SENTENCE STRUCTURE ──────────────────────────────────────────────
story += section_banner("7.  SENTENCE STRUCTURE & WORD ORDER  " + level_badge("A1") + "–" + level_badge("B1"), bg=C_MID_BLUE)

word_order_data = [
    ["Pattern", "Rule", "Example"],
    ["Main Clause", "Verb always in POSITION 2", "Ich lerne jeden Tag Deutsch."],
    ["Yes/No Question", "Verb comes FIRST", "Sprechen Sie Englisch?"],
    ["W-Question", "W-word + Verb + Subject", "Wo wohnen Sie?"],
    ["Inversion (adverb first)", "Adverb + Verb + Subject", "Heute gehe ich ins Kino."],
    ["weil (because)", "Verb goes to END", "Ich lerne, weil es wichtig IST."],
    ["dass (that)", "Verb goes to END", "Ich denke, dass du Recht HAST."],
    ["obwohl (although)", "Verb goes to END", "Obwohl es schwer IST, lerne ich."],
    ["wenn (when/if)", "Verb goes to END", "Wenn ich Zeit HABE, lese ich."],
    ["als (when — past)", "Verb goes to END", "Als ich jung WAR, spielte ich Fussball."],
    ["Relative clause", "Verb goes to END", "Der Mann, der hier WOHNT, ist nett."],
    ["Konjunktiv II", "wurden + infinitive at END", "Ich wurden gern nach Berlin FAHREN."],
    ["Perfekt", "haben/sein + Partizip II at END", "Ich habe Deutsch GELERNT."],
    ["Separable verb", "Prefix goes to END", "Ich stehe um 7 Uhr AUF."],
]
story.append(grammar_table(
    word_order_data[0], word_order_data[1:],
    col_widths=[48*mm, 65*mm, 77*mm]
))
story.append(Spacer(1,4))

# KONJUNKTIV II
story += section_banner("8.  KONJUNKTIV II — Wishes & Polite Requests  " + level_badge("B1"), bg=C_B1)

konj_data = [
    ["Verb", "Konjunktiv II Form", "Example Sentence", "Meaning"],
    ["sein", "ware", "Ich ware gern Arzt.", "I would like to be a doctor."],
    ["haben", "hatte", "Ich hatte gern mehr Zeit.", "I would like to have more time."],
    ["werden", "wurde", "Ich wurde reisen.", "I would travel."],
    ["konnen", "konnte", "Konnten Sie mir helfen?", "Could you help me?"],
    ["mussen", "musste", "Er musste mehr lernen.", "He would have to study more."],
    ["wollen", "wollte", "Sie wollte nach Berlin.", "She wanted to go to Berlin."],
    ["durfen", "durfte", "Durfte ich fragen?", "Might I ask?"],
]
cw4 = [28*mm, 38*mm, 75*mm, 50*mm]
story.append(grammar_table(konj_data[0], konj_data[1:], col_widths=cw4))
story.append(Spacer(1,3))
story.append(tip_box("Most common Konjunktiv II: wurden + infinitive (polite/hypothetical). Use hatte/ware/konnte for most other situations."))
story.append(Spacer(1,4))

# CONJUNCTIONS TABLE
story += section_banner("9.  CONJUNCTIONS  " + level_badge("A2") + "–" + level_badge("B1"), bg=C_A2)

conj_types = [
    ["Type", "Conjunction", "Meaning", "Effect on Word Order", "Example"],
    ["Coordinating", "und", "and", "Normal order", "Ich lerne und er schlaft."],
    ["Coordinating", "aber", "but", "Normal order", "Er ist nett, aber ich mag ihn nicht."],
    ["Coordinating", "oder", "or", "Normal order", "Kommst du oder bleibst du?"],
    ["Coordinating", "denn", "because/for", "Normal order", "Ich esse, denn ich habe Hunger."],
    ["Coordinating", "sondern", "but rather", "Normal order", "Er ist nicht krank, sondern mude."],
    ["Subordinating", "weil", "because", "VERB TO END", "Ich lerne, weil es wichtig ist."],
    ["Subordinating", "dass", "that", "VERB TO END", "Er sagt, dass er kommt."],
    ["Subordinating", "obwohl", "although", "VERB TO END", "Obwohl es regnet, gehe ich raus."],
    ["Subordinating", "wenn", "if/when", "VERB TO END", "Wenn ich Zeit habe, lese ich."],
    ["Subordinating", "als", "when (past)", "VERB TO END", "Als ich jung war, spielte ich."],
    ["Subordinating", "bevor", "before", "VERB TO END", "Bevor er geht, isst er."],
    ["Subordinating", "nachdem", "after", "VERB TO END", "Nachdem er gegessen hat, geht er."],
    ["Subordinating", "damit", "so that", "VERB TO END", "Ich lerne, damit ich bestehe."],
]
story.append(grammar_table(
    conj_types[0], conj_types[1:],
    col_widths=[32*mm, 26*mm, 24*mm, 36*mm, 72*mm]
))

story.append(PageBreak())

# ─── PAGE 5: CASES & PREPOSITIONS ────────────────────────────────────────────
story += section_banner("10.  PREPOSITIONS BY CASE  " + level_badge("A2") + "–" + level_badge("B1"), bg=C_A2)

prep_data = [
    ["Case", "Prepositions", "Example", "Tip"],
    ["ACCUSATIVE only", "durch, fur, gegen, ohne, um, bis, entlang",
     "Das Geschenk ist fur dich.", "Motion TOWARD / purpose"],
    ["DATIVE only", "aus, bei, mit, nach, seit, von, zu, gegenuber",
     "Ich fahre mit dem Bus.", "Location / point in time"],
    ["TWO-WAY (Acc/Dat)", "an, auf, hinter, in, neben, uber, unter, vor, zwischen",
     "Ich gehe IN die Schule. (Acc)\nIch bin IN der Schule. (Dat)",
     "WHERE TO? → Accusative\nWHERE? → Dative"],
    ["GENITIVE", "trotz, wegen, wahrend, statt",
     "Wegen des Regens bleibe ich.", "Formal/written German"],
]
story.append(grammar_table(
    prep_data[0], prep_data[1:],
    col_widths=[36*mm, 62*mm, 60*mm, 32*mm]
))
story.append(Spacer(1,3))
story.append(tip_box("Two-way prepositions: WOHIN? (where to?) = Accusative movement. WO? (where?) = Dative location."))
story.append(Spacer(1,4))

# RELATIVE CLAUSES
story += section_banner("11.  RELATIVE CLAUSES  " + level_badge("B1"), bg=C_B1)

rel_data = [
    ["Gender/Case", "Nominative", "Accusative", "Dative"],
    ["Masculine", "der", "den", "dem"],
    ["Feminine", "die", "die", "der"],
    ["Neuter", "das", "das", "dem"],
    ["Plural", "die", "die", "denen"],
]
story.append(grammar_table(rel_data[0], rel_data[1:],
                            col_widths=[50*mm, 50*mm, 50*mm, 40*mm]))
story.append(Spacer(1,3))

rel_examples = [
    ["Example", "Translation"],
    ["Der Mann, DER hier wohnt, ist nett.", "The man WHO lives here is nice. (Masc. Nom.)"],
    ["Die Frau, DIE ich sehe, ist meine Chefin.", "The woman WHOM I see is my boss. (Fem. Acc.)"],
    ["Das Kind, DEM ich helfe, ist mein Neffe.", "The child WHOM I help is my nephew. (Neut. Dat.)"],
    ["Die Leute, DIE hier wohnen, sind freundlich.", "The people WHO live here are friendly. (Plural Nom.)"],
]
story.append(Spacer(1,2))
story.append(grammar_table(rel_examples[0], rel_examples[1:],
                            col_widths=[100*mm, 90*mm]))
story.append(Spacer(1,3))
story.append(tip_box("Relative clause verb goes to END. Match the pronoun (der/die/das/denen) to the GENDER of the noun, and CASE of its role in the clause."))
story.append(Spacer(1,4))

# REFLEXIVE VERBS
story += section_banner("12.  REFLEXIVE VERBS  " + level_badge("A2") + "–" + level_badge("B1"), bg=C_A2)

refl_data = [
    ["Pronoun", "Reflexive Pronoun (Acc)", "Example Verb: sich freuen"],
    ["ich", "mich", "Ich freue mich."],
    ["du", "dich", "Du freust dich."],
    ["er/sie/es", "sich", "Er freut sich."],
    ["wir", "uns", "Wir freuen uns."],
    ["ihr", "euch", "Ihr freut euch."],
    ["sie/Sie", "sich", "Sie freuen sich."],
]
cw5 = [40*mm, 60*mm, 90*mm]
story.append(grammar_table(refl_data[0], refl_data[1:], col_widths=cw5))
story.append(Spacer(1,3))

refl_verbs = [
    ["Common Reflexive Verb", "Meaning", "Common Reflexive Verb", "Meaning"],
    ["sich vorstellen", "to introduce oneself", "sich bewerben", "to apply (for job)"],
    ["sich freuen (auf)", "to look forward to", "sich befinden", "to be located"],
    ["sich interessieren (fur)", "to be interested in", "sich erinnern (an)", "to remember"],
    ["sich befassen (mit)", "to deal with", "sich melden", "to get in touch"],
]
cw6 = [52*mm, 42*mm, 52*mm, 44*mm]
story.append(grammar_table(refl_verbs[0], refl_verbs[1:], col_widths=cw6))

story.append(PageBreak())

# ─── PAGE 6: EXAM WRITING TEMPLATES ──────────────────────────────────────────
story += section_banner("13.  GOETHE EXAM WRITING TEMPLATES  " + level_badge("A1") + "–" + level_badge("B1"), bg=C_ACCENT)

story.append(Paragraph("<b>A1/A2 — Short Message / Form</b>", style_subsection))
msg_style = ParagraphStyle("MsgBox", fontSize=8.5, leading=12, textColor=C_BLACK,
                            fontName="Courier", leftIndent=8, spaceAfter=1)
box_data = [[Paragraph(line, msg_style)] for line in [
    "Betreff: [Subject / Betreff]",
    "",
    "Liebe/r [Name],",
    "",
    "ich heisse [your name] und ich komme aus [country].",
    "Ich wohne in [city] und ich arbeite als [job].",
    "Ich [main sentence relevant to the task prompt].",
    "",
    "Viele Grusse,",
    "[Your Name]",
]]
msg_table = Table(box_data, colWidths=[PAGE_W - 2*MARGIN])
msg_table.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), HexColor("#EBF5FB")),
    ("BOX", (0,0), (-1,-1), 1, C_A2),
    ("LEFTPADDING", (0,0), (-1,-1), 10),
    ("RIGHTPADDING", (0,0), (-1,-1), 10),
    ("TOPPADDING", (0,0), (-1,-1), 1),
    ("BOTTOMPADDING", (0,0), (-1,-1), 1),
]))
story.append(msg_table)
story.append(Spacer(1,5))

story.append(Paragraph("<b>B1 — Formal Email (Sehr geehrte...)</b>", style_subsection))
email_data = [[Paragraph(line, msg_style)] for line in [
    "Betreff: [Topic]",
    "",
    "Sehr geehrte Damen und Herren,  (or: Sehr geehrte/r Frau/Herr [Name],)",
    "",
    "ich schreibe Ihnen bezuglich [topic/reason for writing].",
    "[Sentence 1: Explain situation or background].",
    "[Sentence 2: State your request or problem clearly].",
    "Ich wurde mich freuen, wenn Sie [your specific request].",
    "",
    "Fur eine Ruckmeldung bedanke ich mich im Voraus.",
    "",
    "Mit freundlichen Gruessen,",
    "[Your Full Name]",
]]
email_table = Table(email_data, colWidths=[PAGE_W - 2*MARGIN])
email_table.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), HexColor("#F4ECF7")),
    ("BOX", (0,0), (-1,-1), 1, C_B1),
    ("LEFTPADDING", (0,0), (-1,-1), 10),
    ("RIGHTPADDING", (0,0), (-1,-1), 10),
    ("TOPPADDING", (0,0), (-1,-1), 1),
    ("BOTTOMPADDING", (0,0), (-1,-1), 1),
]))
story.append(email_table)
story.append(Spacer(1,5))

story.append(Paragraph("<b>B1 — Forum Post / Opinion (Forumsbeitrag)</b>", style_subsection))
forum_data = [[Paragraph(line, msg_style)] for line in [
    "Meiner Meinung nach ist [topic] sehr wichtig / problematisch.",
    "Einerseits [first argument or advantage].",
    "Andererseits [counter-argument or disadvantage].",
    "Ich finde, dass [your conclusion + reason with 'weil' or 'da'].",
    "Deshalb bin ich der Ansicht, dass [final opinion / call to action].",
]]
forum_table = Table(forum_data, colWidths=[PAGE_W - 2*MARGIN])
forum_table.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), HexColor("#FEF9E7")),
    ("BOX", (0,0), (-1,-1), 1, C_YELLOW),
    ("LEFTPADDING", (0,0), (-1,-1), 10),
    ("RIGHTPADDING", (0,0), (-1,-1), 10),
    ("TOPPADDING", (0,0), (-1,-1), 1),
    ("BOTTOMPADDING", (0,0), (-1,-1), 1),
]))
story.append(forum_table)
story.append(Spacer(1,5))

# SPEAKING PHRASE BANK
story += section_banner("14.  B1 SPEAKING — EXAM PHRASE BANK  " + level_badge("B1"), bg=C_B1)

speak_data = [
    ["Function", "German Phrase", "English"],
    ["Opening presentation", "Ich mochte uber [Thema] sprechen.", "I would like to talk about [topic]."],
    ["Adding a point", "Ausserdem mochte ich erw\u00e4hnen, dass...", "Furthermore I would like to mention that..."],
    ["Giving opinion", "Meiner Meinung nach...", "In my opinion..."],
    ["Agreeing", "Da haben Sie recht. / Ich stimme zu.", "You are right. / I agree."],
    ["Disagreeing politely", "Das sehe ich etwas anders, weil...", "I see that slightly differently, because..."],
    ["Making suggestion", "Wie ware es, wenn wir...?", "How about if we...?"],
    ["Asking partner", "Was meinen Sie dazu?", "What do you think about that?"],
    ["Asking to repeat", "Konnten Sie das bitte wiederholen?", "Could you please repeat that?"],
    ["Buying time", "Das ist eine interessante Frage...", "That is an interesting question..."],
    ["Concluding", "Zusammenfassend kann ich sagen, dass...", "In summary I can say that..."],
    ["Transition", "Kommen wir jetzt zu... / Zum Schluss...", "Let's now move to... / In conclusion..."],
]
story.append(grammar_table(speak_data[0], speak_data[1:],
                            col_widths=[46*mm, 80*mm, 64*mm]))

story.append(PageBreak())

# ─── PAGE 7: VOCABULARY QUICK REFERENCE ──────────────────────────────────────
story += section_banner("15.  HIGH-FREQUENCY VOCABULARY BY TOPIC  " + level_badge("A1") + "–" + level_badge("B1"), bg=C_HEADER_BG)

story.append(Paragraph("<b>Numbers, Time & Dates</b>", style_subsection))
num_data = [
    ["German", "English", "German", "English", "German", "English"],
    ["eins (1)", "one", "elf (11)", "eleven", "hundert", "hundred"],
    ["zwei (2)", "two", "zwolf (12)", "twelve", "tausend", "thousand"],
    ["drei (3)", "three", "zwanzig (20)", "twenty", "Montag", "Monday"],
    ["vier (4)", "four", "dreissig (30)", "thirty", "Dienstag", "Tuesday"],
    ["funf (5)", "five", "vierzig (40)", "forty", "Mittwoch", "Wednesday"],
    ["sechs (6)", "six", "funfzig (50)", "fifty", "Donnerstag", "Thursday"],
    ["sieben (7)", "seven", "sechzig (60)", "sixty", "Freitag", "Friday"],
    ["acht (8)", "eight", "siebzig (70)", "seventy", "Samstag", "Saturday"],
    ["neun (9)", "nine", "achtzig (80)", "eighty", "Sonntag", "Sunday"],
    ["zehn (10)", "ten", "neunzig (90)", "ninety", "heute/morgen", "today/tomorrow"],
]
cw7 = [avail/6]*6
story.append(grammar_table(num_data[0], num_data[1:], col_widths=cw7))
story.append(Spacer(1,3))

story.append(Paragraph("<b>Essential Verbs A1–B1</b>", style_subsection))
verb_data = [
    ["Infinitive", "Meaning", "Infinitive", "Meaning", "Infinitive", "Meaning"],
    ["sein", "to be", "arbeiten", "to work", "sich freuen", "to be happy"],
    ["haben", "to have", "lernen", "to learn", "sich vorstellen", "to introduce oneself"],
    ["machen", "to do/make", "sprechen", "to speak", "sich befinden", "to be located"],
    ["gehen", "to go", "lesen", "to read", "sich bewerben", "to apply"],
    ["kommen", "to come", "schreiben", "to write", "wurden", "would (Konj. II)"],
    ["fahren", "to drive/travel", "horen", "to hear/listen", "wurde", "was made (passive)"],
    ["wohnen", "to live/reside", "verstehen", "to understand", "erklaren", "to explain"],
    ["heissen", "to be named", "helfen", "to help", "empfehlen", "to recommend"],
    ["kaufen", "to buy", "bezahlen", "to pay", "beschweren (sich)", "to complain"],
]
story.append(grammar_table(verb_data[0], verb_data[1:], col_widths=cw7))
story.append(Spacer(1,3))

story.append(Paragraph("<b>Opinion & Connective Words (B1 Writing/Speaking)</b>", style_subsection))
opinion_data = [
    ["German", "English", "German", "English"],
    ["Meiner Meinung nach", "In my opinion", "Deshalb / Deswegen", "Therefore / That's why"],
    ["Ich finde, dass...", "I think that...", "Ausserdem", "Furthermore / Besides"],
    ["Einerseits... andererseits...", "On one hand... on the other...", "Trotzdem", "Nevertheless"],
    ["Ich bin dafur / dagegen.", "I am for / against it.", "Im Gegensatz dazu", "In contrast to that"],
    ["Das stimmt (nicht).", "That is (not) true.", "Zum Beispiel (z.B.)", "For example"],
    ["Ich stimme zu / widerspreche.", "I agree / disagree.", "Im Allgemeinen", "In general"],
    ["Auf der einen Seite...", "On the one side...", "Zusammenfassend", "In summary"],
    ["Obwohl / Auch wenn", "Although / Even if", "Letztendlich", "Ultimately / In the end"],
]
story.append(grammar_table(opinion_data[0], opinion_data[1:],
                            col_widths=[60*mm, 45*mm, 55*mm, 30*mm]))

story.append(PageBreak())

# ─── PAGE 8: EXAM STRATEGY & QUICK REFERENCE ─────────────────────────────────
story += section_banner("16.  GOETHE EXAM STRATEGY  A1 / A2 / B1", bg=C_ACCENT)

strat_data = [
    ["Module", "Time", "Task Type", "Key Strategy"],
    ["Lesen (Reading)", "A1: 25min\nA2: 30min\nB1: 65min",
     "Multiple choice, True/False, matching",
     "Skim for gist first. Read questions BEFORE the text. Key words = answer clues."],
    ["Horen (Listening)", "A1: 20min\nA2: 30min\nB1: 40min",
     "Multiple choice, gap fill, True/False",
     "Read questions before audio plays. Write answers in note form first."],
    ["Schreiben (Writing)", "A1: 20min\nA2: 30min\nB1: 60min",
     "A1/A2: form + short message\nB1: formal email + forum post",
     "Use templates! Stay on topic. Check verb position in subordinate clauses."],
    ["Sprechen (Speaking)", "A1: 15min\nA2: 15min\nB1: 15min",
     "A1: introduce self\nA2: negotiate\nB1: presentation + discussion",
     "Speak clearly at natural pace. Use connectors. Ask partner questions. Don't memorize — react!"],
]
story.append(grammar_table(strat_data[0], strat_data[1:],
                            col_widths=[32*mm, 28*mm, 52*mm, 78*mm]))
story.append(Spacer(1,4))

story += section_banner("17.  PASS MARK & SCORING", bg=C_MID_BLUE)
score_data = [
    ["Level", "Total Points", "Pass Mark", "Each Module Worth", "Can Fail One Module?"],
    ["A1", "100 pts", "60 pts (60%)", "25 pts each", "Yes — if total >= 60"],
    ["A2", "100 pts", "60 pts (60%)", "25 pts each", "Yes — if total >= 60"],
    ["B1", "100 pts", "60 pts (60%)", "25 pts each (modular)", "Yes — modules taken separately"],
]
story.append(grammar_table(score_data[0], score_data[1:],
                            col_widths=[24*mm, 30*mm, 32*mm, 42*mm, 62*mm]))
story.append(Spacer(1,4))

story += section_banner("18.  30-DAY STUDY PLAN SUMMARY", bg=C_HEADER_BG)
plan_data = [
    ["Week", "Focus", "Grammar Topics", "Daily Goal"],
    ["Week 1\n(Days 1–7)", "A1 Foundation", "Verbs, sein/haben, articles (Nom/Acc),\nquestion words, basic sentences",
     "20 new words/day\n2 hrs study/day"],
    ["Week 2\n(Days 8–14)", "A2 Expansion", "Dative, modal verbs, Perfekt tense,\nseparable verbs, comparatives",
     "25 new words/day\n2.5 hrs study/day"],
    ["Week 3\n(Days 15–21)", "B1 Bridge", "Prateritum, subordinate clauses,\nrelative clauses, Konjunktiv II, passive",
     "30 new words/day\n3 hrs study/day"],
    ["Week 4\n(Days 22–30)", "Exam Simulation", "Full timed mock tests, writing templates,\nspeaking practice, weak point review",
     "2 mock tests\n2.5 hrs study/day"],
]
story.append(grammar_table(plan_data[0], plan_data[1:],
                            col_widths=[25*mm, 30*mm, 85*mm, 50*mm]))
story.append(Spacer(1,3))
story.append(tip_box("You only need 60% to pass! Focus on consistency, not perfection. Speaking aloud every day — even 10 minutes — trains your brain faster than reading alone."))
story.append(Spacer(1,5))

# FOOTER NOTE
story.append(HRFlowable(width="100%", thickness=0.5, color=HexColor("#BDC3C7")))
story.append(Spacer(1,3))
story.append(Paragraph(
    "Goethe-Zertifikat A1–B1 Grammar Cheat Sheet  |  Viel Erfolg bei deiner Prufung!  |  "
    "Official Practice Tests: www.goethe.de/en/spr/kup/prf.html",
    style_footer
))

# ─── BUILD ────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
Your credits are exhausted. Your daily credits reset tomorrow, or you can purchase a top-up for more.
This is a shared conversation. Sign in to Orris to start your own chat.