LocaleLint: CI validation for iOS localization files (String Catalogs / XLIFF)

I've been building a small tool for a gap I kept hitting with iOS localization, and thought it might be of interest here.

LocaleLint is a CLI and GitHub Action that validates Xcode String Catalog (.xcstrings) and exported XLIFF files as a CI step, before broken localization gets merged or shipped.

It checks for:

  • missing or empty translations across locales
  • format-specifier mismatches between source and target (%@, %lld, positional tokens)
  • CLDR plural-category coverage per locale (e.g. Polish needs one/few/many/other, Arabic needs all six)
  • drift introduced when migrating legacy .strings / .stringsdict to a String Catalog

The motivation: String Catalogs and String(localized:) cleaned up the happy path, but the failure modes stay silent. Nothing fails the build, App Review doesn't flag it, and you find out from a low-rated review in a language you don't read.

It's AST-based internally: each format is parsed into a generic model and the validators run against that, so adding more formats later doesn't touch the rules.

Repo and docs: GitHub - YinsPeace/localelint: Localization CI for iOS apps. Validates Xcode XLIFF and String Catalog files for missing translations, placeholder mismatches, and CLDR plural coverage. · GitHub

I'd genuinely value feedback from people who deal with localization at scale, both on the validation rules and on whether the CI-guard framing is the right shape for this problem.