Skip to main content

Nuolatinis lokalizavimas be TMS

Jūsų kodas diegiamas nuolat. Vertimai taip pat turėtų būti diegiami nuolat. Štai kaip automatizuoti lokalizavimą kūrimo darbo eigoje.

Kas yra nuolatinis lokalizavimas?

Nuolatinis lokalizavimas – tai praktika, kai naujos eilutės automatiškai verčiamos kūrimo darbo eigoje, o vertimai nekaupiami periodiniams leidimams. Kai kūrėjas prideda naują funkciją su UI eilutėmis, jos išverčiamos prieš funkcijos išleidimą.

Tradicinis metodas

Dauguma komandų vertimus grupuoja: surenka naujas eilutes, eksportuoja į TMS, laukia vertėjų, importuoja rezultatus ir tik tada išleidžia. Taip atsiranda lokalizavimo kliūtis, kuri tarptautinius leidimus atideda kelioms dienoms ar savaitėms.

1

Kūrėjas prideda naujas eilutes prie šaltinio lokalės failo

2

Eilutės eksportuojamos ir įkeliamos į TMS platformą

3

Vertėjams pranešama ir jie pradeda darbą

4

Vertimai peržiūrimi ir patvirtinami

5

Išversti failai atsisiunčiami ir vėl sujungiami

6

Funkcija išleidžiama su vertimais (po kelių dienų ar savaičių)

Days to weeks

IDE savasis metodas

Naudodamas IDE savąjį vertimą kūrėjas verčia eilutes įprastoje kodavimo darbo eigoje. Jokio eksportavimo, įkėlimo ar laukimo – vertimai atliekami toje pačioje kūrimo sesijoje.

1

Kūrėjas prideda naujas eilutes prie šaltinio lokalės failo

2

Kūrėjas paprašo DI asistento išversti failą

3

Išversti failai įrašomi tiesiai į projektą

4

Funkcija išleidžiama su vertimais tame pačiame įraše

Same commit

Tradicinis metodas

6 steps

Multiple tools and platforms

Days to weeks per cycle

IDE savasis metodas

4 steps

Inside your editor

Same commit

3

Sukurti vertimo konvejerį

Komandos, norinčios automatizuoti vertimą ne tik IDE, gali pridėti CI/CD veiksmą, kuris kiekvieną kartą pateikus pakeitimus į main išverčia naujas ar pakeistas eilutes. Tai veikia su GitHub Actions, GitLab CI ar bet kuria CI/CD sistema.

Nedidelėms komandoms pradėkite nuo IDE savojo vertimo. CI/CD automatizavimą pridėkite, kai komanda išauga iki daugiau nei 3-4 kūrėjų arba kai vertimai privalo būti įtraukti į kiekvieną sujungimą su main.

Pridėkite vertimą kaip veiksmą prie esamo CI/CD konvejerio. Vertimas vykdomas po sėkmingo komponavimo ir prieš diegimą, todėl kiekviename leidime yra naujausi vertimai.
.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

Pridėti vertimų kokybės tikrinimą CI

Automatiniai CI konvejerio tikrinimai aptinka trūkstamus vertimus, sugadintus vietos rezervavimo ženklus ir negaliojančius ICU pranešimų formatus prieš jiems pasiekiant gamybinę aplinką. Tai paprasti scenarijai, kurie lygina šaltinio lokalės failą su visomis tikslinėmis lokalėmis.

Be CI lygio vertimų tikrinimo trūkstami vertimai tyliai pasiekia gamybinę aplinką. Naudotojai vietoje išversto teksto mato tokius neapdorotus raktus kaip „settings.title“ arba tuščias eilutes. Penkių minučių CI patikra visiškai užkerta tam kelią.
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

Tikrinti vertimus CI

Pridėkite i18n-validate prie CI konvejerio, kad automatiškai aptiktumėte trūkstamus raktus, sugadintus vietos rezervavimo ženklus ir daugiskaitos problemas. Naudodami i18n-pseudo generuokite netikrus vertimus vaizdiniam regresiniam testavimui.
5

Aptikti ir tvarkyti vertimų nukrypimą

Vertimų nukrypimas atsiranda, kai šaltinio eilutės pasikeičia, bet vertimai neatnaujinami. Angliškai rašoma „Save changes“, o vokiškai vis dar rodomas senas tekstas. Nukrypimas aptinkamas lyginant šaltinio ir vertimo failų laiko žymas arba turinio maišas.

Pasenę vertimai blogiau nei trūkstami. Trūkstamas vertimas akivaizdžiai netinkamas – naudotojai mato raktą arba atsarginę kalbą. Pasenęs vertimas įtikinamai sako ne tą, ką reikia, todėl gali suklaidinti naudotojus ar sukelti pagalbos užklausų.
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

Pasirinkti vertimo metodą

Ne visam turiniui reikia to paties vertimo metodo. UI eilutėms ir etiketėms puikiai tinka DI vertimas. Rinkodaros tekstams naudingas DI ir žmogaus peržiūros derinys. Teisinį ir atitikties tekstą visada turėtų versti profesionalūs vertėjai.

DI gamybinei aplinkai tinkama kokybe išverčia daugiau nei 80 % įprastų programos eilučių. Vertėjams palikite teisinį tekstą, prekės ženklo balsą ir kultūriškai jautrų turinį, kuriame niuansai svarbiausi.
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 darbo eiga vertimams

Verskite funkcijos šakoje prieš sujungdami, o ne po to. Taip kiekviename sujungime su main bus visi vertimai. Pridėkite patikrą prieš sujungimą, kuri patvirtina visų palaikomų lokalių vertimų išsamumą.

Kai kelios šakos vienu metu keičia didelius JSON lokalės failus, dažnai kyla sujungimo konfliktų. Surikiuokite raktus abėcėlės tvarka ir kiekvienoje eilutėje pateikite po vieną raktą, kad skirtumai būtų mažesni, o konfliktus būtų lengviau išspręsti.

Vertimo failai saugykloje laikomi šalia kodo. Jų versijos kontroliuojamos, juos galima peržiūrėti gavimo užklausose ir diegti tuo pačiu konvejeriu kaip visa kita.
.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');
\""

Dažnos klaidos

Lokalizavimo laikymas darbu po kūrimo

Didžiausia klaida – versti tik baigus kūrimą. Taip atsiranda kliūčių, vėluoja leidimai, o vertimai tampa antraeile užduotimi. Verskite kurdami, o ne po to.

Nėra CI lygio vertimų tikrinimo

Be automatinių patikrų gamybinę aplinką pasiekia trūkstami vertimai, sugadinti vietos rezervavimo ženklai ir negaliojantys formatai. Pridėkite išsamumo ir formatų tikrinimą prie CI konvejerio.

Per daug sudėtinga TMS

TMS buvo sukurta vertėjų darbo eigoms valdyti. Jei naudojate DI vertimą, papildoma TMS našta gali būti nereikalinga. Pradėkite paprastai – verskite IDE arba CI/CD – ir pridėkite TMS tik tada, kai reikės valdyti vertėjus.

Vertimų aktualumas nestebimas

Nestebėdami aktualumo nežinote, kurie vertimai pasenę. Šaltinio eilutės keičiasi, bet seni vertimai išlieka. Įtraukite nukrypimo aptikimą į darbo eigą, kad rastumėte pasenusį turinį.

Išbandykite i18n Agent dabar

Nuvilkite vertimo failą čia

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

arba spustelėkite norėdami pasirinkti

Tikslinės kalbos

Registruotis nereikiaMomentinis įvertis

Dažnai užduodami klausimai