
Kontinuerlig lokalisering utan ett TMS
Din kod driftsätts kontinuerligt. Det bör även dina översättningar göra. Så här automatiserar du lokaliseringen i utvecklingsflödet.
Vad är kontinuerlig lokalisering?
Kontinuerlig lokalisering innebär att nya strängar översätts automatiskt som en del av utvecklingsflödet i stället för att översättningar samlas i periodiska versioner. När en utvecklare lägger till en ny funktion med gränssnittssträngar översätts strängarna innan funktionen lanseras.
Det traditionella arbetssättet
De flesta team samlar översättningar i omgångar: nya strängar samlas in, exporteras till ett TMS och skickas till översättare. Sedan inväntas och importeras resultaten innan lansering. Det skapar en flaskhals i lokaliseringen som fördröjer internationella lanseringar med dagar eller veckor.
Utvecklaren lägger till nya strängar i källspråkets fil
Strängarna exporteras och laddas upp till en TMS-plattform
Översättarna meddelas och börjar arbeta
Översättningarna granskas och godkänns
De översatta filerna laddas ner och sammanfogas med projektet
Funktionen lanseras med översättningar (dagar eller veckor senare)
Det IDE-integrerade arbetssättet
Med IDE-integrerad översättning översätter utvecklaren strängar som en del av sitt vanliga kodningsflöde. Ingen export, ingen uppladdning och ingen väntan – översättningarna görs under samma session som utvecklingen.
Utvecklaren lägger till nya strängar i källspråkets fil
Utvecklaren ber sin AI-assistent att översätta filen
De översatta filerna skrivs direkt till projektet
Funktionen lanseras med översättningarna i samma commit
Det traditionella arbetssättet
6 steps
Multiple tools and platforms
Days to weeks per cycle
Det IDE-integrerade arbetssättet
4 steps
Inside your editor
Same commit
Konfigurera din översättningspipeline
Team som vill automatisera översättning även utanför IDE:n kan lägga till ett CI/CD-steg som översätter nya eller ändrade strängar vid varje push till main. Det fungerar med GitHub Actions, GitLab CI och alla andra CI/CD-system.
Börja med IDE-integrerad översättning för små team. Lägg till CI/CD-automatisering när teamet växer till fler än 3-4 utvecklare eller när du behöver garantera översättningar vid varje merge till 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 pushLägg till kvalitetssäkring av översättningar i CI
Automatiska kontroller i din CI-pipeline upptäcker saknade översättningar, trasiga platshållare och ogiltiga ICU-meddelandeformat innan de når produktion. Det är enkla skript som jämför källspråkets fil med alla målspråksfiler.
#!/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
doneValidera översättningar i CI
Upptäck och hantera avvikelser i översättningar
Översättningsavvikelser uppstår när källsträngar ändras utan att översättningarna uppdateras. Den engelska texten säger "Spara ändringar", men den tyska visar fortfarande den gamla texten. Avvikelsekontrollen jämför tidsstämplar eller innehållshashar mellan käll- och översättningsfiler.
#!/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"Välj översättningsmetod
Allt innehåll behöver inte översättas på samma sätt. Gränssnittssträngar och etiketter fungerar bra med AI-översättning. Marknadsföringstext blir bättre med AI och mänsklig granskning. Juridiska texter och efterlevnadstexter bör alltid översättas av professionella översättare.
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-flöde för översättningar
Översätt på din funktionsgren före sammanfogningen, inte efter. Då innehåller varje merge till main fullständiga översättningar. Lägg till en kontroll före sammanfogningen som verifierar att översättningarna är fullständiga för alla språk som stöds.
Stora JSON-språkfiler orsakar ofta merge-konflikter när flera grenar ändrar dem samtidigt. Sortera nycklarna alfabetiskt och använd en nyckel per rad för att minska diffstorleken och göra konflikterna enklare att lösa.
# .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');
\""Vanliga fallgropar
Att behandla lokalisering som efterarbete
Ingen validering av översättningar på CI-nivå
Överdimensionering med ett TMS
Ingen kontroll av översättningarnas aktualitet
Prova i18n Agent nu
Släpp din översättningsfil här
JSON, YAML, PO, XML, CSV, Markdown, Properties
eller klicka för att välja en fil
Målspråk