Skip to main content

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.

1

Utvikleren legger til nye strenger i kildespråkfilen

2

Strengene eksporteres og lastes opp til en TMS-plattform

3

Oversettere blir varslet og begynner å jobbe

4

Oversettelsene gjennomgås og godkjennes

5

Oversatte filer lastes ned og slås sammen igjen

6

Funksjonen rulles ut med oversettelser (dager til uker senere)

Days to weeks

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.

1

Utvikleren legger til nye strenger i kildespråkfilen

2

Utvikleren ber sin AI-assistent om å oversette filen

3

Oversatte filer skrives direkte til prosjektet

4

Funksjonen rulles ut med oversettelser i samme commit

Same 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

3

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.

Legg til oversettelse som et steg i den eksisterende CI/CD-pipelinen din. Oversettelsen kjører etter at build-en lykkes og før driftsetting, slik at hver utgivelse inneholder oppdaterte oversettelser.
.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

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

Uten oversettelsesvalidering på CI-nivå når manglende oversettelser produksjon i stillhet. Brukere ser rå nøkler som «settings.title» eller tomme strenger i stedet for oversatt tekst. En 5-minutters CI-sjekk forhindrer dette fullstendig.
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 oversettelser i CI

Legg til i18n-validate i CI-pipelinen din for å automatisk fange opp manglende nøkler, ødelagte plassholdere og flertallsproblemer. Bruk i18n-pseudo til å generere falske oversettelser for visuell regresjonstesting.
5

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.

Foreldede oversettelser er verre enn manglende oversettelser. En manglende oversettelse er åpenbart feil — brukere ser en nøkkel eller et reservespråk. En foreldet oversettelse sier noe feil på en overbevisende måte, noe som kan villede brukere eller forårsake supportsaker.
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

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.

AI-oversettelse håndterer 80 %+ av typiske app-strenger med produksjonskvalitet. Reserver menneskelige oversettere til juridisk tekst, merkevarestemme og kulturelt sensitivt innhold der nyanser betyr 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-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.

Oversettelsesfiler ligger i kodearkivet sammen med koden din. De er versjonskontrollerte, kan gjennomgås i pull requests og driftsettes gjennom samme pipeline som alt annet.
.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');
\""

Vanlige fallgruver

Å behandle lokalisering som etterarbeid

Den største feilen er å vente til etter utviklingen med å oversette. Dette skaper flaskehalser, forsinker utgivelser og gjør oversettelser til noe sekundært. Oversett under utviklingen, ikke etterpå.

Ingen oversettelsesvalidering på CI-nivå

Uten automatiserte sjekker når manglende oversettelser, ødelagte plassholdere og ugyldige formater produksjon. Legg til validering av kompletthet og format i CI-pipelinen din.

Overengineering med et TMS

Et TMS er utviklet for å håndtere arbeidsflyter for menneskelige oversettere. Hvis du bruker AI-oversettelse, trenger du kanskje ikke ekstraarbeidet et TMS medfører. Start enkelt — oversett i IDE-en eller CI/CD — og legg til et TMS bare hvis du trenger å administrere menneskelige oversettere.

Å ikke spore om oversettelsene er oppdaterte

Uten å spore oppdateringsstatus vet du ikke hvilke oversettelser som er foreldede. Kildestrenger endres, men gamle oversettelser blir værende. Bygg avviksdeteksjon inn i arbeidsflyten din for å fange opp foreldet innhold.

Prøv i18n Agent nå

Slipp oversettelsesfilen din her

JSON, YAML, PO, XML, CSV, Markdown, Properties

eller klikk for å bla gjennom

Målspråk

Ingen registrering krevesUmiddelbart estimat

Ofte stilte spørsmål