
Teksti pikenemine i18n-is: väldi tõlgete pikkusest tingitud paigutuse katkemist
Ingliskeelne kasutajaliides mahub täiuslikult. Siis saabuvad saksakeelsed tõlked, mis on 30 protsenti pikemad. Soomekeelsed on 40 protsenti pikemad. Nuppude tekst voolab üle, tabelid lähevad katki ja hoolikalt kujundatud paigutus laguneb. Teksti pikenemise testimine hoiab selle ära.
Miks teksti pikenemine paigutusi rikub
Arendajad kujundavad kasutajaliideseid ingliskeelse tekstiga, mis on üks kompaktsemaid keeli. Tõlgete saabudes voolavad pikemate keelte tekstid konteineritest üle, lõhuvad ruudustikpaigutusi, kärbivad nuppude silte ja lükkavad sisu ekraanilt välja. Need vead ilmnevad ainult kindlates lokaatides, mistõttu jäävad need üksnes inglise keeles arendades ja testides nähtamatuks.
// 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.Teksti pikenemissuhted keelte kaupa
Keskmised pikenemissuhted võrreldes ingliskeelse lähtetekstiga. Lühikesed, alla 20 märgi pikkused stringid pikenevad rohkem kui pikad, sest üksikud sõnavalikud mõjutavad kogupikkust rohkem.
// 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% expansionTestimine i18n-pseudo'ga
i18n-pseudo pikendamisstrateegia lisab lähtekeele stringidele täidet, et jäljendada tõlgete pikkust. Määra pikenemissuhe sihtkeelte järgi ja testi paigutusi enne päris tõlgete saabumist.
# 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,
});
});i18n-i kujunduse head tavad
Teksti pikenemisega toime tulevad paigutused nõuavad kujundusotsuseid juba enne tõlketöö algust. Need tavad hoiavad ära kõige levinumad pikenemisega seotud vead.
/* 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 */Proovi i18n Agent'i kohe
Kukuta tõlkefail siia
JSON, YAML, PO, XML, CSV, Markdown, Properties
või klõpsa faili valimiseks
Sihtkeeled