Skip to main content

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.

1

Programer dodaje nove tekstove u datoteku izvornog lokala

2

Tekstovi se izvoze i otpremaju na TMS platformu

3

Prevodioci dobijaju obaveštenje i počinju rad

4

Prevodi se pregledaju i odobravaju

5

Prevedene datoteke se preuzimaju i ponovo spajaju

6

Funkcionalnost se isporučuje sa prevodima (nekoliko dana ili nedelja kasnije)

Days to weeks

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.

1

Programer dodaje nove tekstove u datoteku izvornog lokala

2

Programer traži od svog AI pomoćnika da prevede datoteku

3

Prevedene datoteke upisuju se direktno u projekat

4

Funkcionalnost se isporučuje sa prevodima u istom commit koraku

Same commit

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

3

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.

Dodajte prevođenje kao korak u postojeći CI/CD pipeline. Prevođenje se pokreće nakon uspešnog build procesa, a pre postavljanja, pa svako izdanje sadrži ažurne prevode.
.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

Dodajte 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.

Bez provere prevoda u CI okruženju, nedostajući prevodi neprimetno stižu u produkciju. Korisnici vide neobrađene ključeve kao „settings.title" ili prazne tekstove. Petominutna CI provera to potpuno sprečava.
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

Proverite prevode u CI okruženju

Dodajte i18n-validate u CI pipeline da automatski otkrijete nedostajuće ključeve, neispravna mesta za promenljive i probleme množine. Koristite i18n-pseudo za generisanje lažnih prevoda radi testiranja vizuelnih regresija.
5

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.

Zastareli prevodi su gori od nedostajućih. Nedostajući prevod je očigledno pogrešan — korisnik vidi ključ ili rezervni jezik. Zastareli prevod uverljivo govori pogrešno, što može da obmane korisnika ili izazove probleme podrške.
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

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.

AI prevođenje obrađuje više od 80% uobičajenih tekstova aplikacije u produkcionom kvalitetu. Ljude prevodioce sačuvajte za pravni tekst, glas brenda i kulturno osetljiv sadržaj gde su nijanse najvažnije.
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

Git 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.

Datoteke prevoda nalaze se u repozitorijumu uz kod. Pod kontrolom su verzija, mogu da se pregledaju u pull request zahtevima i postavljaju se kroz isti pipeline kao i sve ostalo.
.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');
\""

Uobičajene zamke

Tretiranje lokalizacije kao posla nakon razvoja

Najveća greška je čekanje da se razvoj završi pre prevođenja. To stvara uska grla, odlaže izdanja i pretvara prevode u naknadnu misao. Prevodite tokom razvoja, a ne posle njega.

Bez validacije prevoda na nivou CI sistema

Bez automatizovanih provera, nedostajući prevodi, neispravni čuvari mesta i nevažeći formati stižu do produkcije. Dodajte proveru potpunosti i formata u svoj CI pipeline.

Preterano usložnjavanje pomoću TMS sistema

TMS je osmišljen za upravljanje tokovima rada ljudskih prevodilaca. Ako koristite AI prevođenje, možda Vam nije potrebno opterećenje koje donosi TMS. Počnite jednostavno — prevodite u IDE okruženju ili CI/CD sistemu — i dodajte TMS samo ako Vam je potrebno upravljanje ljudskim prevodiocima.

Bez praćenja svežine prevoda

Bez praćenja svežine ne znate koji su prevodi zastareli. Izvorni tekstovi se menjaju, ali stari prevodi ostaju. Ugradite otkrivanje odstupanja u tok rada kako biste pronašli zastareli sadržaj.

Isprobajte i18n Agent sada

Pustite datoteku za prevođenje ovde

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

ili kliknite za izbor

Ciljni jezici

Registracija nije potrebnaTrenutna procena

Česta pitanja