
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.
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.
// 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.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.
// 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% expansionPengujian 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.
# 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// 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,
});
});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.
/* 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