Engineering

Localization Testing: A Comprehensive Guide to Verifying Multilingual Software

Eray Gündoğmuş
Eray Gündoğmuş
·10 min read
Share
Localization Testing: A Comprehensive Guide to Verifying Multilingual Software

Localization Testing: A Comprehensive Guide to Verifying Multilingual Software

Key Takeaways

  • Localization testing verifies that your software works correctly across all target locales — not just that translations are accurate
  • Testing categories include: linguistic, cosmetic/UI, functional, locale-specific, and accessibility
  • Pseudo-localization catches i18n issues early by simulating text expansion, special characters, and RTL without real translations
  • Automated testing can verify placeholders, string length, format correctness, and UI layout, but linguistic accuracy requires human review
  • Testing should happen continuously alongside development, not as a final phase before release

What Is Localization Testing?

Localization testing verifies that a localized product works correctly for its target audience. It goes beyond checking whether translations are accurate to ensure that the entire user experience — UI layout, formatting, functionality, and cultural appropriateness — is correct for each locale.

A common misconception is that localization testing is just proofreading translations. In reality, many localization bugs are technical: truncated text, broken layouts, incorrect date formats, non-functional links, or encoding errors that have nothing to do with translation quality.

Testing Categories

Linguistic Testing

Verify that translations are accurate, natural, and appropriate for the target audience.

What to check:

  • Translation accuracy (does it convey the correct meaning?)
  • Naturalness (does it sound like native language, not translated text?)
  • Terminology consistency (is "Dashboard" translated the same way everywhere?)
  • Tone and formality (does it match the product's voice for that market?)
  • Grammar and spelling (correct for the locale — British vs American English, Brazilian vs European Portuguese)

Who does it: Native speakers of the target language, ideally with domain knowledge.

Cosmetic / UI Testing

Verify that translated content displays correctly in the user interface.

What to check:

IssueExample
Text truncationButton label "Enregistrer les modifications" cut off to "Enregistrer les modi..."
Text overflowLong German label pushes other elements off-screen
Layout breaksRTL text causing misaligned columns
Font renderingMissing glyphs for CJK or Devanagari characters
Image overlapText overlapping hardcoded images or icons
Responsive designLocalized content breaking mobile layouts

How to test: Visual inspection of every screen in every target language. Screenshots comparison tools (Percy, Chromatic) can automate detection of layout changes.

Functional Testing

Verify that the application functions correctly in all locales.

What to check:

  • Locale switching works correctly (changing language doesn't lose state)
  • Forms accept locale-specific input (names with diacritics, addresses in different formats)
  • Search works with accented characters (searching "café" finds "cafe" and vice versa)
  • Sorting follows locale-specific rules (Swedish alphabetical order differs from English)
  • Links and navigation work in all language versions
  • Currency, date, and number inputs accept locale-appropriate formats

Locale-Specific Testing

Verify that locale-aware features work correctly for each target locale.

What to check:

FeatureExample
Date formattingUS: 03/02/2026, Germany: 02.03.2026, Japan: 2026/03/02
Number formattingUS: 1,234.56, Germany: 1.234,56, France: 1 234,56
Currency formattingUS: $1,234, Japan: ¥1,234, Germany: 1.234 €
Time formattingUS: 3:30 PM, Germany: 15:30
Address formatUS: City, State ZIP, Germany: ZIP City
Phone number formatUS: (555) 123-4567, UK: 020 1234 5678

Accessibility Testing

Verify that localized content remains accessible.

What to check:

  • Screen readers correctly read translated content
  • lang attribute is set correctly on the HTML element and on inline language switches
  • RTL content is properly marked with dir="rtl"
  • Color contrast is maintained with translated text (different length may affect layout)
  • Keyboard navigation works in all locales

Pseudo-Localization

Pseudo-localization is a technique for finding internationalization bugs before real translations are available. It transforms source strings in ways that simulate localization challenges:

Types of Pseudo-Localization

Accented characters: Replace ASCII characters with accented equivalents.

  • "Settings" → "Šéttîñgš"
  • Tests: Unicode handling, font rendering, character encoding

Text expansion: Pad strings to simulate the 30-40% expansion common in European languages.

  • "Save" → "[Šåvé xxxxxxxxx]"
  • Tests: Layout flexibility, text truncation, responsive design

Brackets/markers: Wrap strings in visible markers to identify untranslated or hardcoded text.

  • "Settings" → "[Šéttîñgš]"
  • Tests: String externalization completeness — any text without brackets is hardcoded

RTL simulation: Reverse text direction to test layout mirroring.

  • Tests: UI mirroring, bidirectional text handling, CSS logical properties

When to Use Pseudo-Localization

  • During development: Run pseudo-localization in development builds to catch issues as they're introduced
  • Before translation: Verify that all strings are externalized and the UI handles expansion before investing in real translations
  • In CI/CD: Add a pseudo-localization build step that fails if hardcoded strings are detected
// Example: pseudo-localization configuration
{
  "pseudoLocale": {
    "enabled": true,
    "strategy": "accented",
    "expansion": 1.35,
    "brackets": true
  }
}

Automated Testing Approaches

Placeholder Validation

Verify that all placeholders from source strings exist in translations:

// Test: Every {placeholder} in source exists in translation
function validatePlaceholders(source, translation) {
  const sourcePlaceholders = source.match(/\{[^}]+\}/g) || [];
  const translationPlaceholders = translation.match(/\{[^}]+\}/g) || [];

  for (const placeholder of sourcePlaceholders) {
    if (!translationPlaceholders.includes(placeholder)) {
      throw new Error(`Missing placeholder ${placeholder} in translation`);
    }
  }
}

Visual Regression Testing

Use tools like Playwright or Cypress to capture screenshots in each locale and compare against baselines:

// Playwright: Capture screenshots for each locale
for (const locale of ['en', 'de', 'ja', 'ar']) {
  await page.goto(`https://app.example.com/${locale}/dashboard`);
  await page.screenshot({
    path: `screenshots/${locale}-dashboard.png`,
    fullPage: true,
  });
}

Translation Completeness Check

// Verify all source keys have translations
function checkCompleteness(sourceKeys, translationKeys, locale) {
  const missing = sourceKeys.filter(key => !translationKeys.includes(key));
  if (missing.length > 0) {
    console.warn(`${locale}: ${missing.length} missing translations`);
    console.warn('Missing keys:', missing.slice(0, 10));
  }
}

Format Validation

Verify that translation files are valid:

  • JSON files parse without errors
  • XLIFF files are well-formed XML
  • PO files have matching msgid/msgstr pairs
  • No duplicate keys within a file

Testing Workflow Integration

During Development

  1. Pseudo-localization enabled in development builds
  2. Developers see expanded/accented text and fix layout issues immediately
  3. No dependency on translators or translations being ready

In CI/CD

  1. Placeholder validation runs on every PR
  2. Translation completeness checked for all target locales
  3. Format validation ensures translation files are syntactically correct
  4. Visual regression tests catch layout issues in key locales

Before Release

  1. Full linguistic review by native speakers for new or changed content
  2. In-context review in staging environment
  3. Functional testing of locale-specific features
  4. RTL layout verification for Arabic/Hebrew
  5. Accessibility audit for all locales

FAQ

How much time should I budget for localization testing?

Plan for 2-4 hours of linguistic review per 1,000 words per language for human review. Functional and UI testing depends on application complexity — budget 1-2 days per target locale for a full pass. Automated checks (placeholders, format, completeness) run in minutes as part of CI/CD.

Can I automate linguistic testing?

Partially. Automated tools can check grammar and spelling, flag inconsistent terminology, and detect common patterns (missing punctuation, wrong formality). However, verifying translation accuracy, naturalness, and cultural appropriateness requires human native speakers. Automate the mechanical checks, invest human time in the nuanced review.

What are the most common localization bugs?

Based on common industry experience: (1) text truncation from longer translations, (2) hardcoded strings that were missed during externalization, (3) incorrect date/number formatting, (4) broken layouts in RTL languages, (5) placeholders removed or duplicated in translations, (6) encoding issues with special characters.