App Localization: Process and Pitfalls Beyond Translated Strings

On a retail app we localized into German, Japanese, and Arabic, string translation itself was the least time-consuming part of the project. German text ran 35-40% longer than the English source on average, which broke fixed-width buttons and truncated labels across roughly a quarter of our screens — a problem we only caught because we ran a pseudo-localization pass, auto-expanding strings by 40% with padding characters, before real translations even arrived.
Pluralization rules vary far more than most engineers assume. English has two forms; Arabic has six — zero, one, two, few, many, other. We moved from string concatenation with manual if/else pluralization to ICU MessageFormat syntax handled by the i18n library (react-i18next in this case), which let translators own the plural logic per language instead of engineers hardcoding English-shaped assumptions into the code.
Right-to-left support for Arabic wasn't a CSS flip we could apply and forget. Icons implying direction — back arrows, forward chevrons, progress indicators — needed to actually mirror, while icons like a play button or a company logo needed to stay fixed. We built an explicit allowlist of components that mirror under RTL rather than relying on the OS's automatic mirroring, because it got several icons wrong by default.
Dates, currency, and number formatting are where silent bugs hide longest, because they don't look broken, just wrong. We standardized on the platform's native formatting APIs — Intl.NumberFormat / Intl.DateTimeFormat, or NSDateFormatter natively — rather than manual string building, and added a locale-switching QA pass to the release checklist specifically because a hardcoded 'MM/DD/YYYY' format had shipped to UK users for two releases before anyone noticed.
The organizational lesson was to involve a native speaker reviewer per language before release, not just after complaints arrive. Machine-translated strings that are grammatically correct but contextually wrong — a 'submit' button translated as the formal, cold version of the verb rather than the friendly one a consumer app wants — don't get caught by automated checks, only by someone who actually reads the target language in context.

