# How to Use the Format Editor

> Format-specific editing helpers for iOS .strings, Android XML, and i18next JSON projects in StringLane.

Source: https://stringlane.app/docs/use-format-editor
Last updated: 2026-08-21

StringLane supports five file formats and adjusts its editing behavior for each one. The format is detected automatically from your project files, so there is nothing to configure.

## Supported formats

| Format | File type | Used in |
|---|---|---|
| Flutter ARB | `app_*.arb` (JSON) | Flutter, Dart |
| iOS Strings | `Localizable.strings` (+ `.stringsdict`) | iOS, macOS (UIKit/AppKit) |
| Xcode String Catalog | `Localizable.xcstrings` | iOS, macOS (Xcode 15+) |
| Android XML | `res/values*/strings.xml` | Android |
| i18next JSON | `*.json` in locale folders | React, Node.js, web apps |

## Flutter ARB

ARB (Application Resource Bundle) is a JSON format with a specific structure. StringLane:

- Reads and writes the `@key` metadata objects — `description`, `x-max-length`, `x-guarded`, `x-no-translate`, `placeholders` — and passes through any field it does not model, unchanged
- Preserves key order exactly as it appears in the source file
- Handles ICU MessageFormat strings in values (see [Working with ICU Plurals](/docs/working-with-icu-plurals))
- Shows `{placeholder}` names as Param badges when they're mismatched between locales

See [How to Work with ARB Metadata Annotations](/docs/arb-metadata-fields) for details on the `@key` system, or the [ARB editor](/arb-editor) page for what gets validated in a Flutter project.

## iOS .strings

Standard iOS `.strings` format uses `"key" = "value";` pairs, one per line. StringLane:

- Keeps every `/* comment */` block. The one directly above a key is that key's [description](/docs/key-metadata-storage), editable in the metadata panel; the rest, the file header included, are passed through intact
- Reads `.lproj`-based locale structure (`en.lproj/`, `fr.lproj/`, etc.)
- Handles format specifiers like `%@`, `%d`, `%1$@`: mismatches between locales are flagged as Param badges
- Reads plural forms from the companion `.stringsdict` plist and writes it back alongside the `.strings` file on save. The companion is only written when the file actually has plural keys

![An iOS .strings project in StringLane: appTitle shown across en, de, fr and ja .lproj locales, its description Home screen title read straight out of the comment above the entry, with the character-width preview below and the Issues panel on the right](/docs-screenshots/format-ios-strings.webp)

For the companion file itself — plural forms, width-adaptive entries, and what round-trips on save — see [What Is a .stringsdict File?](/docs/what-is-a-stringsdict-file). For the rest of the format, see the [Localizable.strings editor](/strings-editor) page.

## Xcode .xcstrings

String Catalogs hold every locale for a string table in one JSON file, plus a translation state per string. StringLane:

- Loads every locale from the single `.xcstrings` file and shows them side-by-side
- Shows a grey **New** badge on any string Xcode has extracted but not yet translated
- Updates state on save: a filled value becomes `translated`, a cleared one reverts to `new`
- Locks strings marked `shouldTranslate: false` so you cannot edit them by accident, and writes the flag back when you set **Not for translation** on a key
- Reads each string's `comment` as its [description](/docs/key-metadata-storage) and writes your edits back to it, so Xcode sees what StringLane wrote
- Merges a newly added locale into the existing file rather than creating a second one

![An Xcode String Catalog in StringLane: appTitle shown across en, de, fr and ja from the single .xcstrings file, with the character-width preview below](/docs-screenshots/format-xcstrings.webp)

> **Two known limitations with `needs_review`.** Catalogs write that state with an
> underscore, and StringLane's badge matches a hyphenated spelling, so a string awaiting
> review currently renders with no badge at all. Saving also recomputes every string's
> state from whether it has a value, which relabels `needs_review` as `translated`
> across the catalog. If you rely on that state to track drift, verify it in Xcode
> after a StringLane session until both are fixed.

See [What Is the .xcstrings Format?](/docs/what-is-xcstrings) for the format itself, or the [xcstrings editor](/xcstrings-editor) page.

## Android XML

Android resources use `<string>` tags in `res/values/strings.xml`. StringLane:

- Reads all `<string name="...">value</string>` entries
- Handles `<plurals>` elements as multi-value entries, one per quantity (`zero`, `one`, `two`, `few`, `many`, `other`)
- Maps locale variants to `values-fr/`, `values-de/`, etc.
- Format specifiers (`%s`, `%d`, `%1$s`) are treated like ARB placeholders for Param validation
- Checks plural quantities against the CLDR categories each language requires

![An Android strings.xml project in StringLane: app_title across values/, values-de/, values-fr/ and values-pl/, the Polish translation over its character budget in red, api_base_url listed first in the sidebar, and the Issues panel listing the few and many quantities Polish is missing](/docs-screenshots/format-android-xml.webp)

> **What a save does and does not move.** Strings marked `translatable="false"` are
> real keys now: they show in the list, locked, keeping their position and their
> attribute. Comments are kept too — one sitting directly above a key becomes that
> key's [description](/docs/key-metadata-storage), and editing the description
> rewrites it in place. Anything StringLane does not model — `<string-array>` above
> all — is transcribed verbatim and written back byte for byte, but **re-emitted
> after** every `<string>` and `<plurals>`, so it moves to the end of the file on
> the first save. A `<![CDATA[...]]>` block that is the whole value comes back
> escaped (`&lt;b&gt;`) rather than re-wrapped, which Android resolves to the same
> string; one sitting beside markup is kept as CDATA.

For more on this format, see the [Android strings.xml editor](/android-xml-editor) page.

## i18next JSON

i18next uses JSON files with locale code as the folder name (`en/translation.json`, `fr/translation.json`). StringLane:

- Supports nested key paths using dot notation (e.g. `settings.account.title` appears as a single row)
- Handles `{{variable}}` interpolation syntax: mismatches flagged as Param badges
- Preserves key order and nesting structure when writing back to disk
- Does not flatten nested keys. They stay nested

![An i18next project in StringLane: the sidebar shows nested JSON as a collapsible BILLING / ERRORS / SETTINGS tree with PLAN, ACCOUNT and NOTIFICATIONS nested inside, and appTitle shown across four locales](/docs-screenshots/format-i18next-json-nested.webp)

For more on this format, see the [i18next JSON editor](/i18next-editor) page.

## Format detection

If StringLane loads a mixed folder (multiple formats), each format is shown in a separate section or you're prompted to select which to work with. Most projects use a single format throughout.
