Skip to main content

ट्रांसलेशन फ़ाइल सिंक: सभी लोकेल में i18n कुंजियों को सिंक रखें

जब भी कोई डेवलपर स्रोत लोकेल में कुंजी जोड़ता है, तो 15 अन्य लोकेल फ़ाइलें सिंक से बाहर हो जाती हैं। गुम कुंजियों के कारण यूज़र को अपरिष्कृत पाथ दिखाई देते हैं। पुरानी कुंजियाँ ट्रांसलेटर का समय बर्बाद करती हैं और बंडल का आकार बढ़ाती हैं। ऑटोमेटेड सिंक सब कुछ एक समान बनाए रखता है।

1

सिंक की समस्या

ट्रांसलेशन फ़ाइलें लगातार एक-दूसरे से अलग होती जाती हैं। कोई डेवलपर en.json में 'settings.notifications.title' जोड़ता है, लेकिन उसे अन्य 15 लोकेल फ़ाइलों में जोड़ना भूल जाता है। कोई दूसरा डेवलपर कोड से 'onboarding.welcome' हटाता है, लेकिन उसे सभी लोकेल फ़ाइलों में छोड़ देता है। कोई तीसरा डेवलपर अंग्रेज़ी में 'user.name' का नाम बदलकर 'user.displayName' करता है, लेकिन अन्य लोकेल में ऐसा नहीं करता। कुछ महीनों में आपकी लोकेल फ़ाइलों में अंतर बढ़ जाता है: विभिन्न लोकेल में कुंजियाँ गुम, पुरानी या बेमेल हो जाती हैं।

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
}
गुम कुंजियाँ, गुम ट्रांसलेशन से भी गंभीर समस्या हैं। गुम ट्रांसलेशन के लिए स्रोत भाषा का फ़ॉलबैक इस्तेमाल किया जा सकता है। गुम कुंजी के कारण रनटाइम त्रुटि हो सकती है, यूज़र को अपरिष्कृत कुंजी-पाथ दिखाई दे सकता है या खाली स्ट्रिंग रेंडर हो सकती है। सिंक लागू करना आवश्यक है; इसके अपने-आप बने रहने की उम्मीद नहीं की जा सकती।
2

गुम कुंजियों का पता लगाना

गुम कुंजी वह कुंजी है जो स्रोत लोकेल में मौजूद हो, लेकिन लक्ष्य लोकेल में न हो। यह सिंक से जुड़ी सबसे आम और सबसे नुकसानदेह समस्या है—यूज़र को ट्रांसलेट किए गए टेक्स्ट के बजाय 'settings.notifications.title' जैसे अपरिष्कृत कुंजी-पाथ दिखाई देते हैं। i18n-validate हर लोकेल की कुंजी-संरचना की तुलना स्रोत से करके गुम कुंजियों का पता लगाता है।

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)
विशेष रूप से सिंक संबंधी समस्याओं पर ध्यान देने के लिए i18n-validate को --check missing-keys फ़्लैग के साथ चलाएँ। गुम कुंजियों के कारण CI विफल करने के लिए --severity error इस्तेमाल करें, ताकि मर्ज से पहले उन्हें ठीक करना सुनिश्चित हो।
3

पुरानी कुंजियों का पता लगाना

पुरानी कुंजी वह कुंजी है जो ट्रांसलेशन फ़ाइलों में मौजूद हो, लेकिन अब कोड में संदर्भित न होती हो। पुरानी कुंजियों के कारण ट्रांसलेटर का समय बर्बाद होता है (वे उन स्ट्रिंग्स को ट्रांसलेट करते हैं जिन्हें कोई नहीं देखता), बंडल का आकार बढ़ता है और रखरखाव में भ्रम पैदा होता है। पुरानी कुंजियों का पता लगाने के लिए लोकेल फ़ाइलों की कोड संदर्भों से तुलना करनी होती है।

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

सिंक को ऑटोमेट करना

सिंक की सबसे प्रभावी रणनीति में तीन स्तर शामिल होते हैं: 1) हर कमिट पर सिंक सत्यापित करने वाले प्री-कमिट हुक। 2) सिंक संबंधी समस्याओं वाले मर्ज रोकने वाली CI पाइपलाइन जाँच। 3) हॉटफ़िक्स और मैन्युअल बदलावों से समय के साथ उत्पन्न अंतर का पता लगाने वाले नियमित पूर्ण ऑडिट।

.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

ट्रांसलेशन कवरेज की रिपोर्टिंग

ट्रांसलेशन कवरेज, प्रत्येक लक्ष्य लोकेल में ट्रांसलेट की गई स्रोत कुंजियों का प्रतिशत है। i18n-validate हर लोकेल का प्रतिशत दिखाने वाली कवरेज रिपोर्ट बनाता है और पीछे रह रहे लोकेल को हाइलाइट करता है। कवरेज स्वीकार्य स्तर से नीचे जाने पर मर्ज रोकने के लिए CI में कवरेज थ्रेशोल्ड इस्तेमाल करें।

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
अलग-अलग लोकेल के लिए अलग कवरेज थ्रेशोल्ड तय करें। आपके प्राथमिक लोकेल (de, fr, ja) के लिए 100% कवरेज आवश्यक हो सकता है, जबकि नए जोड़े गए लोकेल (th, vi) 80% से शुरू होकर समय के साथ क्रमशः बढ़ सकते हैं।

i18n Agent अभी आज़माएँ

अपनी अनुवाद फ़ाइल यहाँ छोड़ें

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

या ब्राउज़ करने के लिए क्लिक करें

लक्षित भाषाएँ

साइन अप की ज़रूरत नहींतुरंत अनुमान

ट्रांसलेशन फ़ाइल सिंक से जुड़े सामान्य प्रश्न