Skip to main content

Synchronizacja plików tłumaczeń: synchronizuj klucze i18n między językami

Za każdym razem, gdy programista dodaje klucz do języka źródłowego, 15 pozostałych plików językowych traci synchronizację. Brakujące klucze pokazują użytkownikom surowe ścieżki. Nieaktualne klucze marnują czas tłumaczy i zwiększają rozmiar pakietu. Automatyczna synchronizacja utrzymuje wszystko w zgodności.

1

Problem z synchronizacją

Pliki tłumaczeń stale się rozchodzą. Programista dodaje 'settings.notifications.title' do en.json, ale zapomina dodać go do 15 pozostałych plików językowych. Inny usuwa 'onboarding.welcome' z kodu, lecz pozostawia go we wszystkich plikach językowych. Trzeci zmienia nazwę 'user.name' na 'user.displayName' po angielsku, ale nie w pozostałych językach. Po kilku miesiącach pliki zaczynają się różnić: kluczy brakuje, są nieaktualne lub niedopasowane między językami.

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
}
Brakujące klucze są gorsze od brakujących tłumaczeń. Brakujące tłumaczenie może zostać zastąpione językiem źródłowym. Brakujący klucz powoduje błąd podczas działania, pokazuje użytkownikowi surową ścieżkę albo renderuje pusty ciąg. Synchronizację trzeba egzekwować, a nie na nią liczyć.
2

Wykrywanie brakujących kluczy

Brakujący klucz występuje w języku źródłowym, ale nie docelowym. Jest to najczęstszy i najbardziej szkodliwy problem synchronizacji — użytkownicy widzą surowe ścieżki, takie jak 'settings.notifications.title', zamiast przetłumaczonego tekstu. i18n-validate wykrywa brakujące klucze przez porównanie struktury kluczy każdego języka ze źródłem.

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)
Uruchom i18n-validate z flagą --check missing-keys, aby skupić się wyłącznie na problemach z synchronizacją. Użyj --severity error, aby brakujące klucze powodowały niepowodzenie CI i musiały zostać naprawione przed scaleniem.
3

Wykrywanie nieaktualnych kluczy

Nieaktualny klucz występuje w plikach tłumaczeń, ale kod już się do niego nie odwołuje. Takie klucze marnują czas tłumaczy, którzy przekładają niewidoczne ciągi, zwiększają rozmiar pakietu i utrudniają konserwację. Ich wykrywanie wymaga zestawienia plików językowych z odwołaniami w kodzie.

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

Automatyzowanie synchronizacji

Najskuteczniejsza strategia synchronizacji łączy trzy warstwy: 1) hooki pre-commit, które walidują synchronizację przy każdym zatwierdzeniu; 2) kontrole pipeline CI, które blokują scalenia z problemami synchronizacji; 3) okresowe pełne audyty wykrywające rozbieżności nagromadzone wskutek poprawek awaryjnych i ręcznych zmian.

.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

Raportowanie pokrycia tłumaczeń

Pokrycie tłumaczeń to odsetek kluczy źródłowych, które mają tłumaczenie w każdym języku docelowym. i18n-validate generuje raport pokazujący procent dla poszczególnych języków i wyróżnia te pozostające w tyle. Używaj progów pokrycia w CI, aby blokować scalenia, gdy wynik spada poniżej akceptowalnego poziomu.

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
Ustaw różne progi pokrycia dla różnych języków. Główne języki (de, fr, ja) mogą wymagać 100% pokrycia, a nowo dodane (th, vi) zacząć od 80% i stopniowo zwiększać próg.

Wypróbuj i18n Agent

Upuść tutaj plik tłumaczenia

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

lub kliknij, aby go wybrać

Języki docelowe

Rejestracja nie jest wymaganaNatychmiastowa wycena

Najczęstsze pytania o synchronizację plików tłumaczeń