Skip to main content

i18n'de metin genişlemesi: Çeviri uzunluğundan kaynaklanan yerleşim bozulmalarını önleyin

İngilizce kullanıcı arayüzünüz kusursuz biçimde sığar. Ardından %30 daha uzun Almanca çeviriler gelir. Fince %40 daha uzundur. Butonlarınız taşar, tablolarınız bozulur ve özenle tasarladığınız yerleşim dağılır. Metin genişletme testi bunu önler.

1

Metin genişlemesi yerleşimleri neden bozar?

Geliştiriciler kullanıcı arayüzlerini en kısa dillerden biri olan İngilizce metinle tasarlar. Çeviriler geldiğinde daha uzun diller kapsayıcılardan taşar, ızgara yerleşimlerini bozar, buton etiketlerini keser ve içeriği ekranın dışına iter. Bu hatalar yalnızca belirli yerel ayarlarda ortaya çıktığı için yalnızca İngilizce kullanılan geliştirme ve test süreçlerinde görünmez kalır.

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.
Metin genişlemesi uç bir durum değildir. Birden fazla dili destekleyen her kullanıcı arayüzü bununla karşılaşır. Almanca İngilizceden %30, Fince %40 daha uzundur; bazı dillerde kısa dizeler %100'den fazla uzayabilir. Çeviriler gelmeden önce genişlemeyi test etmek, maliyetli yeniden tasarımları önler.
2

Dillere göre metin genişleme oranları

İngilizce kaynak metne göre ortalama genişleme oranlarıdır. Kısa dizelerde (20 karakterden az) tek tek sözcük seçimlerinin toplam uzunluk üzerindeki etkisi daha büyük olduğundan genişleme uzun dizelere göre daha fazladır.

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
Bunlar ortalama değerlerdir. Tek tek dizeler çok daha fazla genişleyebilir; 2 sözcüklük İngilizce bir buton etiketi Almancada 4 sözcüğe çıkabilir. Butonlar, gezinme öğeleri ve tablo başlıkları gibi kritik kullanıcı arayüzü öğelerini daha yüksek oranlarla (%50'den fazla) test edin.
3

i18n-pseudo ile test

i18n-pseudo'nun genişletme stratejisi, çeviri uzunluğunu taklit etmek için kaynak dizelerinize dolgu ekler. Genişleme oranını hedef dillerinize göre ayarlayın ve gerçek çeviriler gelmeden yerleşimlerinizi test edin.

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,
  });
});
Avrupa dilleri için %40, en olumsuz senaryolar için %50 genişlemeyle test yapın. Yerleşiminiz %50 genişlemeye dayanıyorsa neredeyse tüm dilleri destekleyebilir.
4

i18n için tasarım ilkeleri

Metin genişlemesini destekleyen yerleşimler oluşturmak, çeviri çalışmaları başlamadan önce tasarım kararları alınmasını gerektirir. Bu uygulamalar genişlemeyle ilgili en yaygın hataları önler.

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

i18n Agent'ı şimdi deneyin

Çeviri dosyanızı buraya bırakın

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

veya göz atmak için tıklayın

Hedef diller

Kayıt gerekmezAnında fiyat tahmini

Metin genişlemesi hakkında sık sorulan sorular