Skip to content
StringLane

i18next JSON

An i18next JSON editor that keeps your nesting

StringLane opens every locale JSON in your project at once, shows nested keys as readable dot paths, and compares {{variable}} interpolation across languages. Files are written back nested exactly as you had them.

Download for macOS

For macOS, Windows and Linux14-day trial, no email · $49 once

StringLane with a sample i18next project open: billing.plan.upgrade in six languages side by side, with the Spanish cell flagged for a renamed {{plano}} variable

A renamed {{plano}}, flagged on the cell

THE FORMAT

What StringLane opens

i18next keeps one JSON file per language, usually under a folder named for the locale, and lets you nest keys as deeply as you like. Nesting is good for organisation and bad for comparison: a key three levels down in one file is hard to line up against five other files. StringLane flattens the view to a dot path and leaves the file itself nested.

File layout
One JSON file per language, locales/en/translation.json
Nesting
settings.account.title shown as one row, stored nested
Placeholders
{{variable}}, compared between locales by name
Plurals
CLDR suffix keys such as itemCount_one and itemCount_other
ICU
Validated, and # inside a plural branch is supported here
Project chip
JSON

WHAT GETS FLAGGED

What gets flagged in an i18next project

Validation runs when the project loads and again after every edit. i18next is one of the two formats where both the ICU and the plural checks apply. The same checks run from the terminal with stringlane check, and over MCP for a coding agent.

  • Missing or empty per language

    The key exists in your base language and is absent or blank in another file. i18next falls back at run time, so the string still renders, in the wrong language, and nothing in your build says so.

    missing_key

  • Interpolation mismatch

    {{variable}} names are compared as a set rather than by count, so a translation that renamed {{name}} to {{nombre}} is flagged, and so is one that dropped it entirely. Renaming an interpolation variable is the failure that reaches production, because the JSON stays valid.

    format_placeholder_mismatch

  • Plural coverage against CLDR

    Keys ending in a CLDR suffix are grouped into one row, and each language is checked against the categories it actually requires. Ukrainian needs one, few, many and other. English needs two. Ship the English pair for Ukrainian and the gap is flagged. Suffix matching is case insensitive, so keys left in an older casing by earlier tooling are still recognised. Ordinal keys such as place_ordinal_one and place_ordinal_two are checked against the language’s ordinal forms (1st, 2nd, 3rd in English), not its ordinary plural forms. A language that holds its own plural forms under a base value with {{count}} has each form checked against that value.

    missing_key

  • A count with no plural forms

    i18next uses a key’s _one and _other forms only when they exist, so a base value like {{count}} genres with no plural forms in any language reads “1 genres”, and Russian reads “1 жанров”. It is flagged once, on the base language. A label that shows the number apart from the words, such as Found: {{count}}, is not. stringlane pluralize, the MCP pluralize_key tool and the app’s Add plural forms dialog write the base forms for you.

    count_without_plural

  • Invalid ICU

    If you use ICU messages through i18next-icu, they are parsed and validated: unmatched braces, a plural missing other, a malformed select. Unlike Flutter, the i18next ICU runtime does substitute #, so a bare # is left alone here rather than flagged.

    icu_parse_error

  • 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 when a language changes them instead.

    untranslatedguarded_word_violation

What it will not do

StringLane reads the JSON files on disk. It does not run your i18next configuration, so it cannot tell you that a namespace is not registered, that a key is unreachable through your loading strategy, or that a component is calling a key that does not exist. It tells you what is missing, mismatched or malformed across the files themselves.

YOUR FILES

Your JSON comes back nested

The dot path is a view, not a transformation. StringLane never flattens your files on disk.

  • Nesting structure is preserved exactly as found. A key shown as settings.account.title is written back three levels deep.
  • Key order is preserved as it appears in the file.
  • Plural suffix keys are written back as _-suffixed keys, not converted into some other plural shape.
  • Open the file in your editor before and after: the diff shows only the values you changed.

locales/en.json

{
  "cart": {
    "itemCount_one": "{{count}} item in your cart",
    "itemCount_other": "{{count}} items in your cart",
    "checkout": "Check out"
  },
  "billing": {
    "plan": {
      "current": "Current plan",
      "upgrade": "Upgrade to {{plan}}"
    }
  }
}

YOUR TOOLCHAIN

Where it sits in a web project

StringLane edits the same JSON your i18next setup already loads, whether that is a bundler import, a backend plugin or a static folder. It is not a plugin, it does not run at build time, and your i18next configuration does not change.

The case it is built for is the multi-format repo. If the same product ships a mobile app and a web front end, the web strings usually get checked last and least. Opening the i18next files in the same tool that opens the app strings puts them under the same missing-key view.

Let your coding agent check the same files.

The free CLI reads the same locale JSON files.

Read https://stringlane.app/docs/cli/agent-setup.md and set up StringLane for this project.

Pay once for the app. The CLI is free.

Desktop app

$49once

  • 14-day trial, no email, no card
  • macOS, Windows and Linux
  • 3 machines, updates in the major version
  • Your own AI key, or a local model

Early-adopter price, $79 after launch.

CLI & agents

$0free

  • Terminal, CI and MCP
  • Claude Code, Cursor, Codex and 5 more
  • No key, no activation
  • Separate from the app licence

Lokalise starts at $144 a month (checked July 2026). StringLane sells no AI credits.

i18next JSON questions

Will it flatten my nested JSON?
No. Nesting is preserved on disk. The dot path is only how the key is displayed so it can be lined up against the other languages in a table. A key stored three levels deep is written back three levels deep.
How does it handle i18next plurals?
Keys ending in a CLDR suffix, such as itemCount_one and itemCount_other, are grouped into a single row with one entry per quantity. Each language is then checked against the plural categories CLDR says it needs, and an _ordinal_ key against the language’s ordinal categories. On save they are written back as suffixed keys, _ordinal_ spelling included.
Does it open easy_localization and slang projects?
Yes. Both keep JSON catalogs that open as an i18next-style project, and StringLane works out which package you use from pubspec.yaml and slang’s .i18n.json file naming. Each is then checked by its own rules: easy_localization’s {} and {name} placeholders, slang’s $name and {name}, and a nested map of plural forms as one plural key. easy_localization is not asked for few and many, which it reads only with ignorePluralRules: false.
Does it understand {{variable}} interpolation?
Yes, and it compares variables by name across locales rather than counting them. A translation missing {{count}}, or one that renamed it, is flagged as an error.
What if I use ICU messages through i18next-icu?
They are parsed and validated. i18next is one of the two formats where ICU checks run, alongside Flutter ARB. One difference worth knowing: the i18next ICU runtime substitutes # inside plural branches, so StringLane does not flag it here, while it does on ARB where Flutter has no pound token.
Can I open my web and mobile strings in the same project?
Yes. StringLane detects each format from the files themselves, and a folder holding more than one format loads with each format in its own section.

Check your locales tonight.

Download for macOS

For macOS, Windows and Linux14-day trial, no email · The agent setup is free