StringLane

Skip to content
XCSXcode String CatalogmacOS, Windows, Linux

An .xcstrings editor that keeps translation state honest

StringLane opens Localizable.xcstrings outside Xcode, shows every language side by side, and updates each string's state when you edit so the catalog does not drift out of sync with reality.

$49 once · No email · Full app for 14 days

StringLane with an Xcode String Catalog loaded, showing every locale from a single .xcstrings file side by side

The format

What StringLane opens

A String Catalog is one JSON file per string table holding every locale, plus a translation state for each string in each language. That state is the feature, and it is also the thing hand-editing the JSON gets wrong: change a value in a text editor and the surrounding state does not move, so Xcode's view of what still needs translating quietly stops being true.

File layout
One Localizable.xcstrings per string table, all locales inside it
Placeholders
%@, %d, %lld, and positional forms such as %2$@
Plurals
Apple variations, stored inline in the catalog
Per-string state
new, needs_review, translated
Detected by
Any .xcstrings file, including several across sibling targets
Project chip
XCS

Verification

What gets flagged in a String Catalog

Validation runs when the catalog loads and again after every edit. These are the checks that apply to `.xcstrings`.

Missing or empty per language

The string exists in your source language and is absent or blank in another. In a catalog with thirty languages this is the number you cannot hold in your head, which is the entire reason for the side-by-side view.

Format specifier mismatch

Apple specifiers are positional, so they are compared by count rather than by name. If the source has %@ and %lld and the German translation came back with one specifier, that is an error, and it is the class of mistake bulk AI translation produces most often.

Plural coverage against CLDR

Each language is checked against the plural categories it actually requires. Ukrainian needs one, few, many and other. English needs two. Supply only the English pair and the missing categories are flagged, which you can verify without reading the language.

Same as source, and guarded words

A value identical to the source language usually means it was copied and never translated. Terms you mark as guarded, such as your app name, are flagged when a locale changes them instead.

What it will not do. ICU MessageFormat validation does not apply here, and StringLane does not pretend otherwise. String Catalogs express plurals as Apple variations, not as ICU strings, so the ICU checks you would get on an ARB or i18next project are switched off for this format. Plural coverage is still checked, through CLDR.

Your files

The catalog stays canonical

StringLane writes to the same `.xcstrings` file Xcode reads. There is no export step and no second copy of your strings.

  • Translation state is updated for you: a value you fill becomes translated, one you clear reverts to new.
  • Strings marked shouldTranslate: false are left alone, including their state.
  • Adding a language merges into the existing file rather than creating a second one.
  • The JSON shape is preserved, so the file Xcode opens afterwards is the file it expects.

Your toolchain

Where it sits in an Xcode project

Xcode still owns extraction. It pulls string literals out of your code into the catalog at build time, exactly as before, and StringLane never touches your .xcodeproj or .xcworkspace. What it changes is the editing surface: instead of one language at a time in the Xcode inspector, every language is a column.

This is also why StringLane runs on Windows and Linux. The catalog is JSON, not a Mac-only bundle, so a cross-platform team can work on the same iOS strings without an Apple machine each.

FAQ

Xcode String Catalog questions

Do I still need Xcode?
Yes, for building and for extracting new strings into the catalog. StringLane is the editing and verification surface, not a replacement for the toolchain. The practical split is that Xcode extracts and compiles, StringLane is where you fill and check thirty languages.
What happens to translation state when I edit a value?
StringLane sets it. Filling an empty value marks that string translated for that language, and clearing a value returns it to new. This is the main reason to use an editor that understands the format rather than opening the JSON in a text editor, where the state silently stays wrong.
Does it touch strings marked shouldTranslate: false?
No. Those are system-managed strings and StringLane leaves both the value and the surrounding entry untouched.
My project is mid-migration and still has .lproj folders. Does that work?
Yes. StringLane walks the workspace, collects every .lproj cluster and every .xcstrings file, and loads them as one project with keys namespaced by their origin folder. Saves go back to each origin in its own native format, so a half-migrated project keeps working.
Can I add a new language?
Yes, from a preset list. The language merges into the existing catalog file, and every string shows as missing for that language until you fill it manually or with AI.

Price

One purchase, no subscription

$49once

Early-adopter price. Full price after launch is $79.

Start the 14-day trial
  • All five formats, not just this one
  • Live validation while you edit
  • AI fill with your own API key, or a local model
  • macOS, Windows and Linux
  • Updates within the major version

The comparison worth making is against a cloud TMS seat rather than against another editor. Lokalise lists $144 a month at entry and $999 a month on its Advanced plan, checked July 2026. That bill arrives every month. This one does not.