Overview › Internationalization & Localization
Internationalization & Localization
4 locales (en, en-CA, fr-CA, fr); ~2,000 strings; some hardcoded literal text remains.
70
SCORE
Summary
Four locales: en, en-CA, fr-CA, fr. ~2,000 strings per locale in the main bundle. Most code uses NSLocalizedString but some hardcoded literal text remains. No pseudo-localization in debug schemes.
Locales shipping today
| Locale | .lproj folder | Snapshot test plan |
|---|---|---|
| English (US) | en.lproj | Snapshot-Tests-EN_US.xctestplan |
| English (Canada) | en-CA.lproj | Snapshot-Tests-EN_CA.xctestplan |
| French (Canada) | fr-CA.lproj | Snapshot-Tests-FR_CA.xctestplan |
| French (France) | fr.lproj | (falls back to fr-CA snapshot baseline) |
Localization toolchain recommendations
- SwiftGen — generate
L10nenum fromLocalizable.strings; compile-time error on missing keys. - String Catalogs (.xcstrings) — Xcode 15+ format; replaces .strings + .stringsdict; built-in plural / variant support.
- Pseudo-localization scheme — Xcode "Show non-localized strings" launch arg + a custom pseudo-locale build configuration.
- Lokalise / Phrase — translation memory + machine-translation pipeline.
Plurals / dates / currency
Verify NumberFormatter uses Locale.current not Locale(identifier: "en_US"). Use .stringsdict (or .xcstrings) for plurals — NSLocalizedString alone doesn't handle "1 item" vs "2 items" correctly across languages.
Findings
""PASS
4 locale variants with snapshot coverage
Locale-specific snapshot test plans (EN_CA, EN_US, FR_CA) lock visual layout per language.
MEDIUM
Hardcoded text in some screens
Some
label.text = "..." literals bypass NSLocalizedString.Recommendation: SwiftLint custom rule banning string literals in
.text setter; SwiftGen for compile-time string safety.MEDIUM
No pseudo-localization scheme
Pseudo-locales (en-XA, ar-XB) catch truncation, encoding, and RTL bugs early.
Recommendation: Add a Pseudo build configuration that uses
-AppleLocale/-NSShowNonLocalizedStrings launch arguments; run snapshot tests against pseudo-locale.LOW
Number / date formatting
Confirm
NumberFormatter + DateFormatter use the user's locale, not Locale(identifier: "en_US").Recommendation: Audit formatter creation; default to
Locale.current for user-facing.No findings logged in this category yet for iOS.
Costco iOS · Code Review Report · Generated 2026-05-07 · 88 machine-curated findings