Skip to main content

Vertimo failų sinchronizavimas: išlaikykite i18n raktus sinchronizuotus visose lokalėse

Kaskart kūrėjui pridėjus raktą į šaltinio lokalę, 15 kitų lokalės failų praranda sinchronizaciją. Dėl trūkstamų raktų naudotojai mato neapdorotus kelius. Pasenę raktai eikvoja vertėjų laiką ir didina paketo dydį. Automatizuotas sinchronizavimas išlaiko viską suderinta.

1

Sinchronizavimo problema

Vertimo failai nuolat išsiskiria. Kūrėjas prideda „settings.notifications.title“ į en.json, bet pamiršta pridėti į kitus 15 lokalės failų. Kitas kūrėjas pašalina „onboarding.welcome“ iš kodo, bet palieka visuose lokalės failuose. Trečias kūrėjas angliškame faile pervadina „user.name“ į „user.displayName“, bet to nepadaro kitose lokalėse. Per kelis mėnesius lokalės failai išsiskiria: lokalėse trūksta raktų, yra pasenusių arba nesutampančių raktų.

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ūkstami raktai yra blogiau nei trūkstami vertimai. Trūkstamam vertimui galima naudoti šaltinio kalbą. Dėl trūkstamo rakto kyla vykdymo klaida, naudotojui rodomas neapdorotas rakto kelias arba atvaizduojama tuščia eilutė. Sinchronizavimas turi būti užtikrinamas, o ne paliekamas vilčiai.
2

Trūkstamų raktų aptikimas

Trūkstamas raktas yra raktas, esantis šaltinio lokalėje, bet nesantis tikslinėje. Tai dažniausia ir žalingiausia sinchronizavimo problema – naudotojai vietoje išversto teksto mato neapdorotus raktų kelius, pvz., „settings.notifications.title“. i18n-validate aptinka trūkstamus raktus palygindama kiekvienos lokalės raktų struktūrą su šaltiniu.

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)
Paleiskite i18n-validate su žyma --check missing-keys, kad susitelktumėte būtent į sinchronizavimo problemas. Naudokite --severity error, kad dėl trūkstamų raktų CI patikra nepavyktų ir jie būtų ištaisyti prieš suliejant.
3

Pasenusių raktų aptikimas

Pasenęs raktas yra raktas, esantis vertimo failuose, bet nebenaudojamas kode. Pasenę raktai eikvoja vertėjų laiką (vertėjai verčia eilutes, kurių niekas nemato), didina paketo dydį ir kelia painiavą prižiūrint. Norint aptikti pasenusius raktus, reikia palyginti lokalės failus su kodo nuorodomis.

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

Sinchronizavimo automatizavimas

Veiksmingiausia sinchronizavimo strategija sujungia tris sluoksnius: 1) išankstinio fiksavimo kablius, tikrinančius sinchronizaciją per kiekvieną fiksavimą; 2) CI konvejerio patikras, blokuojančias suliejimą esant sinchronizavimo problemų; 3) periodines išsamias patikras, aptinkančias dėl skubių pataisų ir rankinio redagavimo susikaupusį išsiskyrimą.

.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

Vertimų aprėpties ataskaitos

Vertimų aprėptis – tai šaltinio raktų, turinčių vertimus kiekvienoje tikslinėje lokalėje, procentinė dalis. i18n-validate sugeneruoja aprėpties ataskaitą su kiekvienos lokalės procentine dalimi ir išryškina atsiliekančias lokales. Naudodami aprėpties ribas CI aplinkoje blokuokite suliejimus, kai aprėptis nukrenta žemiau priimtino lygio.

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
Skirtingoms lokalėms nustatykite skirtingas aprėpties ribas. Pagrindinėms lokalėms (de, fr, ja) gali reikėti 100 % aprėpties, o naujai pridėtos lokalės (th, vi) gali pradėti nuo 80 % ir laikui bėgant kelti ribą.

Išbandykite i18n Agent dabar

Nuvilkite vertimo failą čia

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

arba spustelėkite norėdami pasirinkti

Tikslinės kalbos

Registruotis nereikiaMomentinis įvertis

DUK apie vertimo failų sinchronizavimą