Skip to main content

Extinderea textului în i18n: preveniți deteriorarea aspectului din cauza lungimii traducerilor

Interfața dumneavoastră în limba engleză se încadrează perfect. Apoi sosesc traducerile în germană, cu 30% mai lungi. Finlandeza este cu 40% mai lungă. Textul depășește butoanele, tabelele se deformează, iar aspectul proiectat cu atenție se destramă. Testarea extinderii textului previne aceste probleme.

1

De ce extinderea textului deteriorează aspectul

Dezvoltatorii proiectează interfețe cu texte în limba engleză, una dintre cele mai compacte limbi. Atunci când sosesc traducerile, textele mai lungi din alte limbi depășesc containerele, deteriorează aspectele de tip grilă, trunchiază etichetele butoanelor și împing conținutul în afara ecranului. Aceste erori apar numai în anumite setări regionale, fiind invizibile în timpul dezvoltării și testării efectuate exclusiv în limba engleză.

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.
Extinderea textului nu este un caz marginal. Fiecare interfață care acceptă mai multe limbi se va confrunta cu aceasta. Germana este cu 30% mai lungă decât engleza, finlandeza este cu 40% mai lungă, iar unele limbi pot fi cu peste 100% mai lungi în cazul șirurilor scurte. Testarea extinderii înainte de sosirea traducerilor previne reproiectări costisitoare.
2

Rapoarte de extindere a textului în funcție de limbă

Rapoarte medii de extindere față de textul sursă în limba engleză. Șirurile scurte (sub 20 de caractere) se extind mai mult decât cele lungi, deoarece alegerea fiecărui cuvânt are un impact mai mare asupra lungimii totale.

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
Acestea sunt valori medii. Unele șiruri se pot extinde mult mai mult: eticheta unui buton din 2 cuvinte în engleză poate deveni o expresie de 4 cuvinte în germană. Testați cu rapoarte mai mari (peste 50%) elementele esențiale ale interfeței, precum butoanele, navigarea și antetele de tabel.
3

Testarea cu i18n-pseudo

Strategia de extindere a i18n-pseudo adaugă caractere de umplere în șirurile sursă pentru a simula lungimea traducerilor. Stabiliți raportul de extindere în funcție de limbile-țintă și testați aspectele înainte de sosirea traducerilor reale.

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ți cu o extindere de 40% pentru limbile europene și de 50% pentru cele mai nefavorabile situații. Dacă aspectul rezistă unei extinderi de 50%, va putea gestiona aproape orice limbă.
4

Bune practici de design pentru i18n

Crearea unor aspecte care gestionează extinderea textului necesită decizii de design luate înainte de începerea traducerilor. Aceste practici previn cele mai frecvente erori legate de extindere.

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

Încercați acum i18n Agent

Plasați aici fișierul de traducere

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

sau faceți clic pentru a-l selecta

Limbi țintă

Nu este necesară înregistrareaEstimare instantanee

Întrebări frecvente despre extinderea textului