i18n readiness check

Translated is not the same as ready

Run one command in your project. threefold says what is done, what is broken, and what nobody has verified yet, per target market. It runs locally, and your source code never leaves your machine.

Run it

npx threefold check . --markets es-MX,de-DE
OptionWhat it does
[path]Project root (default: the current directory)
--marketsTarget locales, comma-separated, such as es-MX,es-AR,de-DE,ja-JP
--runtime web --url http://localhost:3000Also run the web pseudo-locale check in a real browser (needs Playwright)
--jsonPrint the report as JSON instead of Markdown
--uploadSend the report (not your code) to threefold for history and sharing

The command exits with 1 when the verdict is incomplete, so it can gate a build. A GitHub Action in the threefold repository (action/) runs the same check on pull requests and keeps one comment up to date. Coding agents can follow the localise-app skill: check, fix, translate with market resources, and check again.

Over MCP, the check tool with what: "repo" scans local files on the local stdio server (node mcp/server.mjs from a checkout of the threefold repository). The hosted server at https://api.threefold.eco/mcp returns the market readiness rules and criteria for the agent to apply to local files (see Agent tools).

An honest verdict, not a percentage

No blended readiness score that hides gaps. Each check reports pass, fail, warn, unverified or not_applicable, with file, line and a fix hint.

complete

Every applicable static and runtime check passed and nothing required is unverified.

complete_static

Static checks all pass; runtime checks did not run. Without a runtime run, this is the best verdict available.

incomplete

At least one check failed.

verified_coverage is reported separately from the pass rate: the share of applicable checks that actually ran. Legal items are always listed as “still needs a person” next to the verdict. threefold reports what it found and links the law; it never says “compliant”, and the report says it is not legal advice.

What it checks

37 checks, each with its source.

AreaChecks
CoreHardcoded UI strings, missing keys per locale, orphan keys, placeholder and ICU mismatches, CLDR plural categories (CLDR data vendored), currency and number formatting by concatenation, hardcoded date patterns, untranslated or wrong-language copy
Spanish variantses-ES, es-MX and es-AR: vosotros in Latin America, voseo in Argentine calls to action, vocabulary such as móvil and celular. Warnings with the matched text, never a silent fail
iOSString Catalog states, .strings and .stringsdict syntax, localised permission strings in InfoPlist.strings, CFBundleDevelopmentRegion, and a runtime double-length pseudolanguage run
AndroidLocale qualifier directories, missing translations, plurals quantities, locales_config.xml, and a runtime en-XA pseudolocale run
WebJSON key parity (i18next, next-intl, FormatJS), literal JSX strings, <html lang>, hreflang alternates, and a runtime pseudo-locale overflow check
Flutter and React NativeARB parity and placeholder types, l10n.yaml and delegates, Expo locales against native strings
Store metadataApp Store and Google Play field limits per locale (for example name 30 characters, keywords 100 bytes, Play short description 80), and localised screenshot sets
Market legal, for a person to reviewGermany: Impressum, withdrawal right, order-button wording, privacy policy in German. Japan: 特定商取引法に基づく表記. Argentina: Botón de arrepentimiento. Spain and Mexico: consumer terms

Runtime checks for iOS and Android need a simulator or emulator; without one they report unverified rather than pass.

Measured, not asserted

The checker is benchmarked against four open-source apps (Next-js-Boilerplate, IceCubesApp, Fossify Gallery and flutter/gallery) plus copies with hand-inserted defects. A check needs 90% precision and 90% recall to ship as production; below that it is labelled beta in every report.

27
checks measured
19
met the production bar
8
beta, precision 71–83%
2
runtime checks not measured

Source: docs/research/i18n-benchmark.md, evaluated 7 November 2026. Recall was 100% for every measured check, on five seeded positives each; the two unmeasured runtime checks need a simulator or emulator. More on the benchmark.

What the report looks like

The top of a real report, from a test fixture web project in the threefold repository (test/fixtures/i18n/web/hreflang_fail), checked for es-MX and de-DE. Status icons are left out here:

## Verdict: COMPLETE_STATIC (Static Verified; Runtime Pending)

- Verified Coverage: 86% of applicable automated checks ran
- Passed Checks: 5
- Failed Checks: 0
- Warnings: 1
- Unverified (Runtime): 1
- Human Review Items: 5 still need a person

| Market | Verdict         | Coverage | Pass | Fail | Warn | Human Review |
| es-MX  | complete_static | 86%      | 5    | 0    | 1    | 1            |
| de-DE  | complete_static | 86%      | 5    | 0    | 1    | 4            |

The full report lists every human-review item with its statutory reference, then every check with its status. Full documentation.

Check before you ship

Run it locally, gate pull requests with it, or let your coding agent loop on it until the verdict is honest.