i18n readiness check
The check reads your project on your machine and reports, per target market, what is done, what is broken and what has not been verified. Source code never leaves the machine. Only the report is uploaded, and only if you pass --upload.
Run
npx threefold check . --markets es-MX,de-DE
npx threefold check ./app --markets es-AR,ja-JP --json > report.json
npx threefold check . --markets de-DE --runtime web --url http://localhost:3000
| Option | Meaning |
|---|---|
[path] | Project root. Default: the current directory. |
--markets | Target locales, comma-separated |
--runtime web --url <url> | Run the web pseudo-locale runner against a running app (Playwright) |
--json | Print the JSON report instead of Markdown |
--upload | Send the report (not your code) to your workspace with the CLI's saved login or key; prints the stored report's URL |
Exit code 1 means the verdict is incomplete; 0 means complete or complete_static.
The platforms are detected from the project: iOS (String Catalogs, .strings, .stringsdict, InfoPlist.strings), Android (res/values-*, locales_config.xml), web (i18next, next-intl, FormatJS JSON, JSX), Flutter (.arb, l10n.yaml), React Native with Expo, and store metadata in fastlane folders or a JSON file.
The report
checks: every applicable check withpass,fail,warn,unverifiedornot_applicable, evidence (file, line, snippet) and a fix hint.verified_coverage: the share of applicable automated checks that actually ran. It is not a pass rate.verdict, overall and per target market:complete: every applicable static and runtime check passed and nothing required is unverified;complete_static: static checks all pass, runtime checks did not run;incomplete: at least one check failed.
human_review: market legal items and anything else that needs a person. They are listed next to the verdict and never counted as done.
There is no blended readiness percentage. Checks whose measured precision or recall is below the bar are labelled (beta) in the report.
Checks
37 checks. Each declares its platform, severity (blocker, error, warn or review), how it is verified (static, runtime or human) and its source.
| Platform | Checks |
|---|---|
| Core | CHK-CORE-001 hardcoded UI strings · CHK-CORE-002 missing keys per locale · CHK-CORE-003 orphaned keys · CHK-CORE-004 placeholder and ICU token mismatch · CHK-CORE-005 CLDR plural categories · CHK-CORE-008 number and currency formatting · CHK-CORE-009 date and time formatting · CHK-CORE-010 untranslated or wrong-language copy · CHK-VAR-SPANISH Spanish regional variants |
| iOS | CHK-IOS-001 String Catalog state · CHK-IOS-002 .strings and .stringsdict syntax · CHK-IOS-003 InfoPlist.strings permission strings · CHK-IOS-004 CFBundleDevelopmentRegion · CHK-RUN-IOS01 double-length pseudolanguage (runtime) |
| Android | CHK-AND-001 locale qualifier directories · CHK-AND-002 missing translations · CHK-AND-003 plurals quantities · CHK-AND-004 per-app language preferences · CHK-RUN-AND01 en-XA pseudolocale (runtime) |
| Web | CHK-WEB-001 JSON key parity · CHK-WEB-002 literal JSX strings · CHK-WEB-003 html lang · CHK-WEB-004 hreflang alternates · CHK-RUN-WEB01 pseudo-locale layout and overflow (runtime) |
| Flutter | CHK-FLT-001 ARB parity and placeholder types · CHK-FLT-002 l10n.yaml and delegates |
| React Native | CHK-RN-001 Expo and native locale sync |
| Store | CHK-STORE-LIMITS App Store and Google Play field limits · CHK-STORE-SCREENSHOTS localised screenshot sets |
| Legal (human review) | CHK-LEG-DE01 Impressum · CHK-LEG-DE02 withdrawal right · CHK-LEG-DE03 order-button wording · CHK-LEG-DE04 German privacy policy · CHK-LEG-JP01 特定商取引法に基づく表記 · CHK-LEG-ES01 Spanish consumer terms · CHK-LEG-MX01 PROFECO disclosures · CHK-LEG-AR01 Botón de arrepentimiento |
Store limits checked include App Store name 30 characters, subtitle 30, keywords 100 bytes, promotional text 170, description 4,000; Google Play title 30, short description 80, full description 4,000.
Runtime checks for iOS and Android build the commands and parse the results, but without a simulator or emulator they report unverified.
The full catalogue, with sources, is served by the API: GET https://api.threefold.eco/api/i18n/rules (filter with platform and market), or via the MCP check tool with what: "repo".
Benchmark
The checks are measured against four open-source projects (pinned commits of Next-js-Boilerplate, IceCubesApp, Fossify Gallery and flutter/gallery) and copies with hand-inserted defects. A check needs at least 90% precision and 90% recall on at least five verified positives to ship as production. In the run of 7 November 2026, 19 of the 27 measured checks met the bar and 8 are labelled beta; the iOS and Android runtime checks were not measured. See Translated isn't localised for the details.
In CI
The threefold repository includes a GitHub Action (action/) that runs the check on pull requests, posts the report as a single comment it keeps up to date, and fails the job on incomplete. Inputs: path, markets, runtime, url, fail-on-incomplete (default true), github-token, upload. Outputs: verdict, verified-coverage.
With a coding agent
The localise-app skill gives an agent the loop: run the check, fix every fail, translate missing strings with the market resources, lint variants, check the store copy, re-run until the verdict is complete or complete_static, then show you the human-review list. It tells the agent never to invent pass results or claim legal compliance.
Coding agents run the check with npx threefold check in the project, or over MCP using the check tool with what: "repo" (docs/agent-tools.md). On the local stdio server (node mcp/server.mjs), check what: repo scans files on the machine. On the hosted server (https://api.threefold.eco/mcp), it returns the market readiness rules and criteria for the agent to apply directly to open repository files.
Stored reports
POST /api/i18n/reports stores an uploaded report for your workspace; GET /api/i18n/reports/:id reads it back.