<?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>DEV Community: Charles Perret</title>
    <description>The latest articles on DEV Community by Charles Perret (@charlesperret).</description>
    <link>https://dev.to/charlesperret</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%2F3756756%2F4765b8e0-8e1e-453e-b5d6-6c5adf30870f.png</url>
      <title>DEV Community: Charles Perret</title>
      <link>https://dev.to/charlesperret</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/charlesperret"/>
    <language>en</language>
    <item>
      <title>Why Your Lovable App Isn't Showing Up in Google (And How I Fixed It)</title>
      <dc:creator>Charles Perret</dc:creator>
      <pubDate>Fri, 06 Feb 2026 13:44:00 +0000</pubDate>
      <link>https://dev.to/charlesperret/why-your-lovable-app-isnt-showing-up-in-google-and-how-i-fixed-it-34b4</link>
      <guid>https://dev.to/charlesperret/why-your-lovable-app-isnt-showing-up-in-google-and-how-i-fixed-it-34b4</guid>
      <description>&lt;p&gt;I built a SaaS landing page with Lovable last month. Shipped it in a weekend, felt great about it.&lt;/p&gt;

&lt;p&gt;Then I checked Google Search Console.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero impressions. Zero clicks. For two weeks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Turns out, building fast with AI tools creates a problem nobody talks about: your app only exists in one language, and Google doesn't know what to do with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem Nobody Warned Me About
&lt;/h2&gt;

&lt;p&gt;When you ship a React app with Lovable, Bolt, or v0, you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A working product ✅&lt;/li&gt;
&lt;li&gt;A deployed URL ✅&lt;/li&gt;
&lt;li&gt;SEO-ready pages ❌&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's what I mean. Google crawls your site, sees English content, and indexes it for English queries. But &lt;strong&gt;75% of internet users prefer content in their native language&lt;/strong&gt;. You're invisible to most of the world.&lt;/p&gt;

&lt;p&gt;I wanted to add French and German to reach European users. Simple, right?&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Tried First (And Why It Failed)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Attempt 1: react-i18next
&lt;/h3&gt;

&lt;p&gt;The "proper" way to do React internationalization. Here's what that looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Create translation files for EVERY string&lt;/span&gt;
&lt;span class="c1"&gt;// /locales/en/translation.json&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hero.title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Build faster with AI&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hero.subtitle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ship your product in days, not months&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cta.button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Get Started&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// ... 200 more keys&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// /locales/fr/translation.json&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hero.title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Construisez plus vite avec l'IA&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hero.subtitle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Livrez votre produit en jours, pas en mois&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cta.button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Commencer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// ... 200 more keys (pray you didn't miss any)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then wrap every single text element:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useTranslation&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-i18next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Hero&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useTranslation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hero.title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hero.subtitle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cta.button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The reality with Lovable:&lt;/strong&gt; Every time I prompted a new feature, I had to pray the LLM would update the JSON files correctly. Half the time it didn't. I spent more time fixing translation keys than building features.&lt;/p&gt;

&lt;h3&gt;
  
  
  Attempt 2: Weglot
&lt;/h3&gt;

&lt;p&gt;Weglot is the industry standard. Paste a script, get translations. &lt;/p&gt;

&lt;p&gt;Then I saw the pricing: &lt;strong&gt;€490/year&lt;/strong&gt; for my small landing page. That's more than my hosting, domain, and analytics combined.&lt;/p&gt;

&lt;p&gt;For a side project testing product-market fit? Hard pass.&lt;/p&gt;

&lt;h3&gt;
  
  
  Attempt 3: Google Translate widget
&lt;/h3&gt;

&lt;p&gt;Don't. Just don't. It looks terrible, breaks your layout, and Google specifically says machine-translated content via widgets doesn't help SEO.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Worked
&lt;/h2&gt;

&lt;p&gt;I found &lt;a href="https://lovalingo.com" rel="noopener noreferrer"&gt;lovalingo&lt;/a&gt; — built specifically for Lovable/Bolt/v0 apps.&lt;/p&gt;

&lt;p&gt;The setup was wild:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Paste your site URL&lt;/li&gt;
&lt;li&gt;Pick your languages&lt;/li&gt;
&lt;li&gt;Copy one prompt into Lovable&lt;/li&gt;
&lt;li&gt;Done&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No JSON files. No wrapping every &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; tag. No €490 invoice.&lt;/p&gt;

&lt;p&gt;Here's what convinced me it wasn't just another translation widget:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero-flash rendering&lt;/strong&gt; — The translated content loads server-side. No awkward flash of English before French appears.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatic SEO&lt;/strong&gt; — It generates proper hreflang tags and creates a sitemap with all language versions. This is the part that actually gets you indexed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- What lovalingo adds automatically --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://myapp.com/"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"fr"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://myapp.com/fr/"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"de"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://myapp.com/de/"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"x-default"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://myapp.com/"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;One prompt install&lt;/strong&gt; — This is the entire setup for Lovable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Install lovalingo translation with key [YOUR_KEY] 
for languages: French, German
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The LLM handles the rest. No manual file management.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Results (30 Days Later)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Languages&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indexed pages&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impressions (non-EN)&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;847&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup time&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;5 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The most surprising part: I started ranking for German keywords I never targeted. Turns out there's way less competition for "KI Landing Page erstellen" than "AI landing page builder".&lt;/p&gt;

&lt;h2&gt;
  
  
  When This Makes Sense (And When It Doesn't)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use this approach if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're building with Lovable, Bolt, v0, or similar AI tools&lt;/li&gt;
&lt;li&gt;You want multilingual SEO without managing translation files&lt;/li&gt;
&lt;li&gt;Your budget is "indie hacker" not "enterprise"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stick with i18next if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need pixel-perfect control over every translation&lt;/li&gt;
&lt;li&gt;You have dedicated translators and a localization pipeline&lt;/li&gt;
&lt;li&gt;You're building a complex app with dynamic content that changes based on user data&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bigger Lesson
&lt;/h2&gt;

&lt;p&gt;AI coding tools optimized for speed, not global reach. That's fine — speed matters when you're validating ideas.&lt;/p&gt;

&lt;p&gt;But if you're past validation and want actual users, remember: &lt;strong&gt;the world is bigger than English-speaking Product Hunt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Adding translations isn't just about being nice to international users. It's about 3x-ing your addressable market with minimal effort.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you dealt with i18n in your Lovable/Bolt projects? What worked for you? Drop a comment. Peace.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>seo</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
