StringLane 1.0 — Side-by-side locale editor for indie developers
StringLane 1.0 is shipping. Built for indie Flutter, iOS, Android, and web developers who are tired of juggling locale files in their IDE and discovering missing translations at runtime.
Side-by-side locale editor
Open any folder and see all your locales at once. A namespace-grouped sidebar lists every key on the left; the per-key detail pane on the right shows every locale's value for the active key, with a Grid / List sub-toggle that picks the right layout for short or long strings. No file switching, no manual cross-referencing — and edits stream directly to your source files without an import/export step.
Multi-format support
Open your existing project as-is. Five formats, all first-class — native parsers built and tested per format, not a generic JSON editor with one parser bolted on:
- Flutter ARB —
.arbfiles with full ICU message support and@keymetadata - iOS .strings — classic
key = "value"files inside.lprojdirectories - Xcode .xcstrings — Xcode 15+ String Catalog format, edited in place
- Android strings.xml — including
<plurals>and string arrays - i18next JSON — flat or nested objects, ICU optional via
i18next-icu
Plurals work in each format's native shape: ICU for ARB and i18next, Apple variations for xcstrings, .stringsdict for iOS, <plurals> for Android. Convert any string key to a plural (and back) for iOS / xcstrings / Android with one click.
Issues Panel (⌘J)
A dedicated panel that lists every validation problem across the project as one row per (locale, key) issue:
- Click a row to jump the editor to that key.
- Per-row ✨ Auto-translate fixes Missing or same-as-source cells without leaving the panel.
- Per-row Fix param repairs a broken
{placeholder}by copying the base locale's parameter set. - Per-row Fix with AI repairs ICU syntax errors, missing plural categories, and placeholder mismatches while preserving your translation text.
- Footer Fix all with AI sweeps every AI-addressable issue in one click.
- Dock right (default, 280px rail) or bottom (220px drawer); state is remembered per project.
Real-time validation
StringLane validates every translation when a project loads and after each edit. Problems show as inline badges on the affected cell:
- Missing (red) — key absent or empty in this locale
- Param (red) — placeholder name mismatch with the base
- ICU (red) — invalid ICU plural / select syntax
- Length (amber) — over the configured
x-max-lengthbudget - Same (amber) — translation identical to the base value
- Guarded (amber) — a guarded brand term has been changed
- Malformed (red) — unclosed brace or other broken placeholder
Empty plural quantities are flagged per-row when the target locale's CLDR rules require them. The sidebar shows a per-key error/warning summary and a per-namespace count.
BYOK AI translation — cloud or local
Bring your own API key and bulk-translate every missing string across every locale at once. No per-character credits, no subscription layered on top:
- OpenAI — GPT-4o, GPT-4o-mini, etc.
- Anthropic — Claude Sonnet, Claude Haiku
- Google Gemini — Gemini 1.5 Flash and beyond
- Groq — Llama 3 models, very fast
- Mistral, DeepSeek, xAI (Grok)
- Local LLM (OpenAI-compatible) — Ollama, LM Studio, Jan, llama.cpp, vLLM. No API key, runs entirely on your machine.
Keys are stored in the OS keychain — never written to disk or project files.
The translation prompts are built around the locale's actual rules:
- CLDR-aware plurals — translating into Ukrainian, Polish, or Arabic auto-fills every quantity the target language requires (
one,few,many,otherfor Ukrainian) even when the source has onlyoneandother. No manual+ few/+ manyfirst. - Format rules — prompts encode the placeholder dialect for each format (printf for iOS / xcstrings, ARB
{name}for Flutter,{{var}}for i18next), so the model never invents the wrong syntax. - Locale data — script, RTL, formality, and honorific guidance for 23 seeded locales is part of every prompt.
- Glossary + related-keys hints — recurring terms in the source and sibling keys with the same prefix are passed as context so terminology stays consistent across a chunk.
Bulk operations batch up to 20 keys per call: a 200-key bulk metadata pass takes about 10 calls, not 200. Translate all missing with AI from the Command Palette sweeps every gap across every locale; cancel between chunks keeps partial results.
Command Palette (⌘K)
One searchable menu for every action — Add key, Translate all missing, Open Settings, switch theme, jump to any key by name or value fragment. Recent commands pin to the top.
Welcome screen
- Format pills: ARB · .strings · .xcstrings · XML · i18next JSON
- Trust row: Local only · BYOK AI · No account
- Keyboard hints:
⌘O open · ⌘K command palette · ? shortcuts - Recent project rows show format chip, locale and key counts, completion %, and a relative "last opened" time (5 most recent).
Status Bar
A leading completion ring with tabular-nums percentage, error and warning chips that toggle the Issues Panel on click, a save tail with relative time ("Saved · 30s ago"), and a translucent macOS-style backdrop where supported. Run flutter gen-l10n from a status-bar button on Flutter projects.
ICU visual editor
Open the visual ICU editor on any cell of an ICU-supporting format with the inline {} button (or ⌘I). Three tabs:
- Build — guided per-quantity fields with live preview.
- Raw — drop into the ICU textarea; switching from Build seeds it with the current preview.
- Reference — copy-ready cheat-sheet of plural / select / selectordinal templates.
Plural keys render as one panel per locale in the detail pane, with Add form: chips that highlight CLDR-required quantities in blue.
Auto-save + Reload from Disk (⌘R)
Every edit writes directly to the source file the moment you leave the cell — no Save button, no Export step. ARB files preserve key order and @key metadata exactly as they were on disk; git diffs show only the lines you actually changed.
When something edits a locale file outside StringLane (git checkout, bulk find-and-replace, an external tool), hit ⌘R to discard pending unsaved edits and re-read every file from disk.
Customisation
- Custom keybindings — Settings → Keybindings remaps the palette, search focus, Issues panel, Issues filter, and shortcuts dialog. Export and import as a JSON preset.
- Appearance preferences — pick density (Compact / Cozy / Spacious), toggle zebra striping, show locale flag emojis, turn on tabular numbers everywhere.
- Themes — Light, Dark, or follow System.
- Project Settings — guarded words, key constraints (
x-max-length), product context, branding guidelines, per-locale AI context with 50 seeded locale presets.
Platforms
- macOS — universal DMG, code-signed and notarized through Apple. No "damaged" Gatekeeper warning when downloading from a browser.
flutter gen-l10nworks from DMG installs (StringLane reads your login shell environment to find Flutter however you have it installed). - Windows —
.exeinstaller for Windows 10 / 11.Ctrlinstead of⌘in shortcuts; every feature reaches parity with macOS.
One-time license, no subscription
StringLane is a native desktop app with a one-time license. No monthly fee, no usage caps, no cloud dependency. Your locale files stay on your machine.
Early-adopter pricing is available at launch: $49 one-time. Full price after launch is $79.
A 14-day free trial is built in — no email, no account, works offline.
Follow @stringlane_app for updates on what's coming next.