translation-qa-reviewer
Paste into Claude Code, Claude.ai, the desktop app, or the browser extension — ⌘/Ctrl+V. ✓ Copied. Switch to Claude and paste — ⌘/Ctrl+V.
Translation QA Reviewer
Review a translated locale file against the English source and produce a structured QA report. Catches the issues that automated QA tools miss: tone drift, brand terminology violations, culturally inappropriate phrasing, and CMS-specific character overflow — not just missing keys and broken placeholders.
Usage
/translation-qa-reviewer <translated file>
--source <source-file>
[--locale <locale-code>]
[--cms sitecore|optimizely|umbraco|headless]
[--glossary <glossary-file>]
[--strict]
Examples:
/translation-qa-reviewer src/locales/fr-CA.json --source src/locales/en.json --locale fr-CA/translation-qa-reviewer translations/de.xliff --source en.xliff --cms sitecore --glossary docs/glossary-de.md/translation-qa-reviewer content/fr/ --source content/en/ --locale fr-FR --strict
Phase 1 — File intake and structural diff
Read both the source and translated files. Detect format (JSON, XLIFF 1.2/2.0, Sitecore XML, Optimizely XML, Umbraco JSON, Markdown).
Structural checks (fail-fast)
Run these before linguistic checks:
| Check | Severity | Description |
|---|---|---|
| Missing keys | Critical | Keys present in source but absent from translated file |
| Extra keys | Warning | Keys in translated file not present in source — stale strings |
| Empty values | Critical | Key present but value is empty string or whitespace only |
| Source-identical values | High | Value in translated file is byte-for-byte the same as English source — likely untranslated |
| Broken placeholders | Critical | Placeholder token present in source is missing or mutated in translation |
| ICU pattern corruption | Critical | ICU {count, plural, ...} structure malformed in translation |
| Embedded HTML corruption | High | HTML tags present in source are missing, unclosed, or reordered in translation |
Output a Structural QA Summary before proceeding to linguistic review.
Phase 2 — Placeholder integrity check
For every string containing a placeholder, verify:
- The same number of placeholders appear in the translated string.
- The placeholder tokens are identical (same casing, same braces/sigil style).
- Named placeholders (
{{username}},{name}) retain their exact names — no translation. - Positional placeholders (
%1$s,{0}) retain their positions.
Report format for placeholder violations:
[CRITICAL] Placeholder corruption
Key: auth.login.welcome
Source: "Welcome back, {{username}}!"
Translation: "Bienvenue, {{nom}}!"
Issue: Placeholder renamed — {{username}} → {{nom}}. Runtime will fail.
Fix: Restore placeholder to {{username}}.
Phase 3 — Tone and register review
For each string flagged as linguistically reviewable (i.e. not a placeholder-only string, not a numeric/date token), assess:
Register consistency
- Does the translation use a consistent level of formality throughout?
- For European languages with formal/informal distinctions (de: Sie/du; fr: vous/tu; es: usted/tú): flag any inconsistencies within the file.
- Flag any switch between formal and informal register mid-file.
Brand tone alignment
- Are CTAs still imperative-verb-led in the target language?
- Does the translation avoid weasel words that were excluded in the source?
- Are marketing superlatives handled appropriately (some locales amplify; others understate)?
Naturalness
- Flag translations that read as literal word-for-word from English (machine translation artifacts):
- Unnatural word order
- False cognates used incorrectly
- Untranslated idiomatic expressions ("think outside the box" left as-is)
- Severity: Medium — readable but sounds foreign to a native speaker.
Phase 4 — Terminology consistency
If a --glossary file is supplied, check every glossary term:
- Brand name: must not be translated (e.g. "RBA" remains "RBA").
- Product name: check for consistent usage — do not translate if the brief says "keep English".
- Technical terms: verify the glossary's approved translation is used consistently.
If no glossary is supplied, check for internal consistency:
- The same English source term should always be translated the same way within the file.
- Flag cases where the same English source string has two different translations.
Report format:
[Medium] Terminology inconsistency
Term: "dashboard"
Occurrences: 8
Translations found: "tableau de bord" (6×), "panneau de contrôle" (2×)
Fix: Standardize to "tableau de bord" (preferred in fr-CA SaaS context).
Phase 5 — Character limit check
If --cms is set, check every translated string against the CMS field limits from reference.md.
For strings that exceed the limit:
- Report the key, the translated string, the character count, and the limit.
- Suggest a shortened alternative if the overflow is minor (< 20% over limit).
For strings approaching the limit (> 80% used):
- Flag as Warning with the remaining headroom.
Report format:
[High] Character overflow
Key: nav.primary.solutions.label
CMS field: Sitecore Single-line Text (256 char limit)
Translated: "Nos solutions numériques pour l'expérience client" (50 chars)
Limit: 30 chars (navigation label)
Headroom: −20 chars
Fix: Shorten to "Solutions numériques" (20 chars) or "Nos solutions" (13 chars).
Phase 6 — RTL / bidi review
If locale is ar or he, flag all strings that may affect layout:
- Navigation labels (menu items, breadcrumbs)
- CTA labels (button text)
- Form labels and placeholders
- Toast and notification messages
- Any string containing digits (digits may render LTR within RTL context — verify with UI)
Report format:
[Warning] RTL layout review required
Key: nav.primary.home.label
Value: "الرئيسية"
Note: Navigation label — verify right-to-left rendering in the target component.
Digits in adjacent strings may require bidi isolation (unicode-bidi: isolate).
Phase 7 — QA report output
Produce a structured QA report in Markdown.
# Translation QA Report
**File:** [translated file path]
**Source:** [source file path]
**Locale:** [locale code]
**CMS:** [cms name]
**Glossary:** [file path or "none"]
**Date:** [YYYY-MM-DD]
**Reviewer:** translation-qa-reviewer skill v0.1.0
---
## Summary
| Severity | Count |
|---|---|
| Critical | [n] |
| High | [n] |
| Medium | [n] |
| Warning | [n] |
| Pass | [n] |
**Overall status:** [FAIL — critical issues present | REVIEW — no criticals, high/medium issues |
PASS — warnings only | CLEAN — no issues]
---
## Findings
### Critical
#### [FINDING-001] Placeholder corruption
...
### High
#### [FINDING-002] Character overflow
...
### Medium
...
### Warnings
...
---
## Passed checks
- Structural diff: all keys present
- No empty values
- ...
Severity definitions
| Severity | Definition | Blocks release? |
|---|---|---|
| Critical | Will cause a runtime error, broken UI, or complete loss of meaning | Yes |
| High | Incorrect output visible to users; character overflow breaks layout | Yes (recommend) |
| Medium | Suboptimal translation — sounds unnatural, inconsistent terminology | Recommend fix before release |
| Warning | Informational — layout review needed, approaching character limit | Log; fix in next iteration |
| Pass | No issue found | — |
--strict mode: escalates all Medium findings to High and all Warnings to Medium.
Reference
See reference.md in this skill folder for:
- CMS character limit table by field type
- Common machine translation artifact patterns by language
- Glossary template
Technical details
- Plugin
- copy-localization-generator
- Author
- Dakota Smith
- Skill name
translation-qa-reviewer- Maturity
- experimental
- Security review
- No security review
- Owners
-
- design
- strategy
- Argument hint
<translated file> --source <source-file> [--locale <locale-code>] [--cms sitecore|optimizely|umbraco|headless] [--glossary <glossary-file>] [--strict]- Allowed tools
-
ReadWriteEditBash(find *)Bash(ls *)Bash(cat *)Bash(grep *)Bash(diff *)
- Source
plugins/copy-localization-generator/skills/translation-qa-reviewer/SKILL.md
Edit this skill on GitHub — opens GitHub's web editor. No git knowledge needed.