Skip to main content

Pidev lokaliseerimine ilma TMS-ita

Sinu koodi juurutatakse pidevalt. Sama peaks toimuma tõlgetega. Nii automatiseerid lokaliseerimise oma arenduse töövoos.

Mis on pidev lokaliseerimine?

Pidev lokaliseerimine tähendab uute stringide automaatset tõlkimist arenduse töövoo osana, mitte tõlgete kogumist perioodilistesse pakettväljalasetesse. Kui arendaja lisab kasutajaliidese stringidega uue funktsiooni, tõlgitakse need stringid enne funktsiooni avaldamist.

Traditsiooniline lähenemine

Enamik meeskondi tõlgib pakettidena: kogutakse uued stringid, eksporditakse need TMS-i, oodatakse tõlkijaid, imporditakse tulemused ja avaldatakse. See tekitab lokaliseerimise kitsaskoha, mis lükkab rahvusvahelisi väljalaskeid päevi või nädalaid edasi.

1

Arendaja lisab lähtekeele faili uued stringid

2

Stringid eksporditakse ja laaditakse TMS-platvormile üles

3

Tõlkijaid teavitatakse ja nad alustavad tööd

4

Tõlked vaadatakse üle ja kinnitatakse

5

Tõlgitud failid laaditakse alla ja ühendatakse tagasi

6

Funktsioon avaldatakse koos tõlgetega päevi või nädalaid hiljem

Days to weeks

IDE-sse lõimitud lähenemine

IDE-sse lõimitud tõlkimisel tõlgib arendaja stringid tavapärase programmeerimise töövoo osana. Eksportimist, üleslaadimist ega ootamist pole — tõlked valmivad samas seansis kui arendus.

1

Arendaja lisab lähtekeele faili uued stringid

2

Arendaja palub tehisintellekti abilisel faili tõlkida

3

Tõlgitud failid kirjutatakse otse projekti

4

Funktsioon avaldatakse koos tõlgetega samas commitis

Same commit

Traditsiooniline lähenemine

6 steps

Multiple tools and platforms

Days to weeks per cycle

IDE-sse lõimitud lähenemine

4 steps

Inside your editor

Same commit

3

Seadista tõlkekonveier

Kui meeskond soovib tõlget automatiseerida ka väljaspool IDE-d, lisa CI/CD-etapp, mis tõlgib uued või muudetud stringid iga main-harusse push'imise korral. See töötab GitHub Actions'i, GitLab CI ja mis tahes muu CI/CD-süsteemiga.

Väikeses meeskonnas alusta IDE-sse lõimitud tõlkimisega. Lisa CI/CD-automaatika, kui meeskond kasvab üle 3-4 arendaja või kui vajad tõlgete olemasolu igal main-harusse ühendamisel.

Lisa tõlkimine olemasoleva CI/CD-konveieri etapiks. Tõlge käivitatakse pärast edukat ehitamist ja enne juurutamist, tagades igas väljalaskes ajakohased tõlked.
.github/workflows/translate.yml
# .github/workflows/translate.yml
name: Translate
on:
  push:
    branches: [main]
    paths: ['locales/en/**']

jobs:
  translate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Translate changed strings
        run: |
          npx i18n-agent translate locales/en.json \
            --to de,ja,es,fr,ko,zh-Hans \
            --api-key ${{ secrets.I18N_AGENT_API_KEY }}

      - name: Commit translations
        run: |
          git config user.name "github-actions"
          git config user.email "[email protected]"
          git add locales/
          git diff --cached --quiet || git commit -m "chore: update translations"
          git push
.gitlab-ci.yml
# .gitlab-ci.yml
translate:
  stage: deploy
  only:
    changes:
      - locales/en/**
  script:
    - npx i18n-agent translate locales/en.json
        --to de,ja,es,fr --api-key $I18N_AGENT_API_KEY
    - git add locales/ && git commit -m "chore: translations" && git push
4

Lisa CI-sse tõlgete kvaliteedikontroll

CI-konveieri automaatsed kontrollid leiavad puuduvad tõlked, katkised kohatäitjad ja vigased ICU sõnumivormingud enne tootmiskeskkonda jõudmist. Need on lihtsad skriptid, mis võrdlevad lähtekeele faili kõigi sihtlokaatidega.

Ilma CI-taseme tõlkevalideerimiseta jõuavad puuduvad tõlked märkamatult tootmiskeskkonda. Kasutajad näevad tõlgitud teksti asemel töötlemata võtmeid, nagu "settings.title", või tühje stringe. Viieminutiline CI-kontroll väldib seda täielikult.
check-translations.sh
#!/bin/bash
# check-translations.sh — Run in CI to catch missing translations

SOURCE="locales/en.json"
LANGS=("de" "ja" "es" "fr")
EXIT_CODE=0

# Extract all keys from source
SOURCE_KEYS=$(jq -r '[paths(scalars)] | map(join(".")) | .[]' "$SOURCE" | sort)
SOURCE_COUNT=$(echo "$SOURCE_KEYS" | wc -l)

for lang in "${LANGS[@]}"; do
  TARGET="locales/$lang.json"
  if [ ! -f "$TARGET" ]; then
    echo "❌ Missing: $TARGET"
    EXIT_CODE=1
    continue
  fi

  TARGET_KEYS=$(jq -r '[paths(scalars)] | map(join(".")) | .[]' "$TARGET" | sort)
  MISSING=$(comm -23 <(echo "$SOURCE_KEYS") <(echo "$TARGET_KEYS"))

  if [ -n "$MISSING" ]; then
    COUNT=$(echo "$MISSING" | wc -l)
    echo "❌ $lang: $COUNT missing keys"
    echo "$MISSING" | head -5
    EXIT_CODE=1
  else
    echo "✅ $lang: all $SOURCE_COUNT keys present"
  fi
done

exit $EXIT_CODE
check-placeholders.sh
#!/bin/bash
# check-placeholders.sh — Validate placeholder consistency

SOURCE="locales/en.json"
LANGS=("de" "ja" "es")

for lang in "${LANGS[@]}"; do
  TARGET="locales/$lang.json"

  # Compare placeholders like {{name}}, {count}, %s, %d
  jq -r 'paths(scalars) as $p | [($p | join(".")), (getpath($p))]
    | @tsv' "$SOURCE" | while IFS=$'\t' read -r key value; do
    SOURCE_PH=$(echo "$value" | grep -oE '\{\{[^}]+\}\}|%[sd@]' | sort)
    TARGET_VAL=$(jq -r "getpath($(echo $key | jq -R 'split(".")'))" "$TARGET")
    TARGET_PH=$(echo "$TARGET_VAL" | grep -oE '\{\{[^}]+\}\}|%[sd@]' | sort)

    if [ "$SOURCE_PH" != "$TARGET_PH" ]; then
      echo "❌ $lang/$key: placeholder mismatch"
      echo "   Source: $SOURCE_PH"
      echo "   Target: $TARGET_PH"
    fi
  done
done

Valideeri tõlked CI-s

Lisa CI-konveierisse i18n-validate, et leida automaatselt puuduvad võtmed, katkised kohatäitjad ja mitmusevormide probleemid. Loo i18n-pseudo abil näidistõlked visuaalse regressiooni testimiseks.
5

Tuvasta ja töötle tõlgete vananemist

Tõlge vananeb, kui lähtestring muutub, kuid tõlget ei värskendata. Inglise keeles on "Save changes", kuid saksa keeles kuvatakse endiselt vana tekst. Vananemise tuvastamisel võrreldakse lähte- ja tõlkefailide ajatempleid või sisuräsisid.

Vananenud tõlked on hullemad kui puuduvad. Puuduv tõlge on ilmselgelt vale — kasutaja näeb võtit või varukeelt. Vananenud tõlge ütleb veenvalt valet asja, mis võib kasutajaid eksitada või tekitada tugiprobleeme.
detect-drift.sh
#!/bin/bash
# detect-drift.sh — Find stale translations

SOURCE="locales/en.json"
SOURCE_HASH=$(md5sum "$SOURCE" | cut -d' ' -f1)
HASH_FILE=".translation-hashes"

# Compare current source hash with stored hash
if [ -f "$HASH_FILE" ]; then
  STORED_HASH=$(grep "^en:" "$HASH_FILE" | cut -d: -f2)
  if [ "$SOURCE_HASH" != "$STORED_HASH" ]; then
    echo "⚠️  Source strings changed since last translation"
    echo "   Run translations to update all locales"

    # Show which keys changed
    git diff HEAD~1 "$SOURCE" | grep '^[+-]' | grep -v '^[+-][+-]'
  fi
fi

# Update stored hash
echo "en:$SOURCE_HASH" > "$HASH_FILE"
6

Vali tõlkeviis

Kõik sisu ei vaja sama tõlkeviisi. Tehisintellekti tõlge sobib suurepäraselt kasutajaliidese stringidele ja siltidele. Turundustekstile tuleb kasuks tehisintellekt koos inimese ülevaatusega. Õigus- ja vastavusteksti peaksid alati tõlkima professionaalsed inimtõlkijad.

Tehisintellekti tõlge töötleb enam kui 80% tavapärase rakenduse stringidest tootmiskvaliteediga. Kasuta inimtõlkijaid õigusteksti, brändihääle ja kultuuritundliku sisu puhul, kus nüansid on kõige olulisemad.
Cost Comparison
Translation Approach Comparison:

Content Type         | Approach          | Cost/word  | Quality
─────────────────────┼───────────────────┼────────────┼──────────
UI strings, labels   | AI/LLM            | $0.001-01  | Production
Tooltips, help text  | AI/LLM            | $0.001-01  | Production
Marketing copy       | AI + human review | $0.05-0.15 | High
Legal / compliance   | Human translator  | $0.15-0.40 | Certified
Brand voice content  | Human translator  | $0.20-0.50 | Premium
7

Tõlgete Git'i töövoog

Tõlgi enne ühendamist oma funktsiooniharus, mitte pärast. Nii sisaldab iga main-harusse ühendamine täielikke tõlkeid. Lisa ühendamiseelne kontroll, mis kinnitab tõlgete täielikkust kõigis toetatud lokaatides.

Suured JSON-lokaadifailid põhjustavad sagedasi ühenduskonflikte, kui mitu haru neid korraga muudab. Sordi võtmed tähestikuliselt ja kasuta üht võtit rea kohta, et diff oleks väiksem ning konflikte lihtsam lahendada.

Tõlkefailid asuvad hoidlas sinu koodi kõrval. Need on versioonihalduse all, pull request'ides ülevaadatavad ja juurutatakse sama konveieri kaudu nagu kõik muu.
.gitattributes + package.json
# .gitattributes — reduce merge conflicts in locale files
locales/*.json merge=union

# Sort keys alphabetically to minimize diffs:
# package.json script:
"sort-locales": "node -e \"
  const fs = require('fs');
  const f = process.argv[1];
  const d = JSON.parse(fs.readFileSync(f));
  const s = (o) => Object.keys(o).sort().reduce((r,k) =>
    ({...r, [k]: typeof o[k]==='object' ? s(o[k]) : o[k]}), {});
  fs.writeFileSync(f, JSON.stringify(s(d), null, 2)+'\\n');
\""

Levinud komistuskivid

Lokaliseerimist käsitletakse arendusjärgse tööna

Suurim viga on oodata tõlkimisega arenduse lõpuni. See tekitab kitsaskohti, lükkab väljalaskeid edasi ja muudab tõlked järelmõtteks. Tõlgi arenduse ajal, mitte pärast seda.

CI-taseme tõlkevalideerimine puudub

Ilma automaatsete kontrollideta jõuavad puuduvad tõlked, katkised kohatäitjad ja vigased vormingud tootmiskeskkonda. Lisa CI-konveierisse täielikkuse ja vormingu valideerimine.

TMS-iga ülearendamine

TMS loodi inimtõlkijate töövoogude haldamiseks. Kui kasutad tehisintellekti tõlget, ei pruugi TMS-i halduskoormust vaja olla. Alusta lihtsalt — tõlgi IDE-s või CI/CD-s — ja lisa TMS ainult siis, kui vajad inimtõlkijate haldamist.

Tõlgete värskust ei jälgita

Ilma värskuse jälgimiseta ei tea sa, millised tõlked on vananenud. Lähtestringid muutuvad, kuid vanad tõlked jäävad alles. Lisa töövoogu vananemise tuvastus, et leida aegunud sisu.

Proovi i18n Agent'i kohe

Kukuta tõlkefail siia

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

või klõpsa faili valimiseks

Sihtkeeled

Registreerumine pole vajalikKohene hinnang

Korduma kippuvad küsimused