Skip to main content

Proširenje teksta u i18n-u: spriječite narušavanje rasporeda zbog duljine prijevoda

Vaše englesko korisničko sučelje savršeno pristaje. Zatim stižu njemački prijevodi, 30% dulji. Finski su 40% dulji. Gumbi se prelijevaju, tablice se lome, a pomno osmišljen raspored raspada. Testiranje proširenja teksta to sprječava.

1

Zašto proširenje teksta narušava raspored

Programeri oblikuju korisnička sučelja s engleskim tekstom, jednim od najsažetijih jezika. Kada stignu prijevodi, dulji tekstovi prelijevaju se iz spremnika, narušavaju mrežne rasporede, skraćuju oznake gumba i guraju sadržaj izvan zaslona. Te se pogreške pojavljuju samo u određenim lokalizacijama, pa su nevidljive tijekom razvoja i testiranja samo na engleskom.

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.
Proširenje teksta nije rubni slučaj. S njim će se susresti svako korisničko sučelje koje podržava više jezika. Njemački je 30% dulji od engleskog, finski 40%, a na nekim jezicima kratki tekstovi mogu biti i više od 100% dulji. Testiranje prije dolaska prijevoda sprječava skupe redizajne.
2

Omjeri proširenja teksta po jezicima

Prosječni omjeri proširenja u odnosu na izvorni engleski tekst. Kratki tekstovi (kraći od 20 znakova) proširuju se više od dugih jer odabir pojedine riječi snažnije utječe na ukupnu duljinu.

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
Riječ je o prosjecima. Pojedini se tekstovi mogu znatno više proširiti: engleska oznaka gumba od 2 riječi može na njemačkom imati 4 riječi. Za ključne elemente korisničkog sučelja, poput gumba, navigacije i zaglavlja tablica, testirajte veće omjere (50%+).
3

Testiranje alatom i18n-pseudo

Strategija proširenja u alatu i18n-pseudo dodaje ispunu izvornim tekstovima kako bi oponašala duljinu prijevoda. Postavite omjer koji odgovara ciljnim jezicima i testirajte rasporede prije nego što stignu stvarni prijevodi.

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,
  });
});
Za europske jezike testirajte proširenje od 40%, a za najzahtjevnije slučajeve 50%. Ako raspored izdrži proširenje od 50%, podržat će gotovo svaki jezik.
4

Najbolje dizajnerske prakse za i18n

Za rasporede koji podnose proširenje teksta dizajnerske odluke treba donijeti prije početka prevođenja. Ove prakse sprječavaju najčešće pogreške povezane s proširenjem.

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

Isprobajte i18n Agent odmah

Povucite datoteku za prijevod ovdje

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

ili kliknite za odabir

Ciljni jezici

Registracija nije potrebnaProcjena odmah

Česta pitanja o proširenju teksta