<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Tom Mondloch - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Tom Mondloch - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 18 May 2026 20:18:45 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/author/freeCodeCampTom/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Introducing freeCodeCamp Daily Python and JavaScript Challenges – Solve a New Programming Puzzle Every Day ]]>
                </title>
                <description>
                    <![CDATA[ The freeCodeCamp community is excited to announce that our new Daily Coding Challenges are ready for you to tackle. 🎊 Consistent practice is one of the most effective ways to improve your coding skills. So in addition to the core coding curriculum, ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/introducing-freecodecamp-daily-python-and-javascript-challenges-solve-a-new-programming-puzzle-every-day/</link>
                <guid isPermaLink="false">68bafb5703bcabb153325d47</guid>
                
                    <category>
                        <![CDATA[ freeCodeCamp.org ]]>
                    </category>
                
                    <category>
                        <![CDATA[ coding challenge ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Tom Mondloch ]]>
                </dc:creator>
                <pubDate>Fri, 05 Sep 2025 15:01:43 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1757012321426/66cb1d9b-b2e1-4911-bea5-ca1f1308ca35.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>The freeCodeCamp community is excited to announce that our new Daily Coding Challenges are ready for you to tackle. 🎊</p>
<p>Consistent practice is one of the most effective ways to improve your coding skills. So in addition to the core coding curriculum, you can now keep your programming skills sharp by solving a fun new coding challenge every single day.</p>
<p>Each day at <strong>midnight US Central time</strong>, a new programming puzzle will unlock on <a target="_blank" href="https://freecodecamp.org">freecodecamp.org</a> and the freeCodeCamp mobile app that you can solve in JavaScript and Python.</p>
<h2 id="heading-how-to-start-solving-daily-coding-challenges">How to Start Solving Daily Coding Challenges</h2>
<h3 id="heading-on-the-freecodecamp-mobile-app">On the freeCodeCamp Mobile App:</h3>
<ol>
<li><p>Download the freeCodeCamp mobile app from the Google Play Store or the Apple App Store and open it.</p>
</li>
<li><p>Don’t forget to sign in if you want to save your progress. Then find todays challenge at the top and click “Start the challenge”:</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757013682796/383439a2-12d5-4054-88d5-e0e6a6f052f0.png" alt="383439a2-12d5-4054-88d5-e0e6a6f052f0" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<ol start="3">
<li>Choose your preferred language:</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757013721085/873f1d66-93c5-47ac-805c-aa8ef99d058c.png" alt="873f1d66-93c5-47ac-805c-aa8ef99d058c" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<ol start="4">
<li>Read the challenge instructions:</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757013769135/ff7d0843-1566-4349-8559-9626264bb87a.png" alt="ff7d0843-1566-4349-8559-9626264bb87a" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<ol start="5">
<li>Write the code:</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757013821639/a049756c-b873-4b6b-a7a9-ab020db48933.png" alt="a049756c-b873-4b6b-a7a9-ab020db48933" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<ol start="6">
<li>Pass the tests:</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757014651276/28dff232-0c54-41b3-ac2f-0ddbfa0d913c.png" alt="28dff232-0c54-41b3-ac2f-0ddbfa0d913c" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>And voilà! You’ve completed the challenge.</p>
<h3 id="heading-on-the-website">On the Website:</h3>
<ol>
<li>Go to <a target="_blank" href="https://freecodecamp.org">freecodecamp.org</a> and make sure you’re logged in if you want to save your progress. Then scroll down to find the coding challenge of the day and click “Start”:</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757014100541/aaf37fe9-d06e-4198-834c-6cd6ea37d330.png" alt="aaf37fe9-d06e-4198-834c-6cd6ea37d330" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<ol start="2">
<li><p>Choose your preferred language at the top</p>
</li>
<li><p>Read the challenge instructions, write the code, and pass the tests:</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757014412721/ee3a6ed9-0628-41fe-acf0-fc10e5772ee8.png" alt="ee3a6ed9-0628-41fe-acf0-fc10e5772ee8" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h2 id="heading-what-if-i-missed-a-day">What if I Missed a Day?</h2>
<p>Don’t worry if you miss a challenge. Both the mobile app and website include an <strong>archive page</strong>, where you can browse and complete past challenges at your own pace:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757015163098/3bdf35b5-d76c-49de-bb50-35f262716059.png" alt="3bdf35b5-d76c-49de-bb50-35f262716059" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h2 id="heading-start-your-first-challenge-today">Start Your first Challenge Today</h2>
<p>Today’s challenge is waiting for you. Open the freeCodeCamp app or head to <a target="_blank" href="https://freecodecamp.org">freecodecamp.org</a> to complete it. 🚀</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Introducing the Solana Curriculum: Smart Contracts, dApps, and Command Line Tools ]]>
                </title>
                <description>
                    <![CDATA[ The Solana Curriculum is live. You can now learn Solana's blockchain protocol and the Solana tool ecosystem interactively by building a series of projects. This curriculum is made possible by The Solana Foundation, who gave our charity a grant to 100... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/solana-curriculum/</link>
                <guid isPermaLink="false">66b0aa4a72aed240a79b249f</guid>
                
                    <category>
                        <![CDATA[ Blockchain ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Solana ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web3 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Tom Mondloch ]]>
                </dc:creator>
                <pubDate>Fri, 15 Sep 2023 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/09/arturo-castaneyra-7laIG_Xv5FI-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>The Solana Curriculum is live. You can now learn Solana's blockchain protocol and the Solana tool ecosystem interactively by building a series of projects.</p>
<p>This curriculum is made possible by The Solana Foundation, who gave our charity a grant to 100% fund development of this curriculum.</p>
<h2 id="heading-what-will-this-curriculum-teach-you">What will this curriculum teach you?</h2>
<p>The Solana curriculum contains ten interactive practice projects that will guide you through learning the Solana protocol and their tools.</p>
<p>Through these projects, you will learn how to build and deploy smart contracts, dApps, work with their command line tools, and much more.</p>
<p>There are also five challenging integrated projects to test your knowledge.</p>
<h2 id="heading-how-does-it-work">How does it work?</h2>
<p>The courses will run in a docker container using VS Code and the <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=freeCodeCamp.freecodecamp-courses">freeCodeCamp Courses extension.</a></p>
<h3 id="heading-heres-a-sample">Here's a Sample</h3>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/N7r8ja0QEr4" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<h2 id="heading-which-projects-will-you-build-as-part-of-the-solana-curriculum">Which Projects Will You Build as Part of the Solana Curriculum?</h2>
<p>These projects consist of two interactive practice projects and one integrated project. Here are the projects:</p>
<ol>
<li>Learn How to Set Up Solana by Building a Hello World Smart Contract</li>
<li>Learn How to Interact with On-Chain Programs</li>
<li>Build a Smart Contract</li>
<li>Learn Solana's Token Program by Minting a Fungible Token</li>
<li>Learn the Metaplex SDK by Minting an NFT</li>
<li>Build a University Certification NFT</li>
<li>Learn Anchor by Building Tic-Tac-Toe: Part 1</li>
<li>Learn Anchor by Building Tic-Tac-Toe: Part 2</li>
<li>Build an Anchor Leaderboard</li>
<li>Learn How to Build a Client-Side App: Part 1</li>
<li>Learn How to Build a Client-Side App: Part 2</li>
<li>Build a Client-Side App</li>
<li>Learn How to Build for Mainnet</li>
<li>Learn How to Deploy to Devnet</li>
<li>Build and Deploy Your Freeform App</li>
</ol>
<h2 id="heading-how-to-run-the-courses">How to Run the Courses</h2>
<p>Follow the steps below to run the courses</p>
<h3 id="heading-developer-environment-prerequisites">Developer Environment Prerequisites</h3>
<p>Before you get started, make sure you have these installed on your computer:</p>
<ol>
<li><a target="_blank" href="https://docs.docker.com/engine/">Docker Engine</a></li>
<li><a target="_blank" href="https://code.visualstudio.com/download">VS Code</a> and the <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers">Dev Containers</a> extension</li>
<li>Git</li>
</ol>
<h3 id="heading-how-to-run-the-curriculum-in-docker">How to Run the Curriculum in Docker</h3>
<p>Follow these instructions to clone the repo and run the courses:</p>
<ol>
<li>Open a terminal and clone the <a target="_blank" href="https://github.com/freeCodeCamp/solana-curriculum">solana-curriculum</a> repo with:<pre><code class="lang-console">git clone https://github.com/freeCodeCamp/solana-curriculum.git
</code></pre>
</li>
<li><p>Navigate to the <code>solana-curriculum</code> directory, and open it in a VSCode workspace with:</p>
<pre><code class="lang-console">code .
</code></pre>
</li>
<li><p>Press <code>Ctrl / Cmd + Shift + P</code> to open the command palette, and run <code>Dev Containers: Rebuild Container and Reopen in Container</code>. VS Code will build the container to run the projects in, it will take a few minutes the first time.</p>
</li>
<li>Once it's finished, press <code>Ctrl / Cmd + Shift + P</code> again and run <code>freeCodeCamp: Run Course</code> to start the courses. This will also take a moment.</li>
<li>The simple browser will open when it's done. If it's a blank white page, use the refresh button to update it and see the courses home page.</li>
<li>Click on one of the available projects to start a project.</li>
<li>Follow the instructions to complete the project.</li>
<li>Have fun!</li>
</ol>
<p>If you want to switch projects, click the freeCodeCamp logo at the top to get back to the home page.</p>
<h2 id="heading-freecodecamp-also-offers-a-more-general-web3-course-that-covers-blockchain-fundamentals">freeCodeCamp Also Offers a More General Web3 Course that Covers Blockchain Fundamentals</h2>
<p>While you are waiting for these courses, you can <a target="_blank" href="https://www.freecodecamp.org/news/web3-curriculum-open-beta">try the Web3 curriculum</a>  which is now in open beta. It will teach you many Web3 and blockchain concepts you will want to know for the Solana curriculum.</p>
<h2 id="heading-where-you-can-learn-more-about-the-solana-foundation">Where you can Learn more about the Solana Foundation</h2>
<p>You can learn more about <a target="_blank" href="https://solana.org/">The Solana Foundation</a> on their website.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ freeCodeCamp is Building a NEAR Curriculum ]]>
                </title>
                <description>
                    <![CDATA[ Update December 2022: The first group of projects is fully released. The newly available projects are "Learn NEAR Smart Contracts by Building a Word Guessing Game" and "Build a Sentence Making Smart Contract". The "When Will it be Available?" section... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/near-curriculum/</link>
                <guid isPermaLink="false">66b0aa487cd8dca6718a22ae</guid>
                
                    <category>
                        <![CDATA[ Blockchain ]]>
                    </category>
                
                    <category>
                        <![CDATA[ NEAR ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web3 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Tom Mondloch ]]>
                </dc:creator>
                <pubDate>Wed, 21 Sep 2022 15:10:19 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/09/joshua-newton-IRXYNAMlUtw-unsplash-1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><em>Update December 2022: The first group of projects is fully released. The newly available projects are "Learn NEAR Smart Contracts by Building a Word Guessing Game" and "Build a Sentence Making Smart Contract". The <a class="post-section-overview" href="#heading-when-will-it-be-available">"When Will it be Available?"</a> section has been updated to include the new projects.</em></p>
<p>Over the past 9 months, several of our instructors have been hard at work on a comprehensive NEAR curriculum. This will focus on NEAR's blockchain protocol and the NEAR tool ecosystem.</p>
<p>This curriculum is made possible by NEAR Foundation, who gave our charity a grant to 100% fund development of this curriculum.</p>
<h2 id="heading-what-will-it-contain">What will it contain?</h2>
<p>The curriculum will contain at least ten interactive practice projects that will guide you through learning the NEAR protocol and their tools. </p>
<p>You'll learn how to build and deploy your own smart contracts, dApps, work with NEAR command line tools, and much more. There will also be five challenging integrated projects to test your knowledge.</p>
<h2 id="heading-how-will-it-work">How will it work?</h2>
<p>These courses will run in a docker container using VS Code and the <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=freeCodeCamp.freecodecamp-courses">freeCodeCamp Courses extension.</a></p>
<h3 id="heading-heres-a-sample-of-the-first-project">Here's a Sample of the first Project</h3>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/gV4aL0LY2LA" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<h2 id="heading-when-will-it-be-available">When Will it be Available?</h2>
<p>The courses will be released in batches. As we finish creating a group of projects, typically consisting of two interactive practice projects and one integrated project, they will be released for you to complete. The first group is available now! and consists of these projects:</p>
<ul>
<li>Learn How to Set Up NEAR by Building a Hello World Smart Contract</li>
<li>Learn NEAR Smart Contracts by Building a Word Guessing Game</li>
<li>Build a Sentence Making Smart Contract</li>
</ul>
<h2 id="heading-how-to-run-the-courses">How to Run the Courses</h2>
<p>Follow the steps below to run the courses</p>
<h3 id="heading-developer-environment-prerequisites">Developer Environment Prerequisites</h3>
<p>Before you get started, make sure you have these installed on your computer:</p>
<ol>
<li><a target="_blank" href="https://docs.docker.com/engine/">Docker Engine</a></li>
<li><a target="_blank" href="https://code.visualstudio.com/download">VS Code</a> and the <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers">Dev Containers</a> extension</li>
<li>Git</li>
</ol>
<h3 id="heading-how-to-run-the-curriculum-in-docker">How to Run the Curriculum in Docker</h3>
<p>Follow these instructions to clone the repo and run the courses:</p>
<ol>
<li>Open a terminal and clone the <a target="_blank" href="https://github.com/freeCodeCamp/near-curriculum">near-curriculum</a> repo with:<pre><code class="lang-console">git clone https://github.com/freeCodeCamp/near-curriculum.git
</code></pre>
</li>
<li><p>Navigate to the <code>near-curriculum</code> directory, and open it in a VSCode workspace with:</p>
<pre><code class="lang-console">code .
</code></pre>
</li>
<li><p>Press <code>Ctrl / Cmd + Shift + P</code> to open the command palette, and run <code>Dev Containers: Rebuild Container and Reopen in Container</code>. VS Code will build the container to run the projects in, it will take a few minutes the first time.</p>
</li>
<li>Once it's finished, press <code>Ctrl / Cmd + Shift + P</code> again and run <code>freeCodeCamp: Run Course</code> to start the courses. This will also take a moment.</li>
<li>The simple browser will open when it's done. If it's a blank white page, use the refresh button to update it and see the courses home page.</li>
<li>Click on one of the available projects to start a project.</li>
<li>Follow the instructions to complete the project.</li>
<li>Have fun!</li>
</ol>
<p>If you want to switch projects, click the freeCodeCamp logo at the top to get back to the home page.</p>
<h2 id="heading-sign-up-for-updates">Sign up for updates</h2>
<p>Fill out <a target="_blank" href="https://docs.google.com/forms/d/e/1FAIpQLSf2-_-TNKOd_q-uOHkuZfpogZe0GLZkrCwvG2ZvAJXFnfA_Ag/viewform?usp=sf_link">this google form</a> to sign up to receive updates when new courses are released.</p>
<h2 id="heading-while-youre-waiting">While You're Waiting</h2>
<p>While you are waiting for these courses, you can <a target="_blank" href="https://www.freecodecamp.org/news/web3-curriculum-open-beta">try the Web3 curriculum</a> (also under development). It will teach you many Web3 and blockchain concepts you will want to know for the NEAR curriculum.</p>
<h2 id="heading-learn-more-about-near-foundation">Learn more about NEAR Foundation</h2>
<p>You can learn more about <a target="_blank" href="https://near.foundation/">NEAR Foundation</a> by visiting their website.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ freeCodeCamp's Web3 Curriculum Open Beta – And How to Run it ]]>
                </title>
                <description>
                    <![CDATA[ Update January 2023: The first group of projects is now fully available. The "Available interactive projects" section has been added to list the completed practice projects. The newly available projects are "Learn Digital Ledgers by Building a Blockc... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/web3-curriculum-open-beta/</link>
                <guid isPermaLink="false">66b0aa4f2cf7184612a5a9c1</guid>
                
                    <category>
                        <![CDATA[ Blockchain ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web3 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Tom Mondloch ]]>
                </dc:creator>
                <pubDate>Wed, 21 Sep 2022 14:45:56 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/09/thomas-habr-wprOCzLIEYI-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><em>Update January 2023: The first group of projects is now fully available. The <a class="post-section-overview" href="#heading-available-interactive-projects">"Available interactive projects"</a> section has been added to list the completed practice projects. The newly available projects are "Learn Digital Ledgers by Building a Blockchain", "Learn Proof of Work Consensus by Building a Block Mining Algorithm", and "Learn Digital Signatures by Building a Wallet".</em></p>
<p>Over the past 11 months, we've made considerable progress on our Web3 curriculum. Today I'm thrilled to say that parts of this curriculum are now in open beta. You can try them today.</p>
<p>Before we get into the details, I want to thank the KaijuKingz community, who made a donation to freeCodeCamp that made development of these courses possible. You can <a target="_blank" href="https://www.freecodecamp.org/news/carbon-neutral-web3-curriculum-plans/">read more about their gift to the freeCodeCamp community here</a>.</p>
<h2 id="heading-how-to-approach-these-web3-courses">How to Approach These Web3 Courses</h2>
<p>As a prerequisite for this course, we recommend first learning full stack web development. You can do this by working through the first 7 <a target="_blank" href="https://www.freecodecamp.org/learn/">freeCodeCamp certifications</a> and building their projects:</p>
<ol>
<li><a target="_blank" href="https://www.freecodecamp.org/learn/2022/responsive-web-design/">Responsive Web Design</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/">JavaScript Algorithms and Data Structures</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/learn/front-end-development-libraries/">Front End Development Libraries</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/learn/data-visualization/">Data Visualization</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/learn/relational-database/">Relational Database</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/learn/back-end-development-and-apis/">Back End Development and APIs</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/learn/quality-assurance/">Quality Assurance</a></li>
</ol>
<p>We also recommend you know some knowledge of basic blockchain development concepts. freeCodeCamp has <a target="_blank" href="https://www.freecodecamp.org/news/learn-blockchain-solidity-full-stack-javascript-development/">an in-depth 32-hour course that covers this</a>, taught by developer and instructor Patrick Collins.</p>
<p>We also recommend learning some Rust, which you can learn interactively using <a target="_blank" href="https://www.freecodecamp.org/news/rust-in-replit/">freeCodeCamp's Rust course</a>.</p>
<p>Again, these prerequisites are just our recommendations. Feel free to just dive in and return to those resources as you see fit.</p>
<p>Right now, we have designed five integrated Web3 projects for you to complete:</p>
<ol>
<li>Build a Video Game Marketplace Blockchain</li>
<li>Build a Fundraising Smart Contract</li>
<li>Build a Peer-to-Peer Network</li>
<li>Build a Web3 Client-Side Package for your dApp</li>
<li>Build a Smart Contract in Rust</li>
</ol>
<p>Each of these projects has its own set of instructions with tasks for you to fulfill, and tests to ensure you've implemented your project correctly. Complete all the tasks and get all the tests to pass to finish each project.</p>
<h2 id="heading-these-5-projects-are-just-the-beginning">These 5 projects are just the beginning</h2>
<p>We are also developing 10 interactive Web3 practice projects.</p>
<p>These will walk you through all the Web3 concepts you need to know to build these 5 integrated projects we're releasing today. </p>
<p>Why are we releasing the hard part (the 5 integrated projects) first? For the die-hard Web3 enthusiasts who don't mind using watching <a target="_blank" href="https://www.freecodecamp.org/news/learn-blockchain-solidity-full-stack-javascript-development/">Patrick's course</a>, reading official documentation, and referencing the many other free Web3 tutorials out there.</p>
<p>Soon it will be a smoother ride for anyone to learn these tools and concepts. But we wanted to first get something out there for the hardcore crowd.</p>
<h2 id="heading-available-interactive-projects">Available interactive projects</h2>
<p>As of January 2023, the first group of interactive practice projects is now fully available. They will teach you the concepts you need to know to complete the first integrated project. The new courses are:</p>
<ol>
<li>Learn Digital Ledgers by Building a Blockchain</li>
<li>Learn Proof of Work Consensus by Building a Block Mining Algorithm</li>
<li>Learn Digital Signatures by Building a Wallet</li>
</ol>
<h2 id="heading-the-web3-curriculum-is-in-open-beta-we-welcome-your-feedback-and-bug-reports">The Web3 Curriculum is in open beta. We welcome your feedback and bug reports.</h2>
<p>Note that these are in open beta – meaning that we will continue to refine them with your feedback.</p>
<p>You can help by joining our new <a target="_blank" href="https://discord.gg/9KngwWzvd4">Web3 Curriculum Discord server</a>, introducing yourself, and helping other people who get stuck trying to build these 5 integrated projects.</p>
<p>You can also sign up for updates These will make it a lot easier to build these 5 integrated projects So in a way, you actually doing the hardest, most ambiguos  part <a class="post-section-overview" href="#heading-sign-up-for-updates">Sign up for updates below</a> for when new courses are released.</p>
<h2 id="heading-how-will-it-work">How will it work?</h2>
<p>The courses will run in a docker container using VS Code and the <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=freeCodeCamp.freecodecamp-courses">freeCodeCamp Courses extension.</a></p>
<h3 id="heading-heres-a-sample">Here's a sample</h3>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/EAidlZ6FZwE" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<h2 id="heading-how-to-run-the-courses">How to Run the Courses</h2>
<p>Follow the steps below to run the courses</p>
<h3 id="heading-developer-environment-prerequisites">Developer Environment Prerequisites</h3>
<p>Before you get started, make sure you have these installed on your computer:</p>
<ol>
<li><a target="_blank" href="https://docs.docker.com/engine/">Docker Engine</a></li>
<li><a target="_blank" href="https://code.visualstudio.com/download">VS Code</a> and the <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers">Dev Containers</a> extension</li>
<li>Git</li>
</ol>
<h3 id="heading-how-to-run-the-curriculum-in-docker">How to Run the Curriculum in Docker</h3>
<p>Follow these instructions to clone the repo and run the courses:</p>
<ol>
<li>Open a terminal and clone the <a target="_blank" href="https://github.com/freeCodeCamp/web3-curriculum">web3-curriculum</a> repo with:<pre><code class="lang-console">git clone https://github.com/freeCodeCamp/web3-curriculum.git
</code></pre>
</li>
<li><p>Navigate to the <code>web3-curriculum</code> directory, and open it in a VSCode workspace with:</p>
<pre><code class="lang-console">code .
</code></pre>
</li>
<li><p>Press <code>Ctrl / Cmd + Shift + P</code> to open the command palette, and run <code>Dev Containers: Rebuild Container and Reopen in Container</code>. VS Code will build the container to run the projects in, it will take a few minutes the first time.</p>
</li>
<li>Once it's finished, press <code>Ctrl / Cmd + Shift + P</code> again and run <code>freeCodeCamp: Run Course</code> to start the courses. This will also take a moment.</li>
<li>The simple browser will open when it's done. If it's a blank white page, use the refresh button to update it and see the courses home page.</li>
<li>Click on one of the available projects to start a project.</li>
<li>Follow the instructions to complete the project.</li>
<li>Have fun!</li>
</ol>
<p>If you want to switch projects, click the freeCodeCamp logo at the top to get back to the home page.</p>
<h2 id="sign-up">Sign up for updates</h2>

<p>Fill out <a target="_blank" href="https://docs.google.com/forms/d/e/1FAIpQLSdaKRd34e36eGVA7ne1g1x3kLPjTbLF0YoNqLWH6L7P2AmpxA/viewform?usp=sf_link">this google form</a> to receive updates when new courses are released.</p>
<h2 id="heading-other-courses">Other Courses</h2>
<p>We are also creating courses around the Solana and NEAR protocols.</p>
<p>View the <a target="_blank" href="https://www.freecodecamp.org/news/solana-curriculum/">Solana announcement article.</a>
View the <a target="_blank" href="https://www.freecodecamp.org/news/near-curriculum/">NEAR announcement article.</a></p>
<p>Or, check out the <a target="_blank" href="https://web3.freecodecamp.org/">web3.freecodecamp.org</a> domain where we showcase all the courses.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ VS Code Dark Theme – A freeCodeCamp Night Mode Style for Visual Studio Code ]]>
                </title>
                <description>
                    <![CDATA[ I'm excited to share freeCodeCamp's first official VS Code extension – a dark mode theme. This theme uses freeCodeCamp.org's distinct color scheme, typography, and UI design sensibilities. This night mode theme is minimalistic, easy on the eyes, and ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/vs-code-dark-mode-theme/</link>
                <guid isPermaLink="false">66b0aa4d3bed8efe7711a235</guid>
                
                    <category>
                        <![CDATA[ Visual Studio Code ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Tom Mondloch ]]>
                </dc:creator>
                <pubDate>Thu, 16 Sep 2021 16:46:30 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/09/Screen-Shot-2021-09-16-at-12.52.26-PM.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>I'm excited to share freeCodeCamp's first official VS Code extension – a dark mode theme.</p>
<p>This theme uses freeCodeCamp.org's distinct color scheme, typography, and UI design sensibilities.</p>
<p>This night mode theme is minimalistic, easy on the eyes, and will help you reach a coding flow state.</p>
<p>Here's a preview of what this night mode theme looks like:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/09/Screen-Shot-2021-09-16-at-12.43.07-PM.png" alt="Image" width="600" height="400" loading="lazy">
<em>VS Code Dark Mode Theme – freeCodeCamp Style</em></p>
<p>You can download this theme from the <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=freeCodeCamp.freecodecamp-dark-vscode-theme">Visual Studio Marketplace</a>. </p>
<p>Or you can just open up the extensions tab of your VS Code editor and search for "freeCodeCamp Dark Theme" to install it.</p>

  



<h2 id="heading-about-the-dark-mode-theme">About the Dark Mode Theme</h2>
<p>This theme is based off of freeCodeCamp's "Command Line Chic" visual aesthetic. If you want to feel like you're in Mr. Robot, this style is for you. </p>
<p>We designed this Night Mode theme to strike a balance between contrast and flavor, readability and flare.</p>
<p>If you are a design enthusiast, we've codified Command Line Chic in our nonprofit's <a target="_blank" href="https://design-style-guide.freecodecamp.org/">Design Style Guide</a>.</p>
<p>I think you're going to dig it. Happy coding.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Relational Database Course – How to Learn SQL in VSCode Using Docker and freeCodeCamp ]]>
                </title>
                <description>
                    <![CDATA[ You can now learn Relational Database concepts and SQL right inside your VSCode editor. This tutorial will walk you through how to install it using Docker. During this full-length 300-hour course, you will learn to build more than a dozen projects. S... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-run-freecodecamps-relational-databases-curriculum-using-docker-vscode-and-coderoad/</link>
                <guid isPermaLink="false">66b0aa467cd8dca6718a22aa</guid>
                
                    <category>
                        <![CDATA[ freeCodeCamp.org ]]>
                    </category>
                
                    <category>
                        <![CDATA[ freeCodeCamp Curriculum ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Relational Database ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Tom Mondloch ]]>
                </dc:creator>
                <pubDate>Thu, 16 Sep 2021 16:17:32 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/09/Screen-Shot-2021-09-12-at-9.22.55-PM.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>You can now learn Relational Database concepts and SQL right inside your VSCode editor. This tutorial will walk you through how to install it using Docker.</p>
<p>During this full-length 300-hour course, you will learn to build more than a dozen projects. Some of them will involve step-by-step instructions, and others will be open ended, with elaborate test suites.</p>
<p>You will use real developer tools and software like VS Code, PostgreSQL, and the Linux / Unix command line to complete interactive tutorials and build projects.</p>
<h3 id="heading-what-you-will-learn">What you will learn</h3>
<ul>
<li><p>The Linux / Unix Command Line</p>
</li>
<li><p>Relational Databases</p>
</li>
<li><p>SQL and PostgreSQL</p>
</li>
<li><p>Bash and Bash Scripting</p>
</li>
<li><p>Git and GitHub</p>
</li>
<li><p>Nano</p>
</li>
<li><p>And a lot of other concepts and tools</p>
</li>
</ul>
<p>This course was made possible by a grant from <a target="_blank" href="https://www.classcentral.com/">Class Central</a>, a search engine and review site for online courses.</p>
<h2 id="heading-how-to-install-docker-and-run-the-relational-database-curriculum">How to install Docker and run the Relational Database Curriculum</h2>
<p>Docker will run a container on your computer that has the software and file structure required for these tutorials.</p>
<p>You will be working in that container using VSCode and the Dev Containers extension. Once it's running, the CodeRoad extension will run the tutorials we have created.</p>
<h3 id="heading-prerequisites">Prerequisites</h3>
<p>Before you get started, you need to have a few things installed:</p>
<ol>
<li><p>The <a target="_blank" href="https://docs.docker.com/engine/install/">Docker Engine</a></p>
</li>
<li><p><a target="_blank" href="https://code.visualstudio.com/download">VS Code</a></p>
</li>
<li><p>The <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers">Dev Containers</a> extension for VS Code</p>
</li>
<li><p><a target="_blank" href="https://git-scm.com/downloads">Git</a></p>
</li>
</ol>
<h3 id="heading-how-to-run-a-project-in-docker">How to Run a Project in Docker</h3>
<p>Follow these steps to run the docker container and start a tutorial:</p>
<ol>
<li><p>Clone the RDB Alpha repo to your computer with <code>git clone https://github.com/freeCodeCamp/rdb-alpha</code></p>
</li>
<li><p>Open a terminal, navigate to the <code>rdb-alpha</code> directory, and open VS Code with <code>code .</code></p>
</li>
<li><p>In VS Code, open the command palette with <code>Ctrl / Cmd + Shift + P</code>. Then, enter and run <code>Dev Containers: Rebuild and Reopen in Container</code></p>
</li>
<li><p>A new VS Code window will open and begin building the Docker image. It will take several minutes to build the first time</p>
</li>
<li><p>Once the image is finished building, open the command palette again with <code>Ctrl / Cmd + Shift + P</code>, enter and run <code>CodeRoad: Start</code>. The command won't be available until the extension has finished installing in your container</p>
</li>
<li><p>In the CodeRoad window, click "Start New Tutorial"</p>
</li>
<li><p>Click the <code>URL</code> tab and enter the URL of the <code>tutorial.json</code> file for the project you want to start (ex: https://raw.githubusercontent.com/freeCodeCamp/learn-bash-by-building-a-boilerplate/main/tutorial.json) Full list of available tutorials below.</p>
</li>
<li><p>Click the "Start" button to start the lessons</p>
</li>
</ol>
<h3 id="heading-how-to-restart-or-switch-projects">How to Restart or Switch Projects</h3>
<p>If you restart or switch projects, you will lose your progress on a tutorial you may have started along with any files or folders you may have created.</p>
<ol>
<li><p>Open the command palette with <code>Ctrl / Cmd + Shift + P</code>, enter and run <code>Dev-Containers: Rebuild Container</code></p>
</li>
<li><p>Wait for VS Code to reopen the reload the container</p>
</li>
<li><p>Open CodeRoad from the command palette like you did before, click "Start New Tutorial", and enter the URL of the <code>tutorial.json</code> file for the project you want to do</p>
</li>
</ol>
<h3 id="heading-available-courses">Available Courses</h3>
<p>Here is a list of tutorials currently available. Open one of them and use its URL, as described in the instructions above, to start it.</p>
<ul>
<li><p><a target="_blank" href="https://raw.githubusercontent.com/freeCodeCamp/learn-bash-by-building-a-boilerplate/main/tutorial.json">Learn Bash by Building a Boilerplate</a></p>
</li>
<li><p><a target="_blank" href="https://raw.githubusercontent.com/freeCodeCamp/learn-relational-databases-by-building-a-database-of-video-game-characters/main/tutorial.json">Learn Relational Databases by Building a Database of Video Game Characters</a></p>
</li>
<li><p><a target="_blank" href="https://raw.githubusercontent.com/freeCodeCamp/learn-celestial-bodies-database/main/tutorial.json">Celestial Bodies Database</a></p>
</li>
<li><p><a target="_blank" href="https://raw.githubusercontent.com/freeCodeCamp/learn-bash-scripting-by-building-five-programs/main/tutorial.json">Learn Bash Scripting by Building Five Programs</a></p>
</li>
<li><p><a target="_blank" href="https://raw.githubusercontent.com/freeCodeCamp/learn-sql-by-building-a-student-database-part-1/main/tutorial.json">Learn SQL by Building a Student Database: Part 1</a></p>
</li>
<li><p><a target="_blank" href="https://raw.githubusercontent.com/freeCodeCamp/learn-sql-by-building-a-student-database-part-2/main/tutorial.json">Learn SQL by Building a Student Database: Part 2</a></p>
</li>
<li><p><a target="_blank" href="https://raw.githubusercontent.com/freeCodeCamp/learn-world-cup-database/main/tutorial.json">World Cup Database</a></p>
</li>
<li><p><a target="_blank" href="https://raw.githubusercontent.com/freeCodeCamp/learn-advanced-bash-by-building-a-kitty-ipsum-translator/main/tutorial.json">Learn Advanced Bash by Building a Kitty Ipsum Translator</a></p>
</li>
<li><p><a target="_blank" href="https://raw.githubusercontent.com/freeCodeCamp/learn-bash-and-sql-by-building-a-bike-rental-shop/main/tutorial.json">Learn Bash and SQL by Building a Bike Rental Shop</a></p>
</li>
<li><p><a target="_blank" href="https://raw.githubusercontent.com/freeCodeCamp/learn-salon-appointment-scheduler/main/tutorial.json">Salon Appointment Scheduler</a></p>
</li>
<li><p><a target="_blank" href="https://raw.githubusercontent.com/freeCodeCamp/learn-nano-by-building-a-castle/main/tutorial.json">Learn Nano by Building a Castle</a></p>
</li>
<li><p><a target="_blank" href="https://raw.githubusercontent.com/freeCodeCamp/learn-git-by-building-an-sql-reference-object/main/tutorial.json">Learn Git by Building an SQL Reference Object</a></p>
</li>
<li><p><a target="_blank" href="https://raw.githubusercontent.com/freeCodeCamp/learn-periodic-table-database/main/tutorial.json">Periodic Table Database</a></p>
</li>
<li><p><a target="_blank" href="https://raw.githubusercontent.com/freeCodeCamp/learn-number-guessing-game/main/tutorial.json">Number Guessing Game</a></p>
</li>
</ul>
<h4 id="heading-heres-a-video-of-me-doing-learn-bash-by-building-a-boilerplate-in-13-minutes-and-38-seconds">Here's a video of me doing "Learn Bash by Building a Boilerplate" in 13 minutes and 38 seconds:</h4>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/VQmCwzfSM-k" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<p> </p>
<h2 id="heading-also-download-the-freecodecamp-dark-theme-for-vs-code">Also, Download the freeCodeCamp Dark Theme for VS Code</h2>
<p>If you like the color scheme that these tutorials use, you can download the <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=freeCodeCamp.freecodecamp-dark-vscode-theme">freeCodeCamp Dark Theme extension</a> from the Visual Studio Marketplace.</p>
<p>You can <a target="_blank" href="https://www.freecodecamp.org/news/vs-code-dark-mode-theme/">learn more about the Dark Theme here</a>.</p>
<h2 id="heading-help-us-improve-these-courses-by-asking-questions-and-giving-us-feedback">Help us improve these courses by asking questions and giving us feedback</h2>
<p>If you have any questions about these new Relational Database courses, get stuck at some point, or just have general feedback about them, you can create a thread on <a target="_blank" href="https://forum.freecodecamp.org/">the freeCodeCamp Forum</a>.</p>
<p>We also have our own Slack-like chat room system where you can ask questions and help contribute to our open source projects. <a target="_blank" href="https://chat.freecodecamp.org/home">Join our chat room system</a>.</p>
<p>Happy Coding.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Add Localization (l10n) to Your React App with react-i18next ]]>
                </title>
                <description>
                    <![CDATA[ When you add localization to a website you're making it available in multiple languages. This tutorial aims to teach you how to do that to a small react app using react-i18next. The way it works is simple. Instead of putting the text you want to disp... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-add-localization-to-your-react-app/</link>
                <guid isPermaLink="false">66b0aa4372aed240a79b249d</guid>
                
                    <category>
                        <![CDATA[ localization ]]>
                    </category>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Tom Mondloch ]]>
                </dc:creator>
                <pubDate>Mon, 29 Mar 2021 22:40:00 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/605df42a9618b008528a7ca8.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>When you add localization to a website you're making it available in multiple languages. This tutorial aims to teach you how to do that to a small react app using <code>react-i18next</code>.</p>
<p>The way it works is simple. Instead of putting the text you want to display in the components, it all goes into a JSON file. </p>
<p>You then use the keys from the file in the components to get the text. You can add additional JSON files with the same keys and translated values for each desired language. Whatever language is set will determine which JSON file is used as the text for the app.</p>
<p>Follow the steps below to learn how to add this functionality to a React app.</p>
<h2 id="heading-clone-the-boilerplate">Clone the boilerplate</h2>
<p>If you want to code along, you can <a target="_blank" href="https://github.com/moT01/react-i18next-demo">clone the boilerplate from GitHub</a> or <a target="_blank" href="https://repl.it/github/moT01/react-i18next-demo">open the boilerplate on replit</a>. It's a small React app with two pages and a few components:</p>
<p><img src="https://raw.githubusercontent.com/moT01/moT01/master/i18n-demo.png" alt="the two app pages" width="2255" height="878" loading="lazy"></p>
<p>The goal is to make the app available in English and Spanish. </p>
<p>If you are following along, I recommend taking a quick look at the components and file structure to get familiar with the code. The JS files in the <code>src</code> folder are the important ones you will be changing. The <code>Nav</code>, <code>Home</code>, and <code>Page2</code> components contain all the text that needs to be translated.</p>
<h2 id="heading-add-the-dependencies">Add the dependencies</h2>
<p><code>react-i18next</code> is based on <code>i18next</code>, so you will need both packages as dependencies to translate the app. You can add them with:</p>
<pre><code class="lang-sh">npm install --save react-i18next i18next
</code></pre>
<p>If you are following along, start the app with <code>npm start</code> so you can give the two pages a look.</p>
<h2 id="heading-create-the-file-structure">Create the file structure</h2>
<p>In the <code>src</code> folder, create an <code>i18n</code> folder to hold all the information related to translating the app. Here’s the structure I used that is pretty common:</p>
<pre><code>src
+-- i18n
    +-- locales
    |    +-- en
    |        +-- translations.json
    |    +-- es
    |        +-- translations.json
    +-- config.js
</code></pre><p>The <code>config.js</code> file contains the set up for the <code>i18n</code> instance. The two JSON files will hold the text that goes in the app. <code>en</code> for English and <code>es</code> for Spanish. If you are following along, create the file structure in the boilerplate.</p>
<h2 id="heading-configure-the-i18n-instance">Configure the i18n instance</h2>
<p>The <code>i18n</code> instance will hold all of your translations, the current language, and other info and methods needed. You can configure it in the <code>config.js</code> file like this:</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> i18n <span class="hljs-keyword">from</span> <span class="hljs-string">'i18next'</span>;
<span class="hljs-keyword">import</span> { initReactI18next } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-i18next'</span>;

i18n.use(initReactI18next).init({
  <span class="hljs-attr">fallbackLng</span>: <span class="hljs-string">'en'</span>,
  <span class="hljs-attr">lng</span>: <span class="hljs-string">'en'</span>,
  <span class="hljs-attr">resources</span>: {
    <span class="hljs-attr">en</span>: {
      <span class="hljs-attr">translations</span>: <span class="hljs-built_in">require</span>(<span class="hljs-string">'./locales/en/translations.json'</span>)
    },
    <span class="hljs-attr">es</span>: {
      <span class="hljs-attr">translations</span>: <span class="hljs-built_in">require</span>(<span class="hljs-string">'./locales/es/translations.json'</span>)
    }
  },
  <span class="hljs-attr">ns</span>: [<span class="hljs-string">'translations'</span>],
  <span class="hljs-attr">defaultNS</span>: <span class="hljs-string">'translations'</span>
});

i18n.languages = [<span class="hljs-string">'en'</span>, <span class="hljs-string">'es'</span>];

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> i18n;
</code></pre>
<p>At the top, import the necessary dependencies. Next, the <code>use(initReactI18next)</code> will bind <code>react-i18next</code> to the <code>i18n</code> instance. </p>
<p>The first two properties of the <code>init</code> object parameter are a fallback language (<code>fallbackLng</code>) and default language (<code>lng</code>). I set both of these to English (<code>en</code>). </p>
<p>The <code>resources</code> are the JSON files with the translations that you created in the last step. The namespaces (<code>ns</code>) and default namespace (<code>defaultNS</code>) are the keys from the <code>resources</code> object. </p>
<p>You can split your translations into multiple files (namespaces) if you have a large app to simplify the files. In which case, you would add more than just the one file in the <code>resources</code> object and add it to the namespaces array. This app is small, so all the translations can go in one file.</p>
<h2 id="heading-add-the-i18n-instance-to-your-app">Add the i18n instance to your app</h2>
<p>In the <code>index.js</code> file of the boilerplate, which contains the entire app, import the <code>i18n</code> instance you created like this:</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> <span class="hljs-string">'./i18n/config'</span>;
</code></pre>
<p>Next, add an empty object to your two <code>translations.json</code> files so you don’t get any errors. You will fill in the keys later.</p>
<h2 id="heading-translate-a-functional-component-with-the-usetranslation-hook">Translate a functional component with the useTranslation hook</h2>
<p>The <code>Nav.js</code> file is the first component to translate. It’s a functional component, so you can use the <code>useTranslation</code> hook. Import it at the top with <code>import { useTranslation } from 'react-i18next'</code>. </p>
<p>Next, instead of using the implicit return with the component, add curly brackets and the return statement so you can declare a variable. Get the <code>t</code> function from the hook with <code>const { t } = useTranslation();</code>. </p>
<p>All together, it should look like something this:</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> { useTranslation } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-i18next'</span>;

<span class="hljs-keyword">const</span> Nav = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> { t } = useTranslation();

  <span class="hljs-keyword">return</span> (
    …
  );
}
</code></pre>
<p>The text you want to translate in this component is <code>Home</code> and <code>Page 2</code>. In your English <code>translations.json</code> file, add two properties to the object:</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"home"</span>: <span class="hljs-string">"Home"</span>,
  <span class="hljs-attr">"page2"</span>: <span class="hljs-string">"Page 2"</span>
}
</code></pre>
<p>Now, you can pass those keys to the <code>t</code> function to get the text. In the <code>Nav.js</code> component, use the <code>t</code> function to translate <code>Home</code> and <code>Page 2</code> to the English text like this: <code>t('key-from-json-file')</code>. </p>
<p>Here’s how those lines should look:</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> { useTranslation } <span class="hljs-keyword">from</span> ‘react-i18next;

<span class="hljs-keyword">const</span> Nav = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> { t } = useTranslation();

  <span class="hljs-keyword">return</span> (
    …

    &lt;Link to=<span class="hljs-string">"/"</span>&gt;{t(<span class="hljs-string">'home'</span>)}&lt;/Link&gt;
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Link</span> <span class="hljs-attr">to</span>=<span class="hljs-string">"/page2"</span>&gt;</span>{t('page2')}<span class="hljs-tag">&lt;/<span class="hljs-name">Link</span>&gt;</span></span>
  );
}
</code></pre>
<h2 id="heading-preview-in-spanish">Preview in Spanish</h2>
<p>The two nav buttons should be working for English. Add the same two keys to the Spanish JSON file so you can see what it will look like in Spanish. Here’s the translations:</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"home"</span>: <span class="hljs-string">"Casa"</span>,
  <span class="hljs-attr">"page2"</span>: <span class="hljs-string">"Página 2"</span>
}
</code></pre>
<p>After that, go to the <code>config.js</code> file, set the <code>lng</code> (default language) to <code>es</code> and reload the page. The nav links should show up in Spanish. When you are done, you can set the default language back to <code>en</code>.</p>
<h2 id="heading-translate-a-class-component-using-withtranslation">Translate a class component using withTranslation</h2>
<p>In the <code>Home.js</code> file, there are three sentences and a button to translate. You can use the <code>t</code> function again for most of them, but this one is a Class component so you need to use the <code>withTranslation</code> higher order component (HOC). Import it at the top with <code>import { withTranslation } from 'react-i18next';</code>. </p>
<p>Then, at the bottom of the file, export it with <code>export default withTranslation()(Home);</code>. Now the <code>t</code> function will be passed into the component’s props for use. </p>
<p>In the render method, get the function with <code>const { t } = this.props</code>. The code should look something like this:</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> { withTranslation } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-i18next'</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Home</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Component</span> </span>{
  …

  render() {
    <span class="hljs-keyword">const</span> { t } = <span class="hljs-built_in">this</span>.props;

    …
  }
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> withTranslation()(Home);
</code></pre>
<p>The first line to translate, <code>Welcome, {username}</code>, has a variable. You can pass an object to the <code>t</code> function with your variable like this: <code>t('key-from-json-file', { variable: value })</code>. It would look like this in the component:</p>
<pre><code class="lang-js">&lt;p&gt;{t(<span class="hljs-string">'welcome'</span>, { <span class="hljs-attr">username</span>: username })}&lt;/p&gt;
</code></pre>
<p>Add that in place of of the "welcome" line. Then, in the English JSON file, add the new key: <code>"welcome": "Welcome, {{username}}"</code>. The <code>username</code> variable passed to the <code>t</code> function will be placed in the string for you.</p>
<p>Also, add the property to the Spanish file: <code>"welcome": "Bienvenido {{username}}"</code>. Follow the instructions from before if you want to preview it in Spanish.</p>
<h3 id="heading-challenge-yourself">Challenge yourself</h3>
<p>You should be able to translate a few things on your own now. Try to do the next two lines, <code>Change your username:</code> and <code>Submit</code>, like the others.</p>
<p>Here are the properties for the English JSON file:</p>
<pre><code class="lang-json"><span class="hljs-string">"change-username"</span>: <span class="hljs-string">"Change your username:"</span>,
<span class="hljs-string">"submit"</span>: <span class="hljs-string">"Submit"</span>
</code></pre>
<p>And the Spanish translations:</p>
<pre><code class="lang-json"><span class="hljs-string">"change-username"</span>: <span class="hljs-string">"Cambia tu nombre de usuario:"</span>,
<span class="hljs-string">"submit"</span>: <span class="hljs-string">"Enviar"</span>
</code></pre>
<p>Add the above in the two JSON files. Then, translate the <code>label</code> and <code>button</code> text with the <code>t</code> function.</p>
<p>When you are done, the render part of <code>Home.js</code> should look like this:</p>
<pre><code class="lang-js">render() {
  <span class="hljs-keyword">const</span> { username } = <span class="hljs-built_in">this</span>.state;
  <span class="hljs-keyword">const</span> { t } = <span class="hljs-built_in">this</span>.props;

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">'body'</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>{t('welcome', {username: username})}<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>

      <span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">label</span>&gt;</span>{t('change-username')}<span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">'text'</span> <span class="hljs-attr">onChange</span>=<span class="hljs-string">{this.updateUsername.bind(this)}</span> /&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onClick</span>=<span class="hljs-string">{this.setUsername.bind(this)}</span>&gt;</span>
          {t('submit')}
        <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

      <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Click <span class="hljs-tag">&lt;<span class="hljs-name">Link</span> <span class="hljs-attr">to</span>=<span class="hljs-string">'/page2'</span>&gt;</span>here<span class="hljs-tag">&lt;/<span class="hljs-name">Link</span>&gt;</span> to go to page 2, {username}<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
}
</code></pre>
<p>Change the <code>lng</code> in <code>config.js</code> to <code>en</code> or <code>es</code> and reload the app to test the languages.</p>
<h2 id="heading-translate-basic-nested-elements-with-the-trans-component">Translate basic nested elements with the Trans Component</h2>
<p>Leave the last line on the home page for now and head over to the <code>Page2.js</code> file. The two sentences to translate contain other elements – a <code>strong</code> tag and a <code>Link</code> component. </p>
<p>The general rule is to use the <code>t</code> function from the previous examples when you can, but if you have elements or other components in the text, you will need to use the <code>Trans</code> component. </p>
<p>First, import <code>Trans</code> and <code>withTranslation</code> from <code>react-i18next</code>. Then, export the component using <code>withTranslation</code> again. It should look like this:</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> { Trans, withTranslation } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-i18next'</span>;

<span class="hljs-keyword">const</span> Page2 = <span class="hljs-function">() =&gt;</span> (
  …
);

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> withTranslation()(Page2);
</code></pre>
<p>If you have <em>basic</em> HTML tags in your text, you can wrap the <code>Trans</code> component around the key from your JSON file, and the tags will be added to the text.</p>
<p>Change the first <code>&lt;p&gt;</code> in the component to this:</p>
<pre><code class="lang-js">&lt;p&gt;<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Trans</span>&gt;</span>this-is-page2<span class="hljs-tag">&lt;/<span class="hljs-name">Trans</span>&gt;</span></span>&lt;/p&gt;
</code></pre>
<p>Then, add the key to the two <code>translation.json</code> files. For English:</p>
<pre><code class="lang-json"><span class="hljs-string">"this-is-page2"</span>: <span class="hljs-string">"This is &lt;strong&gt;page 2&lt;/strong&gt;"</span>
</code></pre>
<p>And the Spanish JSON:</p>
<pre><code class="lang-json"><span class="hljs-string">"this-is-page2"</span>: <span class="hljs-string">"Esta es la &lt;strong&gt;página 2&lt;/strong&gt;"</span>
</code></pre>
<p>The above will translate the first line of <code>Page2.js</code>. Default basic tags you can use with this method are <code>br</code>, <code>strong</code>, <code>i</code>, and <code>p</code>, but that list can be expanded in the config. Set the language in the config to Spanish to make sure it's working.</p>
<h2 id="heading-translate-complex-nested-elements-with-trans">Translate complex nested elements with Trans</h2>
<p>The next line has a nested <code>Link</code> component, so it's a little trickier. You need to use <code>Trans</code> again, but pass the key in its props as <code>i18nKey</code> and keep the <code>Link</code> as its child. The <code>Link</code> doesn’t need to have any text. Here’s how that looks:</p>
<pre><code class="lang-js">&lt;Trans i18nKey=<span class="hljs-string">'go-to-home'</span>&gt;
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Link</span> <span class="hljs-attr">to</span>=<span class="hljs-string">'/'</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">Link</span>&gt;</span></span>
&lt;/Trans&gt;
</code></pre>
<p>Be sure to keep the <code>&lt;p&gt;</code> tags. Add the associated property to the English JSON:</p>
<pre><code class="lang-json"><span class="hljs-string">"go-to-home"</span>: <span class="hljs-string">"Go to &lt;0&gt;the home page&lt;/0&gt;"</span>
</code></pre>
<p>And the Spanish version:</p>
<pre><code class="lang-json"><span class="hljs-string">"go-to-home"</span>: <span class="hljs-string">"Ir a la &lt;0&gt;pagina principal&lt;/0&gt;"</span>
</code></pre>
<p>The <code>&lt;0&gt;</code> tags represent the first child of the <code>Trans</code> component, in this case, <code>Link</code>. If there was another child, it would use <code>&lt;1&gt;</code> tags, and so on.</p>
<p>Change the language in the config if you want to see the two different locales.</p>
<h2 id="heading-translate-complex-nested-elements-with-a-variable">Translate complex nested elements with a variable</h2>
<p>One more line to translate. The last line in the <code>Home.js</code> file contains a nested <code>Link</code> element and a variable. You need to use <code>Trans</code> again so add it to the existing import at the top.</p>
<p>If you need to use a variable with <code>Trans</code>, it can be placed inside the element. So the last line:</p>
<pre><code class="lang-js">&lt;p&gt;Click &lt;Link to=<span class="hljs-string">'/page2'</span>&gt;here&lt;<span class="hljs-regexp">/Link&gt; to go to page 2, {username}&lt;/</span>p&gt;
</code></pre>
<p>Can be translated like this:</p>
<pre><code class="lang-js">&lt;Trans i18nKey=<span class="hljs-string">'go-to-page2'</span>&gt;
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Link</span> <span class="hljs-attr">to</span>=<span class="hljs-string">'/page2'</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">Link</span>&gt;</span></span>
  {{username}}
&lt;/Trans&gt;
</code></pre>
<p>The key is passed to <code>Trans</code> as a prop like before. The nested <code>Link</code> element and the <code>{{ username }}</code> variable need to be somewhere in the component, it doesn't matter where.</p>
<p>Be sure to add the values to the JSON files. For English:</p>
<pre><code class="lang-json"><span class="hljs-string">"go-to-page2"</span>: <span class="hljs-string">"Click &lt;0&gt;here&lt;/0&gt; to go to page 2, {{username}}"</span>
</code></pre>
<p>And Spanish:</p>
<pre><code class="lang-json"><span class="hljs-string">"go-to-page2"</span>: <span class="hljs-string">"Haga clic &lt;0&gt;aquí&lt;/0&gt; para ir a la página 2, {{username}}"</span>
</code></pre>
<h2 id="heading-how-to-change-languages">How to change languages</h2>
<p>All the desired text should be available in both English and Spanish now. The last thing to do is to make it easy to switch between languages. </p>
<p>The <code>Footer.js</code> file has a few buttons and a <code>changeLanguage</code> function. Import the <code>useTranslation</code> hook from <code>react-i18next</code> at the top of the file. At the top of the <code>Footer</code> component, get the <code>i18n</code> instance from it like this: <code>const { i18n } = useTranslation();</code>. </p>
<p>Finally, in the <code>changeLanguage</code> function, use the <code>i18n.changeLanguage()</code> method, passing <code>e.target.value</code> to it, to change the langauge.</p>
<p>All together, it looks like this:</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> { useTranslation } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-i18next'</span>;

<span class="hljs-keyword">const</span> Footer = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> { i18n } = useTranslation();

  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">changeLanguage</span>(<span class="hljs-params">e</span>) </span>{
    i18n.changeLanguage(e.target.value);
  }

  <span class="hljs-keyword">return</span>(
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">'footer'</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onClick</span>=<span class="hljs-string">{changeLanguage}</span> <span class="hljs-attr">value</span>=<span class="hljs-string">'en'</span>&gt;</span>English<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onClick</span>=<span class="hljs-string">{changeLanguage}</span> <span class="hljs-attr">value</span>=<span class="hljs-string">'es'</span>&gt;</span>Español<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  )
}
</code></pre>
<p>Now, you should be able to switch languages by clicking the buttons on each page.</p>
<h2 id="heading-how-to-add-languages">How to add languages</h2>
<p>From here, the app is ready to be translated into any language quite easily. You just need to add another language to the config, and the JSON file with the translated text to go with it.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Hopefully, this gave you some insight into how to rapidly expand a React application into many world languages. </p>
<p>There are many more features and details with these tools. See the links below for more info. </p>
<h3 id="heading-helpful-links">Helpful Links</h3>
<ul>
<li>View a <a target="_blank" href="https://react-i18next-demo.mot01.repl.co/">demo of the finished project</a></li>
<li>View the <a target="_blank" href="https://github.com/moT01/react-i18next-demo/tree/solution">source code for the finished project</a></li>
<li>The <a target="_blank" href="https://react.i18next.com">react-i18next documentation</a> goes into more detail on some of the translation methods, server side rendering, testing, and additional uses with React.</li>
<li>The <a target="_blank" href="https://www.i18next.com/">i18next documentation</a> has helpful information on additional configuration, the API, translating complex text, and additional features.</li>
</ul>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
