A Localizable.strings editor for every .lproj at once
StringLane collects every .lproj folder in your project into one table, checks format specifiers across languages, and writes plural forms to the companion .stringsdict on save.
$49 once · No email · Full app for 14 days

The format
What StringLane opens
The classic Apple layout splits localization two ways. Values live in one Localizable.strings per language, as "key" = "value"; pairs, and plurals live in a separate .stringsdict plist because the .strings format cannot express them. StringLane reads both and treats them as one project, so plural keys sit in the same table as everything else.
- File layout
- One folder per language,
en.lproj/Localizable.strings - Plurals
- Companion
.stringsdictplist, written alongside on save - Placeholders
%@,%d,%ld, and positional forms such as%1$@- Comments
/* ... */blocks above each key, passed through intact- Detected by
.stringsand.stringsdictfiles under.lprojfolders- Project chip
STR
Verification
What gets flagged in a .strings project
Validation runs when the project loads and again after every edit. These are the checks that apply to `.strings` and its `.stringsdict` companion.
Missing or empty per language
The key exists in your base language and is absent or blank in another .lproj. Nothing in the Xcode build stops you shipping that, which is why it is the first column of the table.
Format specifier mismatch
Apple specifiers are positional, so they are compared by count. A base string with %@ and %ld against a translation carrying one specifier is flagged as an error. Positional forms like %1$@ and %2$@ are recognised, including length modifiers such as %lld.
Plural coverage against CLDR
Every .stringsdict plural is checked against the categories its language actually requires. Ukrainian needs one, few, many and other. English needs two. A Ukrainian entry carrying only the English pair is flagged, and you do not have to read Ukrainian to act on it.
Same as base, and guarded words
A value identical to the base language usually means it was copied rather than translated. Terms you mark as guarded are flagged in the opposite direction, when a language changes something that should have stayed fixed.
What it will not do. ICU MessageFormat validation does not apply to this format and is switched off for it. Apple .strings values are not ICU messages, and plurals live in the .stringsdict structure rather than inline. Plural coverage is still checked, through CLDR.
Your files
Your files come back the way you left them
StringLane writes to your source files directly, in place, with no export step.
/* comment */blocks above each key are passed through untouched.- Plural keys are written to the companion
.stringsdictalongside the.stringsfile, generated only when the file actually has plurals. - In a multi-target workspace, each key is saved back to the file it came from rather than merged into one.
- Quoting style and file structure are preserved, so the diff shows only the values you changed.
Your toolchain
Where it sits in an Xcode project
StringLane never opens your .xcodeproj or .xcworkspace. It reads the .lproj folders on disk and writes back to them, so Xcode picks the changes up the way it would if you had typed them yourself.
Multi-target workspaces load as one project. A main app, a shared module and a watch extension each with their own .lproj cluster are collected together, with keys prefixed by their origin folder so namespaces stay separate. MyApp/Core/Assets/en.lproj/Localizable.strings shows up as MyApp.Core.Assets.<key>. Non-standard filenames inside .lproj, such as SharedLocalizable.strings, are picked up too.
FAQ
iOS .strings questions
Does it handle .stringsdict plural files?
.stringsdict next to the .strings file. The companion is only written when the file actually has plural keys, so a project without plurals does not gain a file it never had.Will it rewrite my comments or reformat the file?
/* comment */ blocks above each key are passed through intact. StringLane writes back the values you edited and leaves the rest of the file structure alone.I have several targets, each with its own .lproj folders. Does that load?
.lproj cluster, and prefixes each key with its origin folder so two targets can use the same key name without colliding. Saves go back to each origin file separately.Should I be using String Catalogs instead?
.xcstrings page covers what changes.Do I need a Mac?
.strings files are plain text. You will still need a Mac to build the app. The Windows build is not code-signed yet, so SmartScreen shows a warning on first run.Price
One purchase, no subscription
$49once
Early-adopter price. Full price after launch is $79.
- 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.
Docs
Read before you download
Opening an Xcode project
How .lproj clusters and multi-target workspaces load.
Format-specific editing
What changes per format, including iOS .strings.
Fixing placeholder mismatches
Reading the badge tooltip and correcting a dropped specifier.
Reading validation badges
What each badge means and how to clear it.
If your project has moved to `.xcstrings`, that page covers the single-file catalog and the per-string translation state model Apple added with it.
Xcode String Catalog editor