Start a project

Article · iOS · Localisation · UK English · 12 min read

How to localise an iOS app, including UK English

Localising an iOS app is more than attaching a translation file at the end. For a UK product, it also means treating British English as a first-class locale: an en-GB string table, dates and currency that look right in Britain, and tests that catch a missed key or an American spelling that slipped through. String Catalogs in Xcode are the right place to keep that work, including plurals and argument-aware strings, rather than a handful of Localizable.strings files that nobody remembers to update.

On this page 10 sections
  1. Decide your development language and your base locale
  2. String Catalogs, not scattered Localizable.strings
  3. en-GB, en-US and the words that actually differ
  4. Dates, numbers, currency and units
  5. Images, layout and text that grows
  6. Pluralisation and strings with arguments
  7. SwiftUI and String Catalogs
  8. A testing routine that catches gaps
  9. Key takeaways
  10. Frequently asked questions

This is not a general accessibility article — for Dynamic Type and VoiceOver start with accessible iOS apps in SwiftUI — and it is not an MVP scoping exercise. It is the localisation method I use when the first language is UK English, whether or not a second language exists yet.

Decide your development language and your base locale

Xcode has a development language, and the system has a locale. They are easy to conflate.

The development language is the language you type in source and the language the String Catalog uses as the source of truth. For a UK-first app, I set this to English (United Kingdom) — en-GB — so the default copy is the copy I actually want on a phone in London. If you leave it as generic en, you will write American English by habit, or a mix, and en-GB will become a partial overlay you forget to maintain.

The device locale decides formatting (dates, numbers, currency, first day of the week) and which language table is chosen. A user in the UK with language English and region United Kingdom should get your en-GB strings and UK formats. A user who has picked English (US) should get en-US if you ship it, not a surprise “colour” in a US UI — and not “color” in a UK one.

A practical scheme:

In App Store Connect, the product page languages are a separate list. If the app is UK English, the UK product page should match. That is store metadata, not the String Catalog, but the same words should appear in both.

String Catalogs, not scattered Localizable.strings

A String Catalog (.xcstrings) is the current Xcode format for this work. It holds source strings, translations, comments, plural variations and device variations in one file the compiler still turns into the right runtime tables.

Use one catalog for the app’s user-facing copy, and let Xcode extract strings from String(localized:), Text("…"), and the other standard APIs. Add comments in the catalog for any string where a translator — including future you, adding en-US — would otherwise have to guess: “Button on the photo import screen, imperative verb”, not “Label”.

A few habits keep the catalog honest:

Older Localizable.strings and .stringsdict files still work, and you can migrate them into a catalog in Xcode. For new work, start with the catalog. Scattered NSLocalizedString calls with inconsistent tables are the thing you are trying to leave.

en-GB, en-US and the words that actually differ

The useful work is a short, shared list of differences you actually put in the UI, not a lecture on British English. Words and conventions that regularly appear in apps:

I keep a short glossary in the repo for the words we have decided, and I search the catalog for the American forms I do not want in en-GB. A word counter is a quick way to size a screen’s copy when a designer asks whether a title will wrap; it does not replace a glossary.

Do not “correct” trademarked UI of other products, API names, or screenshot labels you do not control. Color, localization, and NSLocalizedString stay as they are in code. The user-facing string is the thing you localise.

If you only ship en-GB today, you can still write the glossary so adding en-US later is filling a column, not inventing a process. That is much cheaper than discovering, after a US launch, that every “colour” has to be hunted by hand.

Dates, numbers, currency and units

Never format a date or a price with a hand-built string. Use Locale, FormatStyle, or a DateFormatter whose locale you have set, and prefer the user’s locale for a running app.

import Foundation

func displayPrice(_ amount: Decimal, currency: String, locale: Locale = .autoupdatingCurrent) -> String {
    amount.formatted(
        .currency(code: currency)
        .locale(locale)
        .precision(.fractionLength(2))
    )
}

func displayDate(_ date: Date, locale: Locale = .autoupdatingCurrent) -> String {
    date.formatted(
        Date.FormatStyle(date: .abbreviated, time: .omitted)
            .locale(locale)
    )
}

Points that catch UK apps out:

Preview and screenshot locales should include en_GB and, if you ship it, en_US, so a 12-hour versus 24-hour time or a day/month swap is visible before release.

Images, layout and text that grows

Text in a bitmap is not localised when you add a language. If a marketing banner in the app says “Colour themes”, that is a second, hidden string table. Prefer text in the view, over the image, or use asset catalog locale variants when the image itself must change.

Layout needs to tolerate growth even if you only ship English today. UK strings are not always shorter than US ones (authorised representative is a long phrase), and if you add German or French later, buttons that were sized to “OK” will break. Use stacks, flexible widths and the same Dynamic Type discipline you should already have for accessibility. Do not set a fixed height on a label that can wrap.

Right-to-left languages are a bigger layout job if you add one; you do not have to solve Arabic on a UK-only app, but you should avoid assuming that a chevron “leading” is always on the left if you use raw left/right constraints. SwiftUI’s leading and trailing already help.

Watch for typography details that people notice in UK English: a typographic apostrophe in don't if you have chosen curly quotes, and a correct pound sign (£, U+00A3) rather than a lookalike. If a character looks wrong, inspect the code point; the Unicode inspector will tell you whether you pasted a similar symbol by mistake.

Pluralisation and strings with arguments

English still has plurals, and “1 orders” is as sloppy in en-GB as in en-US. String Catalogs support plural variants (zero, one, other — and other categories when you add languages that need them). Use them rather than count == 1 ? "…" : "…", which will be wrong as soon as a language has more forms, and is easy to get wrong for zero in English too.

let text = String(
    localized: "order.count \(count)",
    defaultValue: "\(count) orders"
)

In the catalog, supply “1 order” for the one case and “%lld orders” (or the interpolation the catalog shows) for other, including zero if you want “0 orders” rather than a special empty state. Empty states are often a different string entirely (“No orders yet”), which is better than forcing a plural to do that job.

Arguments should be typed. A name, a date and a number in one sentence need a format the translator can reorder. Do not assemble sentences with +. Do not use a placeholder like TBD or dummy lorem in shipping strings; if you need temporary copy, the placeholder copy tool is for mocks, not for the catalog you ship.

Comments in the catalog should mention what each argument is. %lld without a comment is how a year becomes a count in a translation.

SwiftUI and String Catalogs

SwiftUI’s Text("Save") and Label("Account", systemImage:) participate in extraction. LocalizedStringKey is the type you already pass without thinking. A few sharp edges:

If you inject copy for tests or for a design preview, inject a catalog-backed string, not a raw English literal you will forget to add later.

A testing routine that catches gaps

Localisation fails quietly: a key is missing, a string is still in the development language, a plural is wrong, a date is US-shaped on a UK screenshot. Build a routine, and run it before you ship a screen, not after a translator emails you.

Do not treat a green build as proof. The compiler will not object to “Color themes” in an en-GB catalog.

Key takeaways

If you want a second pair of eyes on a catalog or a UK/US glossary, tell me about it.

Frequently asked questions

Should a UK app use en or en-GB?

Use en-GB. Generic en is easy to treat as US English, and it makes a later en-US overlay messy. A UK-first app should develop in en-GB and add en-US when it needs it, rather than the other way around.

What is a String Catalog in Xcode?

A .xcstrings file that holds source strings, translations, comments and variations (including plurals) in one place. Xcode extracts strings from standard APIs such as String(localized:) and SwiftUI Text, and compiles the catalog into the bundles the app uses at runtime. It replaces most new use of Localizable.strings and .stringsdict.

How do you localise SwiftUI text?

Prefer literal Text("…"), Label, navigationTitle and String(localized:) so the catalog can extract the copy. Set a locale in previews. Do not build a finished String in code and pass it to Text if you want the interpolation to be translatable and reorderable.

How do you format dates and currency for the UK in iOS?

Use FormatStyle or a formatter with a Locale. For a running app, .autoupdatingCurrent is usually right for the format. Pass an explicit currency code ("GBP") for prices you charge in sterling, rather than guessing from the device region. Preview and test with en_GB so you see day/month order and the pound sign.

How do you test missing localisation strings?

Resolve a sample of keys in each shipped language and fail if they fall back unexpectedly, walk the app with the scheme’s language and region set, and grep catalogs for glossary mistakes. When you add a language, log missing keys in debug builds. A successful compile does not mean the en-GB table is complete or actually British.

Written by Lee Johnson. Published 10 November 2026.

All articles · Swift A–Z · Apps

Questions, or an app in mind?

Let's bring your ideas to life. Whether you're envisioning a game-changing Apple Watch app or a transformative iOS experience, I'm here to make it happen.

Start a project