SiteVerdict — Translation QA & AI Translator (JSON, PO, XLIFF)
Pricing
Pay per event
SiteVerdict — Translation QA & AI Translator (JSON, PO, XLIFF)
QA your i18n files before release: missing keys, broken placeholders, ICU plurals, HTML tags, length limits, glossary, tone. JSON, PO, XLIFF, CSV. No key needed for checks; translate gaps with your own DeepL, OpenAI or Anthropic key. HTML report and CI gate.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Aman Thakran
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Features
Share
Translation QA & AI Translator: catch broken translations before your users do
Point it at your localisation files and get every problem that would break or embarrass a release: missing keys, broken {placeholders}, invalid ICU plurals, lost HTML tags, strings too long for the button, glossary and brand-term violations, and the wrong du/Sie or tu/vous. Supports JSON (nested, flat, ARB), gettext PO, XLIFF 1.2/2.0 and CSV.
- No API key needed for QA. All checks are deterministic.
- Optional, on your own key: fill missing strings with DeepL, OpenAI or Anthropic (placeholders are protected and verified), and get an AI review (OpenAI, Anthropic, Google Gemini or Mistral) that flags mistranslations and tone problems with suggested fixes. Translation and AI review need your own provider API key; without a key only the deterministic checks run.
Who it is for
- Developers / CI: run before every release and set
failOnErrorsto block a deploy that would shipHallo {nom}. - Localisation managers: one HTML report across all languages and files, with a quality score per locale.
- Agencies and freelancers: QA vendor deliveries against your glossary and style guide in minutes.
Before and after (from the default example input)
| Severity | Locale | Key | Check | Problem |
|---|---|---|---|---|
| error | de | greeting | placeholder_mismatch | Missing: {name}. Unexpected: {nom}. |
| error | de | cart.items | icu_plural_other | Plural "{count}" has no "other" branch. |
| error | de | cart.checkout | max_length | Translation is 28 characters; limit is 20. |
| error | de | cart.title | forbidden_term | Forbidden term "Einkaufswagen" used (use "Warenkorb"). |
| warning | de | cart.title | tone_formality | Informal address found; the de style guide asks for formal. |
| warning | de | help | url_mismatch | https://example.com/help changed or missing. |
| error | de | save | missing_translation | No translation for this key. |
| warning | de | old | extra_key | Key exists in the translation but not in the source. |
Output: one dataset row per issue, plus REPORT.html (summary per file and locale with scores, then all issues), ISSUES.csv and an OUTPUT JSON summary. In translate modes you also get the updated files (translated-<locale>-<file>) in their original format.
Checks
| Check | What it catches |
|---|---|
missing_translation, empty_translation, extra_key | Gaps and obsolete keys between source and target |
untranslated | Target identical to source (with an allowlist for brand names) |
placeholder_mismatch | {name}, {{name}}, %s, %1$d, %(name)s, ${name} lost, added or renamed |
icu_syntax, icu_plural_other, icu_plural_categories | Broken ICU braces; plural branches missing for the target language (CLDR rules, e.g. Polish needs one/few/many/other) |
markup_mismatch | HTML/XML tags lost or added |
max_length, length_ratio | Hard limits (rules by key pattern, XLIFF maxwidth) and "too long for UI" warnings |
whitespace, newlines, end_punctuation, double_space | Formatting drift |
number_mismatch, url_mismatch | Changed numbers, links or e-mail addresses |
glossary_term, forbidden_term, do_not_translate | Terminology and brand rules per locale |
tone_formality | du/Sie, tu/vous, tú/usted, tu/Lei, jij/u, tu/você (heuristic) |
inconsistent | The same source translated differently in one locale |
needs_review | PO fuzzy and XLIFF needs-review states |
ai_review (optional) | Mistranslation, omission, tone and terminology, with a suggestion |
Pricing
Pay per event:
string-checked: $0.0002 per string per locale checked (deterministic QA)string-translated: $0.001 per string translated with your key (successful translations only)string-ai-reviewed: $0.0005 per string reviewed by your LLM
Examples:
- 2,000 strings × 5 languages QA = $2.00
- filling 300 missing strings = $0.30
- AI review of 1,000 strings = $0.50
Your DeepL, OpenAI, Anthropic, Google or Mistral usage is billed by them on your key.
Maximum total charge: the Actor reserves money for every string before processing it (check + translation + AI review, as needed). Strings that would not fit in your run's maximum total charge are not processed and not charged: the dataset gets a not_processed row per file/locale and the run's status message ends with "N strings not processed (max total charge reached)". A budget that is used up exactly is not reported as stopped.
FAQ
How do I give it my files? Use public or pre-signed URLs, paste the content, or upload to an Apify key-value store and reference store/key. For JSON, mark the source file with "role": "source" or name it after the source locale (en.json).
Will machine translation break my placeholders? We swap placeholders and tags for protected tokens before translating, restore them afterwards, and reject any translation that lost one. Rejected strings keep their old value and are reported as translation_failed.
How reliable is the tone check? It is a pronoun-based heuristic, good for spotting the wrong form of address. Use aiReview for nuanced style feedback.
Limits
- Up to 100 files and 100,000 strings per run, 20 MB per file.
- XLIFF inline markup is kept verbatim. Exotic XLIFF extensions are passed through but not interpreted.
- Tone checks cover de, fr, es, it, nl and pt only.
Sources & compliance
- Works only on files you supply. No web scraping. Files from URLs are fetched with an SSRF guard (private and internal addresses blocked) and a size cap.
- Plural rules come from your runtime's CLDR data (Intl.PluralRules).
- Providers: DeepL (terms), OpenAI (terms), Anthropic (terms), Google Gemini (terms) and Mistral (terms) process strings under your account and key. Terms links checked 11 Oct 2026 (Google/Mistral links added 3 Nov 2026, not re-reviewed). DeepL Free keys (
…:fx) use the free endpoint automatically. - Hosts called: only the provider you choose —
api.deepl.com/api-free.deepl.com(DeepL),api.openai.com,api.anthropic.com,generativelanguage.googleapis.com(Gemini, review only) andapi.mistral.ai(review only) — plus the file URLs you supply. With no translation mode andaiReviewoff (no key), no provider is called. - Secrets: API keys are secret inputs, sent only to the chosen provider and scrubbed from logs, errors and output.
- Personal data: UI strings rarely contain personal data. Don't put customer data into translation files you send to third-party MT providers. Not legal advice.
Built by SiteVerdict (BharatFare Travel and Technologies Ltd, UK). Contact: hello@webrevenuescan.com.