Skip to main content

Teksta paplašināšana i18n: novērsiet izkārtojuma bojājumus tulkojumu garuma dēļ

Jūsu angļu UI ietilpst perfekti. Tad ierodas vācu tulkojumi — par 30 % garāki. Somu tulkojumi ir par 40 % garāki. Pogas pārplūst, tabulas sabrūk un rūpīgi izstrādātais izkārtojums izjūk. Teksta paplašināšanas testēšana to novērš.

1

Kāpēc teksta paplašināšanās bojā izkārtojumus

Izstrādātāji veido UI ar angļu tekstu, kas ir viena no kompaktākajām valodām. Kad ierodas tulkojumi, garākas valodas pārpilda konteinerus, salauž režģa izkārtojumus, apcērp pogu etiķetes un izstumj saturu ārpus ekrāna. Šīs kļūdas parādās tikai konkrētās lokālēs, tāpēc izstrādē un testēšanā tikai angļu valodā tās nav redzamas.

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.
Teksta paplašināšanās nav rets izņēmums. Ar to saskarsies ikviens UI, kas atbalsta vairākas valodas. Vācu teksts ir par 30 % garāks nekā angļu, somu — par 40 % garāks, bet dažās valodās īsas virknes var būt vairāk nekā par 100 % garākas. Paplašinājuma testēšana pirms tulkojumu saņemšanas novērš dārgu pārprojektēšanu.
2

Teksta paplašinājuma attiecības pēc valodas

Vidējās paplašinājuma attiecības pret angļu avota tekstu. Īsas virknes (mazāk par 20 rakstzīmēm) paplašinās vairāk nekā garas virknes, jo atsevišķu vārdu izvēlei ir lielāka ietekme uz kopējo garumu.

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
Tie ir vidējie rādītāji. Atsevišķas virknes var paplašināties ievērojami vairāk — divu vārdu angļu pogas etiķete vācu valodā var kļūt par četriem vārdiem. Kritiskiem UI elementiem, piemēram, pogām, navigācijai un tabulu galvenēm, testējiet ar lielākām attiecībām (50 % un vairāk).
3

Testēšana ar i18n-pseudo

i18n-pseudo paplašināšanas stratēģija avota virknēm pievieno pildījumu, lai imitētu tulkojuma garumu. Iestatiet mērķvalodām atbilstošu paplašinājuma attiecību un testējiet izkārtojumus pirms īstu tulkojumu saņemšanas.

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,
  });
});
Eiropas valodām testējiet ar 40 % paplašinājumu, bet sliktākajiem scenārijiem — ar 50 %. Ja izkārtojums iztur 50 % paplašinājumu, tas spēs apstrādāt gandrīz jebkuru valodu.
4

i18n dizaina paraugprakse

Lai veidotu izkārtojumus, kas spēj apstrādāt teksta paplašināšanos, dizaina lēmumi jāpieņem pirms tulkošanas darba sākuma. Šī prakse novērš biežākās ar paplašināšanos saistītās kļūdas.

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

Izmēģiniet i18n Agent tūlīt

Nometiet tulkošanas failu šeit

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

vai noklikšķiniet, lai izvēlētos

Mērķa valodas

Reģistrācija nav vajadzīgaTūlītēja tāme

Bieži uzdotie jautājumi par teksta paplašināšanu