9.3 KiB
Translation Coverage Status
Last Updated: 2025-01-12
Complete translation coverage tracking for all 9 locales in the checkout form example.
Overall Coverage
| Locale | Code | Files | Coverage | Status | Priority |
|---|---|---|---|---|---|
| English (US) | en-US | ✓ | 100% | Reference | - |
| English (UK) | en-GB | ✓ | 95% | 1 missing | Medium |
| Spanish (Spain) | es-ES | ✓ | 100% | Complete | High |
| Spanish (Mexico) | es-MX | ✓ | 100% | Complete | High |
| Portuguese (Brazil) | pt-BR | ✓ | 80% | Fallback chain | Medium |
| Portuguese (Portugal) | pt-PT | ✓ | 95% | 1 missing | Medium |
| French (France) | fr-FR | ✓ | 100% | Complete | High |
| Japanese (Japan) | ja-JP | ✓ | 100% | Complete | Medium |
| Arabic (Saudi Arabia) | ar-SA | ✓ | 100% | RTL support | High |
Detailed Coverage by Key
Order Summary Section
| Key | en-US | en-GB | es-ES | es-MX | pt-BR | pt-PT | fr-FR | ja-JP | ar-SA |
|---|---|---|---|---|---|---|---|---|---|
| order-items-count | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| subtotal-amount | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| tax-amount | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| shipping-cost | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| order-total | ✓ | ✓ | ✓ | ✓ | ⟵ | ✓ | ✓ | ✓ | ✓ |
Note: pt-BR order-total missing - falls back to pt-PT ✓
Delivery Information Section
| Key | en-US | en-GB | es-ES | es-MX | pt-BR | pt-PT | fr-FR | ja-JP | ar-SA |
|---|---|---|---|---|---|---|---|---|---|
| recipient-title | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| delivery-greeting | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| preferred-delivery-date | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| delivery-instructions | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| delivery-window | ✓ | ✓ | ✓ | ✓ | ⟵ | ✓ | ✓ | ✓ | ✓ |
Note: pt-BR delivery-window missing - falls back to pt-PT ✓
Billing Address Section
| Key | en-US | en-GB | es-ES | es-MX | pt-BR | pt-PT | fr-FR | ja-JP | ar-SA |
|---|---|---|---|---|---|---|---|---|---|
| billing-country | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| payment-method | ✓ | ✓ | ✓ | ✓ | ⟵ | ✓ | ✓ | ✓ | ✓ |
Note: pt-BR payment-method missing - falls back to pt-PT ✓
Order Review Section
| Key | en-US | en-GB | es-ES | es-MX | pt-BR | pt-PT | fr-FR | ja-JP | ar-SA |
|---|---|---|---|---|---|---|---|---|---|
| agree-terms | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| agree-terms-error | ✓ | ✓ | ✓ | ✓ | ⟵ | ✓ | ✓ | ✓ | ✓ |
| agree-newsletter | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| save-address-future | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Note: pt-BR agree-terms-error missing - falls back to pt-PT ✓
Confirmation Messages Section
| Key | en-US | en-GB | es-ES | es-MX | pt-BR | pt-PT | fr-FR | ja-JP | ar-SA |
|---|---|---|---|---|---|---|---|---|---|
| order-confirmed | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| order-number | ✓ | ✓ | ✓ | ✓ | ⟵ | ✓ | ✓ | ✓ | ✓ |
| estimated-delivery | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Note: pt-BR order-number missing - falls back to pt-PT ✓
Error Messages Section
| Key | en-US | en-GB | es-ES | es-MX | pt-BR | pt-PT | fr-FR | ja-JP | ar-SA |
|---|---|---|---|---|---|---|---|---|---|
| field-required | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| invalid-date | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| invalid-amount | ✓ | ✓ | ✓ | ✓ | ⟵ | ✓ | ✓ | ✓ | ✓ |
Note: pt-BR invalid-amount missing - falls back to pt-PT ✓
Legend
- ✓ - Translated and complete in this locale
- ⟵ - Missing in this locale, will use fallback chain
- △ - Partial translation (90-99% complete)
- ✗ - Not translated, will use default (en-US)
Fallback Chain Behavior
Portuguese Brazil (pt-BR) Fallback Chain
Portuguese Brazil is intentionally incomplete to demonstrate fallback chain behavior:
pt-BR (80% complete)
├─ Lookup in pt-PT (95% complete) ✓
│ └─ If missing, lookup in es-ES (100% complete) ✓
│ └─ If missing, lookup in en-US (100% complete) ✓
│ └─ Return string (or error if not found)
Demonstration:
order-totalnot in pt-BR → Falls back to pt-PT ✓- If it were missing from pt-PT, would check es-ES ✓
- If missing from es-ES, would check en-US ✓
This shows graceful degradation - users always get something in a related language rather than an error.
Translation Features Implemented
Pluralization Rules
| Locale | Forms | Examples |
|---|---|---|
| en-US | 2 | 1 item / N items |
| en-GB | 2 | 1 item / N items |
| es-ES | 2 | 1 artículo / N artículos |
| es-MX | 2 | 1 artículo / N artículos |
| pt-BR | 2 | 1 item / N itens |
| pt-PT | 2 | 1 artigo / N artigos |
| fr-FR | 3 | 0 articles / 1 article / N articles |
| ja-JP | 1 | N個のアイテム (no plural distinction) |
| ar-SA | 6 | 0 / 1 / 2 / 3-10 / 11-99 / 100+ forms |
Gender Agreement
| Locale | Support | Examples |
|---|---|---|
| en-US | ❌ | No gender marking |
| en-GB | ❌ | No gender marking |
| es-ES | ✓ | Bienvenido/Bienvenida |
| es-MX | ✓ | Bienvenido/Bienvenida |
| pt-BR | ✓ | Bem-vindo/Bem-vinda |
| pt-PT | ✓ | Bem-vindo/Bem-vinda |
| fr-FR | ✓ | Bienvenu/Bienvenue |
| ja-JP | ❌ | No gender marking in Japanese |
| ar-SA | ✓ | السيد/السيدة (Sir/Madam) |
Number Formatting
| Locale | Format | Example |
|---|---|---|
| en-US | Comma thousands, period decimal | 1,234.56 |
| en-GB | Comma thousands, period decimal | 1,234.56 |
| es-ES | Period thousands, comma decimal | 1.234,56 |
| es-MX | Comma thousands, period decimal | 1,234.56 |
| pt-BR | Period thousands, comma decimal | 1.234,56 |
| pt-PT | Period thousands, comma decimal | 1.234,56 |
| fr-FR | Period thousands, comma decimal | 1.234,56 |
| ja-JP | Comma thousands, no decimals | 1,234 |
| ar-SA | Arabic-Indic numerals | ١٬٢٣٤٫٥٦ |
Date Formatting
| Locale | Format | Example |
|---|---|---|
| en-US | MM/DD/YYYY | 1/15/2025 |
| en-GB | DD/MM/YYYY | 15/01/2025 |
| es-ES | DD/MM/YYYY | 15/01/2025 |
| es-MX | DD/MM/YYYY | 15/01/2025 |
| pt-BR | DD/MM/YYYY | 15/01/2025 |
| pt-PT | DD/MM/YYYY | 15/01/2025 |
| fr-FR | DD MMMM YYYY | 15 janvier 2025 |
| ja-JP | YYYY年M月D日 | 2025年1月15日 |
| ar-SA | DD MMMM YYYY | ١٥ يناير ٢٠٢٥ |
Text Direction
| Locale | Direction | Support |
|---|---|---|
| en-US | LTR | ✓ Standard |
| en-GB | LTR | ✓ Standard |
| es-ES | LTR | ✓ Standard |
| es-MX | LTR | ✓ Standard |
| pt-BR | LTR | ✓ Standard |
| pt-PT | LTR | ✓ Standard |
| fr-FR | LTR | ✓ Standard |
| ja-JP | LTR | ✓ Standard |
| ar-SA | RTL | ✓ Right-to-left with .direction = rtl |
Translation Maintenance Notes
Adding a New String
-
Add to en-US first (reference locale):
new-feature = This is a new feature -
Mark as untranslated in other locales:
new-feature = [NEEDS TRANSLATION] -
Translate and remove marker:
new-feature = Ceci est une nouvelle fonctionnalité -
Verify coverage:
grep -r "NEEDS TRANSLATION" locales/
Updating an Existing Translation
- Edit the string in the appropriate locale file
- Test in that locale:
LANG=es_ES cargo run -p typedialog-tui -- checkout-form.toml - Verify plural forms work correctly (test with count=0, 1, 2, 5, 100)
- Update translations-status.md if coverage changed
Testing Translations
# Run all locales
./test-locales.sh
# Run specific locale
LANG=ja_JP cargo run -p typedialog-tui -- checkout-form.toml
# Validate Fluent syntax
for file in locales/*/main.ftl; do
echo "Checking $file..."
# Your Fluent validator here
done
Next Steps for Completion
- Add more locales - Use these 9 as templates for additional languages
- Extract UI strings - Audit forms for hardcoded text
- Set up translation platform - Crowdin, Weblate, or similar for remote teams
- Automate testing - Run
test-locales.shin CI/CD pipeline - Monitor in production - Track translation quality and user feedback
Key Takeaways
- Pluralization is complex - Arabic has 6 forms, French has special 0/1 rules, Japanese has none
- Gender agreement varies - Not present in English or Japanese, essential in Romance languages
- Number/Date formatting differs - Can't assume US format everywhere (1,234.56 vs 1.234,56)
- RTL requires special handling - Arabic text flows right-to-left but numbers stay left-to-right
- Fallback chains provide resilience - Portuguese Brazil users get Portuguese/Spanish/English if needed
- Complete translations matter - Mixing languages in UI breaks user experience
Translation Coverage Tracking: This document is updated whenever translation files change. Always verify the coverage matrix before deploying to production.