<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Language | Ville Langén</title><link>https://villelangen.com/tags/language/</link><atom:link href="https://villelangen.com/tags/language/index.xml" rel="self" type="application/rss+xml"/><description>Language</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Thu, 03 Sep 2026 00:00:00 +0000</lastBuildDate><image><url>https://villelangen.com/media/icon_hu7353780716416406245.png</url><title>Language</title><link>https://villelangen.com/tags/language/</link></image><item><title>Tongue Driller</title><link>https://villelangen.com/dev-work/tongue-driller/</link><pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate><guid>https://villelangen.com/dev-work/tongue-driller/</guid><description>&lt;p>&lt;strong>Tongue Driller&lt;/strong> is a small &lt;strong>desktop&lt;/strong> app by Ville Langén for language drills. Prompt on top, type the answer, Enter to check. Optional translation, grammar note, and spoken answer (TTS). UI in Finnish or English.&lt;/p>
&lt;p>&lt;strong>You can use it&lt;/strong> (download first):&lt;/p>
&lt;ul>
&lt;li>&lt;strong>macOS Apple Silicon:&lt;/strong> &lt;a href="https://github.com/vljlangen/tongue-driller/releases/download/v1.0.0/TongueDriller-arm64.dmg" target="_blank" rel="noopener">TongueDriller-arm64.dmg&lt;/a>&lt;/li>
&lt;li>&lt;strong>macOS Intel:&lt;/strong> &lt;a href="https://github.com/vljlangen/tongue-driller/releases/download/v1.0.0/TongueDriller-intel.dmg" target="_blank" rel="noopener">TongueDriller-intel.dmg&lt;/a>&lt;/li>
&lt;li>&lt;strong>Windows:&lt;/strong> &lt;a href="https://github.com/vljlangen/tongue-driller/releases/download/v1.0.0/TongueDriller.exe" target="_blank" rel="noopener">TongueDriller.exe&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>All builds and notes: &lt;a href="https://github.com/vljlangen/tongue-driller/releases/tag/v1.0.0" target="_blank" rel="noopener">GitHub Releases (v1.0.0)&lt;/a>.&lt;/p>
&lt;h3 id="opening-screen">Opening screen&lt;/h3>
&lt;p>Open a CSV chapter, create the built-in English–German example, toggle shuffle, and pick a speech voice. Switch the UI with &lt;strong>Suomi&lt;/strong> / English.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-100" >&lt;img alt="Tongue Driller opening screen" srcset="
/dev-work/tongue-driller/opening_screen_hu17451097696005565665.webp 400w,
/dev-work/tongue-driller/opening_screen_hu11746669961823650080.webp 760w,
/dev-work/tongue-driller/opening_screen_hu11897029932567546731.webp 1200w"
src="https://villelangen.com/dev-work/tongue-driller/opening_screen_hu17451097696005565665.webp"
width="760"
height="587"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h3 id="how-it-works">How it works&lt;/h3>
&lt;ol>
&lt;li>Open a CSV chapter (or create the example).&lt;/li>
&lt;li>Read the prompt, type the answer, press Enter.&lt;/li>
&lt;li>See correct / incorrect; optionally show translation, rule, and hear TTS.&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Examples of how to use the app&lt;/strong>&lt;/p>
&lt;p>A simple translation: English prompt on top, type the German (or other) sentence below, then Enter.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-100" >&lt;img alt="Simple translation drill" srcset="
/dev-work/tongue-driller/simple_translation_hu1386182413130004792.webp 400w,
/dev-work/tongue-driller/simple_translation_hu7536004732852455560.webp 760w,
/dev-work/tongue-driller/simple_translation_hu6225954308838064105.webp 1200w"
src="https://villelangen.com/dev-work/tongue-driller/simple_translation_hu1386182413130004792.webp"
width="760"
height="598"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>A word-order drill: prompt on top, your answer below, then instant feedback plus a short grammar tip.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-100" >&lt;img alt="Correct answer on a word-order drill" srcset="
/dev-work/tongue-driller/start_with_a_word_hu8388911117135739382.webp 400w,
/dev-work/tongue-driller/start_with_a_word_hu12034427904739311330.webp 760w,
/dev-work/tongue-driller/start_with_a_word_hu5067375272722616261.webp 1200w"
src="https://villelangen.com/dev-work/tongue-driller/start_with_a_word_hu8388911117135739382.webp"
width="760"
height="593"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>Gender drills work the same way—wrong answers highlight the mismatch; correct ones confirm the article.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-100" >&lt;img alt="Wrong gender answer with highlighted correction" srcset="
/dev-work/tongue-driller/gender_de_wrong_hu11565772466060692687.webp 400w,
/dev-work/tongue-driller/gender_de_wrong_hu15607620662607471002.webp 760w,
/dev-work/tongue-driller/gender_de_wrong_hu1196234206031458723.webp 1200w"
src="https://villelangen.com/dev-work/tongue-driller/gender_de_wrong_hu11565772466060692687.webp"
width="760"
height="593"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-100" >&lt;img alt="Correct gender answer" srcset="
/dev-work/tongue-driller/gender_de_right_hu16437514774118530159.webp 400w,
/dev-work/tongue-driller/gender_de_right_hu14201982878872760065.webp 760w,
/dev-work/tongue-driller/gender_de_right_hu14015462417623273172.webp 1200w"
src="https://villelangen.com/dev-work/tongue-driller/gender_de_right_hu16437514774118530159.webp"
width="760"
height="586"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h3 id="statistics">Statistics&lt;/h3>
&lt;p>Per-folder totals: a year heatmap of minutes drilled, streaks, and an error-rate chart by day.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-100" >&lt;img alt="Drill statistics window" srcset="
/dev-work/tongue-driller/statistics_hu11130355843983160439.webp 400w,
/dev-work/tongue-driller/statistics_hu12065417733306442152.webp 760w,
/dev-work/tongue-driller/statistics_hu9234779692038552821.webp 1200w"
src="https://villelangen.com/dev-work/tongue-driller/statistics_hu11130355843983160439.webp"
width="760"
height="648"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h3 id="csv-format">CSV format&lt;/h3>
&lt;p>Recommended columns: &lt;strong>prompt&lt;/strong>, &lt;strong>answer&lt;/strong>, &lt;strong>translation&lt;/strong>, &lt;strong>rule&lt;/strong> (last two optional). Headers optional—column 1 is the prompt, column 2 the answer.&lt;/p>
&lt;ul>
&lt;li>Underscores around a word underline it in the prompt.&lt;/li>
&lt;li>In the file, &lt;code>\n&lt;/code> starts a new line in the prompt.&lt;/li>
&lt;/ul>
&lt;p>Keep personal chapter files private; &lt;code>chapters/&lt;/code> is gitignored in the public repo.&lt;/p>
&lt;h3 id="run-from-source">Run from source&lt;/h3>
&lt;p>Needs &lt;strong>Python 3 with Tkinter&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">python3 drill.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>On Mac, Homebrew Python 3.14 often lacks Tkinter—use 3.13 if needed.&lt;/p>
&lt;h3 id="development--support">Development &amp;amp; Support&lt;/h3>
&lt;p>Open source (MIT) on &lt;strong>&lt;a href="https://github.com/vljlangen/tongue-driller" target="_blank" rel="noopener">GitHub&lt;/a>&lt;/strong>. Issues and ideas welcome there.&lt;/p></description></item></channel></rss>