<?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: Karol Piecyk</title>
    <description>The latest articles on DEV Community by Karol Piecyk (@karol_piecyk).</description>
    <link>https://dev.to/karol_piecyk</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%2F3976038%2F03b35bc0-ef00-45e2-8f74-4ae74c5fff5f.png</url>
      <title>DEV Community: Karol Piecyk</title>
      <link>https://dev.to/karol_piecyk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/karol_piecyk"/>
    <language>en</language>
    <item>
      <title>Why I Stopped Storing Translation Files in Git</title>
      <dc:creator>Karol Piecyk</dc:creator>
      <pubDate>Tue, 09 Jun 2026 13:01:43 +0000</pubDate>
      <link>https://dev.to/karol_piecyk/why-i-stopped-storing-translation-files-in-git-3fg6</link>
      <guid>https://dev.to/karol_piecyk/why-i-stopped-storing-translation-files-in-git-3fg6</guid>
      <description>&lt;p&gt;If you've ever built a multilingual application, you've probably started with something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"welcome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Welcome"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"logout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Logout"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few weeks later you add another language:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"welcome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Witamy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"logout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Wyloguj"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything still looks manageable.&lt;/p&gt;

&lt;p&gt;Then the product grows.&lt;/p&gt;

&lt;p&gt;More features are added.&lt;/p&gt;

&lt;p&gt;More developers join.&lt;/p&gt;

&lt;p&gt;More languages appear.&lt;/p&gt;

&lt;p&gt;Suddenly your repository contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;locales/
├── en.json
├── pl.json
├── de.json
├── fr.json
├── es.json
├── it.json
└── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's when localization starts becoming a maintenance problem rather than a translation problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Cost of Translation Files
&lt;/h2&gt;

&lt;p&gt;Most teams focus on translating text.&lt;/p&gt;

&lt;p&gt;In practice, the harder problem is keeping translations synchronized.&lt;/p&gt;

&lt;p&gt;Questions start appearing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which keys are missing in German?&lt;/li&gt;
&lt;li&gt;Which translations are outdated?&lt;/li&gt;
&lt;li&gt;Which strings were recently changed?&lt;/li&gt;
&lt;li&gt;Why is production showing a fallback language?&lt;/li&gt;
&lt;li&gt;Which developer forgot to update all language files?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The larger the application becomes, the harder these questions are to answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Git Was Never Designed for Localization Workflows
&lt;/h2&gt;

&lt;p&gt;Git is excellent for source code.&lt;/p&gt;

&lt;p&gt;It is much less effective for managing hundreds or thousands of translations.&lt;/p&gt;

&lt;p&gt;Imagine changing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"subscription_expired_message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your subscription has expired"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that same change needs to be reflected across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Polish&lt;/li&gt;
&lt;li&gt;German&lt;/li&gt;
&lt;li&gt;French&lt;/li&gt;
&lt;li&gt;Spanish&lt;/li&gt;
&lt;li&gt;Italian&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And every translation file must stay synchronized.&lt;/p&gt;

&lt;p&gt;Developers often end up spending more time managing translation files than writing features.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Makes Translation Easier, But Doesn't Solve Management
&lt;/h2&gt;

&lt;p&gt;Today we can generate translations using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI&lt;/li&gt;
&lt;li&gt;DeepL&lt;/li&gt;
&lt;li&gt;Google Translate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generating translations is easy.&lt;/p&gt;

&lt;p&gt;Managing them is still difficult.&lt;/p&gt;

&lt;p&gt;You still need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;store them&lt;/li&gt;
&lt;li&gt;version them&lt;/li&gt;
&lt;li&gt;review them&lt;/li&gt;
&lt;li&gt;serve them efficiently&lt;/li&gt;
&lt;li&gt;keep languages synchronized&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI solves translation generation.&lt;/p&gt;

&lt;p&gt;It doesn't solve translation infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Changed My Approach
&lt;/h2&gt;

&lt;p&gt;Instead of treating translations as files, I started treating them as data.&lt;/p&gt;

&lt;p&gt;The workflow became:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Store translations in a centralized system.&lt;/li&gt;
&lt;li&gt;Manage translation keys through an API.&lt;/li&gt;
&lt;li&gt;Generate missing translations automatically.&lt;/li&gt;
&lt;li&gt;Serve translations through cached endpoints.&lt;/li&gt;
&lt;li&gt;Keep source code focused on business logic.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Git Repository
└── Translation Files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The architecture becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application
     ↓
Translation API
     ↓
Translation Store
     ↓
AI Translation Providers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Benefits
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Easier Collaboration
&lt;/h3&gt;

&lt;p&gt;Developers, translators, and product owners can work independently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better Visibility
&lt;/h3&gt;

&lt;p&gt;You can immediately see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;missing translations&lt;/li&gt;
&lt;li&gt;outdated strings&lt;/li&gt;
&lt;li&gt;approval status&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Faster Releases
&lt;/h3&gt;

&lt;p&gt;Adding a new language no longer requires editing dozens of files.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reduced Merge Conflicts
&lt;/h3&gt;

&lt;p&gt;Translation changes stop polluting source control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is File-Based Localization Always Wrong?
&lt;/h2&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;For small projects, translation files are perfectly fine.&lt;/p&gt;

&lt;p&gt;If your application has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one developer&lt;/li&gt;
&lt;li&gt;two languages&lt;/li&gt;
&lt;li&gt;a few dozen strings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;there is little reason to introduce additional infrastructure.&lt;/p&gt;

&lt;p&gt;But once localization becomes an ongoing process, centralization starts paying off quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Localization is often treated as a translation problem.&lt;/p&gt;

&lt;p&gt;In my experience it's actually a workflow problem.&lt;/p&gt;

&lt;p&gt;The challenge isn't generating text.&lt;/p&gt;

&lt;p&gt;The challenge is managing thousands of translations across multiple languages while keeping development fast and predictable.&lt;/p&gt;

&lt;p&gt;The earlier you solve the workflow problem, the easier localization becomes as your application grows.&lt;/p&gt;




&lt;p&gt;How are you managing translations today?&lt;/p&gt;

&lt;p&gt;Still using JSON files in Git, or have you moved to a centralized localization workflow?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm currently building &lt;a href="https://i18nme.com" rel="noopener noreferrer"&gt;i18nme.com&lt;/a&gt;, a localization backend for developers. Building it forced me to rethink how translation workflows should work at scale.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>nextjs</category>
      <category>localization</category>
    </item>
  </channel>
</rss>
