Skip to main content

Szövegbővítés i18n-ben: a fordítási hossz okozta elrendezéstörés megelőzése

Az angol felület tökéletesen illeszkedik. Aztán megérkezik a 30%-kal hosszabb német és a 40%-kal hosszabb finn. A gombok túlcsordulnak, a táblázatok és elrendezés szétesik. A szövegbővítési teszt ezt megelőzi.

1

Miért töri el a szövegbővítés az elrendezést?

A fejlesztők angol szövegre terveznek, amely az egyik legtömörebb nyelv. A hosszabb fordítások túlcsordulnak, szétszedik a rácsot, levágják a gombcímkéket és képernyőn kívülre tolják a tartalmat. Csak bizonyos területeken jelentkeznek, ezért angol fejlesztésnél láthatatlanok.

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.
A szövegbővítés nem szélső eset. Minden többnyelvű felület találkozik vele. A német 30%-kal, a finn 40%-kal hosszabb, rövid szövegeknél egyes nyelvek több mint 100%-kal bővülhetnek. A fordítás előtti tesztelés költséges újratervezést előz meg.
2

Szövegbővítési arányok nyelvenként

Átlagos arányok az angol forráshoz képest. A 20 karakternél rövidebb szöveg arányosan jobban bővül, mert az egyes szóválasztások nagyobb hatással vannak a teljes hosszra.

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
Ezek átlagok. Egy két szavas angol gombcímke németül négy szó is lehet. Kritikus elemeknél, például gomboknál, navigációnál és táblázatfejléceknél teszteljen 50% feletti aránnyal.
3

Tesztelés i18n-pseudo használatával

Az i18n-pseudo expansion stratégiája kitöltést ad a forráshoz a fordítási hossz szimulálásához. Állítsa az arányt a célnyelvekhez, és valódi fordítás előtt tesztelje az elrendezést.

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,
  });
});
Európai nyelvekhez 40%-kal, legrosszabb esethez 50%-kal teszteljen. Ha az elrendezés túléli az 50%-ot, szinte bármely nyelvet kezel.
4

i18n-tervezési bevált módszerek

A bővülést kezelő elrendezésekhez már a fordítás előtt megfelelő tervezési döntések kellenek. Ezek megelőzik a leggyakoribb hibákat.

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

Try i18n Agent Now

Drop your translation file here

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

or click to browse

Target languages

No signup requiredInstant estimate

Szövegbővítés – gyakori kérdések