
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é.
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 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
}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.
# 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)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.
# 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-keysAutomatizace 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
#!/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.'
})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ň.
// 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 workflowsVyzkouš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