StringLane

Skip to content
XMLAndroid XMLmacOS, Windows, Linux

An Android strings.xml editor for every values folder

StringLane loads values/, values-de/ and every other resource folder into one table, checks each <plurals> against the quantities its language requires, and writes the XML back with your CDATA and escapes intact.

$49 once · No email · Full app for 14 days

StringLane with an Android strings.xml project loaded, showing several values folders as locale columns

The format

What StringLane opens

Android keeps each language in its own resource folder, and the qualifier on the folder name is what selects it at run time. Plurals are a separate XML element with one entry per quantity, and the set of quantities a language needs is decided by CLDR rather than by you. StringLane reads the whole tree and lines the folders up as columns.

File layout
One folder per language, res/values-de/strings.xml
Plurals
<plurals> elements with zero, one, two, few, many, other
Placeholders
%s, %d, and positional forms such as %1$s
Preserved
<![CDATA[...]]> wrappers and XML entities such as &amp;
Detected by
Any res/values*/strings.xml path
Project chip
XML

Verification

What gets flagged in an Android project

Validation runs when the project loads and again after every edit. These are the checks that apply to Android XML.

Missing or empty per language

The <string name="..."> exists in your default values/ folder and is absent or blank in another. Android falls back to the default resource, so the string still renders, in the wrong language.

Plural quantity coverage

Each <plurals> element is checked against the categories its language actually requires, taken from CLDR. Ukrainian needs one, few, many and other. English needs two. A Ukrainian block carrying only the English pair is flagged as an error, and that is a structural defect you can act on without reading Ukrainian.

Format argument mismatch

Android arguments are positional, so they are compared by count. A default string with %1$s and %2$d against a translation carrying one argument is flagged. This is checked per quantity inside a <plurals> block, not just on flat strings.

Same as default, and guarded words

A value identical to the default values/ folder usually means it was copied and never translated. Terms you mark as guarded are flagged the other way, when a language changes something meant to stay fixed.

What it will not do. ICU MessageFormat validation does not apply to Android XML and is switched off for it. Android expresses plurals through the <plurals> element rather than through ICU strings, so the ICU checks you would get on an ARB or i18next project are not run here. Plural coverage is still checked, through CLDR.

Your files

The XML comes back the way you left it

StringLane edits your resource files in place. There is no export step and no intermediate spreadsheet.

  • <![CDATA[...]]> wrappers are preserved rather than unwrapped.
  • XML entities such as &amp; and &lt; are kept as entities.
  • Key order is preserved as it appears in the file.
  • <plurals> blocks keep their element structure, with one entry per quantity.

Your toolchain

Where it sits in an Android project

StringLane edits the XML files your Gradle build already merges. It is not a Gradle plugin, it does not run in your build, and it does not need to know about your module layout or your flavors. Resource merging behaves exactly as it did.

What it adds is timing. Your build reports on translation problems at build time and your release process reports them later still, or not at all. A <plurals> block short two categories for Ukrainian shows up here while you are editing the file, next to the other five languages that have the same gap.

FAQ

Android XML questions

Does it handle <plurals> properly?
Yes. Each <plurals> element loads as a multi-value entry with one row per quantity, and every language is checked against the quantities CLDR says it needs rather than against whatever the default folder happens to have.
Will it strip my CDATA blocks or unescape my entities?
No. <![CDATA[...]]> wrappers are preserved and XML entities stay escaped. StringLane writes back the values you edited and leaves the surrounding file structure alone.
Which values folders does it find?
Any path matching res/values*/strings.xml, so values/, values-de/, values-fr/ and the rest load as locale columns in one table.
Is this a Gradle plugin or something that runs in CI?
Neither. It is a desktop editor that reads and writes the files on disk. Your build is untouched, and nothing about your project changes if you stop using StringLane.
Do I need an account or an internet connection?
No account, and no connection unless you choose to use AI fill with your own API key. The 14-day trial does not ask for an email address.

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.