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/.stringsdictto 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.
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.