
Tõlkefailide sünkroonimine: hoia i18n-i võtmed kõigis lokaatides sünkroonis
Iga kord, kui arendaja lisab lähteandmete lokaati võtme, lähevad 15 muud lokaadifaili sünkroonist välja. Puuduvad võtmed näitavad kasutajatele töötlemata teid. Aegunud võtmed raiskavad tõlkijate aega ja suurendavad paketi mahtu. Automaatne sünkroonimine hoiab kõik kooskõlas.
Sünkroonimisprobleem
Tõlkefailid lahknevad pidevalt. Arendaja lisab faili en.json võtme 'settings.notifications.title', kuid unustab selle lisada ülejäänud 15 lokaadifaili. Teine arendaja eemaldab koodist võtme 'onboarding.welcome', kuid jätab selle kõigisse lokaadifailidesse. Kolmas nimetab ingliskeelse võtme 'user.name' ümber võtmeks 'user.displayName', kuid ei tee seda teistes lokaatides. Kuude jooksul lokaadifailid lahknevad: võtmed puuduvad, on aegunud või ei ühti lokaatide vahel.
// 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
}Puuduvate võtmete tuvastamine
Puuduv võti on võti, mis on lähteandmete lokaadis, kuid mitte sihtlokaadis. See on kõige levinum ja kahjulikum sünkroonimisprobleem: kasutajad näevad tõlgitud teksti asemel töötlemata võtmeteid, näiteks 'settings.notifications.title'. i18n-validate tuvastab puuduvad võtmed, võrreldes iga lokaadi võtmestruktuuri lähteandmetega.
# 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)Aegunud võtmete tuvastamine
Aegunud võti on tõlkefailides olev võti, millele kood enam ei viita. Aegunud võtmed raiskavad tõlkijate aega, sest tõlgitakse stringe, mida keegi ei näe, suurendavad paketi mahtu ja tekitavad hoolduses segadust. Nende tuvastamiseks tuleb lokaadifaile koodiviidetega võrrelda.
# 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-keysSünkroonimise automatiseerimine
Kõige tõhusam sünkroonimisstrateegia ühendab kolm kihti: 1) Commitieelsed hook'id, mis valideerivad sünkroonsust iga commit'i puhul. 2) CI-konveieri kontrollid, mis blokeerivad sünkroonimisprobleemidega muudatuste ühendamise. 3) Korrapärased täisauditid, mis tuvastavad kiirparandustest ja käsitsi muudatustest kogunenud lahknevuse.
# .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.'
})Tõlkekatvuse aruandlus
Tõlkekatvus on lähteandmete võtmete protsent, millel on igas sihtlokaadis tõlge. i18n-validate loob katvusaruande, mis näitab protsente lokaadi kaupa ja tõstab esile maha jäävad lokaadid. Kasuta CI-s katvuslävendeid, et blokeerida ühendamine, kui katvus langeb alla vastuvõetava taseme.
// 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 workflowsProovi i18n Agent'i kohe
Kukuta tõlkefail siia
JSON, YAML, PO, XML, CSV, Markdown, Properties
või klõpsa faili valimiseks
Sihtkeeled