Skip to main content

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.

1

Utvecklaren lägger till nya strängar i källspråkets fil

2

Strängarna exporteras och laddas upp till en TMS-plattform

3

Översättarna meddelas och börjar arbeta

4

Översättningarna granskas och godkänns

5

De översatta filerna laddas ner och sammanfogas med projektet

6

Funktionen lanseras med översättningar (dagar eller veckor senare)

Days to weeks

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.

1

Utvecklaren lägger till nya strängar i källspråkets fil

2

Utvecklaren ber sin AI-assistent att översätta filen

3

De översatta filerna skrivs direkt till projektet

4

Funktionen lanseras med översättningarna i samma commit

Same 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

3

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.

Lägg till översättning som ett steg i din befintliga CI/CD-pipeline. Översättningen körs efter att bygget har slutförts och före driftsättningen så att varje version innehåller aktuella översättningar.
.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

Lä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.

Utan validering av översättningar på CI-nivå kan saknade översättningar nå produktion obemärkt. Användarna ser obearbetade nycklar som "settings.title" eller tomma strängar i stället för översatt text. En CI-kontroll på fem minuter förhindrar detta 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

Validera översättningar i CI

Lägg till i18n-validate i din CI-pipeline för att automatiskt upptäcka saknade nycklar, trasiga platshållare och problem med pluralformer. Använd i18n-pseudo för att skapa testöversättningar för visuell regressionstestning.
5

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.

Inaktuella översättningar är värre än saknade översättningar. En saknad översättning är uppenbart fel – användarna ser en nyckel eller ett reservspråk. En inaktuell översättning förmedlar fel budskap på ett övertygande sätt, vilket kan vilseleda användare eller orsaka supportärenden.
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ä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.

AI-översättning hanterar över 80 % av vanliga appsträngar med produktionsklar kvalitet. Använd mänskliga översättare för juridiska texter, varumärkets tonalitet och kulturellt känsligt innehåll där nyanser är särskilt viktiga.
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-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.

Översättningsfilerna finns i ditt repository tillsammans med koden. De versionshanteras, kan granskas i pull-begäranden och driftsätts genom samma pipeline som allt annat.
.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');
\""

Vanliga fallgropar

Att behandla lokalisering som efterarbete

Det största misstaget är att vänta med översättningen tills utvecklingen är klar. Det skapar flaskhalsar, fördröjer lanseringar och gör översättningen till en eftertanke. Översätt under utvecklingen, inte efteråt.

Ingen validering av översättningar på CI-nivå

Utan automatiska kontroller når saknade översättningar, trasiga platshållare och ogiltiga format produktion. Lägg till fullständighets- och formatvalidering i din CI-pipeline.

Överdimensionering med ett TMS

Ett TMS är utformat för att hantera arbetsflöden för mänskliga översättare. Om du använder AI-översättning kanske du inte behöver den extra administration som ett TMS medför. Börja enkelt – översätt i IDE:n eller CI/CD – och lägg bara till ett TMS om du behöver hantera mänskliga översättare.

Ingen kontroll av översättningarnas aktualitet

Utan aktualitetskontroll vet du inte vilka översättningar som är inaktuella. Källsträngarna ändras, men de gamla översättningarna ligger kvar. Bygg in avvikelsekontroll i arbetsflödet för att upptäcka inaktuellt innehåll.

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

Ingen registrering krävsPrisuppskattning direkt

Vanliga frågor