Skip to main content

Tõlkefailide sünkroonimine: hoia i18n-i võtmed kõigis lokaatides sünkroonis

Iga kord, kui arendaja lisab lähteandmete lokaati võtme, lähevad 15 muud lokaadifaili sünkroonist välja. Puuduvad võtmed näitavad kasutajatele töötlemata teid. Aegunud võtmed raiskavad tõlkijate aega ja suurendavad paketi mahtu. Automaatne sünkroonimine hoiab kõik kooskõlas.

1

Sünkroonimisprobleem

Tõlkefailid lahknevad pidevalt. Arendaja lisab faili en.json võtme 'settings.notifications.title', kuid unustab selle lisada ülejäänud 15 lokaadifaili. Teine arendaja eemaldab koodist võtme 'onboarding.welcome', kuid jätab selle kõigisse lokaadifailidesse. Kolmas nimetab ingliskeelse võtme 'user.name' ümber võtmeks 'user.displayName', kuid ei tee seda teistes lokaatides. Kuude jooksul lokaadifailid lahknevad: võtmed puuduvad, on aegunud või ei ühti lokaatide vahel.

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
}
Puuduvad võtmed on hullemad kui puuduvad tõlked. Puuduva tõlke korral saab kasutada lähtekeelt. Puuduv võti põhjustab käitusajavea, näitab kasutajale töötlemata võtmeteed või renderdab tühja stringi. Sünkroonimist tuleb jõustada, mitte selle peale lootma jääda.
2

Puuduvate võtmete tuvastamine

Puuduv võti on võti, mis on lähteandmete lokaadis, kuid mitte sihtlokaadis. See on kõige levinum ja kahjulikum sünkroonimisprobleem: kasutajad näevad tõlgitud teksti asemel töötlemata võtmeteid, näiteks 'settings.notifications.title'. i18n-validate tuvastab puuduvad võtmed, võrreldes iga lokaadi võtmestruktuuri lähteandmetega.

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)
Käivita i18n-validate lipuga --check missing-keys, et keskenduda just sünkroonimisprobleemidele. Kasuta lippu --severity error, et puuduvad võtmed kukutaksid CI läbi ja parandataks enne ühendamist.
3

Aegunud võtmete tuvastamine

Aegunud võti on tõlkefailides olev võti, millele kood enam ei viita. Aegunud võtmed raiskavad tõlkijate aega, sest tõlgitakse stringe, mida keegi ei näe, suurendavad paketi mahtu ja tekitavad hoolduses segadust. Nende tuvastamiseks tuleb lokaadifaile koodiviidetega võrrelda.

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

Sünkroonimise automatiseerimine

Kõige tõhusam sünkroonimisstrateegia ühendab kolm kihti: 1) Commitieelsed hook'id, mis valideerivad sünkroonsust iga commit'i puhul. 2) CI-konveieri kontrollid, mis blokeerivad sünkroonimisprobleemidega muudatuste ühendamise. 3) Korrapärased täisauditid, mis tuvastavad kiirparandustest ja käsitsi muudatustest kogunenud lahknevuse.

.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

Tõlkekatvuse aruandlus

Tõlkekatvus on lähteandmete võtmete protsent, millel on igas sihtlokaadis tõlge. i18n-validate loob katvusaruande, mis näitab protsente lokaadi kaupa ja tõstab esile maha jäävad lokaadid. Kasuta CI-s katvuslävendeid, et blokeerida ühendamine, kui katvus langeb alla vastuvõetava taseme.

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
Määra eri lokaatidele erinevad katvuslävendid. Peamistelt lokaatidelt (de, fr, ja) võib nõuda 100-protsendist katvust, samas kui äsja lisatud lokaadid (th, vi) võivad alustada 80 protsendist ja lävendit aja jooksul tõsta.

Proovi i18n Agent'i kohe

Kukuta tõlkefail siia

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

või klõpsa faili valimiseks

Sihtkeeled

Registreerumine pole vajalikKohene hinnang

Tõlkefailide sünkroonimise KKK