Skip to main content

Text Expansion sa i18n: Pigilan ang Pagkasira ng Layout Dahil sa Haba ng Translation

Sakto ang fit ng English UI ninyo. Pagdating ng mga German translation—30% na mas mahaba. Ang Finnish ay 40% na mas mahaba. Nag-o-overflow ang mga button, nasisira ang mga table, at gumuho ang maingat na dinisenyong layout. Pinipigilan ito ng text expansion testing.

1

Bakit Sinisira ng Text Expansion ang mga Layout

Dinidisenyo ng mga developer ang UI gamit ang English text, na isa sa mga pinakamaiksi at pinakakompaktong wika. Kapag dumating ang mga translation, umaapaw ang mas mahahabang wika sa mga container, sinisira ang mga grid layout, pinuputol ang mga label ng button, at itinutulak palabas ng screen ang content. Lumalabas lang ang mga bug na ito sa partikular na mga locale, kaya hindi sila nakikita sa development at testing na English-only.

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.
Hindi edge case ang text expansion. Lahat ng UI na sumusuporta sa maraming wika ay makakaranas nito. Ang German ay 30% na mas mahaba kaysa English, ang Finnish ay 40% na mas mahaba, at ang ilang wika ay puwedeng 100%+ na mas mahaba para sa maiikling string. Ang pag-test para sa expansion bago dumating ang mga translation ay nakakaiwas sa magastos na redesign.
2

Mga Text Expansion Ratio ayon sa Wika

Mga average na expansion ratio kumpara sa English source text. Mas lumalawak ang maiikling string (mas mababa sa 20 character) kaysa mahahabang string dahil mas malaki ang epekto ng pagpili ng salita sa kabuuang haba.

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
Mga average lang ang mga ito. Puwedeng mas lumaki nang husto ang expansion ng mga indibidwal na string—halimbawa, ang 2-word na English button label ay puwedeng maging 4 na salita sa German. Mag-test gamit ang mas mataas na ratio (50%+) para sa mga kritikal na UI element tulad ng mga button, navigation, at table header.
3

Pag-test gamit ang i18n-pseudo

Nagdaragdag ang expansion strategy ng i18n-pseudo ng padding sa inyong source string para tularan ang haba ng translation. Itakda ang expansion ratio na tumutugma sa inyong target language at subukan ang inyong mga layout bago pa dumating ang totoong translation.

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,
  });
});
Mag-test gamit ang 40% expansion para sa mga European language at 50% para sa worst-case na mga scenario. Kung kayang tiisin ng layout ninyo ang 50% expansion, halos lahat ng wika ay kakayanin nito.
4

Mga Best Practice sa Design para sa i18n

Ang pagbuo ng mga layout na kayang humawak ng text expansion ay nangangailangan ng mga desisyong pang-design bago pa magsimula ang anumang trabaho sa translation. Pinipigilan ng mga praktis na ito ang pinakakaraniwang bug na may kinalaman sa expansion.

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

Subukan ang i18n Agent Ngayon

I-drop dito ang inyong translation file

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

o i-click para mag-browse

Mga target language

Hindi kailangan ang signupInstant na estimate

FAQ sa Text Expansion