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.

80 testsMIT-compatible CIZero config
01.
INSTALL
GitHub Action
- uses: YinsPeace/localelint@v0
  with:
    files: MyApp/Localizable.xcstrings
    fail-on-warning: false
Local CLI
$ npm install -g localelint
$ localelint check path/to/Localizable.xcstrings

Drop 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

github-actions bot commented now

LocaleLint Summary

0 errors3 warnings2 info
SeverityRuleLocaleKey
WARNmissing-targetfraction.continue.reading
INFOneeds-reviewplbook.read.percent
WARNmissing-targetarshare.with.friends

Devs get the diff in plain sight. No more surprise one-star reviews.

02.
MIGRATE

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.

Terminal
$ 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)
03.
CATCHES

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.

04.
UPDATES

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.