Overview › Internationalization & Localization

Internationalization & Localization

4 locales (en, en-CA, fr-CA, fr); ~2,000 strings; some hardcoded literal text remains.

0 findings in this category · iOS
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 folderSnapshot test plan
English (US)en.lprojSnapshot-Tests-EN_US.xctestplan
English (Canada)en-CA.lprojSnapshot-Tests-EN_CA.xctestplan
French (Canada)fr-CA.lprojSnapshot-Tests-FR_CA.xctestplan
French (France)fr.lproj(falls back to fr-CA snapshot baseline)

Localization toolchain recommendations

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