
Vertimo failų sinchronizavimas: išlaikykite i18n raktus sinchronizuotus visose lokalėse
Kaskart kūrėjui pridėjus raktą į šaltinio lokalę, 15 kitų lokalės failų praranda sinchronizaciją. Dėl trūkstamų raktų naudotojai mato neapdorotus kelius. Pasenę raktai eikvoja vertėjų laiką ir didina paketo dydį. Automatizuotas sinchronizavimas išlaiko viską suderinta.
Sinchronizavimo problema
Vertimo failai nuolat išsiskiria. Kūrėjas prideda „settings.notifications.title“ į en.json, bet pamiršta pridėti į kitus 15 lokalės failų. Kitas kūrėjas pašalina „onboarding.welcome“ iš kodo, bet palieka visuose lokalės failuose. Trečias kūrėjas angliškame faile pervadina „user.name“ į „user.displayName“, bet to nepadaro kitose lokalėse. Per kelis mėnesius lokalės failai išsiskiria: lokalėse trūksta raktų, yra pasenusių arba nesutampančių raktų.
// 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
}Trūkstamų raktų aptikimas
Trūkstamas raktas yra raktas, esantis šaltinio lokalėje, bet nesantis tikslinėje. Tai dažniausia ir žalingiausia sinchronizavimo problema – naudotojai vietoje išversto teksto mato neapdorotus raktų kelius, pvz., „settings.notifications.title“. i18n-validate aptinka trūkstamus raktus palygindama kiekvienos lokalės raktų struktūrą su šaltiniu.
# 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)Pasenusių raktų aptikimas
Pasenęs raktas yra raktas, esantis vertimo failuose, bet nebenaudojamas kode. Pasenę raktai eikvoja vertėjų laiką (vertėjai verčia eilutes, kurių niekas nemato), didina paketo dydį ir kelia painiavą prižiūrint. Norint aptikti pasenusius raktus, reikia palyginti lokalės failus su kodo nuorodomis.
# 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-keysSinchronizavimo automatizavimas
Veiksmingiausia sinchronizavimo strategija sujungia tris sluoksnius: 1) išankstinio fiksavimo kablius, tikrinančius sinchronizaciją per kiekvieną fiksavimą; 2) CI konvejerio patikras, blokuojančias suliejimą esant sinchronizavimo problemų; 3) periodines išsamias patikras, aptinkančias dėl skubių pataisų ir rankinio redagavimo susikaupusį išsiskyrimą.
# .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.'
})Vertimų aprėpties ataskaitos
Vertimų aprėptis – tai šaltinio raktų, turinčių vertimus kiekvienoje tikslinėje lokalėje, procentinė dalis. i18n-validate sugeneruoja aprėpties ataskaitą su kiekvienos lokalės procentine dalimi ir išryškina atsiliekančias lokales. Naudodami aprėpties ribas CI aplinkoje blokuokite suliejimus, kai aprėptis nukrenta žemiau priimtino lygio.
// 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 workflowsIšbandykite i18n Agent dabar
Nuvilkite vertimo failą čia
JSON, YAML, PO, XML, CSV, Markdown, Properties
arba spustelėkite norėdami pasirinkti
Tikslinės kalbos