
Ç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.
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 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ı 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.
# 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)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.
# 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-keysEş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
#!/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
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.'
})Ç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.
// 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 workflowsi18n 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