Skip to main content

Expansão de texto em i18n: impedir que a extensão das traduções danifique o esquema

A sua interface inglesa cabe na perfeição. Depois chegam traduções alemãs, 30% mais extensas. O finlandês é 40% mais extenso. Os seus botões apresentam conteúdo excedente, as tabelas ficam danificadas e o esquema cuidadosamente concebido desfaz-se. Os testes de expansão do texto impedem estes problemas.

1

Porque a expansão do texto danifica os esquemas

Os programadores concebem as interfaces com texto inglês, um dos idiomas mais compactos. Quando chegam as traduções, os idiomas mais extensos excedem os contentores, danificam esquemas de grelha, truncam etiquetas de botões e empurram conteúdo para fora do ecrã. Estes erros só aparecem em regiões específicas, pelo que são invisíveis durante o desenvolvimento e os testes apenas em inglê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.
A expansão do texto não é um caso extremo. Todas as interfaces compatíveis com vários idiomas terão de a enfrentar. O alemão é 30% mais extenso do que o inglês, o finlandês é 40% mais extenso e alguns idiomas podem ser mais de 100% mais extensos em cadeias curtas. Testar a expansão antes de chegarem as traduções evita reformulações dispendiosas.
2

Proporções de expansão do texto por idioma

Proporções médias de expansão em relação ao texto de origem inglês. As cadeias curtas (menos de 20 carateres) expandem mais do que as longas porque cada escolha de palavras tem maior impacto na extensão 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
Estas são médias. Algumas cadeias podem expandir muito mais: uma etiqueta de botão inglesa com 2 palavras pode passar a 4 palavras em alemão. Teste proporções superiores (mais de 50%) nos elementos críticos da interface, como botões, navegação e cabeçalhos de tabela.
3

Testar com i18n-pseudo

A estratégia de expansão de i18n-pseudo acrescenta enchimento às suas cadeias de origem para simular a extensão das traduções. Defina a proporção de expansão de acordo com os seus idiomas de destino e teste os esquemas antes de chegarem as traduções reais.

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,
  });
});
Teste uma expansão de 40% em idiomas europeus e de 50% nos piores cenários. Se o seu esquema resistir a uma expansão de 50%, será compatível com praticamente qualquer idioma.
4

Boas práticas de design para i18n

Criar esquemas compatíveis com a expansão do texto exige decisões de design antes de qualquer trabalho de tradução. Estas práticas impedem os erros mais comuns relacionados com a expansão.

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

Experimente já o i18n Agent

Largue aqui o seu ficheiro de tradução

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

ou clique para selecionar

Idiomas de destino

Sem registoEstimativa imediata

Perguntas frequentes sobre expansão do texto