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