Localization checklist: 10 traps you catch in a single pass
Localization is not “run the strings through a translator”. With 5+ languages, a dozen classes of bugs appear that are invisible in English. A compact checklist covering 90% of real problems.
— String length. German and Finnish are 1.5–2× longer than English — buttons and headings overflow. Test the “Confirm” button in German (Bestätigung) and Finnish (Vahvistus). Worst cases: German compounds (Geschwindigkeitsbegrenzung) and Finnish agglutination.
— Pluralization. Russian has 3 forms (1 apple, 2 apples, 5 apples), Polish 4, Arabic 6. If your code says “{count} item(s)” — that’s a bug. Use ICU MessageFormat / i18next / Polyglot.
— Date and number formats. 1,000.50 (US) vs 1.000,50 (EU) vs 1 000,50 (FR). Date 03/04/2026 — March or April? Use Intl.NumberFormat / Intl.DateTimeFormat, not local hardcodes.
— RTL (Right-to-Left). Arabic, Hebrew, Persian — the UI must mirror: “back” arrows, progress bars, button icons. Verify every screen in RTL mode (on iOS: Scheme → Application Language → Arabic).
— ⚠️ Turkish “i” problem. In tr-TR locale "İSTANBUL".ToLower() returns "i̇stanbul", and "i".ToUpper() gives "İ". String search and comparisons are a separate class of bugs. Use InvariantCulture for technical comparisons.
— Color semantics. Red = danger in Europe, luck in China. Green = success or “cheap”. If you encode meaning by color — add a backup text/icon marker.
— Currency. Not just the symbol — order (“$10” vs “10 €”), space, separator. The conversion rate must not change between adding to cart and paying.
— Capitalization. In German, all nouns are capitalized. In Spanish, headings are sentence case, not Title Case. Screen titles must come from the locale, not from text.toUpperCase().
— Glossary. If your game has consistent terminology (“booster”, “life”, “level”) — it must be unified across screens, push notifications, store description. Maintain a glossary.csv.
— Fallback chain. If there’s no translation for the current language — fall back to en. Never show string keys like errors.network.timeout in the UI.
What to embed in the QA process
💡 Pseudo-localization in dev builds: Ĥéĺĺo Wörłd — instantly reveals unlocalized strings.
💡 Test on 2-3 “heavy” languages (German + Russian + Arabic) — covers most classes.
💡 One regression case per trap above — 10-15 minutes per language per release.
More: W3C Internationalization Best Practices, Apple Localization Guide.