
Kontinuirana lokalizacija bez TMS sustava
Vaš se kod kontinuirano implementira. Tako bi trebalo biti i s prijevodima. Saznajte kako automatizirati lokalizaciju u svojem razvojnom procesu.
Što je kontinuirana lokalizacija?
Kontinuirana lokalizacija praksa je automatskog prevođenja novih tekstova u sklopu razvojnog procesa umjesto grupiranja prijevoda u povremena izdanja. Kada programer doda novu značajku s tekstovima korisničkog sučelja, ti se tekstovi prevode prije objave značajke.
Tradicionalni pristup
Većina timova grupira prijevode: prikupe nove tekstove, izvezu ih u TMS, pričekaju prevoditelje, uvezu rezultate i tek ih tada objave. Tako nastaje usko grlo u lokalizaciji koje međunarodna izdanja odgađa danima ili tjednima.
Programer dodaje nove tekstove u datoteku izvornog lokaliteta
Tekstovi se izvoze i prenose na TMS platformu
Prevoditelji dobivaju obavijest i započinju rad
Prijevodi se pregledaju i odobravaju
Prevedene datoteke preuzimaju se i ponovno spajaju
Značajka se objavljuje s prijevodima (nekoliko dana ili tjedana poslije)
Pristup ugrađen u IDE
Uz prevođenje ugrađeno u IDE programer prevodi tekstove u sklopu uobičajenog rada na kodu. Nema izvoza, prijenosa ni čekanja — prijevodi nastaju u istoj sesiji kao i razvoj.
Programer dodaje nove tekstove u datoteku izvornog lokaliteta
Programer traži od svojeg AI pomoćnika da prevede datoteku
Prevedene datoteke zapisuju se izravno u projekt
Značajka se objavljuje s prijevodima u istom commitu
Tradicionalni pristup
6 steps
Multiple tools and platforms
Days to weeks per cycle
Pristup ugrađen u IDE
4 steps
Inside your editor
Same commit
Postavite proces prevođenja
Timovi koji žele automatizirano prevođenje izvan IDE-a mogu dodati CI/CD korak koji prevodi nove ili izmijenjene tekstove pri svakom slanju na granu main. To funkcionira s GitHub Actionsom, GitLab CI-jem i bilo kojim CI/CD sustavom.
Mali timovi neka započnu prevođenjem u IDE-u. Dodajte CI/CD automatizaciju kada Vaš tim preraste tri ili četiri programera ili kada prijevodi moraju biti zajamčeni pri svakom spajanju u granu 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 prijevoda u CI
Automatizirane provjere u Vašem CI procesu otkrivaju prije produkcije prijevode koji nedostaju, oštećena rezervirana mjesta i neispravne formate ICU poruka. Jednostavne skripte uspoređuju datoteku izvornog lokaliteta sa svim ciljnim lokalitetima.
#!/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
doneProvjerite prijevode u CI-ju
Otkrijte i obradite zastarjele prijevode
Prijevodi zastarijevaju kada se izvorni tekstovi promijene, a prijevodi se ne ažuriraju. Engleski tekst glasi „Save changes", ali njemački i dalje prikazuje staru verziju. Otkrivanje odstupanja uspoređuje vremenske oznake ili hash vrijednosti sadržaja 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"Odaberite pristup prevođenju
Nije svakom sadržaju potreban isti pristup prevođenju. Tekstovi i oznake korisničkog sučelja izvrsno funkcioniraju s AI prevođenjem. Za marketinški tekst dobro je spojiti AI i ljudski pregled. Pravne tekstove i sadržaj o usklađenosti uvijek bi trebali prevoditi profesionalni prevoditelji.
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 tijek rada za prijevode
Prevodite na grani značajke prije spajanja, a ne nakon njega. Time svako spajanje u granu main uključuje potpune prijevode. Dodajte provjeru prije spajanja koja potvrđuje potpunost prijevoda za sve podržane lokalitete.
Velike JSON datoteke lokaliteta uzrokuju česte sukobe pri spajanju kada ih više grana istodobno mijenja. Poredajte ključeve abecedno i upotrijebite jedan ključ po retku kako biste smanjili opseg razlika i olakšali rješavanje sukoba.
# .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 provjere valjanosti prijevoda na razini CI sustava
Pretjerano usložnjavanje TMS-om
Bez praćenja ažurnosti prijevoda
Isprobajte i18n Agent odmah
Povucite datoteku za prijevod ovdje
JSON, YAML, PO, XML, CSV, Markdown, Properties
ili kliknite za odabir
Ciljni jezici