Localization CI for iOS apps
Ship multilingual apps without breaking them.
LocaleLint validates Xcode XLIFF and String Catalog files in CI. Catches missing translations, broken plurals, and lost placeholders before App Review does.
- uses: YinsPeace/localelint@v0
with:
files: MyApp/Localizable.xcstrings
fail-on-warning: false$ npm install -g localelint
$ localelint check path/to/Localizable.xcstringsDrop the Action into your existing iOS CI workflow. PRs get a comment showing exactly what broke.
WHAT YOUR PR GETS
Clear feedback, right in the diff
•LocaleLint Summary
| Severity | Rule | Locale | Key |
|---|---|---|---|
| WARN | missing-target | fr | action.continue.reading |
| INFO | needs-review | pl | book.read.percent |
| WARN | missing-target | ar | share.with.friends |
Devs get the diff in plain sight. No more surprise one-star reviews.
Migrating to Xcode String Catalogs?
Xcode 15 auto-migrates legacy .strings and .stringsdict files to the new .xcstrings format. Most of the time it works. Sometimes a Polish plural drops a category, a German target loses its %@ placeholder, a comment vanishes that the translator relied on for context. You will not notice until a one-star review.
localelint migrate validates the round-trip. It compares your legacy .lproj directory against the new String Catalog and tells you exactly what got lost, dropped, or corrupted.
$ localelint migrate Localizations/ Localizable.xcstrings
legacy: 5 units, locales de, pl
catalog: 5 units, locales de, pl
[pl] 2 finding(s):
ERR migration-lost-translation
welcome.title: legacy pl translation missing
ERR migration-lost-plural-category
notes.count: plural "many" missing for pl
[de] 1 finding(s):
ERR migration-placeholder-corrupted
user.greeting: %@ missing (legacy 1, catalog 0)
3 error(s), 2 warning(s)What it catches
Missing translations
Keys without target translations, or empty targets with the wrong state.
Placeholder mismatches
%@, %lld, positional %1$@, ICU named tokens. Counted across source and target. Catches Arabic plural variants that quietly drop %d.
CLDR plural coverage
Polish needs one + few + many + other. Arabic needs all six. Japanese accepts a single form. LocaleLint knows the rules for every locale Apple ships.
Get notified when the hosted dashboard ships
Multi-repo audit history, Slack alerts on translation drift, branch-protection integration. One email when it lands. No newsletter.