Skip to main content

Tekstudvidelse i i18n: Undgå ødelagte layout på grund af oversættelseslængde

Din engelske brugergrænseflade passer perfekt. Så kommer de tyske oversættelser — 30 % længere. Finsk er 40 % længere. Teksten løber ud af dine knapper, dine tabeller bryder sammen og dit omhyggeligt udformede layout falder fra hinanden. Test af tekstudvidelse forhindrer det.

1

Derfor ødelægger tekstudvidelse layout

Udviklere designer brugergrænseflader med engelsk tekst, som er et af de mest kompakte sprog. Når oversættelserne kommer, løber længere sprog ud af beholdere, ødelægger gitterlayout, afkorter knaptekster og skubber indhold ud af skærmen. Disse fejl opstår kun i bestemte landestandarder og er derfor usynlige under udvikling og test, der kun foregår på engelsk.

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.
Tekstudvidelse er ikke et grænsetilfælde. Alle brugergrænseflader, der understøtter flere sprog, vil støde på det. Tysk er 30 % længere end engelsk, finsk er 40 % længere og visse sprog kan være over 100 % længere ved korte strenge. Hvis du tester for udvidelse, før oversættelserne kommer, undgår du dyre redesign.
2

Tekstudvidelsesforhold efter sprog

Gennemsnitlige udvidelsesforhold sammenlignet med engelsk kildetekst. Korte strenge (under 20 tegn) udvides mere end lange strenge, fordi valget af enkelte ord har større betydning for den samlede længde.

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
Dette er gennemsnit. Enkelte strenge kan blive betydeligt længere — en engelsk knaptekst på 2 ord kan blive til 4 ord på tysk. Test med højere forhold (mere end 50 %) for kritiske elementer i brugergrænsefladen såsom knapper, navigation og tabeloverskrifter.
3

Test med i18n-pseudo

Udvidelsesstrategien i i18n-pseudo føjer udfyldning til dine kildestrenge for at simulere oversættelseslængde. Angiv udvidelsesforholdet, så det svarer til dine målsprog og test dine layout, før de rigtige oversættelser 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,
  });
});
Test med 40 % udvidelse for europæiske sprog og 50 % for værst tænkelige scenarier. Hvis dit layout klarer 50 % udvidelse, kan det håndtere stort set alle sprog.
4

Bedste designpraksis til i18n

Layout, der kan håndtere tekstudvidelse, kræver designbeslutninger, før oversættelsesarbejdet begynder. Disse fremgangsmåder forebygger de mest almindelige fejl i forbindelse med udvidelse.

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

Prøv i18n Agent nu

Slip din oversættelsesfil her

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

eller klik for at vælge en fil

Målsprog

Kræver ingen tilmeldingEstimat med det samme

Ofte stillede spørgsmål om tekstudvidelse