If localization still feels like something you "deal with later," it's probably because you remember how painful it used to be. Good news: it's almost 2026 now. It doesn't have to hurt anymore.
Let's be honest: developers have historically hated localization. And honestly? They were right to.
- Plurals were unpredictable
.strings files loved to break
- Android XML had mysterious edge cases
- Right-to-left layouts broke everything
- Artifacts scattered across repos
But modern tooling has changed the game. AI-powered translation handles the heavy lifting, and a decent CLI can automate strings extraction, translation, formatting, sync, and versioning.
This guide walks you through how to localize an iOS or Android app in 2026, using a workflow that's fast, repeatable, CI/CD-friendly, and surprisingly straightforward.
The Modern Localization Workflow
Here's the new developer mindset:
Localization should behave like linting or formatting — automatic, predictable, boring-in-a-good-way.
The whole cycle becomes:
- Extract strings
- Upload
- Let AI translate
- Download
- Commit
- Ship
- Let CI/CD keep everything in sync
A good CLI wraps this into one command: upload → translate → download
One command. One flow. Zero spreadsheets.
Part 1: Localizing iOS (Swift / SwiftUI)
iOS localization revolves around:
Localizable.strings
.stringsdict for plurals
*.lproj directories
Let's walk through the steps.
Step 1: Set up your Base localization directory
YourApp/
Base.lproj/
Localizable.strings
Main.storyboard (if you use one)
SwiftUI? Same idea, fewer storyboards.
Step 2: Replace hardcoded strings
Bad:
Text("Welcome to the app!")
Good:
Text(NSLocalizedString("welcome_text", comment: "Homepage greeting"))
Repeat until your app stops hardcoding English everywhere.
Step 3: Upload your strings
With a modern CLI tool:
pip install gettranslated-cli
Authenticate via your .gettranslated file:
echo "YOUR_API_KEY" > .gettranslated
Then from your project root:
This does everything:
- Scans your project
- Finds
*.lproj files
- Uploads your base language
- Translates anything new
- Downloads updated
.lproj directories
Fully automatic. No UI clicking.
Step 4: Generate translations
On the platform:
- Get fast translations from multiple LLMs
- Fix voice consistency issues
- Check grammar and spelling
- Protect branded terms
- Use translation memory to avoid inconsistencies
This is where the old agency invoices start looking expensive.
Step 5: Sync into Xcode
After running translate sync, your project will now contain:
en.lproj/
es.lproj/
fr.lproj/
de.lproj/
pt-BR.lproj/
Xcode picks them up automatically.
Step 6: Test your layouts
Change the simulator language:
Xcode → Scheme → Application Language.
Or test RTL:
UIView.appearance().semanticContentAttribute = .forceRightToLeft
German will always stretch your UI. This is normal.
Part 2: Localizing Android (Kotlin / Java)
Android localization uses:
res/values/strings.xml
- locale-specific directories like
values-es/, values-fr/, values-pt-rBR/
- powerful plural rules
- string arrays
Let's break it down.
Step 1: Centralize your strings
Avoid chaos like:
strings_home.xml
strings_temp.xml
strings_final.xml
strings_backup2.xml
Just use:
Step 2: Replace hardcoded copy
Bad:
textView.text = "Welcome"
Good:
textView.text = getString(R.string.welcome)
Step 3: Upload your strings
From your project root:
The CLI:
- detects Android automatically
- finds
strings.xml
- uploads new strings
- translates with your selected LLMs
- downloads the new files into:
values-es/
values-fr/
values-ja/
values-pt-rBR/
This replaces the old manual upload/download cycle. One command, all platforms.
Step 4: Generate translations
Same workflow as iOS:
- Compare LLM outputs
- Tune tone
- Maintain placeholders like
%1$s
- Handle plurals automatically
- Flag dangerous XML formatting
Android developers: you just avoided 20 XML bugs.
Step 5: Sync via CI/CD
In your GitHub Actions:
- name: Install CLI
run: pip install gettranslated-cli
- name: Sync translations
env:
GETTRANSLATED_KEY: ${{ secrets.GETTRANSLATED_KEY }}
run: translate sync .
Every commit → fresh translations. Every release → fully localized.
Step 6: Preview layouts
Android Studio makes it easy:
- Switch locale
- Test RTL
- Preview long text
- Check overflow
- Verify plurals
German will break whatever is weak. This is tradition.
Bonus: React Native
The CLI auto-detects React Native folders like:
locales/
i18n/
src/locales/
translations/
assets/locales/
Same translate sync command, all platforms.
Device-Language Analytics
This is where modern localization tooling becomes genuinely useful.
With one integration, you get:
- Every user's default device language
- Fast-growing locales
- Locale-based churn insights
- Regions losing users due to language friction
- Auto-generated language support recommendations
This turns localization from "let's guess" into:
"Here are the exact languages your users want next."
Your team can make data-driven decisions about which languages to support.
Final Thoughts
2026 is the year localization becomes a normal, automated part of development — not a project, not a sprint, not a separate initiative.
With an AI translation engine plus a decent CLI:
- upload → translate → download in one step
- tone consistency across languages
- plural handling automatically
- CI/CD sync
- device-locale analytics for strategy
- minimal manual XML or
.strings editing
The workflow is simple: write code → run translate sync → ship globally.
Your app can speak dozens of languages. It just needs a workflow that doesn't require a dedicated sprint. For teams ready to design for localization from day one, the tooling is finally there.