Skip to main content

Nepārtraukta lokalizācija bez TMS

Jūsu kods tiek izvietots nepārtraukti. Arī tulkojumiem tā jānotiek. Lūk, kā automatizēt lokalizāciju izstrādes darbplūsmā.

Kas ir nepārtraukta lokalizācija?

Nepārtraukta lokalizācija ir prakse, kurā jaunas virknes automātiski tulko izstrādes darbplūsmas ietvaros, nevis uzkrāj tulkojumus periodiskiem laidieniem. Kad izstrādātājs pievieno jaunu funkciju ar UI virknēm, tās tiek iztulkotas pirms funkcijas izlaišanas.

Tradicionālā pieeja

Vairums komandu tulkojumus grupē: savāc jaunas virknes, eksportē uz TMS, gaida tulkotājus, importē rezultātus un tikai tad izlaiž. Tas rada lokalizācijas sastrēgumu, kas starptautiskos laidienus aizkavē par dienām vai nedēļām.

1

Izstrādātājs pievieno jaunas virknes avota lokalizācijas failam

2

Virknes tiek eksportētas un augšupielādētas TMS platformā

3

Tulkotāji saņem paziņojumu un sāk darbu

4

Tulkojumi tiek pārskatīti un apstiprināti

5

Iztulkotie faili tiek lejupielādēti un sapludināti atpakaļ

6

Funkcija tiek izlaista ar tulkojumiem (pēc vairākām dienām vai nedēļām)

Days to weeks

IDE vietējā pieeja

Izmantojot IDE vietējo tulkošanu, izstrādātājs tulko virknes savā parastajā kodēšanas darbplūsmā. Bez eksportēšanas, augšupielādes vai gaidīšanas — tulkojumi tiek veikti tajā pašā izstrādes sesijā.

1

Izstrādātājs pievieno jaunas virknes avota lokalizācijas failam

2

Izstrādātājs lūdz MI asistentam iztulkot failu

3

Iztulkotie faili tiek ierakstīti tieši projektā

4

Funkcija tiek izlaista ar tulkojumiem tajā pašā komitā

Same commit

Tradicionālā pieeja

6 steps

Multiple tools and platforms

Days to weeks per cycle

IDE vietējā pieeja

4 steps

Inside your editor

Same commit

3

Izveidot tulkošanas konveijeru

Komandas, kas vēlas automatizētu tulkošanu arī ārpus IDE, var pievienot CI/CD soli, kas katrā izmaiņu nosūtīšanā uz main iztulko jaunas vai mainītas virknes. Tas darbojas ar GitHub Actions, GitLab CI vai jebkuru CI/CD sistēmu.

Mazās komandās sāciet ar IDE vietējo tulkošanu. Pievienojiet CI/CD automatizāciju, kad komanda izaug pāri 3-4 izstrādātājiem vai kad tulkojumiem jābūt garantēti iekļautiem katrā sapludināšanā ar main.

Pievienojiet tulkošanu kā soli esošajā CI/CD konveijerā. Tulkošana tiek veikta pēc veiksmīga būvējuma un pirms izvietošanas, nodrošinot aktuālus tulkojumus katrā laidienā.
.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

Pievienot tulkojumu kvalitātes pārbaudi CI

Automātiskas CI konveijera pārbaudes atrod trūkstošus tulkojumus, bojātus vietturus un nederīgus ICU ziņojumu formātus, pirms tie nonāk produkcijas vidē. Tie ir vienkārši skripti, kas salīdzina avota lokalizācijas failu ar visām mērķa lokalizācijām.

Bez CI līmeņa tulkojumu validācijas trūkstoši tulkojumi nemanāmi nonāk produkcijas vidē. Lietotāji tulkota teksta vietā redz tādas neapstrādātas atslēgas kā „settings.title“ vai tukšas virknes. Piecu minūšu CI pārbaude to pilnībā novērš.
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

Validēt tulkojumus CI

Pievienojiet i18n-validate CI konveijeram, lai automātiski atrastu trūkstošās atslēgas, bojātos vietturus un daudzskaitļa problēmas. Ar i18n-pseudo ģenerējiet pseidotulkojumus vizuālai regresijas testēšanai.
5

Noteikt un pārvaldīt tulkojumu novirzi

Tulkojumu novirze rodas, kad avota virknes mainās, bet tulkojumi netiek atjaunināti. Angļu teksts saka „Save changes“, bet vācu tulkojumā joprojām ir vecais teksts. Novirzi nosaka, salīdzinot avota un tulkojuma failu laikspiedolus vai satura jaucējkodus.

Novecojuši tulkojumi ir sliktāki par trūkstošiem. Trūkstošs tulkojums ir acīmredzami nepareizs — lietotāji redz atslēgu vai atkāpšanās valodu. Novecojis tulkojums pārliecinoši pasaka nepareizo, tādēļ var maldināt lietotājus vai radīt atbalsta pieprasījumus.
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

Izvēlēties tulkošanas pieeju

Ne visam saturam vajadzīga viena tulkošanas pieeja. UI virknēm un etiķetēm lieliski der MI tulkošana. Mārketinga tekstam noder MI un cilvēka pārskatīšanas kombinācija. Juridiskais un atbilstības teksts vienmēr jāuztic profesionāliem tulkotājiem.

MI produkcijas videi piemērotā kvalitātē iztulko vairāk nekā 80% tipisku lietotnes virkņu. Cilvēku tulkotājiem atstājiet juridisko tekstu, zīmola balsi un kultūras ziņā jutīgu saturu, kur nianses ir vissvarīgākās.
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 darbplūsma tulkojumiem

Tulkojiet funkcijas zarā pirms sapludināšanas, nevis pēc tās. Tas nodrošina, ka katrā sapludināšanā ar main ir pilnīgi tulkojumi. Pievienojiet pārbaudi pirms sapludināšanas, kas apstiprina tulkojumu pilnīgumu visās atbalstītajās lokalizācijās.

Ja vairāki zari vienlaikus maina lielus JSON lokalizācijas failus, bieži rodas sapludināšanas konflikti. Kārtojiet atslēgas alfabētiski un katrā rindā ievietojiet vienu atslēgu, lai izmaiņas būtu mazākas un konfliktus vieglāk atrisināt.

Tulkošanas faili repozitorijā atrodas līdzās kodam. Tiem ir versiju kontrole, tos var pārskatīt izmaiņu pieprasījumos un izvietot ar to pašu konveijeru kā visu pārējo.
.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');
\""

Biežākās kļūdas

Lokalizācijas uzskatīšana par darbu pēc izstrādes

Lielākā kļūda ir gaidīt līdz izstrādes beigām, lai tulkotu. Tas rada sastrēgumus, aizkavē laidienus un padara tulkošanu par otršķirīgu uzdevumu. Tulkojiet izstrādes laikā, nevis pēc tam.

Nav CI līmeņa tulkojumu validācijas

Bez automatizētām pārbaudēm produkcijas vidē nonāk trūkstoši tulkojumi, bojāti vietturi un nederīgi formāti. Pievienojiet pilnīguma un formāta validāciju CI konveijeram.

Pārlieka sarežģīšana ar TMS

TMS tika radīta tulkotāju darbplūsmu pārvaldīšanai. Ja izmantojat MI tulkošanu, TMS papildu slodze var nebūt vajadzīga. Sāciet vienkārši — tulkojiet IDE vai CI/CD — un pievienojiet TMS tikai tad, ja vajadzīga tulkotāju pārvaldība.

Tulkojumu aktualitāte netiek izsekota

Neizsekojot aktualitāti, nezināt, kuri tulkojumi ir novecojuši. Avota virknes mainās, bet vecie tulkojumi paliek. Iekļaujiet novirzes noteikšanu darbplūsmā, lai atrastu novecojušu saturu.

Izmēģiniet i18n Agent tūlīt

Nometiet tulkošanas failu šeit

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

vai noklikšķiniet, lai izvēlētos

Mērķa valodas

Reģistrācija nav vajadzīgaTūlītēja tāme

Bieži uzdotie jautājumi