StringLane

Skip to content
STRiOS .stringsmacOS, Windows, Linux

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

StringLane with an iOS .strings project loaded, showing format specifiers in cells across several locale columns

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 .stringsdict plist, written alongside on save
Placeholders
%@, %d, %ld, and positional forms such as %1$@
Comments
/* ... */ blocks above each key, passed through intact
Detected by
.strings and .stringsdict files under .lproj folders
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 .stringsdict alongside the .strings file, 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?
Yes. Plural keys appear in the same table as ordinary strings, one row per quantity, and on save StringLane writes the companion .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?
No. The /* 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?
Yes, as a single project. StringLane walks the workspace, collects every .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?
That is a decision about your project, not about this editor. StringLane opens both, and a project part-way through the migration loads as one thing, with each key written back in the format it came from. If you have already moved, the .xcstrings page covers what changes.
Do I need a Mac?
Not for editing. StringLane runs on macOS, Windows and Linux, and .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.

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.