Skip to main content

Teksto išplėtimas i18n: apsaugokite maketą nuo ilgesnių vertimų

Angliškas UI telpa puikiai. Tada gaunate vertimus į vokiečių kalbą – 30 % ilgesnius. Suomiški yra 40 % ilgesni. Mygtukai persipildo, lentelės sugenda, o kruopščiai sukurtas maketas subyra. Teksto išplėtimo testavimas padeda to išvengti.

1

Kodėl dėl teksto išplėtimo sugenda maketai

Kūrėjai UI kuria su anglų kalbos tekstu – viena glaudžiausių kalbų. Gavus vertimus, ilgesnių kalbų tekstas perpildo konteinerius, sugadina tinklelio maketus, sutrumpina mygtukų etiketes ir išstumia turinį už ekrano ribų. Šios klaidos atsiranda tik konkrečiose lokalėse, todėl kuriant ir testuojant tik anglų kalba jos nematomos.

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.
Teksto išplėtimas nėra išskirtinis atvejis. Su juo susidurs kiekvienas kelių kalbų UI. Vokiečių tekstas yra 30 % ilgesnis už anglišką, suomių – 40 % ilgesnis, o kai kuriose kalbose trumpos eilutės gali būti daugiau kaip 100 % ilgesnės. Išplėtimo testavimas prieš gaunant vertimus padeda išvengti brangaus dizaino perdarymo.
2

Teksto išplėtimo santykiai pagal kalbą

Vidutiniai išplėtimo santykiai, palyginti su anglų šaltinio tekstu. Trumpos eilutės (iki 20 simbolių) išsiplečia labiau nei ilgos, nes atskirų žodžių pasirinkimas daro didesnę įtaką bendram ilgiui.

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
Tai vidurkiai. Atskiros eilutės gali išsiplėsti daug labiau – dviejų žodžių angliška mygtuko etiketė vokiškai gali tapti keturiais žodžiais. Svarbiems UI elementams, pvz., mygtukams, naršymo elementams ir lentelių antraštėms, išbandykite didesnius santykius (50 % ir daugiau).
3

Testavimas su i18n-pseudo

i18n-pseudo išplėtimo strategija prideda užpildą prie šaltinio eilučių, kad imituotų vertimo ilgį. Nustatykite tikslines kalbas atitinkantį išplėtimo santykį ir išbandykite maketus prieš gaudami tikrus vertimus.

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,
  });
});
Europos kalboms išbandykite 40 % išplėtimą, o blogiausiems scenarijams – 50 %. Jei maketas atlaiko 50 % išplėtimą, jis tiks beveik bet kuriai kalbai.
4

Geroji i18n dizaino praktika

Norint kurti maketus, kurie atlaiko teksto išplėtimą, dizaino sprendimus reikia priimti dar prieš pradedant vertimo darbus. Ši praktika padeda išvengti dažniausių su išplėtimu susijusių klaidų.

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

Išbandykite i18n Agent dabar

Nuvilkite vertimo failą čia

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

arba spustelėkite norėdami pasirinkti

Tikslinės kalbos

Registruotis nereikiaMomentinis įvertis

DUK apie teksto išplėtimą