Skip to main content

Tekstin laajeneminen i18n:ssä: estä käännösten pituuden aiheuttamat asetteluvirheet

Englanninkielinen käyttöliittymäsi mahtuu täydellisesti. Sitten saksankieliset käännökset saapuvat, ja ne ovat 30 prosenttia pidempiä. Suomenkieliset ovat 40 prosenttia pidempiä. Painikkeiden teksti vuotaa yli, taulukot rikkoutuvat ja huolellisesti suunniteltu asettelu hajoaa. Tekstin laajenemisen testaus estää tämän.

1

Miksi tekstin laajeneminen rikkoo asetteluja

Kehittäjät suunnittelevat käyttöliittymät englanninkielisellä tekstillä, joka kuuluu tiiviimpiin kieliin. Käännösten saapuessa pidemmät kielet vuotavat säilöjen yli, rikkovat ruudukkoasetteluja, katkaisevat painikkeiden selitteitä ja työntävät sisältöä näytön ulkopuolelle. Virheet ilmenevät vain tietyillä kielialueilla, joten ne jäävät näkymättömiksi pelkästään englanniksi kehitettäessä ja testattaessa.

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.
Tekstin laajeneminen ei ole ääritapaus. Jokainen useita kieliä tukeva käyttöliittymä kohtaa sen. Saksankielinen teksti on 30 prosenttia englantia pidempää, suomenkielinen 40 prosenttia pidempää, ja joissakin kielissä lyhyet merkkijonot voivat olla yli kaksi kertaa pidempiä. Laajenemisen testaaminen ennen käännösten saapumista estää kalliit uudelleensuunnittelut.
2

Tekstin laajenemissuhteet kielittäin

Keskimääräiset laajenemissuhteet englanninkieliseen lähdetekstiin verrattuna. Lyhyet, alle 20 merkin merkkijonot laajenevat pitkiä enemmän, koska yksittäiset sanavalinnat vaikuttavat enemmän kokonaispituuteen.

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
Nämä ovat keskiarvoja. Yksittäiset merkkijonot voivat pidentyä huomattavasti enemmän: englanninkielinen kaksisanainen painikeselite voi muuttua saksaksi nelisanaiseksi. Testaa käyttöliittymän kriittisiä osia, kuten painikkeita, siirtymistä ja taulukko-otsikoita, suuremmilla, vähintään 50 prosentin suhteilla.
3

Testaus i18n-pseudo:lla

i18n-pseudo:n laajennusstrategia lisää lähdemerkkijonoihin täytettä käännösten pituuden jäljittelemiseksi. Aseta laajenemissuhde vastaamaan kohdekieliäsi ja testaa asettelut ennen oikeiden käännösten saapumista.

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,
  });
});
Testaa eurooppalaisia kieliä 40 prosentin laajennuksella ja pahimpia tapauksia 50 prosentin laajennuksella. Jos asettelusi kestää 50 prosentin laajennuksen, se käsittelee käytännössä minkä tahansa kielen.
4

i18n-suunnittelun parhaat käytännöt

Tekstin laajenemisen huomioivat asettelut edellyttävät suunnittelupäätöksiä jo ennen käännöstyön alkua. Näillä käytännöillä estät tavallisimmat laajenemiseen liittyvät virheet.

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

Kokeile i18n Agent:ia nyt

Pudota käännöstiedostosi tähän

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

tai valitse napsauttamalla

Kohdekielet

Rekisteröitymistä ei tarvitaVälitön arvio

Tekstin laajenemisen usein kysytyt kysymykset