
Neprekinjena lokalizacija brez sistema TMS
Vaša koda se uvaja neprekinjeno. Tudi Vaši prevodi bi se morali. Preberite, kako lokalizacijo avtomatizirati v svojem razvojnem poteku dela.
Kaj je neprekinjena lokalizacija?
Neprekinjena lokalizacija pomeni samodejno prevajanje novih besedil v okviru razvojnega poteka dela, namesto zbiranja prevodov v občasne izdaje. Ko razvijalec doda novo funkcijo z besedili uporabniškega vmesnika, se ta prevedejo pred izdajo funkcije.
Tradicionalni pristop
Večina ekip prevode zbira v svežnje: zbere nova besedila, jih izvozi v TMS, počaka na prevajalce, uvozi rezultate in nato izda. Tako nastane ozko grlo pri lokalizaciji, ki mednarodne izdaje zakasni za več dni ali tednov.
Razvijalec v izvorno jezikovno datoteko doda nova besedila
Besedila se izvozijo in naložijo na platformo TMS
Prevajalci prejmejo obvestilo in začnejo delo
Prevodi se pregledajo in odobrijo
Prevedene datoteke se prenesejo in združijo nazaj
Funkcija se izda s prevodi (čez več dni ali tednov)
Pristop, vgrajen v IDE
Pri prevajanju, vgrajenem v IDE, razvijalec besedila prevede v okviru svojega običajnega programerskega poteka dela. Brez izvoza, nalaganja in čakanja: prevodi nastanejo v isti seji kot razvoj.
Razvijalec v izvorno jezikovno datoteko doda nova besedila
Razvijalec pomočnika umetne inteligence prosi, naj prevede datoteko
Prevedene datoteke se zapišejo neposredno v projekt
Funkcija se izda s prevodi v istem commitu
Tradicionalni pristop
6 steps
Multiple tools and platforms
Days to weeks per cycle
Pristop, vgrajen v IDE
4 steps
Inside your editor
Same commit
Nastavite svoj prevajalski pipeline
Ekipe, ki želijo prevajanje avtomatizirati tudi zunaj razvojnega okolja IDE, naj dodajo korak CI/CD, ki ob vsakem potisku v main prevede nova ali spremenjena besedila. To deluje z GitHub Actions, GitLab CI in katerim koli sistemom CI/CD.
Majhne ekipe naj začnejo s prevajanjem, vgrajenim v IDE. Avtomatizacijo CI/CD dodajte, ko Vaša ekipa preraste 3-4 razvijalce ali ko morajo biti prevodi zagotovljeni pri vsaki združitvi v 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 zagotavljanje kakovosti prevodov v CI
Samodejna preverjanja v Vašem pipelineu CI odkrijejo manjkajoče prevode, poškodovane označbe mest in neveljavne oblike sporočil ICU, preden dosežejo produkcijo. To so preprosti skripti, ki izvorno jezikovno datoteko primerjajo z vsemi ciljnimi različicami.
#!/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
donePreverjajte prevode v CI
Odkrijte in obravnavajte razhajanje prevodov
Do razhajanja prevodov pride, ko se izvorna besedila spremenijo, prevodi pa ne. Angleščina pravi "Save changes", nemščina pa še vedno prikazuje staro besedilo. Zaznavanje razhajanja primerja časovne žige ali zgoščene vrednosti vsebine izvornih in prevajalskih datotek.
#!/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"Izberite svoj pristop k prevajanju
Vsa vsebina ne potrebuje enakega prevajalskega pristopa. Besedila in oznake uporabniškega vmesnika dobro delujejo s prevajanjem z umetno inteligenco. Trženjskim besedilom koristi umetna inteligenca s človeškim pregledom. Pravna besedila in besedila o skladnosti naj vedno prevajajo poklicni prevajalci.
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 | PremiumPotek dela Git za prevode
Prevajajte na svoji veji funkcije pred združitvijo, ne po njej. Tako vsaka združitev v main vključuje celotne prevode. Dodajte preverjanje pred združitvijo, ki preveri popolnost prevodov za vse podprte jezikovne različice.
Velike jezikovne datoteke JSON povzročajo pogoste spore pri združevanju, kadar jih hkrati spreminja več vej. Ključe razvrstite po abecedi in uporabite po en ključ na vrstico, da zmanjšate diff in olajšate reševanje sporov.
# .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');
\""Pogoste pasti
Lokalizacija kot opravilo po razvoju
Brez preverjanja prevodov na ravni CI
Pretirano zapleten sistem TMS
Brez spremljanja svežine prevodov
Preizkusite i18n Agent zdaj
Spustite prevajalsko datoteko sem
JSON, YAML, PO, XML, CSV, Markdown, Properties
ali kliknite za izbiro
Ciljni jeziki