What This Template Is For
Localization testing verifies that your product works correctly for users in different languages, regions, and cultural contexts. It goes beyond checking that translations are present. It validates that dates, numbers, and currencies render in locale-correct formats, that translated text fits within UI constraints, that right-to-left (RTL) layouts work, and that content is culturally appropriate for each target market.
Localization bugs are some of the most embarrassing to ship. A truncated button label, a date in the wrong format, or a culturally offensive image damages trust in ways that are hard to recover from. These bugs also tend to be invisible to English-speaking development teams until a customer reports them.
This template structures localization testing across linguistic, functional, visual, and cultural dimensions. It covers translation verification, locale-specific formatting, layout and UI checks, RTL support, and content appropriateness reviews.
Use this alongside the test strategy template to integrate localization into your broader quality approach. The browser compatibility template covers device and browser testing that intersects with locale rendering. For tracking localization bugs, the bug report template should include a "Locale" field. The Technical PM Handbook discusses internationalization architecture decisions that PMs need to understand.
How to Use This Template
- Start by listing your target locales. Distinguish between languages (translation) and regions (formatting). Spanish for Spain (es-ES) and Spanish for Mexico (es-MX) share a language but differ in vocabulary, date formats, and currency.
- For each locale, define the testing scope. New locales need full testing. Existing locales with updated translations need targeted testing of changed strings.
- Run automated checks first. String completeness (all keys translated), formatting validation (date/number patterns), and character encoding can be verified programmatically.
- Follow with manual visual review. Automated tests cannot catch text truncation, overlapping elements, or awkward translations. A human reviewer who reads the language must review the UI.
- For RTL locales (Arabic, Hebrew, Farsi), run a dedicated RTL layout review. Every element that works left-to-right may need to be mirrored.
- For cultural appropriateness, have a native speaker or local market expert review imagery, color choices, icons, and content tone.
The Template
Test Plan Overview
| Field | Details |
|---|---|
| Product / Feature | [Name] |
| Test Plan Owner | [Name] |
| PM | [Name] |
| Localization Manager | [Name] |
| Target Locales | [e.g., en-US, es-MX, fr-FR, de-DE, ja-JP, ar-SA] |
| Test Scope | [Full product / Updated strings only / New feature only] |
| Last Updated | [Date] |
Locale Matrix
| Locale Code | Language | Region | Script Direction | Date Format | Number Format | Currency | Status |
|---|---|---|---|---|---|---|---|
| en-US | English | United States | LTR | MM/DD/YYYY | 1,234.56 | $1,234.56 | [Baseline] |
| es-MX | Spanish | Mexico | LTR | DD/MM/YYYY | 1,234.56 | $1,234.56 MXN | [Testing] |
| fr-FR | French | France | LTR | DD/MM/YYYY | 1 234,56 | 1 234,56 EUR | [Testing] |
| de-DE | German | Germany | LTR | DD.MM.YYYY | 1.234,56 | 1.234,56 EUR | [Testing] |
| ja-JP | Japanese | Japan | LTR | YYYY/MM/DD | 1,234 | JPY 1,234 | [Testing] |
| ar-SA | Arabic | Saudi Arabia | RTL | DD/MM/YYYY | ูกูฌูขูฃูคูซูฅูฆ | ูกูฌูขูฃูคูซูฅูฆ ุฑ.ุณ | [Testing] |
Translation Completeness
| Locale | Total Strings | Translated | Missing | % Complete | Reviewer | Status |
|---|---|---|---|---|---|---|
| es-MX | [e.g., 2,400] | [2,380] | [20] | [99.2%] | [Name] | [In review] |
| fr-FR | [2,400] | [2,400] | [0] | [100%] | [Name] | [Approved] |
| de-DE | [2,400] | [2,350] | [50] | [97.9%] | [Name] | [In progress] |
| ja-JP | [2,400] | [2,400] | [0] | [100%] | [Name] | [In review] |
| ar-SA | [2,400] | [2,100] | [300] | [87.5%] | [Name] | [In progress] |
Fallback behavior for missing strings:
- ☐ Missing strings fall back to English (en-US)
- ☐ Fallback is visually indistinguishable from translated strings (no "MISSING:" prefix)
- ☐ Fallback strings are logged for translation team to address
Linguistic Review
For each locale, a native speaker reviews the UI for translation quality.
| Check | Description | es-MX | fr-FR | de-DE | ja-JP | ar-SA |
|---|---|---|---|---|---|---|
| Grammar and spelling | No grammatical errors or typos | ☐ | ☐ | ☐ | ☐ | ☐ |
| Consistent terminology | Same term used consistently (e.g., "dashboard" always translated the same way) | ☐ | ☐ | ☐ | ☐ | ☐ |
| Context accuracy | Translations match the UI context (same word may translate differently in different contexts) | ☐ | ☐ | ☐ | ☐ | ☐ |
| Tone and formality | Formality level matches brand voice (formal vs. informal "you") | ☐ | ☐ | ☐ | ☐ | ☐ |
| Placeholder handling | Variables like {name}, {count}, {date} render correctly in translated strings | ☐ | ☐ | ☐ | ☐ | ☐ |
| Pluralization | Plural forms handle 0, 1, 2, few, many correctly per locale rules | ☐ | ☐ | ☐ | ☐ | ☐ |
| Gender agreement | Gendered languages use correct gender forms (if applicable) | ☐ | ☐ | ☐ | ☐ | ☐ |
Functional Locale Testing
Verify that locale-sensitive functionality works correctly.
| Check | Description | Test Approach | Status per Locale |
|---|---|---|---|
| Date formatting | Dates display in locale-correct format | [Verify creation dates, due dates, timestamps] | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Time formatting | 12h vs 24h clock per locale convention | [Check event times, notification times] | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Number formatting | Thousands separators and decimal marks correct | [Check analytics, pricing, metrics displays] | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Currency formatting | Symbol position, decimals, code display | [Check pricing, invoices, payment amounts] | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Sort order | Alphabetical sort respects locale collation | [Sort lists: users, products, categories] | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Search | Search works with accented characters, CJK input | [Search for accented names, Japanese text] | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Input validation | Email, phone, postal code formats per locale | [Submit forms with locale-specific formats] | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Email templates | Transactional emails render in correct locale | [Trigger password reset, invite, receipt] | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
Visual and Layout Review
Translated text is often 30-50% longer than English. German and French are especially expansive.
| Check | Description | Status per Locale |
|---|---|---|
| Button label truncation | All button text fits without truncation or overflow | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Navigation label fit | Nav items render on one line, no wrapping | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Table header overflow | Column headers do not overflow or break layout | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Modal and dialog sizing | Content fits within modal boundaries | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Tooltip content | Tooltips display fully, no clipping | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Error message display | Longer error messages do not break layout | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Form field labels | Labels align with inputs correctly | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Empty states | Empty state messages render correctly | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| PDF/export output | Exported documents render in correct locale | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
RTL Layout Review (Arabic, Hebrew, Farsi)
| Check | Description | Status |
|---|---|---|
| Page direction | dir="rtl" set on html or body element | ☐ |
| Text alignment | Body text right-aligned | ☐ |
| Navigation | Nav items flow right-to-left | ☐ |
| Breadcrumbs | Arrow direction reversed (home on right) | ☐ |
| Form layout | Labels right-aligned, inputs flow RTL | ☐ |
| Icons with direction | Arrows, progress bars, back/forward mirrored | ☐ |
| Tables | Column order right-to-left | ☐ |
| Bidirectional text | Embedded English/numbers render correctly within RTL text | ☐ |
| Scroll direction | Horizontal scrollable areas scroll correctly | ☐ |
| CSS logical properties | Margin/padding use logical properties (start/end, not left/right) | ☐ |
Cultural Appropriateness
| Check | Description | Reviewer | Status per Locale |
|---|---|---|---|
| Imagery | Images, illustrations, and icons are culturally neutral or appropriate | [Native reviewer] | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Color meaning | Color associations match cultural expectations | [Native reviewer] | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Examples and defaults | Sample data uses locale-appropriate names, addresses, phone numbers | [Native reviewer] | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
| Legal and regulatory | Disclaimer text meets local legal requirements | [Legal/compliance] | es-MX ☐ fr-FR ☐ de-DE ☐ ja-JP ☐ ar-SA ☐ |
Issue Log
| Issue ID | Locale | Type | Severity | Description | Screenshot | Fix Owner | Status |
|---|---|---|---|---|---|---|---|
| L10N-001 | [Locale] | [Translation / Layout / Functional / Cultural] | [Critical / Major / Minor] | [Description] | [Link] | [Name] | [Open / Fixed] |
Exit Criteria
Localization testing is complete when:
- ☐ Translation completeness is 100% for all launch locales
- ☐ Linguistic review approved by native speaker for each locale
- ☐ All date, number, and currency formats verified per locale
- ☐ No text truncation or layout overflow in any locale
- ☐ RTL layout review passed (if applicable)
- ☐ Cultural appropriateness review passed for all locales
- ☐ All critical and major localization bugs resolved
- ☐ Email templates verified in all locales
Filled Example: SaaS Product Launch in DACH Market
Locale Matrix
| Locale | Language | Direction | Date | Number | Currency |
|---|---|---|---|---|---|
| de-DE | German | LTR | DD.MM.YYYY | 1.234,56 | 1.234,56 EUR |
| de-AT | German (Austria) | LTR | DD.MM.YYYY | 1.234,56 | 1.234,56 EUR |
| de-CH | German (Switzerland) | LTR | DD.MM.YYYY | 1'234.56 | CHF 1'234.56 |
Key Findings
German text expansion: 14 buttons had truncated text. German translations averaged 42% longer than English. The "Subscribe" button ("Abonnieren") fit. The "Request a demo" button ("Demo anfragen") fit. But "Download your invoice" ("Ihre Rechnung herunterladen") overflowed on mobile. Fix: increased button min-width and allowed two-line wrapping on mobile.
Swiss number formatting: Switzerland uses apostrophe as thousands separator (1'234.56), not period (1.234,56). The Intl.NumberFormat with de-CH locale handled this correctly, but a custom formatter in the billing module was hardcoded to period separators. Fix: replaced custom formatter with Intl.NumberFormat everywhere.
Sort order: German sort order places umlauts (รค, รถ, รผ) after the base letter (a, o, u). The product was using default Unicode sort, which placed รค after z. Fix: added localeCompare with de locale to all client-side sort functions.
Key Takeaways
- Localization testing covers four dimensions: linguistic, functional, visual, and cultural
- German and French text is 30-50% longer than English. Test for truncation and overflow in every locale.
- RTL languages need a dedicated layout review. CSS logical properties make RTL support systematic.
- Use pseudo-localization during development to find i18n bugs before translations are available
- Every locale-specific formatting check (dates, numbers, currencies) should compare against the locale specification, not just "look right"
About This Template
Created by: Tim Adair
Last Updated: 3/5/2026
Version: 1.0.0
License: Free for personal and commercial use
