checklistslocalization

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.