OhmsPolyglot.
An editor and linter for Xcode String Catalogs.
Issues before your users find them
Show Issues (⇧⌘I) needs no key and no network. It lists languages with no text for a key, strings Xcode marked New or Needs Review, plural variations missing a form the language needs (Russian “few” and “many”, for instance) or carrying one it never uses, translations whose placeholders changed count or order, keys Xcode no longer finds in your code, and keys that share the same source text. Choose a finding to jump straight to its key.
A write-guard, not a hope
Every machine translation is compared with its source: the same %@, %lld, %#@name@ and {count} placeholders, the same number of times, each reading the same argument as the same type. Numbering them to reorder (%2$lld … %1$@) is accepted; swapping them is not. Every glossary term from Settings that the source uses has to come back verbatim. If a check fails, OhmsPolyglot asks once more, then leaves the entry empty and lists it rather than write a string that crashes String(format:).
Strings go only where you send them
Translate Missing (⌘T) is optional and fills only empty entries, in the languages you pick: the ones already in your file plus any language code you add, remembered per catalog. Keys marked Don't Translate, stale keys and plural or substitution entries are skipped. Before anything leaves the Mac it shows how many entries will be sent, and where. Each request carries the key, its source text and developer comment, your glossary and the target language, over HTTPS to the provider whose API key you pasted, or over loopback to a model server on this Mac. API keys live in the macOS Keychain.
Click any value to correct it. Add, rename or remove manual keys, clear stale keys in one step, and save to the same file. Plural forms, substitutions and metadata you did not edit go back untouched. If Xcode rewrites the catalog while it is open, Save stops and asks before replacing Xcode's changes.
Preview the exact file, then write any language as Android strings.xml with converted placeholders, valid resource names and <plurals>, as a Flutter ARB file with Dart-safe keys and declared placeholders, or as a CSV of every language side by side for a human reviewer. Untranslated keys stay out of per-language files, so the platform falls back to its default strings.
Still on Localizable.strings and .stringsdict? Bring them into the catalog from their .lproj folders. Text the catalog already has is never overwritten.
One-time Mac App Store purchase, with no subscription and no Ohm account. Translation is optional; if you point it at a paid provider, that bill is between you and them.
Opening, editing, checking, importing and exporting run entirely on this Mac. Translate sends entries straight to the endpoint you set in Settings, and Silo Systems receives none of them.
More Ohm apps that talk only to the provider you choose.
3 related apps- View on the App Storevoice · $29.99OhmsVoice
Speak. Transcribe on-device. Approve any optional provider before text is sent.
- Download on the Mac App Storevision · $24.99Ohms Lens
Screenshot to design tokens, worked out on this Mac with no API key.
- View on the App Storeproductivity · $29.99Ohms Explain
Ask about anything you can see.