Skip to main content

Jatkuva lokalisointi ilman TMS:ää

Koodisi julkaistaan jatkuvasti. Samoin pitäisi tehdä käännöstesi. Näin automatisoit lokalisoinnin kehitystyönkulussasi.

Mitä jatkuva lokalisointi on?

Jatkuva lokalisointi tarkoittaa uusien merkkijonojen automaattista kääntämistä osana kehitystyönkulkua sen sijaan, että käännökset kerättäisiin säännöllisiin eräjulkaisuihin. Kun kehittäjä lisää uuden käyttöliittymätekstejä sisältävän ominaisuuden, merkkijonot käännetään ennen ominaisuuden julkaisua.

Perinteinen lähestymistapa

Useimmat tiimit kääntävät erissä: ne keräävät uudet merkkijonot, vievät ne TMS:ään, odottavat kääntäjiä, tuovat tulokset ja julkaisevat. Tämä luo lokalisointiin pullonkaulan, joka viivästyttää kansainvälisiä julkaisuja päivillä tai viikoilla.

1

Kehittäjä lisää uusia merkkijonoja lähdekielen tiedostoon

2

Merkkijonot viedään ja lähetetään TMS-alustalle

3

Kääntäjät saavat ilmoituksen ja aloittavat työn

4

Käännökset tarkistetaan ja hyväksytään

5

Käännetyt tiedostot ladataan ja yhdistetään takaisin

6

Ominaisuus julkaistaan käännöksineen päivien tai viikkojen kuluttua

Days to weeks

IDE-ympäristöön integroitu lähestymistapa

IDE-ympäristöön integroidussa kääntämisessä kehittäjä kääntää merkkijonot osana tavallista ohjelmointityönkulkuaan. Ei vientiä, lähettämistä tai odottamista — käännökset valmistuvat saman istunnon aikana kuin kehitys.

1

Kehittäjä lisää uusia merkkijonoja lähdekielen tiedostoon

2

Kehittäjä pyytää tekoälyavustajaansa kääntämään tiedoston

3

Käännetyt tiedostot kirjoitetaan suoraan projektiin

4

Ominaisuus julkaistaan käännöksineen samassa commitissa

Same commit

Perinteinen lähestymistapa

6 steps

Multiple tools and platforms

Days to weeks per cycle

IDE-ympäristöön integroitu lähestymistapa

4 steps

Inside your editor

Same commit

3

Määritä käännösputkesi

Jos tiimisi haluaa automatisoida käännökset myös IDE-ympäristön ulkopuolella, lisää CI/CD-vaihe, joka kääntää uudet tai muuttuneet merkkijonot jokaisella main-haaraan lähetyksellä. Tämä toimii GitHub Actions:in, GitLab CI:n ja kaikkien muiden CI/CD-järjestelmien kanssa.

Aloita pienessä tiimissä IDE-ympäristöön integroidulla kääntämisellä. Lisää CI/CD-automaatio, kun tiimissäsi on yli 3-4 kehittäjää tai tarvitset käännökset varmasti jokaiseen main-haaraan yhdistämiseen.

Lisää kääntäminen nykyisen CI/CD-putkesi vaiheeksi. Käännös suoritetaan onnistuneen koonnin jälkeen ja ennen julkaisua, jotta jokainen julkaisu sisältää ajantasaiset käännökset.
.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

Lisää käännösten laadunvarmistus CI:hin

CI-putkesi automaattiset tarkistukset löytävät puuttuvat käännökset, rikkoutuneet paikkamerkit ja virheelliset ICU-sanomamuodot ennen tuotantoa. Ne ovat yksinkertaisia komentosarjoja, jotka vertaavat lähdekielen tiedostoa kaikkiin kohdekieliversioihin.

Ilman CI-tason käännösvalidointia puuttuvat käännökset päätyvät huomaamatta tuotantoon. Käyttäjät näkevät käännetyn tekstin sijaan käsittelemättömiä avaimia, kuten "settings.title", tai tyhjiä merkkijonoja. Viiden minuutin CI-tarkistus estää tämän kokonaan.
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

Validoi käännökset CI:ssä

Lisää CI-putkeesi i18n-validate löytämään automaattisesti puuttuvat avaimet, rikkoutuneet paikkamerkit ja monikkomuoto-ongelmat. Luo i18n-pseudo:lla tekaistut käännökset visuaaliseen regressiotestaukseen.
5

Havaitse ja käsittele käännösten vanheneminen

Käännös vanhenee, kun lähdeteksti muuttuu mutta käännöstä ei päivitetä. Englanniksi lukee "Save changes", mutta saksaksi näkyy yhä vanha teksti. Vanhenemisen tunnistus vertaa lähde- ja käännöstiedostojen aikaleimoja tai sisältötiivisteitä.

Vanhentuneet käännökset ovat puuttuvia pahempia. Puuttuva käännöksen virheellisyys on ilmeistä — käyttäjä näkee avaimen tai varakielen. Vanhentunut käännös kertoo vakuuttavasti väärän asian, mikä voi johtaa käyttäjiä harhaan tai aiheuttaa tukipyyntöjä.
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

Valitse käännöstapasi

Kaikki sisältö ei tarvitse samaa käännöstapaa. Tekoälykäännös sopii erinomaisesti käyttöliittymäteksteihin ja nimikkeisiin. Markkinointiteksti hyötyy tekoälystä ja ihmistarkistuksesta. Laki- ja vaatimustenmukaisuustekstit tulee aina antaa ammattimaisille ihmiskääntäjille.

Tekoälykäännös käsittelee yli 80 % tavallisen sovelluksen merkkijonoista julkaisuvalmiilla laadulla. Varaa ihmiskääntäjät lakiteksteihin, brändin äänensävyyn ja kulttuurisesti arkaluonteiseen sisältöön, joissa vivahteilla on eniten merkitystä.
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

Käännösten Git-työnkulku

Käännä ominaisuushaarassasi ennen yhdistämistä, älä sen jälkeen. Näin jokainen main-haaraan yhdistäminen sisältää täydelliset käännökset. Lisää yhdistämistä edeltävä tarkistus, joka varmistaa kaikkien tuettujen kieliversioiden käännösten kattavuuden.

Suuret JSON-kieliversiotiedostot aiheuttavat usein yhdistämisristiriitoja, kun useat haarat muuttavat niitä samanaikaisesti. Lajittele avaimet aakkosjärjestykseen ja käytä yhtä avainta riviä kohden, jotta diff pysyy pienenä ja ristiriidat ovat helpompia ratkaista.

Käännöstiedostot ovat tietovarastossasi koodisi rinnalla. Ne ovat versiohallittuja, tarkistettavissa pull requesteissa ja julkaistavissa saman putken kautta kuin kaikki muukin.
.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');
\""

Tavalliset sudenkuopat

Lokalisointi käsitellään kehityksen jälkeisenä työnä

Suurin virhe on käännösten lykkääminen kehityksen jälkeiseen aikaan. Se luo pullonkauloja, viivästyttää julkaisuja ja tekee käännöksistä jälkiajatuksen. Käännä kehityksen aikana, älä sen jälkeen.

Ei CI-tason käännösvalidointia

Ilman automaattisia tarkistuksia puuttuvat käännökset, rikkoutuneet paikkamerkit ja virheelliset muodot päätyvät tuotantoon. Lisää CI-putkeesi kattavuus- ja muotovalidointi.

TMS:n tarpeeton ylikehittäminen

TMS suunniteltiin ihmiskääntäjien työnkulkujen hallintaan. Jos käytät tekoälykäännöstä, et ehkä tarvitse TMS:n hallinnollista kuormaa. Aloita yksinkertaisesti — käännä IDE-ympäristössä tai CI/CD:ssä — ja lisää TMS vain, jos tarvitset ihmiskääntäjien hallintaa.

Käännösten ajantasaisuutta ei seurata

Ilman ajantasaisuuden seurantaa et tiedä, mitkä käännökset ovat vanhentuneita. Lähdetekstit muuttuvat, mutta vanhat käännökset säilyvät. Lisää työnkulkuusi vanhenemisen tunnistus löytämään vanhentunut sisältö.

Kokeile i18n Agent:ia nyt

Pudota käännöstiedostosi tähän

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

tai valitse napsauttamalla

Kohdekielet

Rekisteröitymistä ei tarvitaVälitön arvio

Usein kysytyt kysymykset