
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.
Kehittäjä lisää uusia merkkijonoja lähdekielen tiedostoon
Merkkijonot viedään ja lähetetään TMS-alustalle
Kääntäjät saavat ilmoituksen ja aloittavat työn
Käännökset tarkistetaan ja hyväksytään
Käännetyt tiedostot ladataan ja yhdistetään takaisin
Ominaisuus julkaistaan käännöksineen päivien tai viikkojen kuluttua
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.
Kehittäjä lisää uusia merkkijonoja lähdekielen tiedostoon
Kehittäjä pyytää tekoälyavustajaansa kääntämään tiedoston
Käännetyt tiedostot kirjoitetaan suoraan projektiin
Ominaisuus julkaistaan käännöksineen samassa commitissa
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
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.
# .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
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 pushLisää 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.
#!/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#!/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
doneValidoi käännökset CI:ssä
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ä.
#!/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"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.
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 | PremiumKää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.
# .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ä
Ei CI-tason käännösvalidointia
TMS:n tarpeeton ylikehittäminen
Käännösten ajantasaisuutta ei seurata
Kokeile i18n Agent:ia nyt
Pudota käännöstiedostosi tähän
JSON, YAML, PO, XML, CSV, Markdown, Properties
tai valitse napsauttamalla
Kohdekielet