
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.
Arendaja lisab lähtekeele faili uued stringid
Stringid eksporditakse ja laaditakse TMS-platvormile üles
Tõlkijaid teavitatakse ja nad alustavad tööd
Tõlked vaadatakse üle ja kinnitatakse
Tõlgitud failid laaditakse alla ja ühendatakse tagasi
Funktsioon avaldatakse koos tõlgetega päevi või nädalaid hiljem
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.
Arendaja lisab lähtekeele faili uued stringid
Arendaja palub tehisintellekti abilisel faili tõlkida
Tõlgitud failid kirjutatakse otse projekti
Funktsioon avaldatakse koos tõlgetega samas commitis
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
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.
# .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
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 pushLisa 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.
#!/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#!/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
doneValideeri tõlked CI-s
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.
#!/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"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.
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 | PremiumTõ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.
# .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
CI-taseme tõlkevalideerimine puudub
TMS-iga ülearendamine
Tõlgete värskust ei jälgita
Proovi i18n Agent'i kohe
Kukuta tõlkefail siia
JSON, YAML, PO, XML, CSV, Markdown, Properties
või klõpsa faili valimiseks
Sihtkeeled