import gradio as gr import random import json import os # Initialize data DATA_DIR = "data" os.makedirs(DATA_DIR, exist_ok=True) # Data structure for Afrikaans learning content afrikaans_content = { "phonics": { "beginner": [ {"sound": "aa", "examples": ["aap", "jaar", "daar"], "pronunciation": "long 'a' as in 'father'"}, {"sound": "ee", "examples": ["beer", "meer", "seer"], "pronunciation": "long 'e' as in 'bear'"}, {"sound": "oe", "examples": ["boek", "koek", "soek"], "pronunciation": "similar to 'oo' in 'book'"}, {"sound": "ui", "examples": ["huis", "muis", "tuin"], "pronunciation": "similar to 'ay' + 'oo'"}, {"sound": "eu", "examples": ["deur", "kleur", "geur"], "pronunciation": "similar to 'e' in 'her'"} ], "intermediate": [ {"sound": "ei", "examples": ["klein", "reis", "sein"], "pronunciation": "like 'ay' in 'day'"}, {"sound": "y", "examples": ["tyd", "wys", "fyn"], "pronunciation": "like 'ay' in 'day'"}, {"sound": "eeu", "examples": ["sneeu", "leeu", "spreeu"], "pronunciation": "like 'ay' + 'oo'"}, {"sound": "uu", "examples": ["muur", "vuur", "duur"], "pronunciation": "similar to 'ue' in 'blue'"} ] }, "vocabulary": { "beginner": [ {"word": "hallo", "translation": "hello", "sentence": "Hallo, hoe gaan dit?"}, {"word": "dankie", "translation": "thank you", "sentence": "Baie dankie vir jou hulp."}, {"word": "skool", "translation": "school", "sentence": "Ek gaan na die skool toe."}, {"word": "huis", "translation": "house", "sentence": "My huis is groot."}, {"word": "water", "translation": "water", "sentence": "Mag ek 'n bietjie water kry?"} ], "intermediate": [ {"word": "vriendelik", "translation": "friendly", "sentence": "Die mense hier is baie vriendelik."}, {"word": "belangrik", "translation": "important", "sentence": "Dit is 'n belangrike les."}, {"word": "toekoms", "translation": "future", "sentence": "Wat is jou planne vir die toekoms?"}, {"word": "omgewing", "translation": "environment", "sentence": "Ons moet die omgewing bewaar."} ], "advanced": [ {"word": "verbeelding", "translation": "imagination", "sentence": "Gebruik jou verbeelding om die storie te voltooi."}, {"word": "gebeurtenis", "translation": "event", "sentence": "Die gebeurtenis sal môre plaasvind."}, {"word": "wetenskaplik", "translation": "scientific", "sentence": "Dit is 'n wetenskaplike eksperiment."}, {"word": "onafhanklik", "translation": "independent", "sentence": "Suid-Afrika het in 1961 onafhanklik geword."} ] }, "grammar": { "beginner": [ {"rule": "Basic sentence structure", "explanation": "Afrikaans follows Subject-Verb-Object order: 'Ek eet kos' (I eat food)"}, {"rule": "Definite articles", "explanation": "Afrikaans has one definite article 'die' for both singular and plural: 'die boek' (the book), 'die boeke' (the books)"}, {"rule": "Indefinite article", "explanation": "'n is used as 'a/an': ''n boek' (a book)"} ], "intermediate": [ {"rule": "Past tense", "explanation": "Form the past tense with 'het ge-': 'Ek het geëet' (I ate)"}, {"rule": "Future tense", "explanation": "Form the future tense with 'sal': 'Ek sal eet' (I will eat)"}, {"rule": "Negation", "explanation": "Use 'nie' at the end: 'Ek verstaan nie' (I don't understand)"} ], "advanced": [ {"rule": "Passive voice", "explanation": "Form with 'word' (present) or 'is' (past): 'Die boek word gelees' (The book is being read)"}, {"rule": "Subjunctive mood", "explanation": "Express with 'sou': 'Ek sou help as ek kon' (I would help if I could)"}, {"rule": "Conditional clauses", "explanation": "Use 'as': 'As dit reën, bly ons tuis' (If it rains, we stay home)"} ] }, "reading": { "beginner": [ {"title": "My Familie", "text": "My naam is Johan. Ek is tien jaar oud. Ek het 'n ma, 'n pa, en 'n suster. My suster se naam is Anke. Sy is sewe jaar oud. Ons woon in Kaapstad. Ons huis is naby die strand.", "questions": ["Hoe oud is Johan?", "Wat is sy suster se naam?", "Waar woon hulle?"]}, {"title": "By die Skool", "text": "Elke oggend gaan ek skool toe. Ek hou van my skool. My gunsteling vak is Wiskunde. Ek het baie maats by die skool. Ons speel saam tydens pouse.", "questions": ["Waarheen gaan die kind elke oggend?", "Wat is die kind se gunsteling vak?", "Wanneer speel die kinders saam?"]} ], "intermediate": [ {"title": "Die Weer in Suid-Afrika", "text": "Suid-Afrika het 'n diverse klimaat. In die somer is dit baie warm, veral in die binneland. Die kusgebiede is koeler as gevolg van die seebries. In die winter kan dit koud word in dele van die land, veral in die Drakensberge waar dit soms sneeu.", "questions": ["Hoe is die klimaat in Suid-Afrika?", "Waar is dit koeler in die somer?", "Waar kan dit sneeu in die winter?"]}, {"title": "Suid-Afrikaanse Kos", "text": "Suid-Afrikaners hou van braaivleis. Dit is wanneer vleis oor 'n oop vuur gebraai word. Boerewors is 'n tradisionele soort wors wat baie gewild is by 'n braai. Nog 'n tradisionele gereg is bobotie, 'n geurige maalvleisgereg met 'n vla-agtige bedekking.", "questions": ["Wat is braaivleis?", "Watter soort wors is gewild by 'n braai?", "Beskryf bobotie."]} ], "advanced": [ {"title": "Die Geskiedenis van Afrikaans", "text": "Afrikaans het ontwikkel uit Nederlands wat na Suid-Afrika gebring is deur koloniste in die 17de eeu. Mettertyd het die taal beïnvloed geraak deur ander tale soos Maleis, Portugees, Bantoetale en Khoitale. Afrikaans is in 1925 as een van die amptelike tale van Suid-Afrika erken, ter vervanging van Nederlands. Vandag word Afrikaans deur ongeveer 7 miljoen mense as moedertaal gepraat.", "questions": ["Uit watter taal het Afrikaans ontwikkel?", "Watter ander tale het Afrikaans beïnvloed?", "Wanneer is Afrikaans as amptelike taal erken?", "Hoeveel mense praat Afrikaans as moedertaal?"]}, {"title": "Nelson Mandela", "text": "Nelson Rolihlahla Mandela was 'n Suid-Afrikaanse anti-apartheidsrewolusionêr en politieke leier wat van 1994 tot 1999 as die eerste swart president van Suid-Afrika gedien het. Hy is in 1918 gebore en het 'n sleutelrol gespeel in die stryd teen apartheid. Hy het 27 jaar in die tronk deurgebring voordat hy vrygelaat is en gehelp het om 'n vreedsame oorgang na demokrasie te bewerkstellig. Mandela het die Nobelprys vir Vrede in 1993 ontvang.", "questions": ["Wanneer was Mandela president van Suid-Afrika?", "Hoe lank was hy in die tronk?", "Watter belangrike prys het hy ontvang?", "Wat was sy rol in Suid-Afrika se geskiedenis?"]} ] }, "writing": { "beginner": [ {"prompt": "Skryf 'n paragraaf oor jou gesin.", "example": "My gesin bestaan uit vier mense. Daar is my ma, my pa, my broer en ek. My ma se naam is Marié en my pa se naam is Johan. My broer se naam is Pieter en hy is 15 jaar oud. Ek is 12 jaar oud. Ons het ook 'n hond. Sy naam is Rex."}, {"prompt": "Beskryf jou gunsteling kos.", "example": "My gunsteling kos is pizza. Ek hou van pizza met kaas en sampioene. Dit is lekker warm en smaaklik. Ek eet graag pizza op 'n Vrydagaand saam met my familie."} ], "intermediate": [ {"prompt": "Skryf 'n brief aan jou vriend/vriendin oor jou vakansie.", "example": "Liewe Jana\n\nHoe gaan dit met jou? Ek hoop dit gaan goed. Ek skryf om jou te vertel van my vakansie by die see. Dit was wonderlik! Elke dag het ons geswem en sandkastele gebou. Die weer was sonnig en warm. My gunsteling deel was toe ons 'n dolfyn in die see gesien het.\n\nWat het jy gedoen tydens die vakansie? Ek sien uit daarna om jou weer te sien by die skool.\n\nGroete\nLisa"}, {"prompt": "Skryf 'n paragraaf oor jou gunsteling sport.", "example": "My gunsteling sport is sokker. Ek speel al sokker vandat ek ses jaar oud was. Ek oefen twee keer per week en ons het wedstryde op Saterdae. Ek is 'n doelwagter in my span. Dit is 'n uitdagende posisie, maar ek geniet dit baie. Sokker leer my hoe om in 'n span saam te werk en dit verbeter my fiksheid."} ], "advanced": [ {"prompt": "Skryf 'n opstel oor die belangrikheid van onderwys in Suid-Afrika.", "example": "Onderwys in Suid-Afrika: Die Sleutel tot 'n Beter Toekoms\n\nOnderwys speel 'n deurslaggewende rol in die ontwikkeling van enige land, en Suid-Afrika is geen uitsondering nie. As 'n ontwikkelende land met 'n komplekse geskiedenis van ongelykheid, is toegang tot gehalte-onderwys van kardinale belang om sosiale en ekonomiese vooruitgang te bewerkstellig.\n\nEerstens bied onderwys aan jongmense die vaardighede en kennis wat hulle nodig het om in die arbeidsmark mee te ding. In 'n globale ekonomie wat toenemend op tegnologie en innovasie steun, is dit noodsaaklik dat Suid-Afrikaanse leerders toegerus word met relevante vaardighede. Onderwys bevorder kritiese denke, probleemoplossing en kreatiwiteit – almal noodsaaklike eienskappe in die moderne werkplek.\n\nTweedens is onderwys 'n kragtige instrument vir sosiale transformasie. Deur gelyke toegang tot gehalte-onderwys te verseker, kan Suid-Afrika die nalatenskap van apartheid en ongelykheid begin aanspreek. Onderwys bemagtig individue om ingeligte besluite te neem en aktief aan die demokrasie deel te neem, wat lei tot 'n meer regverdige en inklusiewe samelewing.\n\nDerdens is onderwys noodsaaklik vir ekonomiese groei. 'n Goed opgeleide bevolking lok belegging, bevorder entrepreneurskap en dryf innovasie. Dit kan help om werkloosheid te verminder – een van Suid-Afrika se grootste uitdagings – en bydra tot armoedeverligting.\n\nTen slotte, ten spyte van vordering wat gemaak is sedert 1994, staar Suid-Afrika steeds beduidende uitdagings in die gesig met betrekking tot onderwys. Dit sluit in ongelyke toegang tot hulpbronne, swak infrastruktuur in sommige gebiede, en onvoldoende opleiding van onderwysers. Om hierdie uitdagings aan te spreek, vereis 'n gesamentlike poging van die regering, private sektor, en gemeenskappe. Deur in onderwys te belê, belê Suid-Afrika in sy mees waardevolle hulpbron – sy mense – en baan die weg vir 'n voorspoedige toekoms."}, {"prompt": "Skryf 'n opstel oor die impak van tegnologie op die moderne samelewing.", "example": "Die Dubbelsnydende Swaard van Tegnologie in die Moderne Samelewing\n\nIn die afgelope dekades het tegnologie ons wêreld teen 'n verbysterende tempo verander. Vandag is slim toestelle, die internet, sosiale media en kunsmatige intelligensie alledaagse aspekte van ons lewens. Hierdie tegnologiese revolusie het verreikende implikasies vir individue, gemeenskappe en die samelewing as geheel, met beide positiewe en negatiewe gevolge.\n\nAan die positiewe kant het tegnologie ongekende toegang tot inligting moontlik gemaak. Met die druk van 'n knoppie kan ons toegang kry tot 'n wêreld van kennis wat voorheen slegs beskikbaar was vir diegene met toegang tot uitgebreide biblioteke of spesialisonderwys. Hierdie demokratisering van inligting het gelei tot 'n meer ingeligte bevolking en het geleenthede vir selfstudie en professionele ontwikkeling geskep.\n\nBoonop het tegnologie kommunikasie en konnektiwiteit verbeter. Families wat deur kontinente geskei word, kan nou maklik in verbinding bly deur video-oproepe. Besighede kan saamwerk met vennote reg oor die wêreld, wat globalisering bevorder en ekonomiese geleenthede skep. Gedurende krisisse, soos die COVID-19-pandemie, het tegnologie ons in staat gestel om te werk, te leer en sosiaal te bly terwyl ons fisies geïsoleerd was.\n\nIn die mediese veld het tegnologiese vooruitgang gelei tot verbeterde diagnoses, behandelings en lewensverwagting. Gevorderde beeldtegnieke, robotiese chirurgie en genetiese navorsing het mediese moontlikhede uitgebrei en baie lewens gered.\n\nTen spyte van hierdie voordele, hou tegnologie ook beduidende uitdagings in. Die toenemende afhanklikheid van digitale toestelle het gelei tot kwessies soos skermverslawing, sedentêre lewenstyle en die verwaarlosing van persoonlike verhoudings. Studies het 'n verband getoon tussen oormatige gebruik van sosiale media en verhoogde vlakke van angs, depressie en eensaamheid, veral onder jongmense.\n\nPrivaatheid bly 'n groot bekommernis in die digitale era. Maatskappye versamel groot hoeveelhede persoonlike data, wat kwessies oor toestemming en die potensiaal vir misbruik opper. Kubermisdaad en identiteitsdiefstal is ook aan die toeneem, wat individue en organisasies kwesbaar laat.\n\nVanuit 'n sosio-ekonomiese perspektief het outomatisering en kunsmatige intelligensie die potensiaal om baie tradisionele werksgeleenthede te vervang, wat lei tot werkloosheid en ekonomiese onsekerheid vir diegene wie se vaardighede verouderd raak. Die \"digitale kloof\" – die gaping tussen diegene met toegang tot tegnologie en diegene daarsonder – kan bestaande ongelykhede vererger.\n\nTen slotte, terwyl tegnologie ongetwyfeld talle voordele inhou, moet ons waaksaam bly oor die potensiële nadele daarvan. Die uitdaging vir die moderne samelewing is om tegnologie op 'n gebalanseerde en etiese manier te gebruik – om die voordele te maksimeer terwyl die risiko's versag word. Dit vereis 'n doelbewuste benadering van individue, opvoeders, besighede en beleidmakers om te verseker dat tegnologie ons dien, eerder as om ons te oorheers. Deur kritiese denke, digitale geletterdheid en etiese oorwegings te bevorder, kan ons streef na 'n toekoms waar tegnologie bydra tot 'n meer regverdige, gesonde en vervullende samelewing vir almal."} ] }, "exercises": { "spelling": { "beginner": [ {"word": "hond", "options": ["hond", "hont", "hondt"]}, {"word": "kos", "options": ["kos", "cos", "koss"]}, {"word": "water", "options": ["water", "vater", "watter"]} ], "intermediate": [ {"word": "belangrik", "options": ["belangrik", "belangrek", "belangric"]}, {"word": "verskillende", "options": ["verskillende", "ferskillende", "verskillende"]}, {"word": "geleentheid", "options": ["geleentheid", "geleentheit", "geleenthyd"]} ], "advanced": [ {"word": "verantwoordelikheid", "options": ["verantwoordelikheid", "verantwoordelikhet", "verantwordelikheid"]}, {"word": "wetenskaplike", "options": ["wetenskaplike", "wetenskaplik", "wetenskaplik"]}, {"word": "onafhanklikheid", "options": ["onafhanklikheid", "onafhankelikheid", "onafhanklikhyd"]} ] }, "translation": { "beginner": [ {"english": "hello", "afrikaans": "hallo"}, {"english": "thank you", "afrikaans": "dankie"}, {"english": "please", "afrikaans": "asseblief"} ], "intermediate": [ {"english": "environment", "afrikaans": "omgewing"}, {"english": "experience", "afrikaans": "ervaring"}, {"english": "opportunity", "afrikaans": "geleentheid"} ], "advanced": [ {"english": "constitution", "afrikaans": "grondwet"}, {"english": "democracy", "afrikaans": "demokrasie"}, {"english": "sustainability", "afrikaans": "volhoubaarheid"} ] } } } # Save content to JSON file with open(os.path.join(DATA_DIR, "afrikaans_content.json"), "w") as f: json.dump(afrikaans_content, f) # Function to load content from JSON file def load_content(): try: with open(os.path.join(DATA_DIR, "afrikaans_content.json"), "r") as f: return json.load(f) except FileNotFoundError: return afrikaans_content # User tracking (in memory for demo purposes) user_progress = {} # Helper functions def get_random_exercise(category, level): content = load_content() if category in content and level in content[category]: exercises = content[category][level] return random.choice(exercises) if exercises else None return None def check_spelling(user_answer, correct_word): return user_answer.lower().strip() == correct_word.lower() def check_translation(user_answer, correct_translation): return user_answer.lower().strip() == correct_translation.lower() def check_reading_answer(user_answer, question_index, reading): # Simple implementation for demo purposes question = reading["questions"][question_index] text = reading["text"].lower() if question_index == 0 and "johan" in reading["title"].lower(): if "tien" in user_answer.lower() or "10" in user_answer: return True elif question_index == 1 and "johan" in reading["title"].lower(): if "anke" in user_answer.lower(): return True elif question_index == 2 and "johan" in reading["title"].lower(): if "kaapstad" in user_answer.lower() or "by die strand" in user_answer.lower(): return True # Generic fallback - check if answer contains words from the text return len(user_answer.strip()) > 0 # Accept any non-empty answer for demo # Main app components def phonics_component(): content = load_content() with gr.Tabs() as tabs: with gr.Tab("Beginner Phonics"): with gr.Accordion("Afrikaans Sounds", open=True): for phoneme in content["phonics"]["beginner"]: with gr.Accordion(f"{phoneme['sound']} - {phoneme['pronunciation']}", open=False): examples_text = ", ".join(phoneme["examples"]) gr.Markdown(f"**Examples:** {examples_text}") # Practice section gr.Markdown("### Practice") for example in phoneme["examples"]: with gr.Row(): gr.Textbox(example, label="Word") input_box = gr.Textbox(label="Type the word") check_btn = gr.Button("Check") result = gr.Textbox(label="Result") def check_word(word, user_input): if user_input.lower().strip() == word.lower(): return "Correct! ✓" else: return f"Try again. The correct word is '{word}'." check_btn.click( fn=check_word, inputs=[gr.Textbox(example, visible=False), input_box], outputs=result ) with gr.Tab("Intermediate Phonics"): with gr.Accordion("Advanced Afrikaans Sounds", open=True): for phoneme in content["phonics"]["intermediate"]: with gr.Accordion(f"{phoneme['sound']} - {phoneme['pronunciation']}", open=False): examples_text = ", ".join(phoneme["examples"]) gr.Markdown(f"**Examples:** {examples_text}") # Practice section gr.Markdown("### Practice") for example in phoneme["examples"]: with gr.Row(): gr.Textbox(example, label="Word") input_box = gr.Textbox(label="Type the word") check_btn = gr.Button("Check") result = gr.Textbox(label="Result") check_btn.click( fn=check_word, inputs=[gr.Textbox(example, visible=False), input_box], outputs=result ) return tabs def vocabulary_component(): content = load_content() with gr.Tabs() as tabs: for level in ["beginner", "intermediate", "advanced"]: with gr.Tab(f"{level.capitalize()} Vocabulary"): for i, word_item in enumerate(content["vocabulary"][level]): with gr.Accordion(f"{word_item['word']} - {word_item['translation']}", open=i==0): gr.Markdown(f"**Word:** {word_item['word']}") gr.Markdown(f"**Translation:** {word_item['translation']}") gr.Markdown(f"**Example sentence:** {word_item['sentence']}") # Practice gr.Markdown("### Practice") with gr.Row(): word_input = gr.Textbox(label=f"What is the Afrikaans word for '{word_item['translation']}'?") check_btn = gr.Button("Check") result = gr.Textbox(label="Result") def check_vocab(word, user_input): if user_input.lower().strip() == word.lower(): return "Correct! ✓" else: return f"Try again. The correct word is '{word}'." check_btn.click( fn=check_vocab, inputs=[gr.Textbox(word_item['word'], visible=False), word_input], outputs=result ) return tabs def grammar_component(): content = load_content() with gr.Tabs() as tabs: for level in ["beginner", "intermediate", "advanced"]: with gr.Tab(f"{level.capitalize()} Grammar"): for rule in content["grammar"][level]: with gr.Accordion(rule["rule"], open=False): gr.Markdown(f"**Rule:** {rule['rule']}") gr.Markdown(f"**Explanation:** {rule['explanation']}") return tabs def reading_component(): content = load_content() def get_reading_passage(level): passages = content["reading"][level] return random.choice(passages) if passages else None def display_reading_passage(level): passage = get_reading_passage(level) if not passage: return "No passages available for this level.", [], [], "" return passage["title"], passage["text"], passage["questions"], json.dumps(passage) def check_reading_answers(answers, passage_json): passage = json.loads(passage_json) results = [] for i, answer in enumerate(answers): if i < len(passage["questions"]): if answer and len(answer.strip()) > 0: results.append(f"Question {i+1}: Accepted ✓") else: results.append(f"Question {i+1}: No answer provided") return "\n".join(results) with gr.Tabs() as tabs: for level in ["beginner", "intermediate", "advanced"]: with gr.Tab(f"{level.capitalize()} Reading"): refresh_btn = gr.Button(f"Get New {level.capitalize()} Reading Passage") title_out = gr.Textbox(label="Title") text_out = gr.Textbox(label="Reading Passage", lines=10) questions_out = gr.JSON(label="Questions") passage_json = gr.Textbox(visible=False) # Initial load of reading passage refresh_btn.click( fn=display_reading_passage, inputs=[gr.Textbox(level, visible=False)], outputs=[title_out, text_out, questions_out, passage_json] ) # Answer section answer_boxes = [] for i in range(4): # Max 4 questions per passage answer_boxes.append(gr.Textbox(label=f"Answer to Question {i+1}", lines=2)) check_btn = gr.Button("Check Answers") result = gr.Textbox(label="Results") check_btn.click( fn=check_reading_answers, inputs=answer_boxes + [passage_json], outputs=result ) return tabs def writing_component(): content = load_content() def get_writing_prompt(level): prompts = content["writing"][level] return random.choice(prompts) if prompts else None def display_writing_prompt(level): prompt = get_writing_prompt(level) if not prompt: return "No prompts available for this level.", "" return prompt["prompt"], prompt["example"] def evaluate_writing(user_text, prompt_text): # Simple evaluation based on word count word_count = len(user_text.split()) if word_count < 5: return "Please write a more complete response." elif word_count < 20: return "Good start! Try to elaborate more on your ideas." else: return "Excellent work! You've written a substantial response." with gr.Tabs() as tabs: for level in ["beginner", "intermediate", "advanced"]: with gr.Tab(f"{level.capitalize()} Writing"): refresh_btn = gr.Button(f"Get New {level.capitalize()} Writing Prompt") prompt_out = gr.Textbox(label="Writing Prompt") with gr.Accordion("View Example", open=False): example_out = gr.Textbox(label="Example", lines=10) user_writing = gr.Textbox(label="Your Response", lines=10, placeholder="Write your response here...") submit_btn = gr.Button("Submit for Feedback") feedback_out = gr.Textbox(label="Feedback") refresh_btn.click( fn=display_writing_prompt, inputs=[gr.Textbox(level, visible=False)], outputs=[prompt_out, example_out] ) submit_btn.click( fn=evaluate_writing, inputs=[user_writing, prompt_out], outputs=feedback_out ) return tabs def exercises_component(): content = load_content() def get_exercise(category, level): return get_random_exercise(category, level) def check_exercise(user_answer, exercise_json, category): exercise = json.loads(exercise_json) if category == "spelling": return "Correct!" if check_spelling(user_answer, exercise["word"]) else "Try again" elif category == "translation": return "Correct!" if check_translation(user_answer, exercise["afrikaans"]) else "Try again" return "Invalid category" with gr.Tabs() as tabs: # Spelling Exercises with gr.Tab("Spelling"): for level in ["beginner", "intermediate", "advanced"]: with gr.Tab(f"{level.capitalize()}"): refresh_btn = gr.Button("Get New Word") word_display = gr.JSON(label="Choose the correct spelling:") exercise_json = gr.Textbox(visible=False) answer = gr.Radio(label="Select your answer:") check_btn = gr.Button("Check Answer") result = gr.Textbox(label="Result") refresh_btn.click( fn=get_exercise, inputs=[ gr.Textbox("spelling", visible=False), gr.Textbox(level, visible=False) ], outputs=[word_display, exercise_json] ) check_btn.click( fn=check_exercise, inputs=[answer, exercise_json, gr.Textbox("spelling", visible=False)], outputs=result ) # Translation Exercises with gr.Tab("Translation"): for level in ["beginner", "intermediate", "advanced"]: with gr.Tab(f"{level.capitalize()}"): refresh_btn = gr.Button("Get New Word") word_display = gr.JSON(label="Translate:") exercise_json = gr.Textbox(visible=False) answer = gr.Textbox(label="Your translation:") check_btn = gr.Button("Check Answer") result = gr.Textbox(label="Result") refresh_btn.click( fn=get_exercise, inputs=[ gr.Textbox("translation", visible=False), gr.Textbox(level, visible=False) ], outputs=[word_display, exercise_json] ) check_btn.click( fn=check_exercise, inputs=[answer, exercise_json, gr.Textbox("translation", visible=False)], outputs=result ) return tabs # Main app interface with gr.Blocks(title="Learn Afrikaans") as app: gr.Markdown("# Learn Afrikaans") gr.Markdown("An interactive app to learn Afrikaans language") with gr.Tabs(): with gr.Tab("Phonics"): phonics_component() with gr.Tab("Vocabulary"): vocabulary_component() with gr.Tab("Grammar"): grammar_component() with gr.Tab("Reading"): reading_component() with gr.Tab("Writing"): writing_component() with gr.Tab("Exercises"): exercises_component() if __name__ == "__main__": app.launch()