Guides / Behind the Scenes

How We Translated Our Mobile Games Into 14 Languages

What it took to put four Android games into 14 languages: how we structure string files, why plural rules and fonts matter, the translation mistakes that kept coming back, a bug that only hits phones in Europe, and why 14 languages means 16 store listings.

All four of our games, Idle Ronin, Idle Summoner, Idle AI Factory and Block Brain, are fully translated into 14 languages: English, German, Spanish, French, Croatian, Indonesian, Italian, Japanese, Korean, Portuguese, Russian, Slovenian, Turkish and Traditional Chinese. Together that is about 2,100 English strings, from 254 in Block Brain to 1,253 in Idle Ronin, each one translated 13 times. This is what that took, and what we would do again.

One string file per language, with context

Each game keeps one plain text file per language. An entry is the English source line, marked with @, followed by its translation, marked with =, and most entries carry a comment written for the translator. This is the first monster in Idle Summoner's English file:

# monster name with its number in the summon chain (1-55); names appear on small labels

@ {0}. Slime

Those comments are the most useful thing we added. Idle Summoner's English file has 156 of them for 258 strings. A translator who knows that a string sits on a tiny label, or that {0} is a number, makes far fewer mistakes than one guessing from the words alone.

Using the English text itself as the key keeps the files readable, but it has a trap. A string that is the same in both columns is not automatically a name that must stay in English: in Idle Ronin, about 680 of the first 1,185 entries matched their English text. Only the real proper nouns stay English, the 19 Guardians, the unit names and 12 costumes, and our build script locks exactly those.

Plural rules are not optional

English has two forms: 1 unit, 2 units. Many languages have more, and the rules differ. Our Loc code follows the integer plural rules from the Unicode CLDR tables:

LanguagesForms our code uses
English, German, Spanish, Italianone, other
French, Portugueseone (0 and 1), other
Croatianone, few, other
Russianone, few, many
Slovenianone, two, few, other
Turkish, Indonesian, Japanese, Korean, Chinesea single form

Slovenian is the one that surprises people: it has a separate form for two, so "2 units" and "5 units" are different words. If your code only knows singular and plural, every one of these languages shows wrong grammar somewhere.

Fonts: the letters you did not know were missing

Idle Summoner's text font was a trimmed copy of Noto Sans KR Black that lacked č, š, ž and ć, Western European accents, Turkish letters and Traditional Chinese. Missing letters either fell back to a phone font or did not show at all. We rebuilt it with every letter our tables use and added Noto Sans JP for Japanese and Noto Sans TC for Traditional Chinese. Labels in the game's pixel font keep it only while the text fits the letters that font has.

Fonts can also mislead. In Idle Ronin's Korean font, a capital N is drawn so that ON and OFF read as "OΠ". We switched those toggles to the Korean words 켜기 and 끄기, which read better anyway.

The mistakes that came back in every language

However a game is translated, the first draft is rarely ready. Ours repeated the same handful of mistakes in almost every language, the ones our own Slovenian review had caught first:

  • "Particle", a graphics setting, translated as the physics word instead of "Effects".
  • "Stack", extra copies of a unit, left in English or translated as "pile" instead of "copies".
  • A quest to defeat the monster called Treasure Chest translated as smashing treasure chests.
  • Text translated at full length for rows and badges that only fit a word or two.
  • "FIGHT FLOOR {0}" keeping a redundant verb that made the button too long.

So we wrote a checker that prints exactly those strings for any language, and we hand the list over before translation starts. The two languages drafted with the list in hand needed no fixes; the ones drafted without it needed about six each.

Check the screens, not just the files

A file can be complete while the screen still shows English. Our test: switch the game to another language, collect every visible text on screen and compare it with the English file. Anything still in English is a label the code never translates. In Idle Ronin that sweep found an always-visible OPEN button and settings buttons stuck in whatever language was active when the menu first opened.

Then check fit on a real phone resolution. We look at every screen at 1080 x 2400 in the longest languages and in Japanese, Korean, Chinese and Russian, and we shorten text rather than shrink it until nobody can read it.

A comma that breaks saves in Europe

One bug has nothing to do with words. In a game we are building, the save joins numbers with commas. On a phone whose language writes decimals with a comma, as in much of Europe, 7392.58 becomes 7392,58, the extra comma splits it in two, and every value after it shifts one place. A developer testing in English never sees it. The fix is one line at startup that pins number formatting to the invariant culture, plus a guard so saves that were already broken still load.

14 languages, 16 store listings

Google Play has separate listings for Spanish in Spain and Latin America and for Portuguese in Portugal and Brazil. We keep one in-game translation per language, but write the store text separately for each market, with its own search terms. That makes 16 listings per game, each with its own title, short description, full description and screenshots. Our website follows the same pattern, and we explain how we build it in a separate post.

What we would do again

  1. Write a context comment for every string.
  2. Lock proper nouns in the build, not in the translator's head.
  3. Implement plural rules before the first translation arrives.
  4. Check that your fonts contain every letter your tables use.
  5. Keep a list of known problem strings and hand it over up front.
  6. Sweep the screens in another language for leftover English.
  7. Write save data in the invariant culture.
  8. Plan for 16 store listings, not 14.

Want to see the result? Switch the language in Idle Ronin, Idle Summoner, Idle AI Factory or Block Brain: every one of them speaks all 14.

Sources

  • Unicode CLDR, Language Plural Rules.
  • ONI Games game code, September 2026: Idle Summoner (Loc.cs, LocFonts.cs, Localization/Summoner/en.txt), Idle Ronin (Localization/Ronin), Idle AI Factory (Localization/AIFactory), Block Brain (Localization/Brain).

More guides

All guides
Why We Removed Forced Ads After Boss Fights

Behind the Scenes

Why We Removed Forced Ads After Boss Fights

Where an ad appears matters more than how many there are. The story of the full-screen ad at Idle Ronin's boss fights, which moved twice before we switched it off, and the rules for ads we now follow in all our games, with the code behind them.

Read the guide →

◆ More from ONI Games

More games

Swipe for more

Idle Ronin: Cyber RPG
Out now · Google Play

Idle Ronin: Cyber RPG

Step into a neon-soaked future as the last Cyber Ronin. Slash through waves of mechs, recruit a cyborg squad and climb the Neon Tower. Your blade keeps swinging even while you are offline.

Explore the game →
Idle Summoner: Pixel RPG
Out now · Google Play

Idle Summoner: Pixel RPG

Summon a legion of beasts, storm the castles of the underworld and rebirth stronger every time progress slows.

Explore the game →
Block Brain: Block Puzzle Game
Out now · Google Play

Block Brain: Block Puzzle Game

Fit colorful blocks, clear lines and chain combos while your Brain buddy grows from a tiny sprout into a crowned Mastermind.

Explore the game →
Idle AI Factory: Robot Tycoon
Out now · Google Play

Idle AI Factory: Robot Tycoon

Run a factory full of cheerful robots, automate every production line and grow from a small AI lab to a base on the Moon.

Explore the game →