Skip to main content

Localizare continuă fără un TMS

Codul dumneavoastră este implementat continuu. La fel ar trebui să fie și traducerile. Aflați cum să automatizați localizarea în fluxul de dezvoltare.

Ce este localizarea continuă?

Localizarea continuă este practica de a traduce automat șirurile noi ca parte a fluxului de dezvoltare, în loc de a grupa traducerile în versiuni periodice. Când un dezvoltator adaugă o funcționalitate nouă cu șiruri de interfață, acestea sunt traduse înainte de lansarea funcționalității.

Abordarea tradițională

Majoritatea echipelor grupează traducerile: colectează șirurile noi, le exportă într-un TMS, așteaptă traducătorii, importă rezultatele și apoi lansează versiunea. Astfel apare un blocaj în procesul de localizare, care întârzie lansările internaționale cu zile sau săptămâni.

1

Dezvoltatorul adaugă șiruri noi în fișierul limbii-sursă

2

Șirurile sunt exportate și încărcate pe o platformă TMS

3

Traducătorii sunt notificați și încep lucrul

4

Traducerile sunt verificate și aprobate

5

Fișierele traduse sunt descărcate și integrate înapoi

6

Funcționalitatea este lansată cu traduceri (după câteva zile sau săptămâni)

Days to weeks

Abordarea integrată în IDE

Cu traducerea integrată în IDE, dezvoltatorul traduce șirurile ca parte a fluxului obișnuit de programare. Fără export, fără încărcare, fără așteptare — traducerile sunt realizate în aceeași sesiune de dezvoltare.

1

Dezvoltatorul adaugă șiruri noi în fișierul limbii-sursă

2

Dezvoltatorul îi solicită asistentului bazat pe IA să traducă fișierul

3

Fișierele traduse sunt scrise direct în proiect

4

Funcționalitatea este lansată cu traducerile incluse în același commit

Same commit

Abordarea tradițională

6 steps

Multiple tools and platforms

Days to weeks per cycle

Abordarea integrată în IDE

4 steps

Inside your editor

Same commit

3

Configurați fluxul de traducere

Pentru echipele care doresc traducere automată și în afara IDE-ului, adăugați un pas CI/CD care traduce șirurile noi sau modificate la fiecare push în ramura main. Această soluție funcționează cu GitHub Actions, GitLab CI sau orice sistem CI/CD.

Începeți cu traducerea integrată în IDE dacă aveți o echipă mică. Adăugați automatizarea CI/CD când echipa depășește 3-4 dezvoltatori sau când aveți nevoie ca traducerile să fie garantate la fiecare integrare în ramura main.

Adăugați traducerea ca pas în fluxul CI/CD existent. Traducerea se execută după finalizarea compilării și înainte de implementare, astfel încât fiecare versiune să includă traduceri actualizate.
.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

Adăugați controlul calității traducerilor în CI

Verificările automate din fluxul CI detectează traducerile lipsă, substituenții nevalizi și formatele de mesaje ICU nevalide înainte ca acestea să ajungă în producție. Acestea sunt scripturi simple care compară fișierul limbii-sursă cu toate limbile-țintă.

Fără validarea traducerilor la nivel de CI, traducerile lipsă ajung neobservate în producție. Utilizatorii văd chei neprelucrate precum „settings.title” sau șiruri goale în locul textului tradus. O verificare CI de 5 minute previne complet această problemă.
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

Validați traducerile în CI

Adăugați i18n-validate în fluxul CI pentru a detecta automat cheile lipsă, substituenții nevalizi și problemele de plural. Folosiți i18n-pseudo pentru a genera traduceri fictive destinate testelor vizuale de regresie.
5

Detectați și gestionați decalajul traducerilor

Decalajul traducerilor apare atunci când șirurile sursă se modifică, dar traducerile nu sunt actualizate. Textul în limba engleză spune „Salvați modificările”, însă cel în limba germană afișează încă textul vechi. Detectarea decalajului compară marcajele temporale sau hashurile conținutului fișierelor-sursă și traduse.

Traducerile neactualizate sunt mai problematice decât cele lipsă. O traducere lipsă este în mod evident greșită — utilizatorii văd o cheie sau limba de rezervă. O traducere neactualizată transmite în mod convingător un mesaj greșit, ceea ce poate induce utilizatorii în eroare sau poate genera solicitări de asistență.
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

Alegeți abordarea de traducere

Nu toate tipurile de conținut necesită aceeași abordare de traducere. Șirurile și etichetele interfeței se pretează foarte bine traducerii cu IA. Textele de marketing beneficiază de traducere cu IA și verificare umană. Textele juridice și de conformitate trebuie traduse întotdeauna de traducători profesioniști.

Traducerea cu IA gestionează la un nivel adecvat producției peste 80% dintre șirurile obișnuite ale unei aplicații. Apelați la traducători umani pentru textele juridice, vocea mărcii și conținutul sensibil din punct de vedere cultural, unde nuanțele contează cel mai mult.
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

Fluxul Git pentru traduceri

Traduceți în ramura funcționalității înainte de integrare, nu după. Astfel, fiecare integrare în ramura main va include traduceri complete. Adăugați o verificare înainte de integrare care confirmă integralitatea traducerilor pentru toate limbile acceptate.

Fișierele JSON mari pentru limbi provoacă frecvent conflicte de integrare atunci când mai multe ramuri le modifică simultan. Sortați cheile alfabetic și folosiți câte o cheie pe linie pentru a reduce dimensiunea diferențelor și a simplifica soluționarea conflictelor.

Fișierele de traducere se află în depozit alături de cod. Acestea sunt gestionate prin controlul versiunilor, pot fi verificate în cererile de integrare și sunt implementate prin același flux ca toate celelalte componente.
.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');
\""

Capcane frecvente

Tratarea localizării ca etapă ulterioară dezvoltării

Cea mai mare greșeală este să așteptați încheierea dezvoltării înainte de a traduce. Acest lucru creează blocaje, întârzie lansările și transformă traducerile într-o preocupare secundară. Traduceți în timpul dezvoltării, nu după.

Lipsa validării traducerilor la nivel de CI

Fără verificări automate, traducerile lipsă, substituenții nevalizi și formatele nevalide ajung în producție. Adăugați în fluxul CI validarea integralității și a formatului.

Complicarea excesivă cu un TMS

Un TMS a fost conceput pentru gestionarea fluxurilor traducătorilor umani. Dacă folosiți traducerea cu IA, este posibil să nu aveți nevoie de complexitatea suplimentară a unui TMS. Începeți simplu — traduceți în IDE sau CI/CD — și adăugați un TMS numai dacă trebuie să gestionați traducători umani.

Neurmărirea actualității traducerilor

Fără urmărirea actualității, nu știți care traduceri sunt învechite. Șirurile sursă se modifică, dar traducerile vechi rămân. Includeți detectarea decalajului în fluxul dumneavoastră pentru a identifica textele neactualizate.

Încercați acum i18n Agent

Plasați aici fișierul de traducere

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

sau faceți clic pentru a-l selecta

Limbi țintă

Nu este necesară înregistrareaEstimare instantanee

Întrebări frecvente