Skip to main content

Perluasan Teks dalam i18n: Cegah Kerusakan Tata Letak akibat Panjang Terjemahan

UI bahasa Inggris Anda pas sempurna. Lalu terjemahan bahasa Jerman tiba — 30% lebih panjang. Finlandia 40% lebih panjang. Tombol meluap, tabel rusak, dan tata letak yang dirancang dengan cermat berantakan. Pengujian perluasan teks mencegah hal ini.

1

Mengapa Perluasan Teks Merusak Tata Letak

Developer mendesain UI dengan teks bahasa Inggris, salah satu bahasa paling ringkas. Ketika terjemahan tiba, bahasa yang lebih panjang meluap dari kontainer, merusak tata letak grid, memotong label tombol, dan mendorong konten keluar layar. Bug ini hanya muncul dalam locale tertentu sehingga tidak terlihat selama pengembangan dan pengujian khusus bahasa Inggris.

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.
Perluasan teks bukan kasus khusus yang jarang terjadi. Setiap UI yang mendukung banyak bahasa akan mengalaminya. Bahasa Jerman 30% lebih panjang daripada Inggris, Finlandia 40% lebih panjang, dan beberapa bahasa dapat lebih dari 100% lebih panjang untuk string pendek. Menguji perluasan sebelum terjemahan tiba mencegah desain ulang yang mahal.
2

Rasio Perluasan Teks Berdasarkan Bahasa

Rasio perluasan rata-rata relatif terhadap teks sumber bahasa Inggris. String pendek (kurang dari 20 karakter) meluas lebih banyak daripada string panjang karena pilihan kata individual memiliki dampak lebih besar pada panjang total.

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
Ini adalah nilai rata-rata. String individual dapat meluas jauh lebih banyak — label tombol bahasa Inggris 2 kata dapat menjadi 4 kata dalam bahasa Jerman. Uji dengan rasio lebih tinggi (lebih dari 50%) untuk elemen UI penting seperti tombol, navigasi, dan header tabel.
3

Pengujian dengan i18n-pseudo

Strategi perluasan i18n-pseudo menambahkan padding ke string sumber untuk menyimulasikan panjang terjemahan. Atur rasio perluasan agar sesuai dengan bahasa target dan uji tata letak sebelum terjemahan nyata tiba.

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,
  });
});
Uji dengan perluasan 40% untuk bahasa Eropa dan 50% untuk skenario terburuk. Jika tata letak bertahan dengan perluasan 50%, tata letak tersebut akan menangani hampir semua bahasa.
4

Praktik Desain Terbaik untuk i18n

Membangun tata letak yang menangani perluasan teks memerlukan keputusan desain sebelum pekerjaan terjemahan dimulai. Praktik berikut mencegah bug terkait perluasan yang paling umum.

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

Coba i18n Agent Sekarang

Lepaskan file terjemahan Anda di sini

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

atau klik untuk menjelajahi

Bahasa target

Tidak perlu mendaftarEstimasi instan

Tanya Jawab Perluasan Teks