
Kontinuirana lokalizacija bez TMS sistema
Vaš kôd se postavlja kontinuirano. Tako treba i prevodi. Evo kako da automatizujete lokalizaciju u razvojnom toku.
Šta je kontinuirana lokalizacija?
Kontinuirana lokalizacija je praksa automatskog prevođenja novih tekstova kao dela razvojnog toka, umesto grupisanja prevoda u povremena izdanja. Kada programer doda novu funkciju sa UI tekstovima, oni se prevode pre objavljivanja funkcije.
Tradicionalni pristup
Većina timova grupiše prevode: prikupi nove tekstove, izveze ih u TMS, sačeka prevodioce, uveze rezultate i objavi. Tako nastaje usko grlo lokalizacije koje odlaže međunarodna izdanja danima ili nedeljama.
Programer dodaje nove tekstove u datoteku izvornog lokala
Tekstovi se izvoze i otpremaju na TMS platformu
Prevodioci dobijaju obaveštenje i počinju rad
Prevodi se pregledaju i odobravaju
Prevedene datoteke se preuzimaju i ponovo spajaju
Funkcionalnost se isporučuje sa prevodima (nekoliko dana ili nedelja kasnije)
Pristup izvorno integrisan u IDE
Uz prevođenje izvorno za IDE, programer prevodi tekstove kao deo uobičajenog toka programiranja. Bez izvoza, otpremanja i čekanja — prevodi nastaju u istoj sesiji kao i razvoj.
Programer dodaje nove tekstove u datoteku izvornog lokala
Programer traži od svog AI pomoćnika da prevede datoteku
Prevedene datoteke upisuju se direktno u projekat
Funkcionalnost se isporučuje sa prevodima u istom commit koraku
Tradicionalni pristup
6 steps
Multiple tools and platforms
Days to weeks per cycle
Pristup izvorno integrisan u IDE
4 steps
Inside your editor
Same commit
Podesite pipeline prevođenja
Timovi koji žele automatsko prevođenje van IDE okruženja mogu da dodaju CI/CD korak koji prevodi nove ili izmenjene tekstove pri svakom slanju na main. Radi sa GitHub Actions, GitLab CI i svakim CI/CD sistemom.
Mali timovi neka počnu prevođenjem u IDE okruženju. Dodajte CI/CD automatizaciju kada tim preraste tri do četiri programera ili kada prevodi moraju biti zagarantovani pri svakom spajanju u main.
# .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 pushDodajte QA prevoda u CI
Automatske provere u CI pipeline procesu otkrivaju nedostajuće prevode, neispravna mesta za promenljive i nevažeće ICU formate poruka pre produkcije. To su jednostavne skripte koje porede izvornu datoteku lokala sa svim ciljnim lokalima.
#!/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
doneProverite prevode u CI okruženju
Otkrijte i obradite zastarevanje prevoda
Prevod zastareva kada se izvorni tekst promeni, a prevod ne ažurira. Engleski kaže „Save changes", ali nemački i dalje prikazuje stari tekst. Otkrivanje poredi vremenske oznake ili hash vrednosti izvornih i prevedenih datoteka.
#!/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"Izaberite pristup prevođenju
Nije svakom sadržaju potreban isti pristup. UI tekstovi i oznake odlično rade sa AI prevođenjem. Marketinškom tekstu koristi AI uz ljudski pregled. Pravni tekst i tekst usklađenosti uvek treba da prevode profesionalni ljudi prevodioci.
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 | PremiumGit tok rada za prevode
Prevedite na grani funkcije pre spajanja, ne posle. Tako svako spajanje u main sadrži potpune prevode. Dodajte proveru pre spajanja koja potvrđuje potpunost prevoda za sve podržane lokale.
Velike JSON datoteke lokala izazivaju česte konflikte kada ih više grana menja istovremeno. Sortirajte ključeve abecedno i koristite jedan ključ po redu da smanjite razlike i olakšate rešavanje konflikata.
# .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');
\""Uobičajene zamke
Tretiranje lokalizacije kao posla nakon razvoja
Bez validacije prevoda na nivou CI sistema
Preterano usložnjavanje pomoću TMS sistema
Bez praćenja svežine prevoda
Isprobajte i18n Agent sada
Pustite datoteku za prevođenje ovde
JSON, YAML, PO, XML, CSV, Markdown, Properties
ili kliknite za izbor
Ciljni jezici