Skip to main content

Tulkojumu failu sinhronizācija: uzturiet i18n atslēgas sinhronizētas visās lokālēs

Ikreiz, kad izstrādātājs avota lokālei pievieno atslēgu, 15 citi lokāļu faili vairs nav sinhronizēti. Trūkstošas atslēgas lietotājiem rāda neapstrādātus ceļus. Novecojušas atslēgas izšķiež tulkotāju laiku un palielina komplekta lielumu. Automatizēta sinhronizācija uztur visu saskaņotu.

1

Sinhronizācijas problēma

Tulkojumu faili pastāvīgi atšķiras. Izstrādātājs pievieno „settings.notifications.title“ failam en.json, bet aizmirst to pievienot pārējiem 15 lokāļu failiem. Cits izstrādātājs izņem „onboarding.welcome“ no koda, bet atstāj visos lokāļu failos. Trešais izstrādātājs angļu failā pārdēvē „user.name“ par „user.displayName“, bet ne citās lokālēs. Mēnešu gaitā lokāļu faili atšķiras: dažādās lokālēs atslēgu trūkst, tās ir novecojušas vai nesakrīt.

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
}
Trūkstošas atslēgas ir sliktākas par trūkstošiem tulkojumiem. Trūkstošs tulkojums var atkāpties uz avota valodu. Trūkstoša atslēga izraisa izpildlaika kļūdu, rāda lietotājam neapstrādātu atslēgas ceļu vai renderē tukšu virkni. Sinhronizācija ir jānodrošina, nevis uz to jācer.
2

Trūkstošu atslēgu noteikšana

Trūkstoša atslēga ir atslēga, kas ir avota lokālē, bet nav mērķa lokālē. Tā ir visbiežākā un kaitīgākā sinhronizācijas problēma — lietotāji tulkota teksta vietā redz neapstrādātus atslēgu ceļus, piemēram, „settings.notifications.title“. i18n-validate nosaka trūkstošas atslēgas, salīdzinot katras lokāles atslēgu struktūru ar avotu.

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)
Palaidiet i18n-validate ar karodziņu --check missing-keys, lai koncentrētos tieši uz sinhronizācijas problēmām. Izmantojiet --severity error, lai trūkstošu atslēgu dēļ CI pārbaude neizdotos un tās tiktu izlabotas pirms sapludināšanas.
3

Novecojušu atslēgu noteikšana

Novecojusi atslēga ir atslēga, kas ir tulkojumu failos, bet uz kuru kodā vairs nav atsauces. Novecojušas atslēgas izšķiež tulkotāju laiku (tulkotāji tulko virknes, ko neviens neredz), palielina komplekta lielumu un rada uzturēšanas neskaidrības. Novecojušu atslēgu noteikšanai lokāļu faili jāsalīdzina ar koda atsaucēm.

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

Sinhronizācijas automatizēšana

Visefektīvākā sinhronizācijas stratēģija apvieno trīs slāņus: 1) pirmskomita āķus, kas validē sinhronizāciju katrā komitā; 2) CI konveijera pārbaudes, kas bloķē sapludināšanu sinhronizācijas problēmu gadījumā; 3) periodiskus pilnus auditus, kas atklāj steidzamu labojumu un manuālu rediģējumu uzkrātās novirzes.

.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

Tulkojumu pārklājuma pārskati

Tulkojumu pārklājums ir to avota atslēgu procentuālā daļa, kam ir tulkojumi katrā mērķa lokālē. i18n-validate ģenerē pārklājuma pārskatu ar katras lokāles procentuālo daļu, izceļot lokāles, kas atpaliek. Izmantojiet pārklājuma sliekšņus CI vidē, lai bloķētu sapludināšanu, ja pārklājums nokrītas zem pieņemama līmeņa.

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
Dažādām lokālēm iestatiet atšķirīgus pārklājuma sliekšņus. Galvenajām lokālēm (de, fr, ja) var būt nepieciešams 100 % pārklājums, bet tikko pievienotās lokāles (th, vi) var sākt ar 80 % un laika gaitā paaugstināt slieksni.

Izmēģiniet i18n Agent tūlīt

Nometiet tulkošanas failu šeit

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

vai noklikšķiniet, lai izvēlētos

Mērķa valodas

Reģistrācija nav vajadzīgaTūlītēja tāme

Bieži uzdotie jautājumi par tulkojumu failu sinhronizāciju