<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Sabenin Vladislav</title>
    <description>The latest articles on Forem by Sabenin Vladislav (@sabenin_vladislav_ca3d95e).</description>
    <link>https://forem.com/sabenin_vladislav_ca3d95e</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%2F3642975%2F1185de73-14c2-42a4-a6da-6018cbb2a659.png</url>
      <title>Forem: Sabenin Vladislav</title>
      <link>https://forem.com/sabenin_vladislav_ca3d95e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/sabenin_vladislav_ca3d95e"/>
    <language>en</language>
    <item>
      <title>🌀 Why Flutter Localization Is Still a Pain (Even With easy_localization) — and How I Finally Fixed It</title>
      <dc:creator>Sabenin Vladislav</dc:creator>
      <pubDate>Wed, 03 Dec 2025 09:11:17 +0000</pubDate>
      <link>https://forem.com/sabenin_vladislav_ca3d95e/why-flutter-localization-is-still-a-pain-even-with-easylocalization-and-how-i-finally-fixed-3590</link>
      <guid>https://forem.com/sabenin_vladislav_ca3d95e/why-flutter-localization-is-still-a-pain-even-with-easylocalization-and-how-i-finally-fixed-3590</guid>
      <description>&lt;p&gt;Localization in Flutter sounds simple on paper:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Just use ARB files, run the generator, and you’re done.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Right?&lt;/p&gt;

&lt;p&gt;Right… until your app grows to hundreds of keys, multiple languages, different plural forms, nested folders, and a team of devs all touching the same translations.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I’ve been there.&lt;/em&gt;&lt;br&gt;
And after a few years of building multilingual Flutter apps, I’m convinced of one thing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Localization is one of the most annoying parts of Flutter development.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even with tools like &lt;strong&gt;easy_localization&lt;/strong&gt; helping us generate code and structure files, there are still several pain points that never went away for me.&lt;/p&gt;

&lt;p&gt;So I built a tool to fix them — but let me start with the problems first.&lt;/p&gt;
&lt;h3&gt;
  
  
  ❌ Problem 1: ARB/JSON files don’t scale
&lt;/h3&gt;

&lt;p&gt;JSON files are fine when you have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;title: “Hello”
button_ok: “OK”
button_cancel: “Cancel”
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But with real apps, things turn into this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;settings.notifications.push_title
settings.notifications.push_body
profile.followers_count
profile.following_count
auth.password.strength.weak
auth.password.strength.strong
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There’s no:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tree&lt;/li&gt;
&lt;li&gt;grouping&lt;/li&gt;
&lt;li&gt;drag &amp;amp; drop&lt;/li&gt;
&lt;li&gt;visual structure
Just nested dot-notation that you hope nobody mistypes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It gets worse when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you want to rename a key&lt;/li&gt;
&lt;li&gt;move keys into a different namespace&lt;/li&gt;
&lt;li&gt;or just find things visually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How LokiLoki solves it&lt;/p&gt;

&lt;p&gt;LokiLoki uses a real tree editor, like you'd expect in VS Code:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmtjlw0i0y5x9rh22a1d6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmtjlw0i0y5x9rh22a1d6.png" alt="Tree" width="559" height="755"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;folder hierarchy&lt;/li&gt;
&lt;li&gt;drag &amp;amp; drop&lt;/li&gt;
&lt;li&gt;instant type conversion (text/gender/plural)&lt;/li&gt;
&lt;li&gt;inline editing&lt;/li&gt;
&lt;li&gt;descriptions for translators&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can finally reorganize translations like a normal project.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Problem 2: “Missing translations” is a scavenger hunt
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;easy_localization&lt;/strong&gt; gives you warnings if you forget a key, but:&lt;/p&gt;

&lt;p&gt;it won’t tell you where the missing key is in your files&lt;br&gt;
it won’t show you which locales are incomplete&lt;br&gt;
it won’t highlight partially filled languages&lt;br&gt;
So what do we do?&lt;/p&gt;

&lt;p&gt;We grep, scroll, search manually, compare files in diff-tools, or write small scripts to check for empty values.&lt;/p&gt;

&lt;h4&gt;
  
  
  How LokiLoki solves it
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;With one click&lt;/strong&gt;, LokiLoki shows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjyrpbtbis0qx1xxpkxl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjyrpbtbis0qx1xxpkxl.png" alt="Usages" width="800" height="717"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;empty keys&lt;/li&gt;
&lt;li&gt;partially filled keys&lt;/li&gt;
&lt;li&gt;fully translated keys&lt;/li&gt;
&lt;li&gt;structured by folders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And &lt;strong&gt;AI&lt;/strong&gt; can fill missing ones automatically if you want.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Problem 3: String literals in Dart code get forgotten
&lt;/h3&gt;

&lt;p&gt;We’ve all done it:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Text("Retry")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;App works in English.&lt;br&gt;
You ship it.&lt;br&gt;
And a month later someone asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Why is this screen not translated?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;easy_localization&lt;/strong&gt; can’t detect raw strings in your Dart code.&lt;br&gt;
It also can’t suggest keys, infer context, or help you clean up legacy codebases.&lt;/p&gt;

&lt;h4&gt;
  
  
  How LokiLoki solves it
&lt;/h4&gt;

&lt;p&gt;LokiLoki has a full Dart AST analyzer.&lt;/p&gt;

&lt;p&gt;It finds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;every .tr() call&lt;/li&gt;
&lt;li&gt;every plural()&lt;/li&gt;
&lt;li&gt;every LocaleKeys.something&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and every raw string literal worth translating&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvydqaog7qik2i99tfw3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvydqaog7qik2i99tfw3.png" alt="AutoLocalize" width="409" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then AI can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;propose a key&lt;/li&gt;
&lt;li&gt;generate a translation&lt;/li&gt;
&lt;li&gt;suggest replacing the literal in code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The “&lt;strong&gt;auto-localize&lt;/strong&gt;” workflow is shockingly effective for large apps.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Problem 4: Mistakes in JSON files break the entire project
&lt;/h3&gt;

&lt;p&gt;One wrong comma, wrong nested object, or broken plural structure =&lt;br&gt;
flutter pub run … generate explodes.&lt;/p&gt;

&lt;p&gt;How LokiLoki solves it&lt;/p&gt;

&lt;p&gt;It uses a patch panel where everything is validated before writing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rename keys safely&lt;/li&gt;
&lt;li&gt;move folders&lt;/li&gt;
&lt;li&gt;change types&lt;/li&gt;
&lt;li&gt;see diffs&lt;/li&gt;
&lt;li&gt;undo/redo&lt;/li&gt;
&lt;li&gt;apply as atomic patch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ggum2n07qbqg6mf2kwg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ggum2n07qbqg6mf2kwg.png" alt="Patch" width="800" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No more broken localization files.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Problem 5: No way to understand global language coverage
&lt;/h3&gt;

&lt;p&gt;If you have:&lt;/p&gt;

&lt;p&gt;English&lt;br&gt;
Spanish&lt;br&gt;
Japanese&lt;br&gt;
Chinese&lt;/p&gt;

&lt;p&gt;…what percentage of the planet can actually use your app?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;easy_localization&lt;/strong&gt; doesn’t tell you.&lt;br&gt;
Google Sheets doesn’t tell you.&lt;br&gt;
You need population + language distribution data.&lt;/p&gt;

&lt;h4&gt;
  
  
  How LokiLoki solves it
&lt;/h4&gt;

&lt;p&gt;LokiLoki has a World Coverage Map:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqpvriup6q69nskpcopjt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqpvriup6q69nskpcopjt.png" alt="Coverage" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;see which languages cover which countries&lt;/li&gt;
&lt;li&gt;see global user coverage (%)&lt;/li&gt;
&lt;li&gt;regional variants are supported (e.g., pt-BR vs pt-PT)&lt;/li&gt;
&lt;li&gt;add languages with one click&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You finally get data-driven localization.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Problem 6: teams struggle to keep translation files in sync
&lt;/h3&gt;

&lt;p&gt;Even with Git, merging JSON files is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;noisy&lt;/li&gt;
&lt;li&gt;conflict-prone&lt;/li&gt;
&lt;li&gt;hard to review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And impossible to reason about when large refactors happen.&lt;/p&gt;

&lt;h4&gt;
  
  
  How LokiLoki solves it
&lt;/h4&gt;

&lt;p&gt;LokiLoki baselines changes and shows them as readable operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;added keys&lt;/li&gt;
&lt;li&gt;removed keys&lt;/li&gt;
&lt;li&gt;renamed keys&lt;/li&gt;
&lt;li&gt;moved folders&lt;/li&gt;
&lt;li&gt;changed plural forms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All packaged into a clean patch you can review and apply.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧰 So… what is LokiLoki exactly?
&lt;/h2&gt;

&lt;p&gt;It’s a desktop app for Windows/macOS/Linux that wraps the entire localization workflow into one place:&lt;/p&gt;

&lt;p&gt;Tree-based translation editor&lt;/p&gt;

&lt;p&gt;Code usage analyzer&lt;/p&gt;

&lt;p&gt;AI auto-localize&lt;/p&gt;

&lt;p&gt;World coverage map&lt;/p&gt;

&lt;p&gt;Patch system&lt;/p&gt;

&lt;p&gt;Drag &amp;amp; drop key organization&lt;/p&gt;

&lt;p&gt;Pretty JSON/YAML export&lt;/p&gt;

&lt;p&gt;Supports easy_localization today (intl coming soon)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It started as a personal tool but grew into something I use on every project now.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🎁 Want to Try It?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lokiloki.tech" rel="noopener noreferrer"&gt;Mine landing&lt;/a&gt;&lt;br&gt;
The base app is free.&lt;br&gt;
Only the code analyzer + AI features are premium. AI tokens is not free... (2 days free for test)&lt;/p&gt;

&lt;p&gt;I’d love feedback — whether you're dealing with localization hell or just curious how this workflow feels compared to pure ARB editing.&lt;/p&gt;

</description>
      <category>flutter</category>
    </item>
  </channel>
</rss>
