Skip to main content

Tekstuitbreiding in i18n: voorkom lay-outproblemen door langere vertalingen

Je Engelse UI past perfect. Dan komen de Duitse vertalingen binnen: 30% langer. Fins is 40% langer. Tekst loopt uit je knoppen, je tabellen vallen uiteen en je zorgvuldig ontworpen lay-out stort in. Tests op tekstuitbreiding voorkomen dit.

1

Waarom tekstuitbreiding lay-outs breekt

Ontwikkelaars ontwerpen UI's met Engelse tekst, een van de compactste talen. Wanneer vertalingen binnenkomen, lopen langere teksten uit containers, breken rasterlay-outs, worden knoplabels afgekapt en verdwijnt content buiten beeld. Deze bugs treden alleen in bepaalde locales op en blijven daardoor onzichtbaar tijdens ontwikkeling en tests die uitsluitend in het Engels plaatsvinden.

The expansion problem
// English is one of the most compact languages.
// Translations are almost always LONGER.

// English (source):
"Save"           // 4 chars

// Translations:
"Speichern"      // German: 10 chars (+150%)
"Enregistrer"    // French: 12 chars (+200%)
"Guardar"        // Spanish: 7 chars (+75%)
"Сохранить"      // Russian: 9 chars (+125%)
"Tallenna"       // Finnish: 8 chars (+100%)

// Buttons, labels, and table headers designed for
// English text WILL break in other languages.
Tekstuitbreiding is geen uitzonderlijk randgeval. Elke UI die meerdere talen ondersteunt, krijgt ermee te maken. Duits is 30% langer dan Engels, Fins 40% en sommige talen kunnen bij korte tekenreeksen meer dan 100% langer zijn. Door op uitbreiding te testen voordat de vertalingen binnenkomen, voorkom je dure herontwerpen.
2

Tekstuitbreidingspercentages per taal

Gemiddelde uitbreidingspercentages ten opzichte van de Engelse brontekst. Korte tekenreeksen (minder dan 20 tekens) worden relatief langer dan lange, omdat afzonderlijke woordkeuzes een grotere invloed hebben op de totale lengte.

Expansion ratios by language
// Average text expansion relative to English:

// European languages:
// German:     +30-35%  (compound words)
// Finnish:    +30-40%  (agglutinative)
// French:     +15-25%  (articles, prepositions)
// Spanish:    +15-25%
// Italian:    +15-25%
// Portuguese: +15-25%
// Russian:    +20-30%  (case endings)
// Polish:     +20-30%
// Greek:      +20-30%

// Asian languages (CJK):
// Chinese:    -30-50%  (shorter in characters, but wider per char)
// Japanese:   -20-40%  (kanji compress meaning)
// Korean:     -10-20%

// Right-to-left:
// Arabic:     +20-30%
// Hebrew:     +10-20%

// Rule of thumb by source string length:
// 1-10 chars:   expect +200% expansion
// 11-20 chars:  expect +80% expansion
// 21-70 chars:  expect +40% expansion
// 71+ chars:    expect +30% expansion
Dit zijn gemiddelden. Afzonderlijke tekenreeksen kunnen aanzienlijk meer uitzetten: een Engels knoplabel van 2 woorden kan in het Duits 4 woorden worden. Test kritieke UI-elementen zoals knoppen, navigatie en tabelkoppen met hogere percentages (50% of meer).
3

Testen met i18n-pseudo

De uitbreidingsstrategie van i18n-pseudo voegt opvulling aan je bronteksten toe om de lengte van vertalingen te simuleren. Stel het uitbreidingspercentage af op je doeltalen en test je lay-outs voordat de echte vertalingen binnenkomen.

Terminal
# Method 1: Pseudo-localization with expansion
npx i18n-pseudo generate \
  --source locales/en.json \
  --output locales/pseudo-expanded.json \
  --expansion 1.4 \
  --preset expanded

# Method 2: Longest-translation analysis
npx i18n-validate expansion \
  --source locales/en.json \
  --targets 'locales/*.json' \
  --report expansion-report.json

# Output:
# Key                  | EN  | Longest | Lang | Ratio
# ---------------------|-----|---------|------|-------
# nav.settings         | 8   | 14      | de   | 175%
# buttons.save         | 4   | 12      | fr   | 300%
# errors.networkFailed | 14  | 28      | fi   | 200%

# Method 3: Visual regression with expanded text
npx playwright test \
  --project=expansion-test \
  --update-snapshots
Visual regression tests
// playwright.config.ts
export default defineConfig({
  projects: [
    {
      name: 'expansion-test',
      use: {
        locale: 'pseudo-expanded',
      },
    },
  ],
});

// tests/expansion.spec.ts
test('buttons do not overflow with expanded text', async ({ page }) => {
  await page.goto('/');

  // Check no horizontal overflow
  const buttons = await page.locator('button').all();
  for (const button of buttons) {
    const box = await button.boundingBox();
    const parent = await button.locator('..').boundingBox();
    expect(box!.x + box!.width).toBeLessThanOrEqual(
      parent!.x + parent!.width
    );
  }

  // Visual snapshot comparison
  await expect(page).toHaveScreenshot('homepage-expanded.png', {
    maxDiffPixels: 100,
  });
});
Test met 40% uitbreiding voor Europese talen en 50% voor ongunstige scenario's. Als je lay-out 50% uitbreiding doorstaat, kan die vrijwel elke taal aan.
4

Ontwerpprincipes voor i18n

Voor lay-outs die tekstuitbreiding aankunnen, moet je ontwerpbeslissingen nemen voordat het vertaalwerk begint. Deze werkwijzen voorkomen de meest voorkomende bugs door tekstuitbreiding.

CSS best practices
/* 1. Use flexible containers, not fixed widths */
/* WRONG */
.button { width: 120px; }

/* RIGHT */
.button { min-width: 80px; padding: 8px 16px; }

/* 2. Allow text wrapping in labels */
/* WRONG */
.label { white-space: nowrap; overflow: hidden; }

/* RIGHT */
.label { overflow-wrap: break-word; }

/* 3. Use CSS Grid/Flexbox for adaptive layouts */
.nav {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

/* 4. Reserve space for the longest expected translation */
/* Use min-width based on ~1.4x English length */
.table-header {
  min-width: max-content;
  padding-right: 16px;
}

/* 5. Test with the longest language first */
/* German and Finnish are good stress-test languages */

/* 6. For CJK: account for wider characters */
/* CJK characters are typically 2x the width of Latin chars */
/* Even though text is shorter, it may be wider visually */

Probeer i18n Agent nu

Zet je vertaalbestand hier neer

JSON, YAML, PO, XML, CSV, Markdown, Properties

of klik om een bestand te selecteren

Doeltalen

Geen registratie nodigDirecte prijsindicatie

Veelgestelde vragen over tekstuitbreiding