
Kontinuerlig lokalisering uten et TMS
Koden din driftsettes kontinuerlig. Det bør oversettelsene dine også gjøre. Slik automatiserer du lokalisering i utviklingsflyten din.
Hva er kontinuerlig lokalisering?
Kontinuerlig lokalisering er praksisen med å oversette nye strenger automatisk som en del av utviklingsflyten din, i stedet for å samle oversettelser i periodiske utgivelser. Når en utvikler legger til en ny funksjon med UI-strenger, blir disse strengene oversatt før funksjonen rulles ut.
Den tradisjonelle tilnærmingen
De fleste team behandler oversettelser i puljer: De samler inn nye strenger, eksporterer dem til et TMS, venter på oversettere, importerer resultatene og ruller deretter ut. Dette skaper en lokaliseringsflaskehals som forsinker internasjonale utgivelser med dager eller uker.
Utvikleren legger til nye strenger i kildespråkfilen
Strengene eksporteres og lastes opp til en TMS-plattform
Oversettere blir varslet og begynner å jobbe
Oversettelsene gjennomgås og godkjennes
Oversatte filer lastes ned og slås sammen igjen
Funksjonen rulles ut med oversettelser (dager til uker senere)
Den IDE-integrerte tilnærmingen
Med IDE-integrert oversettelse oversetter utvikleren strenger som en del av den vanlige arbeidsflyten for koding. Ingen eksport, ingen opplasting, ingen venting — oversettelsene gjøres i samme økt som utviklingen.
Utvikleren legger til nye strenger i kildespråkfilen
Utvikleren ber sin AI-assistent om å oversette filen
Oversatte filer skrives direkte til prosjektet
Funksjonen rulles ut med oversettelser i samme commit
Den tradisjonelle tilnærmingen
6 steps
Multiple tools and platforms
Days to weeks per cycle
Den IDE-integrerte tilnærmingen
4 steps
Inside your editor
Same commit
Sett opp oversettelsespipelinen din
For team som ønsker automatisert oversettelse utover IDE-en, legg til et CI/CD-steg som oversetter nye eller endrede strenger ved hver push til main. Dette fungerer med GitHub Actions, GitLab CI eller et hvilket som helst CI/CD-system.
Start med IDE-nativ oversettelse for små team. Legg til CI/CD-automatisering når teamet ditt vokser forbi 3-4 utviklere, eller når du trenger garanterte oversettelser ved hver sammenslåing til main.
# .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 pushLegg til oversettelses-QA i CI
Automatiserte sjekker i CI-pipelinen din fanger opp manglende oversettelser, ødelagte plassholdere og ugyldige ICU-meldingsformater før de når produksjon. Dette er enkle skript som sammenligner kildespråkfilen din med alle mållokalitetene.
#!/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
doneValider oversettelser i CI
Oppdag og håndter utdaterte oversettelser
Oversettelser blir utdaterte når kildestrenger endres uten at oversettelsene oppdateres. Den engelske teksten sier «Save changes», mens den tyske fortsatt har den gamle teksten. Slik avviksdeteksjon sammenligner tidsstempler eller innholdshasher for kilde- og oversettelsesfiler.
#!/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"Velg oversettelsestilnærmingen din
Ikke alt innhold trenger samme oversettelsestilnærming. UI-strenger og etiketter fungerer utmerket med AI-oversettelse. Markedsføringstekst har nytte av AI kombinert med menneskelig gjennomgang. Juridisk tekst og tekst om etterlevelse bør alltid oversettes av profesjonelle menneskelige oversettere.
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 | PremiumGit-arbeidsflyt for oversettelser
Oversett på funksjonsgrenen din før sammenslåing, ikke etterpå. Dette sikrer at hver sammenslåing til main inneholder fullstendige oversettelser. Legg til en sjekk før sammenslåing som bekrefter at oversettelsene er fullstendige for alle støttede lokaliteter.
Store JSON-språkfiler forårsaker hyppige sammenslåingskonflikter når flere grener endrer dem samtidig. Sorter nøkler alfabetisk og bruk én nøkkel per linje for å minimere diff-størrelsen og gjøre konflikter enklere å løse.
# .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');
\""Vanlige fallgruver
Å behandle lokalisering som etterarbeid
Ingen oversettelsesvalidering på CI-nivå
Overengineering med et TMS
Å ikke spore om oversettelsene er oppdaterte
Prøv i18n Agent nå
Slipp oversettelsesfilen din her
JSON, YAML, PO, XML, CSV, Markdown, Properties
eller klikk for å bla gjennom
Målspråk