localizationRTLengineering
Orion ships in 43 languages by treating translation as engineering, not decoration: 884 strings per locale live in catalogs, never in code, and a CI guard fails any build that carries an untranslated line. Right-to-left screens mirror themselves through the layout system, and every font has to prove, on pixels, that it can draw every script we ship. Here is how that holds on two native platforms, and why an English-only backgammon game would have been a contradiction.
Why localize a backgammon game at all?
Because backgammon is not from the English-speaking world. It grew up around the Mediterranean and the Levant: tavla over tea in a Turkish cafe, tavli by a Greek harbor, shesh besh in Beirut, takhteh in Iran. The game was old in Arabic, Persian, and Greek before it had an English name. Orion's destinations follow the same map, Tangier and Athens and Istanbul among them, so an English-only release would have painted the cafe and locked its door. If the game belongs to those places, it has to speak their languages. That decision set the number: 43 languages, right-to-left scripts included, on both platforms.
How do you manage 884 strings across 43 languages?
By refusing to let a single one live in code. Every label, button, rule text, and victory line is a key, and the keys resolve through each platform's native catalog: a String Catalog on iOS, string resources on Android. Multiply 884 strings by 43 locales and you get 38,012 lines of text to keep true. At that scale, copy pasted straight into a screen file is a time bomb: no tool can see it, and no translator will ever be shown it. Keys keep the whole surface visible. When a sentence changes, one key changes, and 43 languages queue up behind it. The iOS app is native SwiftUI, the Android app is native Jetpack Compose, one shared backend sits behind both, and the same key tells the same truth on every phone at the table.
How does right-to-left support work in a game?
Through the layout system, not by hand. We never built mirrored copies of screens for Arabic. Every layout is written in terms of leading and trailing instead of left and right, and SwiftUI and Compose do the rest: when the locale reads right to left, the interface flips itself. Navigation runs the other way, back arrows reverse, text sits on its natural edge. The real work is discipline about what you type. Write the word left once, because it looks fine on your English phone, and you have planted a screen that lies in Arabic. Hand-mirrored screens rot the first week nobody checks them. Mirroring owned by the layout system cannot drift, because there is nothing to forget.
What stops an untranslated string from shipping?
A guard that fails the build. Missing translations are quiet by design: platforms fall back to English without raising an error, so an English-speaking team can stare at a broken Turkish screen and see nothing wrong. Our CI counts translation gaps across all 43 locales on every build, and the number must read zero. One missing key in one language fails the build, loudly, before any store ever sees it. That sounds severe until you picture the alternative: a lone English sentence in the middle of an Arabic season screen, found by exactly the player it disrespects.
How do you test a font against every script?
A font that silently drops glyphs is a lying font.
Strings fail toward English. Fonts fail toward nothing: a blank box where a letter should be, or a silent swap to some fallback that changes the look mid-word. A display font can be gorgeous in Latin and empty in Arabic, and its coverage table will not volunteer that. So we test pixels. We render real strings from every one of the 43 locales in the fonts we actually ship, look at the output, and keep the fallback chain we have watched draw every script with our own eyes. Trust what renders. Nothing else counts.
Why 49 store listings for 43 languages?
Because the stores keep their own maps of the world. Both stores split some languages by region: Portuguese becomes Brazil and Portugal, Spanish becomes Spain and Latin America, English appears more than once. By the time both catalogs were covered, 43 in-game languages had become 49 store listings, each with its own description and screenshots. It is unglamorous work, and it is also the first thing a player ever reads. The listing should greet you the way the game will.
Four rules carried the whole effort:
- No string lives in code. Every line has a key in the platform catalog.
- No hand-mirrored screens. Right-to-left comes from leading and trailing, enforced by the layout system.
- No silent gaps. CI fails the build if one key in one locale is untranslated.
- No trusted fonts. Every script is rendered and checked on pixels before it ships.
The door at orion.arthea.ai/go carries the App Store and Google Play links and always shows what is available right now. Step through it and the game greets you in whichever of its 43 languages your phone already speaks.