Skip to main content

Expansió del text en i18n: eviti que la longitud de les traduccions trenqui el disseny

La seva interfície en anglès encaixa perfectament. Llavors arriben les traduccions a l'alemany, un 30% més llarg. El finès és un 40% més llarg. Els botons es desborden, les taules es trenquen i el disseny que havia preparat amb tanta cura s'ensorra. Les proves d'expansió del text ho eviten.

1

Per què l'expansió del text trenca els dissenys

Els desenvolupadors dissenyen interfícies amb text en anglès, una de les llengües més compactes. Quan arriben les traduccions, les llengües més llargues desborden els contenidors, trenquen els dissenys de quadrícula, trunquen les etiquetes dels botons i empenyen el contingut fora de la pantalla. Aquests errors només apareixen en configuracions regionals concretes i, per tant, són invisibles durant el desenvolupament i les proves exclusivament en anglès.

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.
L'expansió del text no és un cas límit. Totes les interfícies compatibles amb diverses llengües s'hi trobaran. L'alemany és un 30% més llarg que l'anglès, el finès és un 40% més llarg i, en cadenes curtes, algunes llengües poden ser més d'un 100% més llargues. Provar l'expansió abans que arribin les traduccions evita redissenys costosos.
2

Percentatges d'expansió del text per llengua

Percentatges mitjans d'expansió respecte del text d'origen en anglès. Les cadenes curtes —de menys de 20 caràcters— s'expandeixen més que les llargues perquè cada paraula triada té més incidència en la longitud total.

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
Són valors mitjans. Algunes cadenes es poden expandir molt més: una etiqueta de botó de dues paraules en anglès en pot tenir quatre en alemany. Faci proves amb percentatges més alts (50%+) en elements crítics de la interfície, com ara botons, navegació i capçaleres de taula.
3

Proves amb i18n-pseudo

L'estratègia d'expansió d'i18n-pseudo afegeix farciment a les cadenes d'origen per simular la longitud de les traduccions. Estableixi un percentatge d'expansió adequat per a les llengües de destinació i provi els dissenys abans que arribin les traduccions reals.

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,
  });
});
Faci les proves amb una expansió del 40% per a les llengües europees i del 50% per als pitjors casos. Si el disseny resisteix una expansió del 50%, funcionarà amb pràcticament qualsevol llengua.
4

Bones pràctiques de disseny per a la i18n

Per crear dissenys que admetin l'expansió del text, cal prendre decisions de disseny abans de començar qualsevol tasca de traducció. Aquestes pràctiques eviten els errors més habituals relacionats amb l'expansió.

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

Provar i18n Agent ara

Arrossegar aquí el fitxer de traducció

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

o fer clic per explorar

Idiomes de destinació

No cal registrePressupost instantani

Preguntes freqüents sobre l'expansió del text