Skip to main content

Textexpansion i i18n: Förhindra layoutproblem på grund av översättningarnas längd

Ditt engelska gränssnitt passar perfekt. Sedan kommer de tyska översättningarna – 30 % längre. Finska är 40 % längre. Knapparna svämmar över, tabellerna går sönder och den noggrant utformade layouten faller isär. Testning av textexpansion förebygger detta.

1

Varför textexpansion förstör layouter

Utvecklare utformar gränssnitt med engelsk text, som är ett av de mest kompakta språken. När översättningarna kommer svämmar längre språk över sina behållare, förstör rutnätslayouter, trunkerar knapptexter och skjuter innehåll utanför skärmen. Felen uppstår bara i vissa språkversioner och förblir därför osynliga under utveckling och testning enbart på engelska.

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.
Textexpansion är inget ovanligt specialfall. Alla gränssnitt som stöder flera språk kommer att påverkas. Tyska är 30 % längre än engelska, finska är 40 % längre och vissa språk kan vara över 100 % längre för korta strängar. Genom att testa expansion innan översättningarna kommer undviker du kostsamma omarbetningar.
2

Textexpansion per språk

Genomsnittlig expansion jämfört med den engelska källtexten. Korta strängar (under 20 tecken) expanderar mer än långa eftersom enskilda ordval påverkar den totala längden mer.

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
Detta är genomsnitt. Enskilda strängar kan expandera betydligt mer – en engelsk knapptext med 2 ord kan bli 4 ord på tyska. Testa med högre förhållanden (50 % eller mer) för viktiga gränssnittselement som knappar, navigering och tabellrubriker.
3

Testning med i18n-pseudo

Expansionsstrategin i i18n-pseudo lägger till utfyllnad i dina källsträngar för att simulera översättningarnas längd. Ställ in expansionsförhållandet efter dina målspråk och testa layouterna innan de riktiga översättningarna kommer.

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,
  });
});
Testa med 40 % expansion för europeiska språk och 50 % för värsta tänkbara fall. Om layouten klarar 50 % expansion kan den hantera nästan alla språk.
4

Designprinciper för i18n

Layouter som kan hantera textexpansion kräver designbeslut redan innan översättningsarbetet börjar. Följande metoder förebygger de vanligaste expansionsrelaterade felen.

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 */

Prova i18n Agent nu

Släpp din översättningsfil här

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

eller klicka för att välja en fil

Målspråk

Ingen registrering krävsPrisuppskattning direkt

Vanliga frågor om textexpansion