
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.
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 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
}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.
# 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)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.
# 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-keysAutomatyzowanie 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
#!/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
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.'
})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.
// 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 workflowsWypróbuj i18n Agent
Upuść tutaj plik tłumaczenia
JSON, YAML, PO, XML, CSV, Markdown, Properties
lub kliknij, aby go wybrać
Języki docelowe