<?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: Christelle Lorin</title>
    <description>The latest articles on DEV Community by Christelle Lorin (@christelleatparlance).</description>
    <link>https://dev.to/christelleatparlance</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3960319%2F38d7807b-8a1c-43bd-a061-a088b8c7f233.png</url>
      <title>DEV Community: Christelle Lorin</title>
      <link>https://dev.to/christelleatparlance</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/christelleatparlance"/>
    <language>en</language>
    <item>
      <title>No Metric Tells You That Your App Sounds Weird</title>
      <dc:creator>Christelle Lorin</dc:creator>
      <pubDate>Mon, 15 Jun 2026 21:34:00 +0000</pubDate>
      <link>https://dev.to/christelleatparlance/no-metric-tells-you-that-your-app-sounds-weird-51c8</link>
      <guid>https://dev.to/christelleatparlance/no-metric-tells-you-that-your-app-sounds-weird-51c8</guid>
      <description>&lt;h2&gt;
  
  
  How Bad Localization Can Secretly Kill Your Retention Metrics
&lt;/h2&gt;

&lt;p&gt;Imagine you build a beautiful, intuitive banking application. You know it has global potential, so you run your English strings through a standard, modern translation tool. That tool has AI integration that you use to double check languages that are the most dissimilar to English. You deploy to three distinct markets: France, Japan, and the United Arab Emirates.&lt;/p&gt;

&lt;p&gt;You monitor your dashboards. Your analytics show users are interacting with the app, but nobody is staying. There is zero retention.&lt;/p&gt;

&lt;p&gt;You tweak the UI, optimize the loading speeds, and push version 2, then version 3. The metrics still show random clicks, but no real engagement.&lt;/p&gt;

&lt;p&gt;Then you receive feedback via support emails and social media. Users say they were excited to use your app, but::&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;France: Users find your app weirdly off-putting. Why? Because your app's language uses the informal "tu" form everywhere, making your brand sound aggressively familiar and disrespectful to an adult audience that expects the polite "vous".&lt;/li&gt;
&lt;li&gt;Japan: Users find your language outright offensive. In Japan, failing to use the correct level of honorifics (Keigo), or using active, demanding verbs on buttons instead of passive, polite requests, makes your software read like a rude command.&lt;/li&gt;
&lt;li&gt;UAE: Users report the app is entirely illegible. Arabic grammar uses dual plurals alongside regular and complex "broken" plurals. Your tool treated them all as basic variables, rendering the text nonsensical.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Engineers Shouldn't Take Localization For Granted
&lt;/h2&gt;

&lt;p&gt;As software engineers, we are trained to look at text as strings of data. We map a key to a value in a localizable file (be it JSON, YAML, etc.) and call it a day. If the value shows in the correct place and the UI adjusts without breaking, then often times, that is good enough.&lt;/p&gt;

&lt;p&gt;I think we shouldn't settle for good enough when it comes to localizing our products.&lt;/p&gt;

&lt;p&gt;As someone who is trilingual and has been developing iOS apps for the better part of a decade, I look at a localization file a little differently. Spoken languages aren't just collections of words; they are complex systems of culture, psychology, and hidden logic. In some cases, the complex grammar rules in some human languages are very similar to programming languages - especially in languages with few exceptions like Arabic.&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;❌&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;THE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;FAILED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;APPROACH:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;What&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;most&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;localization&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;files&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;look&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;like&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;span class="nl"&gt;"account_plural"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"You have {{count}} accounts"&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;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;⚙️&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;THE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ACTUAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;CONFIG:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;What&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;your&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;codebase&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;needs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;handle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Arabic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;plurals&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;span class="nl"&gt;"account_plural"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"zero"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[Arabic string for 0 items]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"one"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"[Arabic string for 1 item]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"two"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"[Arabic string for 2 items - Dual form]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"few"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"[Arabic string for 3-10 items - Broken plural]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"many"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[Arabic string for 11-99 items]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"other"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"[Arabic string for 100+ items]"&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;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;From my perspective, giving your product a real shot in foreign markets includes putting just as much care in your app's voice as you do in your app. Why? Because that voice is your brand's voice, and it's the one you're telling users to trust. If a product sounds warm and inviting in English, it should sound the same across the board. The problem is, warm and inviting words or phrases in English could be interpreted as too friendly or too cold depending on where you're trying to distribute.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm Trying to Build (And Why I'm Writing This)
&lt;/h2&gt;

&lt;p&gt;That realization is exactly why I’ve spent the last half a year or so building a localization tool that features both a robust CLI and a clean web interface. I think what developers deserve is a tool that actually understands context, cultural tone, and complex grammatical rules before text ever hits a user interface. It needs to be quick, accessible to all experience levels, and seamlessly integrated into a developer's existing workflow. Building it has been equal parts exhilarating and frustrating, and it is finally moving through its final round of QA before launch!&lt;/p&gt;

&lt;p&gt;I always love hearing about developers' experiences with localization. Where have you shipped? What have you learned?  What do you want to see from a localization tool?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>productivity</category>
      <category>software</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
