Get Started
This guide walks you through scanning a GitHub repository and understanding your localization health report.No account required — Just paste a repo URL and scan. GitHub OAuth is optional for saving scan history.
Visit i18n.doctor
Navigate to https://i18n.doctor in your browser.You’ll see the main landing page with a repo input field.
Enter a GitHub Repository
Paste a public GitHub repository URL in one of these formats:The scanner accepts:
- Full GitHub URLs
- Short
owner/repoformat - URLs with specific branches (e.g.,
/tree/develop)
Wait for the Scan
The scanner performs the following steps automatically:If no locale files are found, you’ll see:
- Fetches repo metadata — Validates the repo exists and gets the default branch
- Retrieves the file tree — Pulls the complete directory structure via GitHub API
- Detects locale files — Searches for translation files in common patterns:
- Parses all locale files — Extracts key-value pairs from JSON, YAML, or
.pofiles - Generates the health report — Compares target locales against the source locale
Typical scan time: 5-15 seconds for repos with 10-50 locale files
Review the Health Report
Once the scan completes, you’ll see a comprehensive dashboard with:
Color coding:
Summary Cards
Four key metrics at the top:| Metric | Description |
|---|---|
| Total Keys | Number of translation keys in the source locale (e.g., en) |
| Avg Coverage | Average coverage percentage across all target locales |
| Missing Keys | Total number of keys that exist in source but not in target locales |
| Orphan Keys | Keys present in target locales but absent from source (unused) |
Repository Info
Just below the header, you’ll see badges showing:- Base path — Where locale files were found (e.g.,
locales/) - Style —
flat(e.g.,locales/en.json) ornested(e.g.,locales/en/common.json) - Source locale — The reference locale used for comparison (usually
en)
Locale Cards
Each target locale gets a card displaying:fr85% coverage
36/42 keys translated · 6 issues
- 🟢 Green (≥90%) — Excellent coverage
- 🟠 Orange (60-89%) — Needs attention
- 🔴 Red (<60%) — Critical issues
Expand Locale Details
Click Show details on any locale card to see exactly what’s wrong:Impact: Users will see English fallbacks or blank strings.Impact: Same as missing keys — no text displayed.Impact: Bloat in translation files. These keys are unused and can be safely removed.
Missing Keys
Keys that exist in the source locale but are absent from this target:Untranslated Keys
Keys that exist but have empty values:Orphan Keys
Keys present in target locale but not in source:Fix Issues with Lingo.dev (Coming Soon)
The “Fix with Lingo.dev” button will translate all missing/untranslated keys:
- Click the fix button on the report page
- Lingo.dev translates all gaps using context-aware AI
- Preview a live diff of changes
- Download a ZIP file with updated locale files
- Optionally open a GitHub PR with the fixes
Understanding the Scan Results
Example: Real Scan Output
Let’s walk through a real example. Suppose you scan a repo with this structure:French (fr) — 85% coverage
French (fr) — 85% coverage
Spanish (es) — 67% coverage
Spanish (es) — 67% coverage
German (de) — 95% coverage
German (de) — 95% coverage
Supported File Formats
The scanner automatically parses these formats:- JSON (nested)
- YAML
- PO (gettext)
app.title, app.nav.home, app.nav.aboutCommon Issues
Repository not found
Repository not found
Causes:
- Repo is private (only public repos are supported)
- Incorrect owner or repo name
- Repo was deleted or renamed
No locale files found
No locale files found
Causes:
- Locale files are in an uncommon directory (e.g.,
assets/langs/) - Files use unsupported formats (e.g.,
.xml,.properties)
- Move files to standard paths:
locales/,i18n/,public/locales/ - Convert to JSON, YAML, or
.poformat
GitHub API rate limit exceeded
GitHub API rate limit exceeded
Causes:
- Too many scans from the same IP (60/hour without auth)
- Sign in with GitHub OAuth for 5,000 requests/hour
- Wait for the rate limit to reset (shown in error message)
Source locale not detected correctly
Source locale not detected correctly
The scanner guesses the source locale using this heuristic:
- Prefer
enif present - Prefer
en-usifenis absent - Fall back to first locale alphabetically
en.json or use a nested structure like locales/en/.Next Steps
Core Features
Learn about scanning, health reports, and one-click fixes
Understanding Reports
Learn how to interpret scan results and prioritize fixes
API Reference
Integrate scans into your CI/CD pipeline with the REST API
Supported Formats
See all supported translation file formats and examples