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