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

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 withzero,one,two,few,many,other- Placeholders
%s,%d, and positional forms such as%1$s- Preserved
<![CDATA[...]]>wrappers and XML entities such as&- Detected by
- Any
res/values*/strings.xmlpath - 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
&and<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?
<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?
<![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?
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?
Do I need an account or an internet connection?
Price
One purchase, no subscription
$49once
Early-adopter price. Full price after launch is $79.
- 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.
Docs
Read before you download
Format-specific editing
What changes per format, including Android strings.xml.
Reading validation badges
What each badge means and how to clear it.
Fixing placeholder mismatches
Reading the badge tooltip and restoring a dropped %1$s.
Adding a language
Adding a new values-* folder from a preset.
Shipping an Android app and a web front end from one repo is common. Both formats open in the same window, with the same missing-key view across them.
i18next JSON editor