Internationalize From Day One: Treat English Like Any Other Locale
Building internationalization into your app from the start saves time and money and helps you avoid embarrassing translation failures.
Building internationalization into your app from the start saves time and money and helps you avoid embarrassing translation failures.
I gave this talk after one too many apps shipped with English hardcoded everywhere and "we'll localize later" on the roadmap forever. Later never comes cheap. If you've seen the meme about reading text translated into your language when a developer skipped i18n, you've felt why.
Watch the talk: Internationalization For English on Vimeo
Click below to load the embedded presentation.
| Term | What it means |
|---|---|
| Internationalization (i18n) | Designing software so it can adapt to any locale. |
| Localization (L10n) | Supplying the locale-specific pieces: copy, images, colors, culture. |
i18n is the structure. L10n is what you plug in for each locale.
The usual flow, ship English first and retrofit later, buys you angry designers, duplicated code, and bugs that only show up in German. Flip it: internationalize first, localize English, add more locales when you're ready.
| Practice | Why it helps |
|---|---|
| Ban raw strings. Use resource files or constants exclusively. | Hardcoded text doesn't translate |
Use system libraries (ICU, [ISO8601DateFormatter](https://en.wikipedia.org/wiki/ISO_8601), [NumberFormatter](https://developer.apple.com/documentation/foundation/numberformatter)). | Apple and ICU already solved most formatting edge cases |
| Assume text can shrink or grow. Never hard-code widths. | German labels are not English labels with more letters. Sometimes they're fewer. Often they're way more. |
| Document every string with context for translators. | "Book" as a verb and "Book" as a noun need different notes |
| Write code samples, not comments, for how to fetch localized copy. | Samples get copied. Comments get ignored. |
NumberFormatter.localizedUppercase/localizedLowercase.Language is hard. Fixing it after you've shipped is harder. Bake i18n into sprint one and English is just another locale in your bundle, not a special case you'll regret.