Skip to main content

Synchronizace překladových souborů: Udržujte klíče i18n synchronizované napříč locales

Pokaždé, když vývojář přidá klíč do zdrojového locale, dalších 15 locale souborů se dostane mimo synchronizaci. Chybějící klíče ukazují uživatelům nezpracované cesty ke klíčům. Zastaralé klíče plýtvají časem překladatelů a zvětšují bundle. Automatizovaná synchronizace udržuje vše sladěné.

1

Problém se synchronizací

Překladové soubory se neustále rozcházejí. Vývojář přidá 'settings.notifications.title' do en.json, ale zapomene ho přidat do dalších 15 locale souborů. Jiný vývojář odstraní 'onboarding.welcome' z kódu, ale nechá ho ve všech locale souborech. Třetí vývojář přejmenuje 'user.name' na 'user.displayName' v angličtině, ale ne v ostatních locales. Během měsíců se Vaše locale soubory rozjedou: klíče chybí, jsou zastaralé nebo se mezi locales neshodují.

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
}
Chybějící klíče jsou horší než chybějící překlady. U chybějícího překladu lze spadnout zpět na zdrojový jazyk. Chybějící klíč způsobí runtime chybu, zobrazí uživateli nezpracovanou cestu ke klíči, nebo vykreslí prázdný řetězec. Synchronizaci je potřeba vynucovat, ne v ni doufat.
2

Detekce chybějících klíčů

Chybějící klíč je klíč, který existuje ve zdrojovém locale, ale ne v cílovém locale. Jde o nejčastější problém se synchronizací a zároveň nejškodlivější — uživatelé vidí nezpracované cesty jako 'settings.notifications.title' místo přeloženého textu. i18n-validate detekuje chybějící klíče porovnáním struktury klíčů každého locale se zdrojem.

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)
Spusťte i18n-validate s příznakem --check missing-keys, abyste se zaměřili přímo na problémy se synchronizací. Použijte --severity error, aby chybějící klíče shodily CI a byly opraveny před merge.
3

Detekce zastaralých klíčů

Zastaralý klíč je klíč, který existuje v překladových souborech, ale už se na něj v kódu neodkazuje. Zastaralé klíče plýtvají časem překladatelů (překládají texty, které nikdo nevidí), zvyšují velikost bundle a vytvářejí zmatek při údržbě. Detekce zastaralých klíčů vyžaduje křížové porovnání locale souborů s referencemi v kódu.

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

Automatizace synchronizace

Nejúčinnější strategie synchronizace kombinuje tři vrstvy: 1) Pre-commit hooky, které validují synchronizaci při každém commitu. 2) Kontroly v CI pipeline, které zablokují merge při problémech se synchronizací. 3) Pravidelné plné audity, které zachytí drift nahromaděný hotfixy a ručními úpravami.

.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

Reportování pokrytí překladů

Pokrytí překladů je procento zdrojových klíčů, které mají překlad v každém cílovém locale. i18n-validate vygeneruje report pokrytí s procenty pro jednotlivé locales a zvýrazní ty, které zaostávají. V CI používejte prahové hodnoty pokrytí, abyste zablokovali merge, pokud pokrytí klesne pod přijatelnou úroveň.

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
Nastavte různé prahové hodnoty pokrytí pro různé locales. Vaše primární locales (de, fr, ja) mohou vyžadovat 100% pokrytí, zatímco nově přidané locales (th, vi) mohou začínat na 80 % a postupně se zvyšovat.

Vyzkoušejte i18n Agent nyní

Sem přetáhněte svůj překladový soubor

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

nebo klikněte a vyberte soubor

Cílové jazyky

Bez registraceOkamžitý odhad

FAQ k synchronizaci překladových souborů