We ship a Bazi (Four Pillars) and feng shui app on Google Play. Sixteen languages, one codebase.
The problem we hit was not translation itself. It was drift.
What went wrong
Every screen rendered terms like Heavenly Stem and Earthly Branch from localized strings. Some code paths used a translated label as a map key. That works in Chinese. It explodes in Korean.
We also had placeholder collisions: $mingGong is a prefix of $mingGongAnalysis, so the template engine truncated the longer name and users saw 병사Analysis.
What we changed
-
Server returns language-neutral codes, not text.
gan:"bing",shiShen:"piancai",naYin:"luzhonghuo". The value is stable across all 16 locales. - One client-side term database renders codes to text. 75 term codes x 16 languages in a single lookup. Adding a column means adding entries, not touching screens.
- Server only adds fields, never changes old ones. Older app versions ignore unknown keys, so a field addition cannot break users on a previous release.
-
Braced placeholders only.
${name}, never$name.
Result
We audited the source: 1,267 localization call sites. Our coverage went from about 55% to 78%, and the remaining gaps are now enumerable instead of discovered by users.
Current release fixes eight languages completely: English, Japanese, Korean, Traditional Chinese, Thai, Vietnamese, Indonesian, Malay. The other seven are in progress.
If you maintain a multi-locale app: make your server emit codes, and keep exactly one rendering path on the client.
mysticfate.net
Top comments (0)