Skip to main content

Teksti pikenemine i18n-is: väldi tõlgete pikkusest tingitud paigutuse katkemist

Ingliskeelne kasutajaliides mahub täiuslikult. Siis saabuvad saksakeelsed tõlked, mis on 30 protsenti pikemad. Soomekeelsed on 40 protsenti pikemad. Nuppude tekst voolab üle, tabelid lähevad katki ja hoolikalt kujundatud paigutus laguneb. Teksti pikenemise testimine hoiab selle ära.

1

Miks teksti pikenemine paigutusi rikub

Arendajad kujundavad kasutajaliideseid ingliskeelse tekstiga, mis on üks kompaktsemaid keeli. Tõlgete saabudes voolavad pikemate keelte tekstid konteineritest üle, lõhuvad ruudustikpaigutusi, kärbivad nuppude silte ja lükkavad sisu ekraanilt välja. Need vead ilmnevad ainult kindlates lokaatides, mistõttu jäävad need üksnes inglise keeles arendades ja testides nähtamatuks.

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.
Teksti pikenemine pole äärmusjuhtum. Sellega puutub kokku iga mitut keelt toetav kasutajaliides. Saksakeelne tekst on ingliskeelsest 30 protsenti pikem, soomekeelne 40 protsenti pikem ning mõnes keeles võivad lühikesed stringid olla üle kahe korra pikemad. Pikenemise testimine enne tõlgete saabumist hoiab ära kuluka ümberkujundamise.
2

Teksti pikenemissuhted keelte kaupa

Keskmised pikenemissuhted võrreldes ingliskeelse lähtetekstiga. Lühikesed, alla 20 märgi pikkused stringid pikenevad rohkem kui pikad, sest üksikud sõnavalikud mõjutavad kogupikkust rohkem.

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
Need on keskmised. Üksikud stringid võivad pikeneda palju rohkem: ingliskeelne kahesõnaline nupusilt võib saksa keeles muutuda neljasõnaliseks. Testi kasutajaliidese kriitilisi elemente, nagu nupud, navigeerimine ja tabelipäised, suuremate, vähemalt 50-protsendiste suhetega.
3

Testimine i18n-pseudo'ga

i18n-pseudo pikendamisstrateegia lisab lähtekeele stringidele täidet, et jäljendada tõlgete pikkust. Määra pikenemissuhe sihtkeelte järgi ja testi paigutusi enne päris tõlgete saabumist.

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,
  });
});
Testi Euroopa keeli 40-protsendise pikendusega ja halvimaid olukordi 50-protsendise pikendusega. Kui paigutus peab vastu 50-protsendisele pikenemisele, saab see hakkama peaaegu iga keelega.
4

i18n-i kujunduse head tavad

Teksti pikenemisega toime tulevad paigutused nõuavad kujundusotsuseid juba enne tõlketöö algust. Need tavad hoiavad ära kõige levinumad pikenemisega seotud vead.

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

Proovi i18n Agent'i kohe

Kukuta tõlkefail siia

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

või klõpsa faili valimiseks

Sihtkeeled

Registreerumine pole vajalikKohene hinnang

Teksti pikenemise KKK