Skip to main content

Käännöstiedostojen synkronointi: pidä i18n-avaimet yhtenäisinä kaikilla kielialueilla

Aina kun kehittäjä lisää avaimen lähdekielialueeseen, 15 muuta kielialuetiedostoa lakkaavat olemasta synkronoituja. Puuttuvat avaimet näyttävät käyttäjille käsittelemättömiä polkuja. Vanhentuneet avaimet tuhlaavat kääntäjien aikaa ja kasvattavat pakettikokoa. Automaattinen synkronointi pitää kaiken yhtenäisenä.

1

Synkronointiongelma

Käännöstiedostot ajautuvat jatkuvasti erilleen. Kehittäjä lisää avaimen 'settings.notifications.title' tiedostoon en.json mutta unohtaa lisätä sen 15 muuhun kielialuetiedostoon. Toinen kehittäjä poistaa avaimen 'onboarding.welcome' koodista mutta jättää sen kaikkiin kielialuetiedostoihin. Kolmas nimeää englanninkielisen avaimen 'user.name' uudelleen muotoon 'user.displayName' mutta ei tee samaa muilla kielialueilla. Kuukausien mittaan kielialuetiedostot eroavat toisistaan: avaimia puuttuu, ne ovat vanhentuneita tai eivät vastaa toisiaan.

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
}
Puuttuvat avaimet ovat pahempi ongelma kuin puuttuvat käännökset. Puuttuvasta käännöksestä voidaan palata lähdekieleen. Puuttuva avaimen vuoksi tapahtuu ajonaikainen virhe, käyttäjälle näytetään käsittelemätön avainpolku tai hahmonnetaan tyhjä merkkijono. Synkronointi on varmistettava eikä jätettävä toivon varaan.
2

Puuttuvien avainten tunnistaminen

Puuttuva avain on avain, joka on lähdekielialueessa mutta ei kohdekielialueessa. Tämä on yleisin ja haitallisin synkronointiongelma: käyttäjät näkevät käännetyn tekstin sijaan käsittelemättömiä avainpolkuja, kuten 'settings.notifications.title'. i18n-validate löytää puuttuvat avaimet vertaamalla kunkin kielialueen avainrakennetta lähteeseen.

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)
Keskity synkronointiongelmiin suorittamalla i18n-validate valitsimella --check missing-keys. Aseta puuttuvat avaimet kaatamaan CI valitsimella --severity error, jotta ne korjataan ennen yhdistämistä.
3

Vanhentuneiden avainten tunnistaminen

Vanhentunut avain on käännöstiedostoissa oleva avain, johon koodi ei enää viittaa. Vanhentuneet avaimet tuhlaavat kääntäjien aikaa, sillä he kääntävät merkkijonoja, joita kukaan ei näe, kasvattavat pakettikokoa ja hämmentävät ylläpitoa. Niiden tunnistaminen edellyttää kielialuetiedostojen vertaamista koodiviittauksiin.

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

Synkronoinnin automatisointi

Tehokkain synkronointistrategia yhdistää kolme kerrosta: 1) Commitia edeltävät koukut, jotka validoivat synkronoinnin jokaisella commitilla. 2) CI-putken tarkistukset, jotka estävät synkronointiongelmia sisältävien muutosten yhdistämisen. 3) Säännölliset täydet tarkastukset, jotka löytävät pikakorjauksista ja manuaalisista muokkauksista kertyneen eriytymisen.

.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

Käännöskattavuuden raportointi

Käännöskattavuus on niiden lähdeavainten prosenttiosuus, joille on käännös kullakin kohdekielialueella. i18n-validate luo kattavuusraportin, joka näyttää prosenttiosuudet kielialueittain ja korostaa jälkeen jäävät kielialueet. Estä CI:n kattavuuskynnyksillä yhdistäminen, kun kattavuus laskee hyväksyttävän tason alle.

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
Aseta eri kielialueille eri kattavuuskynnykset. Ensisijaisilta kielialueilta (de, fr, ja) voidaan vaatia 100 prosentin kattavuus, kun taas juuri lisätyt kielialueet (th, vi) voivat aloittaa 80 prosentista ja nostaa kynnystä vähitellen.

Kokeile i18n Agent:ia nyt

Pudota käännöstiedostosi tähän

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

tai valitse napsauttamalla

Kohdekielet

Rekisteröitymistä ei tarvitaVälitön arvio

Käännöstiedostojen synkronoinnin usein kysytyt kysymykset