Skip to main content

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.

1

En udvikler føjer nye strenge til filen for kildelandestandarden

2

Strengene eksporteres og uploades til en TMS-platform

3

Oversætterne får besked og begynder arbejdet

4

Oversættelserne gennemgås og godkendes

5

De oversatte filer downloades og flettes ind igen

6

Funktionen udgives med oversættelser (dage eller uger senere)

Days to weeks

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.

1

En udvikler føjer nye strenge til filen for kildelandestandarden

2

Udvikleren beder sin AI-assistent om at oversætte filen

3

De oversatte filer skrives direkte til projektet

4

Funktionen udgives med oversættelser i samme commit

Same 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

3

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.

Tilføj oversættelse som et trin i din eksisterende CI/CD-pipeline. Oversættelsen kører, efter at dit build er lykkedes og før udrulningen, så hver udgivelse indeholder opdaterede oversættelser.
.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

Fø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.

Uden oversættelsesvalidering på CI-niveau når manglende oversættelser ubemærket produktion. Brugerne ser rå nøgler som "settings.title" eller tomme strenge i stedet for oversat tekst. En CI-kontrol på 5 minutter forhindrer det helt.
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

Valider oversættelser i CI

Føj i18n-validate til din CI-pipeline for automatisk at finde manglende nøgler, ødelagte pladsholdere og problemer med flertalsformer. Brug i18n-pseudo til at generere kunstige oversættelser til visuel regressionstest.
5

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.

Forældede oversættelser er værre end manglende oversættelser. En manglende oversættelse er tydeligvis forkert – brugerne ser en nøgle eller et reservesprog. En forældet oversættelse formidler overbevisende noget forkert, hvilket kan vildlede brugerne eller skabe supportsager.
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

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.

AI-oversættelse håndterer mere end 80 % af typiske appstrenge i produktionskvalitet. Brug menneskelige oversættere til juridisk tekst, brandets tone og kulturelt følsomt indhold, hvor nuancer betyder mest.
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

Git-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.

Oversættelsesfilerne ligger i dit repository sammen med din kode. De er versionsstyrede, kan gennemgås i pull requests og udrulles gennem den samme pipeline som alt andet.
.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');
\""

Almindelige faldgruber

At behandle lokalisering som efterfølgende udviklingsarbejde

Den største fejl er at vente med oversættelsen, til udviklingen er færdig. Det skaber flaskehalse, forsinker udgivelser og gør oversættelser til en eftertanke. Oversæt under udviklingen, ikke efter.

Ingen oversættelsesvalidering på CI-niveau

Uden automatiserede kontroller når manglende oversættelser, ødelagte pladsholdere og ugyldige formater produktion. Føj kontrol af fuldstændighed og formatvalidering til din CI-pipeline.

Overudvikling med et TMS

Et TMS er udviklet til at administrere menneskelige oversætteres arbejdsgange. Hvis du bruger AI-oversættelse, har du muligvis ikke brug for den ekstra administration, som et TMS medfører. Begynd enkelt – oversæt i IDE'en eller CI/CD – og tilføj kun et TMS, hvis du har brug for at administrere menneskelige oversættere.

Ingen sporing af oversættelsernes aktualitet

Uden sporing af aktualitet ved du ikke, hvilke oversættelser der er forældede. Kildestrenge ændres, men gamle oversættelser bliver stående. Indbyg registrering af afvigelser i din arbejdsgang for at finde forældet indhold.

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

Kræver ingen tilmeldingEstimat med det samme

Ofte stillede spørgsmål