Skip to main content

Çeviri dosyası eşitleme: i18n anahtarlarını yerel ayarlar arasında eşit tutun

Bir geliştirici kaynak yerel ayara her anahtar eklediğinde diğer 15 yerel ayar dosyası eşitliğini kaybeder. Eksik anahtarlar kullanıcılara ham yollar gösterir. Güncelliğini yitirmiş anahtarlar çevirmenlerin zamanını boşa harcar ve paket boyutunu artırır. Otomatik eşitleme her şeyi uyumlu tutar.

1

Eşitleme sorunu

Çeviri dosyaları sürekli birbirinden uzaklaşır. Bir geliştirici en.json dosyasına 'settings.notifications.title' anahtarını ekler ancak diğer 15 yerel ayar dosyasına eklemeyi unutur. Başka bir geliştirici 'onboarding.welcome' anahtarını koddan kaldırır ancak tüm yerel ayar dosyalarında bırakır. Üçüncü bir geliştirici İngilizce dosyada 'user.name' anahtarını 'user.displayName' olarak değiştirir ancak diğer yerel ayarlarda değiştirmez. Aylar içinde yerel ayar dosyalarınız farklılaşır; anahtarlar eksik, güncelliğini yitirmiş veya yerel ayarlar arasında uyumsuz hâle gelir.

The drift problem
// The problem: translation files drift out of sync

// Developer adds a new feature with new keys:
// en.json (source of truth)
{
  "nav.home": "Home",
  "nav.about": "About",
  "nav.pricing": "Pricing",     // NEW
  "nav.changelog": "Changelog"  // NEW
}

// de.json (out of sync - missing new keys)
{
  "nav.home": "Startseite",
  "nav.about": "Über uns"
  // nav.pricing - MISSING
  // nav.changelog - MISSING
}

// de.json also has stale keys from deleted features:
{
  "nav.home": "Startseite",
  "nav.about": "Über uns",
  "nav.legacy_page": "Alte Seite"  // STALE - removed from en.json
}
Eksik anahtarlar, eksik çevirilerden daha kötüdür. Eksik bir çeviri kaynak dile geri dönebilir. Eksik bir anahtar ise çalışma zamanı hatasına neden olur, kullanıcıya ham anahtar yolunu gösterir veya boş bir dize görüntüler. Eşitlemenin gerçekleşmesi umulmamalı, zorunlu tutulmalıdır.
2

Eksik anahtarları tespit etme

Eksik anahtar, kaynak yerel ayarda bulunup hedef yerel ayarda bulunmayan anahtardır. Bu, en yaygın ve en zararlı eşitleme sorunudur; kullanıcılar çevrilmiş metin yerine 'settings.notifications.title' gibi ham anahtar yollarını görür. i18n-validate, her yerel ayarın anahtar yapısını kaynakla karşılaştırarak eksik anahtarları tespit eder.

Terminal
# Detect missing and stale keys
npx i18n-validate sync \
  --source locales/en.json \
  --targets 'locales/*.json'

# Output:
# locales/de.json:
#   Missing keys (2):
#     - nav.pricing
#     - nav.changelog
#   Stale keys (1):
#     - nav.legacy_page
#   Coverage: 66.7% (2/3 keys)
#
# locales/ja.json:
#   Missing keys (5):
#     - nav.pricing
#     - nav.changelog
#     - settings.theme
#     - settings.language
#     - settings.notifications
#   Coverage: 50.0% (5/10 keys)
Özellikle eşitleme sorunlarına odaklanmak için i18n-validate aracını --check missing-keys bayrağıyla çalıştırın. Eksik anahtarların CI'ı başarısız kılmasını ve birleştirmeden önce düzeltilmesini sağlamak için --severity error kullanın.
3

Güncelliğini yitirmiş anahtarları tespit etme

Güncelliğini yitirmiş anahtar, çeviri dosyalarında bulunan ancak artık kodda başvurulmayan anahtardır. Bu anahtarlar çevirmenlerin zamanını boşa harcar (çevirmenler kimsenin görmediği dizeleri çevirir), paket boyutunu artırır ve bakım sırasında karışıklık yaratır. Bunları tespit etmek için yerel ayar dosyalarını koddaki başvurularla karşılaştırmak gerekir.

Terminal
# Step 1: Check which files are out of sync
npx i18n-validate sync --source locales/en.json --targets 'locales/*.json'

# Step 2: Auto-fill missing keys with source values (as placeholders)
npx i18n-validate sync \
  --source locales/en.json \
  --targets 'locales/*.json' \
  --fill-missing \
  --fill-value "[NEEDS TRANSLATION] {{source}}"

# Step 3: Remove stale keys no longer in source
npx i18n-validate sync \
  --source locales/en.json \
  --targets 'locales/*.json' \
  --remove-stale

# Step 4: Sort keys to match source order (cleaner diffs)
npx i18n-validate sync \
  --source locales/en.json \
  --targets 'locales/*.json' \
  --sort-keys

# All at once:
npx i18n-validate sync \
  --source locales/en.json \
  --targets 'locales/*.json' \
  --fill-missing \
  --remove-stale \
  --sort-keys
4

Eşitlemeyi otomatikleştirme

En etkili eşitleme stratejisi üç katmanı birleştirir: 1) Her işlemede eşitlemeyi doğrulayan ön işleme kancaları. 2) Eşitleme sorunları bulunan birleştirmeleri engelleyen CI işlem hattı denetimleri. 3) Hızlı düzeltmeler ve elle yapılan değişiklikler nedeniyle biriken sapmaları yakalayan düzenli tam denetimler.

.husky/pre-commit
# .husky/pre-commit
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

# Check if source locale file changed
SOURCE_CHANGED=$(git diff --cached --name-only | grep -c 'locales/en.json')

if [ "$SOURCE_CHANGED" -gt 0 ]; then
  echo "Source locale changed - checking sync..."

  npx i18n-validate sync \
    --source locales/en.json \
    --targets 'locales/*.json' \
    --fail-on-missing \
    --min-coverage 90

  if [ $? -ne 0 ]; then
    echo ""
    echo "Translation files are out of sync!"
    echo "Run: npx i18n-validate sync --fill-missing"
    exit 1
  fi
fi
.github/workflows/i18n-sync.yml
# .github/workflows/i18n-sync.yml
name: Translation Sync Check

on:
  pull_request:
    paths:
      - 'locales/**'

jobs:
  sync-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Check translation sync
        run: npx i18n-validate sync \
          --source locales/en.json \
          --targets 'locales/*.json' \
          --fail-on-missing \
          --min-coverage 95

      - name: Comment on PR if out of sync
        if: failure()
        uses: actions/github-script@v7
        with:
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'Translation files are out of sync. Please run npx i18n-validate sync --fill-missing and commit.'
            })
5

Çeviri kapsamını raporlama

Çeviri kapsamı, her hedef yerel ayarda çevirisi bulunan kaynak anahtarların yüzdesidir. i18n-validate, yerel ayar başına yüzdeleri gösteren ve geride kalan yerel ayarları vurgulayan bir kapsam raporu oluşturur. Kapsam kabul edilebilir düzeyin altına düştüğünde birleştirmeleri engellemek için CI'da kapsam eşikleri kullanın.

Namespace-based sync
// Split large translation files by feature/namespace
// locales/
// ├── en/
// │   ├── common.json      (nav, footer, errors)
// │   ├── auth.json         (login, register, reset)
// │   ├── dashboard.json    (dashboard-specific)
// │   └── settings.json     (settings page)
// ├── de/
// │   ├── common.json
// │   ├── auth.json
// │   ├── dashboard.json
// │   └── settings.json

// Sync with namespace support:
npx i18n-validate sync \
  --source 'locales/en/*.json' \
  --targets 'locales/*/%.json' \
  --namespace-pattern '{locale}/{namespace}.json'

// Benefits:
// - Smaller files, easier to review
// - Feature teams own their translations
// - Lazy-load only needed namespaces
// - Parallel translation workflows
Farklı yerel ayarlar için farklı kapsam eşikleri belirleyin. Birincil yerel ayarlarınız (de, fr, ja) %100 kapsam gerektirebilirken yeni eklenen yerel ayarlar (th, vi) %80'den başlayıp zamanla kademeli olarak yükseltilebilir.

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

Çeviri dosyası eşitleme hakkında sık sorulan sorular