Skip to main content

Fordításfájl-szinkronizálás: i18n-kulcsok szinkronban tartása

Amikor egy fejlesztő kulcsot ad a forrásterülethez, 15 másik fájl kiesik a szinkronból. A hiányzó kulcsok nyers útvonalat mutatnak; az elavultak fordítói időt és csomagméretet pazarolnak. Az automatizált szinkron mindent összehangol.

1

A szinkronizálási probléma

A fordításfájlok folyamatosan eltérnek. Valaki hozzáadja a „settings.notifications.title” kulcsot az en.json fájlhoz, de elfelejti a másik 15 területet. Más eltávolítja az „onboarding.welcome” kulcsot a kódból, de a fájlokban hagyja. Egy harmadik „user.name” kulcsot „user.displayName” értékre nevez át csak angolul. Hónapok alatt a fájlok szétcsúsznak: hiányzó, elavult vagy nem egyező kulcsok lesznek.

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
}
A hiányzó kulcs rosszabb a hiányzó fordításnál. A hiányzó fordítás visszaválthat a forrásnyelvre. A hiányzó kulcs futásidejű hibát okoz, nyers kulcsútvonalat vagy üres karakterláncot mutat. A szinkront ki kell kényszeríteni, nem remélni.
2

Hiányzó kulcsok észlelése

A hiányzó kulcs a forrásterületen létezik, a célterületen nem. Ez a leggyakoribb és legkárosabb szinkronhiba — a felhasználók lefordított szöveg helyett nyers útvonalat, például „settings.notifications.title” értéket látnak. Az i18n-validate minden terület kulcsszerkezetét a forrással összehasonlítva észleli.

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)
Kifejezetten a szinkronhibákhoz futtassa az i18n-validate eszközt --check missing-keys kapcsolóval. --severity error használatával a hiányzó kulcsok meghiúsítják a CI-t, így egyesítés előtt javítani kell őket.
3

Elavult kulcsok észlelése

Az elavult kulcs szerepel a fordításfájlokban, de a kód már nem hivatkozik rá. Fordítói időt pazarol, növeli a csomagméretet és karbantartási zavart okoz. Észleléséhez a területifájlokat a kódbeli hivatkozásokkal kell összevetni.

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

A szinkron automatizálása

A leghatékonyabb stratégia három réteg: 1) minden commitnál pre-commit szinkronellenőrzés, 2) szinkronhibás egyesítést blokkoló CI, 3) gyorsjavításokból és kézi módosításokból felgyűlt eltéréseket kereső rendszeres teljes ellenőrzés.

.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

Fordítási lefedettségi jelentés

A fordítási lefedettség a forráskulcsok célterületen lefordított százaléka. Az i18n-validate területenkénti jelentést készít, kiemelve a lemaradó területeket. CI-küszöbértékkel blokkolja az egyesítést elfogadható szint alatti lefedettségnél.

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
Területenként eltérő küszöböt állítson. Az elsődleges területek (de, fr, ja) 100%-ot igényelhetnek, az új területek (th, vi) 80%-ról indulhatnak, majd fokozatosan emelhetők.

Try i18n Agent Now

Drop your translation file here

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

or click to browse

Target languages

No signup requiredInstant estimate

Fordításfájl-szinkronizálás – gyakori kérdések