Skip to main content

Pengembangan Teks dalam i18n: Cegah Kerosakan Susun Atur akibat Panjang Terjemahan

UI bahasa Inggeris anda muat dengan sempurna. Kemudian terjemahan bahasa Jerman tiba — 30% lebih panjang. Finland 40% lebih panjang. Butang melimpah, jadual rosak, dan susun atur yang direka dengan teliti berantakan. Pengujian pengembangan teks mencegah hal ini.

1

Mengapa Pengembangan Teks Merosakkan Susun Atur

Pembangun mereka bentuk UI dengan teks bahasa Inggeris, salah satu bahasa paling ringkas. Apabila terjemahan tiba, bahasa yang lebih panjang melimpah daripada bekas, merosakkan susun atur grid, memotong label butang, dan menolak kandungan keluar skrin. Pepijat ini hanya muncul dalam lokal tertentu, maka ia tidak kelihatan semasa pembangunan dan pengujian bahasa Inggeris sahaja.

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.
Pengembangan teks bukan kes pinggiran. Setiap UI yang menyokong berbilang bahasa akan mengalaminya. Bahasa Jerman 30% lebih panjang daripada Inggeris, Finland 40% lebih panjang, dan sesetengah bahasa boleh menjadi lebih daripada 100% lebih panjang untuk rentetan pendek. Menguji pengembangan sebelum terjemahan tiba mencegah reka bentuk semula yang mahal.
2

Nisbah Pengembangan Teks Mengikut Bahasa

Nisbah pengembangan purata relatif kepada teks sumber bahasa Inggeris. Rentetan pendek (kurang daripada 20 aksara) mengembang lebih banyak daripada rentetan panjang kerana pilihan perkataan individu mempunyai impak lebih besar pada jumlah panjang.

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 ialah nilai purata. Rentetan individu boleh mengembang jauh lebih banyak — label butang bahasa Inggeris 2 perkataan boleh menjadi 4 perkataan dalam bahasa Jerman. Uji dengan nisbah lebih tinggi (lebih daripada 50%) untuk elemen UI penting seperti butang, navigasi, dan pengepala jadual.
3

Pengujian dengan i18n-pseudo

Strategi pengembangan i18n-pseudo menambahkan pelapik pada rentetan sumber untuk menyimulasikan panjang terjemahan. Tetapkan nisbah pengembangan agar sepadan dengan bahasa sasaran dan uji susun atur sebelum terjemahan sebenar 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 pengembangan 40% untuk bahasa Eropah dan 50% untuk senario terburuk. Jika susun atur bertahan dengan pengembangan 50%, susun atur tersebut akan mengendalikan hampir semua bahasa.
4

Amalan Reka Bentuk Terbaik untuk i18n

Membina susun atur yang mengendalikan pengembangan teks memerlukan keputusan reka bentuk sebelum kerja terjemahan bermula. Amalan berikut mencegah pepijat berkaitan pengembangan yang paling lazim.

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

Cuba i18n Agent Sekarang

Lepaskan fail terjemahan anda di sini

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

atau klik untuk semak imbas

Bahasa sasaran

Tidak perlu mendaftarAnggaran serta-merta

Soalan Lazim Pengembangan Teks