
Kontinuerlig lokalisering uden et TMS
Din kode udrulles løbende. Det bør dine oversættelser også. Sådan automatiserer du lokalisering i din udviklingsproces.
Hvad er kontinuerlig lokalisering?
Kontinuerlig lokalisering er en praksis, hvor nye strenge oversættes automatisk som en del af din udviklingsproces i stedet for at samle oversættelser i periodiske udgivelser. Når en udvikler tilføjer en ny funktion med UI-strenge, oversættes strengene, før funktionen udgives.
Den traditionelle tilgang
De fleste teams samler oversættelser i bunker: De indsamler nye strenge, eksporterer dem til et TMS, venter på oversættere, importerer resultaterne og udgiver derefter. Det skaber en lokaliseringsflaskehals, som forsinker internationale udgivelser med dage eller uger.
En udvikler føjer nye strenge til filen for kildelandestandarden
Strengene eksporteres og uploades til en TMS-platform
Oversætterne får besked og begynder arbejdet
Oversættelserne gennemgås og godkendes
De oversatte filer downloades og flettes ind igen
Funktionen udgives med oversættelser (dage eller uger senere)
Den IDE-integrerede tilgang
Med IDE-integreret oversættelse oversætter udvikleren strengene som en del af sin normale kodeproces. Ingen eksport, ingen upload og ingen ventetid – oversættelserne udføres i samme arbejdssession som udviklingen.
En udvikler føjer nye strenge til filen for kildelandestandarden
Udvikleren beder sin AI-assistent om at oversætte filen
De oversatte filer skrives direkte til projektet
Funktionen udgives med oversættelser i samme commit
Den traditionelle tilgang
6 steps
Multiple tools and platforms
Days to weeks per cycle
Den IDE-integrerede tilgang
4 steps
Inside your editor
Same commit
Konfigurer din oversættelsespipeline
Hvis dit team ønsker automatiseret oversættelse uden for IDE'en, kan du tilføje et CI/CD-trin, der oversætter nye eller ændrede strenge ved hvert push til main. Det fungerer med GitHub Actions, GitLab CI og alle andre CI/CD-systemer.
Begynd med IDE-integreret oversættelse til små teams. Tilføj CI/CD-automatisering, når dit team vokser til mere end 3-4 udviklere eller når du har brug for at garantere oversættelser ved hver fletning 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 pushFøj kvalitetssikring af oversættelser til CI
Automatiserede kontroller i din CI-pipeline finder manglende oversættelser, ødelagte pladsholdere og ugyldige ICU-meddelelsesformater, før de når produktion. Det er enkle scripts, som sammenligner filen for din kildelandestandard med alle mållandestandarder.
#!/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 oversættelser i CI
Registrer og håndter oversættelsesafvigelser
Oversættelsesafvigelser opstår, når kildestrenge ændres, uden at oversættelserne opdateres. Den engelske tekst siger "Save changes", men den tyske viser stadig den gamle tekst. Registrering af afvigelser sammenligner tidsstempler eller indholdshashes for kilde- og oversættelsesfiler.
#!/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ælg din oversættelsestilgang
Ikke alt indhold kræver den samme oversættelsestilgang. UI-strenge og etiketter egner sig godt til AI-oversættelse. Marketingtekster har gavn af AI kombineret med menneskelig gennemgang. Juridiske tekster og compliancetekster bør altid oversættes af professionelle menneskelige oversættere.
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-arbejdsgang til oversættelser
Oversæt på din funktionsgren før fletning, ikke efter. Det sikrer, at hver fletning til main indeholder komplette oversættelser. Tilføj en kontrol før fletning, som bekræfter, at oversættelserne er komplette for alle understøttede landestandarder.
Store JSON-landestandardfiler medfører ofte flettekonflikter, når flere grene ændrer dem samtidig. Sortér nøglerne alfabetisk og brug én nøgle pr. linje for at minimere diffens størrelse og gøre konflikter nemmere at 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');
\""Almindelige faldgruber
At behandle lokalisering som efterfølgende udviklingsarbejde
Ingen oversættelsesvalidering på CI-niveau
Overudvikling med et TMS
Ingen sporing af oversættelsernes aktualitet
Prøv i18n Agent nu
Slip din oversættelsesfil her
JSON, YAML, PO, XML, CSV, Markdown, Properties
eller klik for at vælge en fil
Målsprog