
Localization Testing
- 108 installs
- 433 repo stars
- Updated August 4, 2026
- proffesor-for-testing/agentic-qe
localization-testing is a Claude Code skill for testing & qa.
About
localization-testing is a Claude Code skill for testing & qa. It helps solo builders move faster with AI-assisted development.
- localization-testing
- Testing & QA
- AI-coding skill
Localization Testing by the numbers
- 108 all-time installs (skills.sh)
- +3 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #974 of 2,153 Testing & QA skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/proffesor-for-testing/agentic-qe --skill localization-testingAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 108 |
|---|---|
| repo stars | ★ 433 |
| Last updated | August 4, 2026 |
| Repository | proffesor-for-testing/agentic-qe ↗ |
How do I helps with testing & qa tasks.?
Helps with testing & qa tasks.
Who is it for?
Best when you're working on testing & qa and need structured help with localization testing.
Skip if: Teams with no testing & qa needs, or anyone wanting a generic chat assistant without this specific workflow.
When should I use this skill?
When you need to helps with testing & qa tasks., or when localization-testing is a claude code skill for testing & qa.
What you get
Structured output aligned to localization-testing: localization-testing, Testing & QA.
Files
Localization & Internationalization Testing
Browser engine
Browser-driven locale checks (RTL layout diffs, language-switching flows, locale-specific screenshots) should go through the qe-browser fleet skill. Example:
vibium go "$BASE_URL?lang=ar" # Arabic, RTL
vibium wait load
node .claude/skills/qe-browser/scripts/visual-diff.js --name homepage-ar-rtl
vibium go "$BASE_URL?lang=ja" # Japanese, CJK text expansion
node .claude/skills/qe-browser/scripts/visual-diff.js --name homepage-jaSee .claude/skills/qe-browser/SKILL.md for the full reference.
<default_to_action> When testing multi-language/region support: 1. VERIFY translation coverage (all strings translated) 2. TEST locale-specific formats (date, time, currency, numbers) 3. VALIDATE RTL layout (Arabic, Hebrew) 4. CHECK character encoding (UTF-8, unicode) 5. CONFIRM cultural appropriateness (icons, colors, content)
Quick i18n Checklist:
- All user-facing strings externalized
- No hardcoded text in code
- Date/time/currency formatted per locale
- RTL languages flip layout correctly
- Unicode characters display properly
Critical Success Factors:
- Don't hardcode strings - externalize everything
- Test with real speakers, not just translation files
- RTL requires mirrored UI layout
</default_to_action>
Quick Reference Card
When to Use
- Launching in new markets
- Adding language support
- Before international releases
- After UI changes
---
Translation Coverage Testing
test('all strings are translated', () => {
const enKeys = Object.keys(translations.en);
const frKeys = Object.keys(translations.fr);
const esKeys = Object.keys(translations.es);
// All locales have same keys
expect(frKeys).toEqual(enKeys);
expect(esKeys).toEqual(enKeys);
});
test('no missing translation placeholders', async ({ page }) => {
await page.goto('/?lang=fr');
const text = await page.textContent('body');
// Should not see placeholder keys
expect(text).not.toContain('translation.missing');
expect(text).not.toMatch(/\{\{.*\}\}/); // {{key}} format
});---
Date/Time/Currency Formats
test('date formats by locale', () => {
const date = new Date('2025-10-24');
expect(formatDate(date, 'en-US')).toBe('10/24/2025');
expect(formatDate(date, 'en-GB')).toBe('24/10/2025');
expect(formatDate(date, 'ja-JP')).toBe('2025/10/24');
});
test('currency formats by locale', () => {
const amount = 1234.56;
expect(formatCurrency(amount, 'en-US', 'USD')).toBe('$1,234.56');
expect(formatCurrency(amount, 'de-DE', 'EUR')).toBe('1.234,56 €');
expect(formatCurrency(amount, 'ja-JP', 'JPY')).toBe('¥1,235');
});---
RTL (Right-to-Left) Testing
test('layout flips for RTL languages', async ({ page }) => {
await page.goto('/?lang=ar'); // Arabic
const dir = await page.locator('html').getAttribute('dir');
expect(dir).toBe('rtl');
// Navigation should be on right
const nav = await page.locator('nav');
const styles = await nav.evaluate(el =>
window.getComputedStyle(el)
);
expect(styles.direction).toBe('rtl');
});
test('icons/images appropriate for RTL', async ({ page }) => {
await page.goto('/?lang=he'); // Hebrew
// Back arrow should point right in RTL
const backIcon = await page.locator('.back-icon');
expect(await backIcon.getAttribute('class')).toContain('rtl-flipped');
});---
Unicode Character Support
test('supports unicode characters', async ({ page }) => {
// Japanese
await page.fill('#name', '山田太郎');
await page.click('#submit');
const saved = await db.users.findOne({ /* ... */ });
expect(saved.name).toBe('山田太郎');
// Arabic
await page.fill('#name', 'محمد');
// Emoji
await page.fill('#bio', '👋🌍');
expect(saved.bio).toBe('👋🌍');
});---
Agent-Driven Localization Testing
// Comprehensive localization validation
await Task("Localization Testing", {
url: 'https://example.com',
locales: ['en-US', 'fr-FR', 'de-DE', 'ja-JP', 'ar-SA'],
checks: ['translations', 'formats', 'rtl', 'unicode'],
detectHardcodedStrings: true
}, "qe-test-generator");
// Returns:
// {
// locales: 5,
// missingTranslations: 3,
// formatIssues: 1,
// rtlIssues: 0,
// hardcodedStrings: ['button.submit', 'header.title']
// }---
Agent Coordination Hints
Memory Namespace
aqe/localization-testing/
├── translations/* - Translation coverage
├── formats/* - Locale-specific formats
├── rtl-validation/* - RTL layout checks
└── unicode/* - Character encoding testsFleet Coordination
const l10nFleet = await FleetManager.coordinate({
strategy: 'localization-testing',
agents: [
'qe-test-generator', // Generate l10n tests
'qe-test-executor', // Execute across locales
'qe-visual-tester' // RTL visual validation
],
topology: 'parallel'
});---
Related Skills
- accessibility-testing - Language accessibility
- compatibility-testing - Cross-platform i18n
- visual-testing-advanced - RTL visual regression
---
Remember
With Agents: Agents validate translation coverage, detect hardcoded strings, test locale-specific formatting, and verify RTL layouts automatically across all supported languages.
# =============================================================================
# AQE Skill Evaluation Test Suite: Localization Testing v1.0.0
# =============================================================================
#
# Comprehensive evaluation suite for the localization-testing skill.
# Tests translation coverage, locale-specific formats, RTL validation,
# Unicode support, and hardcoded string detection across multiple languages.
#
# Schema: .claude/skills/.validation/schemas/skill-eval.schema.json
# Validator: .claude/skills/localization-testing/scripts/validate-config.json
#
# Coverage:
# - Translation coverage validation
# - Locale format testing (date, time, currency)
# - Right-to-left (RTL) language support
# - Unicode character handling
# - Hardcoded string detection
#
# =============================================================================
skill: localization-testing
version: 1.0.0
description: >
Comprehensive evaluation suite for the localization-testing skill.
Tests translation coverage metrics, locale-specific formatting validation,
RTL layout support, Unicode character handling, and detection of hardcoded
strings that should be externalized.
# =============================================================================
# Multi-Model Configuration
# =============================================================================
models_to_test:
- claude-sonnet-4-6 # Primary (high accuracy expected)
- claude-haiku-4-5 # Fast model (minimum quality floor)
# =============================================================================
# MCP Integration Configuration
# =============================================================================
mcp_integration:
enabled: true
namespace: skill-validation
query_patterns: true
track_outcomes: true
store_patterns: true
share_learning: true
update_quality_gate: true
target_agents:
- qe-learning-coordinator
- qe-queen-coordinator
- qe-test-generator
# =============================================================================
# ReasoningBank Learning Configuration
# =============================================================================
learning:
store_success_patterns: true
store_failure_patterns: true
pattern_ttl_days: 90
min_confidence_to_store: 0.7
cross_model_comparison: true
# =============================================================================
# Result Format Configuration
# =============================================================================
result_format:
json_output: true
markdown_report: true
include_raw_output: false
include_timing: true
include_token_usage: true
# =============================================================================
# Environment Setup
# =============================================================================
setup:
required_tools:
- jq # JSON parsing for validation results
environment_variables:
LOCALIZATION_ENABLED: "true"
SUPPORTED_LOCALES: "en-US,fr-FR,de-DE,ja-JP,ar-SA,he-IL"
TRANSLATION_COVERAGE_MIN: "90"
# =============================================================================
# TEST CASES
# =============================================================================
test_cases:
# ---------------------------------------------------------------------------
# CATEGORY: Translation Coverage Testing
# ---------------------------------------------------------------------------
- id: tc001_translation_coverage_complete
description: "Detect complete translation coverage across all locales"
category: translation
priority: critical
input:
locales:
- en-US
- fr-FR
- de-DE
translations:
en-US:
home_title: "Welcome"
home_subtitle: "Get started"
button_submit: "Submit"
button_cancel: "Cancel"
fr-FR:
home_title: "Bienvenue"
home_subtitle: "Commencer"
button_submit: "Soumettre"
button_cancel: "Annuler"
de-DE:
home_title: "Willkommen"
home_subtitle: "Erste Schritte"
button_submit: "Senden"
button_cancel: "Abbrechen"
context:
type: json
framework: i18n
expected_output:
must_contain:
- "coverage"
- "100"
- "complete"
must_not_contain:
- "missing"
- "incomplete"
severity_classification: info
finding_count:
max: 1
validation:
schema_check: true
keyword_match_threshold: 0.8
reasoning_quality_min: 0.75
timeout_ms: 30000
- id: tc002_translation_coverage_incomplete
description: "Detect missing translations in specific locales"
category: translation
priority: critical
input:
locales:
- en-US
- fr-FR
- de-DE
translations:
en-US:
home_title: "Welcome"
home_subtitle: "Get started"
button_submit: "Submit"
settings_title: "Settings"
fr-FR:
home_title: "Bienvenue"
button_submit: "Soumettre"
de-DE:
home_title: "Willkommen"
home_subtitle: "Erste Schritte"
button_submit: "Senden"
settings_title: "Einstellungen"
context:
type: json
framework: i18n
expected_output:
must_contain:
- "missing"
- "home_subtitle"
- "button_submit"
- "french"
must_not_contain:
- "100% coverage"
severity_classification: high
finding_count:
min: 1
validation:
schema_check: true
keyword_match_threshold: 0.8
reasoning_quality_min: 0.75
# ---------------------------------------------------------------------------
# CATEGORY: Locale Format Validation
# ---------------------------------------------------------------------------
- id: tc003_date_format_validation
description: "Validate locale-specific date formats (en-US, fr-FR, ja-JP)"
category: format
priority: critical
input:
samples:
- locale: en-US
expected: "10/24/2025"
actual: "10/24/2025"
- locale: fr-FR
expected: "24/10/2025"
actual: "24/10/2025"
- locale: ja-JP
expected: "2025/10/24"
actual: "2025/10/24"
context:
language: javascript
date: "2025-10-24"
expected_output:
must_contain:
- "date format"
- "locale-specific"
- "correct"
must_not_contain:
- "incorrect format"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.7
- id: tc004_currency_format_locale_specific
description: "Detect locale-specific currency formatting differences"
category: format
priority: high
input:
samples:
- locale: en-US
currency: USD
amount: 1234.56
expected: "$1,234.56"
actual: "$1,234.56"
- locale: de-DE
currency: EUR
amount: 1234.56
expected: "1.234,56 €"
actual: "1,234.56 €" # Wrong format
context:
language: javascript
expected_output:
must_contain:
- "currency"
- "format"
- "incorrect"
must_match_regex:
- "de-DE|EUR"
severity_classification: medium
validation:
schema_check: true
keyword_match_threshold: 0.7
# ---------------------------------------------------------------------------
# CATEGORY: RTL Language Support
# ---------------------------------------------------------------------------
- id: tc005_rtl_layout_support
description: "Validate right-to-left (RTL) language layout mirroring"
category: rtl
priority: critical
input:
html: |
<html>
<body>
<nav>Navigation</nav>
<main>Content</main>
<sidebar>Sidebar</sidebar>
</body>
</html>
locale: ar-SA
context:
type: html
language: arabic
expected_output:
must_contain:
- "rtl"
- "right-to-left"
- "direction"
- "mirrored"
must_not_contain:
- "ltr"
severity_classification: critical
validation:
schema_check: true
keyword_match_threshold: 0.8
- id: tc006_rtl_icon_mirroring
description: "Verify that directional icons are mirrored for RTL languages"
category: rtl
priority: high
input:
icons:
- name: "back-arrow"
direction: "left"
required_for_rtl: true
- name: "forward-arrow"
direction: "right"
required_for_rtl: true
locale: he-IL
context:
type: ui
language: hebrew
expected_output:
must_contain:
- "mirrored"
- "arrow"
- "icon"
must_not_contain:
- "no mirroring"
severity_classification: medium
validation:
schema_check: true
keyword_match_threshold: 0.7
# ---------------------------------------------------------------------------
# CATEGORY: Unicode Support
# ---------------------------------------------------------------------------
- id: tc007_unicode_cjk_characters
description: "Validate handling of CJK (Chinese, Japanese, Korean) characters"
category: unicode
priority: critical
input:
samples:
- text: "日本語テスト"
language: ja-JP
description: "Japanese text"
- text: "中文测试"
language: zh-CN
description: "Chinese text"
- text: "한국어 테스트"
language: ko-KR
description: "Korean text"
context:
encoding: UTF-8
type: text
expected_output:
must_contain:
- "unicode"
- "supported"
- "CJK"
must_not_contain:
- "encoding error"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.7
- id: tc008_unicode_emoji_support
description: "Verify emoji and extended Unicode character support"
category: unicode
priority: high
input:
samples:
- text: "Hello 🌍!"
expected_display: true
- text: "Task ✓ Complete"
expected_display: true
- text: "Alert ⚠️ Warning"
expected_display: true
context:
encoding: UTF-8
type: text
expected_output:
must_contain:
- "emoji"
- "supported"
must_not_contain:
- "not supported"
severity_classification: low
validation:
schema_check: true
keyword_match_threshold: 0.6
# ---------------------------------------------------------------------------
# CATEGORY: Hardcoded String Detection
# ---------------------------------------------------------------------------
- id: tc009_hardcoded_strings_in_code
description: "Detect hardcoded user-facing strings that should be externalized"
category: hardcoded
priority: critical
input:
code: |
function renderPage() {
const title = "Welcome to our app";
const subtitle = "Get started today";
const button = "Click me";
return {
title: title,
subtitle: subtitle,
button: button
};
}
context:
language: javascript
framework: react
expected_output:
must_contain:
- "hardcoded"
- "Welcome"
- "externalize"
- "translation key"
must_not_contain:
- "no issues"
severity_classification: high
finding_count:
min: 3
validation:
schema_check: true
keyword_match_threshold: 0.8
reasoning_quality_min: 0.75
- id: tc010_no_hardcoded_strings
description: "Verify code with proper i18n patterns is not flagged"
category: hardcoded
priority: high
input:
code: |
import { useTranslation } from 'react-i18next';
function HomePage() {
const { t } = useTranslation();
return {
title: t('home.title'),
subtitle: t('home.subtitle'),
button: t('actions.submit')
};
}
context:
language: javascript
framework: react
i18n_library: react-i18next
expected_output:
must_contain:
- "proper"
- "i18n"
- "externalized"
must_not_contain:
- "hardcoded"
- "critical"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.7
allow_partial: true
# ---------------------------------------------------------------------------
# CATEGORY: Cultural Appropriateness
# ---------------------------------------------------------------------------
- id: tc011_cultural_icons_appropriateness
description: "Detect potentially culturally inappropriate icons or colors"
category: cultural
priority: high
input:
icons:
- name: "hand-gesture"
description: "OK sign"
locale: ar-SA
issue: "Offensive in some Arabic cultures"
- name: "clock"
description: "Time indicator"
locale: universal
issue: "None"
colors:
- color: "white"
locale: western
issue: "Wedding color"
- color: "white"
locale: asian
issue: "Mourning color"
context:
type: ui
market: global
expected_output:
must_contain:
- "cultural"
- "context-dependent"
must_not_contain: []
severity_classification: medium
validation:
schema_check: true
keyword_match_threshold: 0.6
# =============================================================================
# SUCCESS CRITERIA
# =============================================================================
success_criteria:
pass_rate: 0.85
critical_pass_rate: 1.0
avg_reasoning_quality: 0.75
max_execution_time_ms: 300000
cross_model_variance: 0.15
# =============================================================================
# METADATA
# =============================================================================
metadata:
author: "qe-test-generator"
created: "2026-02-02"
last_updated: "2026-02-02"
coverage_target: >
Localization testing including translation coverage validation,
locale-specific formatting (date, time, currency), RTL language support,
Unicode character handling, hardcoded string detection, and cultural
appropriateness. 11 test cases covering 6 locales (en-US, fr-FR, de-DE,
ja-JP, ar-SA, he-IL) with 85% pass rate requirement.
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://agentic-qe.dev/schemas/localization-testing-output.json",
"title": "AQE Localization Testing Skill Output Schema",
"description": "Schema for i18n/l10n testing output including translation coverage, locale formats, RTL validation, and Unicode support.",
"type": "object",
"required": ["skillName", "version", "timestamp", "status", "trustTier", "output"],
"properties": {
"skillName": {
"type": "string",
"const": "localization-testing",
"description": "Skill identifier"
},
"version": {
"type": "string",
"pattern": "^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9]+)?$"
},
"timestamp": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?$"
},
"status": {
"type": "string",
"enum": ["success", "partial", "failed", "skipped"]
},
"trustTier": {
"type": "integer",
"const": 3
},
"output": {
"type": "object",
"required": ["summary", "localesCovered", "translationCoverage", "metrics"],
"properties": {
"summary": {
"type": "string",
"minLength": 10,
"maxLength": 2000
},
"score": {
"$ref": "#/$defs/localizationScore"
},
"localesCovered": {
"type": "array",
"items": {
"$ref": "#/$defs/localeEntry"
},
"minItems": 1,
"description": "Locales tested"
},
"translationCoverage": {
"$ref": "#/$defs/translationCoverage",
"description": "Translation completeness metrics"
},
"formatValidation": {
"$ref": "#/$defs/formatValidation",
"description": "Date/time/currency format validation"
},
"rtlValidation": {
"$ref": "#/$defs/rtlValidation",
"description": "Right-to-left language support"
},
"unicodeSupport": {
"$ref": "#/$defs/unicodeSupport",
"description": "Unicode character handling"
},
"findings": {
"type": "array",
"items": {
"$ref": "#/$defs/localizationFinding"
},
"maxItems": 500
},
"recommendations": {
"type": "array",
"items": {
"$ref": "#/$defs/recommendation"
},
"maxItems": 100
},
"metrics": {
"$ref": "#/$defs/localizationMetrics"
},
"hardcodedStrings": {
"type": "array",
"items": {
"$ref": "#/$defs/hardcodedString"
},
"description": "Detected hardcoded strings"
},
"artifacts": {
"type": "array",
"items": {
"$ref": "#/$defs/artifact"
},
"maxItems": 50
}
}
},
"metadata": {
"type": "object",
"properties": {
"executionTimeMs": { "type": "integer", "minimum": 0 },
"toolsUsed": {
"type": "array",
"items": { "type": "string" }
},
"agentId": { "type": "string", "pattern": "^qe-[a-z][a-z0-9-]*$" },
"targetUrl": { "type": "string" },
"baseLocale": { "type": "string", "description": "Base locale (e.g., en-US)" }
}
},
"validation": {
"type": "object",
"properties": {
"schemaValid": { "type": "boolean" },
"contentValid": { "type": "boolean" },
"confidence": { "type": "number", "minimum": 0, "maximum": 1 }
}
},
"learning": {
"type": "object",
"properties": {
"patternsDetected": { "type": "array", "items": { "type": "string" } },
"reward": { "type": "number", "minimum": 0, "maximum": 1 }
}
}
},
"$defs": {
"localizationScore": {
"type": "object",
"required": ["value", "max"],
"properties": {
"value": { "type": "number", "minimum": 0, "maximum": 100 },
"max": { "type": "number", "const": 100 },
"grade": { "type": "string", "pattern": "^[A-F][+-]?$" },
"i18nReadiness": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Internationalization readiness percentage"
}
}
},
"localeEntry": {
"type": "object",
"required": ["locale", "status"],
"properties": {
"locale": {
"type": "string",
"pattern": "^[a-z]{2}(-[A-Z]{2})?$",
"description": "Locale code (e.g., en-US, fr-FR)"
},
"language": { "type": "string", "description": "Language name" },
"status": { "type": "string", "enum": ["passed", "failed", "partial", "skipped"] },
"translationPercent": { "type": "number", "minimum": 0, "maximum": 100 },
"issueCount": { "type": "integer", "minimum": 0 },
"isRtl": { "type": "boolean", "description": "Is right-to-left language" }
}
},
"translationCoverage": {
"type": "object",
"properties": {
"totalStrings": { "type": "integer", "minimum": 0 },
"translatedStrings": { "type": "integer", "minimum": 0 },
"missingStrings": { "type": "integer", "minimum": 0 },
"coveragePercent": { "type": "number", "minimum": 0, "maximum": 100 },
"missingKeys": {
"type": "array",
"items": { "type": "string" },
"description": "Translation keys with missing values"
},
"placeholderIssues": {
"type": "array",
"items": { "type": "string" },
"description": "Issues with translation placeholders"
}
}
},
"formatValidation": {
"type": "object",
"properties": {
"dateFormat": {
"$ref": "#/$defs/formatCheck",
"description": "Date format validation"
},
"timeFormat": {
"$ref": "#/$defs/formatCheck",
"description": "Time format validation"
},
"currencyFormat": {
"$ref": "#/$defs/formatCheck",
"description": "Currency format validation"
},
"numberFormat": {
"$ref": "#/$defs/formatCheck",
"description": "Number format validation"
}
}
},
"formatCheck": {
"type": "object",
"properties": {
"status": { "type": "string", "enum": ["passed", "failed", "partial"] },
"localesChecked": { "type": "integer", "minimum": 0 },
"issueCount": { "type": "integer", "minimum": 0 },
"examples": {
"type": "array",
"items": {
"type": "object",
"properties": {
"locale": { "type": "string" },
"expected": { "type": "string" },
"actual": { "type": "string" }
}
}
}
}
},
"rtlValidation": {
"type": "object",
"properties": {
"supported": { "type": "boolean" },
"rtlLocales": {
"type": "array",
"items": { "type": "string" },
"description": "RTL locales tested (ar, he, fa, etc.)"
},
"layoutMirrored": { "type": "boolean" },
"textAlignmentCorrect": { "type": "boolean" },
"iconsMirrored": { "type": "boolean" },
"issues": {
"type": "array",
"items": { "type": "string" }
}
}
},
"unicodeSupport": {
"type": "object",
"properties": {
"status": { "type": "string", "enum": ["passed", "failed", "partial"] },
"encodingCorrect": { "type": "boolean" },
"scriptsSupported": {
"type": "array",
"items": { "type": "string" },
"description": "Unicode scripts supported (Latin, CJK, Arabic, etc.)"
},
"emojiSupport": { "type": "boolean" },
"issues": { "type": "array", "items": { "type": "string" } }
}
},
"localizationFinding": {
"type": "object",
"required": ["id", "title", "severity", "category"],
"properties": {
"id": { "type": "string", "pattern": "^L10N-\\d{3,6}$" },
"title": { "type": "string", "minLength": 5, "maxLength": 200 },
"description": { "type": "string", "maxLength": 2000 },
"severity": { "type": "string", "enum": ["critical", "high", "medium", "low", "info"] },
"category": {
"type": "string",
"enum": ["translation", "format", "rtl", "unicode", "hardcoded", "cultural", "layout"]
},
"affectedLocales": { "type": "array", "items": { "type": "string" } },
"location": {
"type": "object",
"properties": {
"file": { "type": "string" },
"key": { "type": "string" },
"line": { "type": "integer" }
}
},
"remediation": { "type": "string" }
}
},
"hardcodedString": {
"type": "object",
"required": ["value", "location"],
"properties": {
"value": { "type": "string" },
"location": {
"type": "object",
"properties": {
"file": { "type": "string" },
"line": { "type": "integer" },
"column": { "type": "integer" }
}
},
"suggestion": { "type": "string", "description": "Suggested translation key" }
}
},
"localizationMetrics": {
"type": "object",
"properties": {
"localesTested": { "type": "integer", "minimum": 0 },
"localesPassed": { "type": "integer", "minimum": 0 },
"localesFailed": { "type": "integer", "minimum": 0 },
"overallCoverage": { "type": "number", "minimum": 0, "maximum": 100 },
"hardcodedStringsFound": { "type": "integer", "minimum": 0 },
"rtlIssues": { "type": "integer", "minimum": 0 },
"formatIssues": { "type": "integer", "minimum": 0 },
"duration": { "type": "integer", "minimum": 0 }
}
},
"recommendation": {
"type": "object",
"required": ["id", "title", "priority"],
"properties": {
"id": { "type": "string", "pattern": "^REC-\\d{3,6}$" },
"title": { "type": "string", "minLength": 5, "maxLength": 200 },
"description": { "type": "string", "maxLength": 2000 },
"priority": { "type": "string", "enum": ["critical", "high", "medium", "low"] },
"effort": { "type": "string", "enum": ["trivial", "low", "medium", "high", "major"] }
}
},
"artifact": {
"type": "object",
"required": ["type", "path"],
"properties": {
"type": { "type": "string", "enum": ["report", "data", "screenshot", "log"] },
"path": { "type": "string", "maxLength": 500 },
"format": { "type": "string", "enum": ["json", "html", "md", "csv", "png"] }
}
}
}
}
{
"skillName": "localization-testing",
"skillVersion": "1.0.0",
"requiredTools": [
"jq"
],
"optionalTools": [
"ajv",
"jsonschema",
"python3"
],
"schemaPath": "schemas/output.json",
"requiredFields": [
"skillName",
"status",
"output",
"output.localesCovered",
"output.translationCoverage",
"output.metrics"
],
"requiredNonEmptyFields": [
"output.summary",
"output.localesCovered"
],
"mustContainTerms": [
"locale",
"translation"
],
"mustNotContainTerms": [
"TODO",
"placeholder",
"FIXME"
],
"enumValidations": {
".status": [
"success",
"partial",
"failed",
"skipped"
]
}
}
Related skills
FAQ
What does localization-testing do?
localization-testing is a Claude Code skill for testing & qa.
When should I use localization-testing?
When you need to helps with testing & qa tasks., or when localization-testing is a claude code skill for testing & qa.
What are the main capabilities?
localization-testing; Testing & QA; AI-coding skill.