<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Jean Estevez</title>
    <description>The latest articles on Forem by Jean Estevez (@jeancarje).</description>
    <link>https://forem.com/jeancarje</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1487214%2F44b14ec3-c016-4587-b94c-b377d99809f4.png</url>
      <title>Forem: Jean Estevez</title>
      <link>https://forem.com/jeancarje</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jeancarje"/>
    <language>en</language>
    <item>
      <title>LinguaClip: The Extension That Turns Your Browser into a Language Learning Tool Combining Pomodoro with Flashcards</title>
      <dc:creator>Jean Estevez</dc:creator>
      <pubDate>Tue, 15 Jul 2025 00:17:25 +0000</pubDate>
      <link>https://forem.com/jeancarje/linguaclip-the-extension-that-turns-your-browser-into-a-language-learning-tool-combining-pomodoro-370d</link>
      <guid>https://forem.com/jeancarje/linguaclip-the-extension-that-turns-your-browser-into-a-language-learning-tool-combining-pomodoro-370d</guid>
      <description>&lt;p&gt;Introducing &lt;strong&gt;LinguaClip&lt;/strong&gt;: The Extension That Turns Your Browser into a Language Learning Tool Combining Pomodoro with Flashcards&lt;/p&gt;

&lt;p&gt;👋 Have you ever been reading an article in another language and discovered valuable new vocabulary, only to forget it hours later?&lt;/p&gt;

&lt;p&gt;Learning a new language is a journey, but measuring progress and staying motivated can be challenging.&lt;/p&gt;

&lt;p&gt;To solve this, I'm thrilled to introduce my passion project: LinguaClip.&lt;/p&gt;

&lt;p&gt;LinguaClip is an open-source browser extension I developed to transform how we capture, learn, and – most importantly – visualize our progress in language learning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes LinguaClip special?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Effortless Capture: Select words/phrases on any website and save them to your personal collection with one click.&lt;br&gt;
📚 Flashcards + Pomodoro: Uses spaced repetition algorithms for optimal retention.&lt;br&gt;
📊 Progress Visualization: Powered by Chart.js, it generates dynamic charts showing your growth, study frequency, and top practiced words – your visual motivation boost!&lt;br&gt;
💡 Open-Source Collaboration: 100% open-source. I invite you to explore, suggest features, report bugs, or share feedback!&lt;/p&gt;

&lt;p&gt;This project combines front-end development, UX design, and my love for languages into one powerful tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it now:&lt;/strong&gt;&lt;br&gt;
🔗 GitHub Repo: &lt;a href="https://github.com/Jean-EstevezT/LinguaClip-extension" rel="noopener noreferrer"&gt;https://github.com/Jean-EstevezT/LinguaClip-extension&lt;/a&gt;&lt;br&gt;
🔗 Install guide: Available in the repository&lt;/p&gt;

&lt;p&gt;⭐ If you find it useful, a GitHub star means the world!&lt;/p&gt;

&lt;p&gt;Thanks for reading – I hope LinguaClip helps you as much as building it helped me!&lt;/p&gt;

&lt;h1&gt;
  
  
  LinguaClip #JavaScript #WebExtensions #ChromeExtension #OpenSource #EdTech #LanguageLearning #Pomodoro #Flashcards #ChartJS #WebDev #Developer #Coding #TechForGood #SaaS #EdTech #Startup #LanguageHack #LearnToCode
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>learning</category>
    </item>
    <item>
      <title>🏗️ From “Ghost Ideas” to Living Projects: My 5-Step Route to Mastering Python 🐍💥</title>
      <dc:creator>Jean Estevez</dc:creator>
      <pubDate>Wed, 09 Jul 2025 16:34:07 +0000</pubDate>
      <link>https://forem.com/jeancarje/from-ghost-ideas-to-living-projects-my-5-step-route-to-mastering-python-5aj3</link>
      <guid>https://forem.com/jeancarje/from-ghost-ideas-to-living-projects-my-5-step-route-to-mastering-python-5aj3</guid>
      <description>&lt;p&gt;Is your folder a festival of abandoned projects? 🎢 You open it and you’re greeted by a parade of names like bot_final, ultimate_analysis, web_demo_v3… all promising at first, but buried by procrastination! If this sounds familiar, raise your hand 🤚 – many of us start off sprinting and end up jogging excuses.&lt;/p&gt;

&lt;p&gt;Enough of being the curator of an idea graveyard. 🚧 With this simple 5‑step plan, you’ll become the architect of completed projects, not a collector of half‑baked concepts. Let’s dive in! 👇&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Fall in Love with the Pain, Not the Tech Hype 💔✨
&lt;/h3&gt;

&lt;p&gt;Common mistake: “I want to tinker with Django because it’s trending.”&lt;/p&gt;

&lt;p&gt;Real superpower: “I hate losing time hunting shipping rates. I’m building a scraper to save me that hassle.”&lt;/p&gt;

&lt;p&gt;When personal pain drives your learning, even the most annoying bug becomes your ally. Spot those tiny daily frictions and turn each project into a meaningful challenge.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔍 Your turn: List 3 tech annoyances that steal minutes from your day. There lies your next project!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Define Your “North Star” in One Sentence 🌠
&lt;/h3&gt;

&lt;p&gt;A project without a compass is like a ship without a rudder.&lt;/p&gt;

&lt;p&gt;Vague goal: “I want a Telegram bot.”&lt;/p&gt;

&lt;p&gt;Real goal: “Every morning I’ll receive a summary of finance news in Spanish on Telegram.”&lt;/p&gt;

&lt;p&gt;That precise line is your beacon: it keeps you on track when distractions knock on your door.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📝 Quick exercise: Summarize your idea in one clear sentence and stick it on a post‑it next to your keyboard.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. Build with LEGO Bricks, Not Mountains of Code 🧱
&lt;/h3&gt;

&lt;p&gt;Thinking of your project as “the whole system” is overwhelming. Break it down:&lt;/p&gt;

&lt;p&gt;INPUT 📥 – What comes in? (URLs, files, user text…)&lt;/p&gt;

&lt;p&gt;PROCESS ⚙️ – What magic happens? (calculations, API calls…)&lt;/p&gt;

&lt;p&gt;OUTPUT 📤 – How is it delivered? (console, database, notifications…)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Turn each component into tiny tasks. You’ll go from “building a castle” to “placing one brick.” Way more motivating.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4. Challenge Yourself Before Calling for Backup 🧠💪
&lt;/h3&gt;

&lt;p&gt;Google is a good friend… but also a crutch.&lt;/p&gt;

&lt;p&gt;No challenge: Copy‑pasting solutions.&lt;/p&gt;

&lt;p&gt;With challenge: Try first, fail, read the error, then research.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Controlled frustration is the gym where expert problem‑solvers are forged. Every bug you face without copy‑paste leaves you with a spark of knowledge you won’t forget.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  5. Ship Your “Rough” MVP and Celebrate 🎉
&lt;/h3&gt;

&lt;p&gt;Perfectionism slows you down. The MVP (Minimum Viable Product) is your best ally:&lt;/p&gt;

&lt;p&gt;A polished UI can wait.&lt;/p&gt;

&lt;p&gt;If it prints the correct result, it’s a win!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Publish your “ugly but working” version and let it run. Once it’s live, feedback will guide your improvements.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🚀 Your Ultimate Goal: Become the Finisher!
&lt;/h3&gt;

&lt;p&gt;It’s not just about completing a project; it’s about proving to yourself that you follow through. A repository with one finished, documented challenge speaks louder than ten eternally “in progress” ideas.&lt;/p&gt;

&lt;p&gt;👇 Now tell me:&lt;br&gt;
Which project are you resurrecting from your digital graveyard today? Do you have any extra tricks to keep motivation high? I’m reading your comments!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>🌍 Build My Own Telegram Translator Bot with Python</title>
      <dc:creator>Jean Estevez</dc:creator>
      <pubDate>Sat, 28 Jun 2025 02:19:41 +0000</pubDate>
      <link>https://forem.com/jeancarje/build-my-own-telegram-translator-bot-with-python-23n7</link>
      <guid>https://forem.com/jeancarje/build-my-own-telegram-translator-bot-with-python-23n7</guid>
      <description>&lt;p&gt;⚙️ *This article is part of my practice and reinforcement: in this post you will see “what” I have done, also “why” and “how” each part works, it is ideal for advanced and intermediate beginners.&lt;/p&gt;

&lt;p&gt;Hey devs! 👋 I'm Jean, and I've launched &lt;strong&gt;LinguaTranslateSpark&lt;/strong&gt;: a Telegram bot that instantly translates text in 100+ languages. &lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What Is LinguaTranslateSpark?
&lt;/h2&gt;

&lt;p&gt;A lightweight real-time translation bot for Telegram, built in Python. With it you can:&lt;/p&gt;

&lt;p&gt;✅ Translate instantly.&lt;br&gt;&lt;br&gt;
✅ Change target languages.&lt;br&gt;&lt;br&gt;
✅ Save preferences&lt;br&gt;&lt;br&gt;
✅ Deploy in minutes  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://t.me/LinguaTranslateSparkBot" rel="noopener noreferrer"&gt;👉 Test now&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠️ Why I Built This
&lt;/h2&gt;

&lt;p&gt;I converse daily with friends (some of us don't speak the same language) and I thought, what better exercise or practice than a telegram bot to translate, practice and at the same time have some fun, biting code 😄&lt;/p&gt;


&lt;h3&gt;
  
  
  🔧 Under the Hood: Code and Concepts
&lt;/h3&gt;

&lt;p&gt;Dependencies and Setup&lt;br&gt;
python-telegram-bot: abstracts Telegram API with handlers and callbacks.&lt;/p&gt;

&lt;p&gt;deep-translator: lightweight client for Google Translate (without using the official API, plus googletrans flags many errors).&lt;/p&gt;

&lt;p&gt;Async I/O with async def: avoids crashes and improves real-time experience.&lt;/p&gt;

&lt;p&gt;context.user_data: per-user dict to remember preferences without database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;telegram&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InlineKeyboardButton&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InlineKeyboardMarkup&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;telegram.ext&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;CommandHandler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;MessageHandler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;CallbackContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;CallbackQueryHandler&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;deep_translator&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GoogleTranslator&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We import key classes from python-telegram-bot.&lt;/p&gt;

&lt;p&gt;ApplicationBuilder creates the bot, and the handlers are the “routes” that execute functions according to commands or responses.&lt;/p&gt;




&lt;h2&gt;
  
  
  Translation Function
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;translate_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CallbackContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;user_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;effective_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;

    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;User &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; sent text: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;target_language&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;target_language&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;loop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_running_loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;translated_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run_in_executor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;GoogleTranslator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;target_language&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;translate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;b&amp;gt;Original:&amp;lt;/b&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;b&amp;gt;Translation (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target_language&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;):&amp;lt;/b&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;translated_text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parse_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HTML&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Successful translation for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target_language&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;error_message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Translation error. Please try again.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Translation error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exc_info&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;p&gt;async def declares a coroutine, which allows await (although we use synchronous library here; in real projects it is convenient to use an asynchronous client).&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Try It Out in 60 Seconds
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;&lt;br&gt;
git clone https://github.com/Jean-EstevezT/LinguaTranslateSpark&lt;br&gt;
cd LinguaTranslateSpark&lt;br&gt;
pip install python-telegram-bot deep-translator&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Put your token in config.py (or environment variable).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run: python bot.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chat with your bot: @LinguaTranslateSparkBot&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 What I Learned
&lt;/h2&gt;

&lt;p&gt;Callback Queries: how to capture clicks on inline buttons.&lt;/p&gt;

&lt;p&gt;Session State: using context.user_data without external database.&lt;/p&gt;

&lt;p&gt;Async vs Sync: when and why to use coroutines in bots.&lt;/p&gt;

&lt;p&gt;Error Handling: wrapping translations in try/except to control network failures or API limits.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Project Links
&lt;/h2&gt;

&lt;p&gt;🔗 GitHub: &lt;a href="https://github.com/Jean-EstevezT/=" rel="noopener noreferrer"&gt;https://github.com/Jean-EstevezT/=&lt;/a&gt;&lt;br&gt;
🤖 Telegram: @LinguaTranslateSparkBot&lt;br&gt;
🐦 Twitter: &lt;a href="https://x.com/jeantvz" rel="noopener noreferrer"&gt;https://x.com/jeantvz&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>opensource</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
