Skip to main content

Ciągła lokalizacja bez TMS

Kod jest wdrażany bez przerwy. Tłumaczenia również powinny. Zobacz, jak zautomatyzować lokalizację w procesie programistycznym.

Czym jest ciągła lokalizacja?

Ciągła lokalizacja polega na automatycznym tłumaczeniu nowych tekstów w ramach procesu programistycznego zamiast grupowania ich w okresowych wydaniach. Gdy programista dodaje nową funkcję z tekstami interfejsu, są one tłumaczone przed jej publikacją.

Tradycyjne podejście

Większość zespołów grupuje tłumaczenia: zbiera nowe teksty, eksportuje je do TMS, czeka na tłumaczy, importuje wyniki i dopiero wydaje funkcję. Powstaje wąskie gardło lokalizacji opóźniające międzynarodowe wydania o dni lub tygodnie.

1

Programista dodaje nowe teksty do pliku języka źródłowego

2

Teksty są eksportowane i przesyłane na platformę TMS

3

Tłumacze otrzymują powiadomienie i rozpoczynają pracę

4

Tłumaczenia są sprawdzane i zatwierdzane

5

Przetłumaczone pliki są pobierane i ponownie scalane

6

Funkcja trafia do użytkowników z tłumaczeniami po kilku dniach lub tygodniach

Days to weeks

Podejście natywne dla środowiska programistycznego

W podejściu zintegrowanym ze środowiskiem programista tłumaczy teksty podczas zwykłej pracy z kodem. Bez eksportowania, przesyłania i oczekiwania — tłumaczenia powstają w tej samej sesji co funkcja.

1

Programista dodaje nowe teksty do pliku języka źródłowego

2

Programista prosi asystenta AI o przetłumaczenie pliku

3

Przetłumaczone pliki są zapisywane bezpośrednio w projekcie

4

Funkcja i tłumaczenia trafiają do tego samego zatwierdzenia

Same commit

Tradycyjne podejście

6 steps

Multiple tools and platforms

Days to weeks per cycle

Podejście natywne dla środowiska programistycznego

4 steps

Inside your editor

Same commit

3

Konfigurowanie pipeline'u tłumaczeń

Zespoły potrzebujące automatyzacji poza środowiskiem mogą dodać etap CI/CD, który przy każdym wypchnięciu do main tłumaczy nowe lub zmienione teksty. Rozwiązanie działa z GitHub Actions, GitLab CI i dowolnym systemem CI/CD.

Małe zespoły powinny zacząć od tłumaczeń w środowisku programistycznym. Automatyzację CI/CD warto dodać po przekroczeniu 3-4 programistów lub gdy każde scalenie z main musi zawierać komplet tłumaczeń.

Dodaj tłumaczenie jako etap istniejącego pipeline CI/CD. Uruchamiaj je po udanej kompilacji i przed wdrożeniem, aby każde wydanie zawierało aktualne tłumaczenia.
.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

Kontrola jakości tłumaczeń w CI

Automatyczne kontrole w pipeline CI wykrywają brakujące tłumaczenia, uszkodzone symbole zastępcze i nieprawidłowy format ICU przed wdrożeniem na produkcję. Proste skrypty porównują plik języka źródłowego ze wszystkimi plikami docelowymi.

Bez walidacji na poziomie CI brakujące tłumaczenia trafiają po cichu do produkcji. Zamiast tekstu użytkownicy widzą surowe klucze takie jak "settings.title" lub puste ciągi. Pięciominutowa kontrola CI całkowicie temu zapobiega.
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

Walidacja tłumaczeń w CI

Dodaj i18n-validate do pipeline CI, aby automatycznie wykrywać brakujące klucze, uszkodzone symbole zastępcze i problemy z liczbą mnogą. Użyj i18n-pseudo do generowania sztucznych tłumaczeń na potrzeby testów regresji wizualnej.
5

Wykrywanie rozbieżności tłumaczeń

Rozbieżność powstaje, gdy tekst źródłowy się zmienia, a tłumaczenia nie są aktualizowane. Po angielsku widnieje "Save changes", ale niemiecki nadal zawiera poprzedni tekst. Wykrywanie porównuje znaczniki czasu lub skróty zawartości plików źródłowych i tłumaczeń.

Nieaktualne tłumaczenie jest gorsze niż brakujące. Brak jest oczywisty — użytkownik widzi klucz lub język rezerwowy. Nieaktualny tekst przekonująco przekazuje błędną informację, co może wprowadzać w błąd i powodować zgłoszenia do pomocy technicznej.
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

Wybór sposobu tłumaczenia

Nie każda treść wymaga tego samego podejścia. Teksty i etykiety interfejsu dobrze tłumaczy AI. Teksty marketingowe korzystają na weryfikacji człowieka, a treści prawne i dotyczące zgodności powinny zawsze trafiać do profesjonalnych tłumaczy.

AI zapewnia jakość produkcyjną dla ponad 80% typowych tekstów aplikacji. Tłumaczy należy angażować do treści prawnych, języka marki i materiałów wrażliwych kulturowo, gdzie niuanse są najważniejsze.
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

Przepływ Git dla tłumaczeń

Tłumacz w gałęzi funkcji przed scaleniem, a nie po nim. Dzięki temu każde scalenie z main zawiera kompletne tłumaczenia. Dodaj kontrolę przed scaleniem, która sprawdzi kompletność wszystkich obsługiwanych języków.

Duże pliki JSON często powodują konflikty, gdy kilka branchy modyfikuje je równocześnie. Sortuj klucze alfabetycznie i zapisuj po jednym w wierszu, aby ograniczyć rozmiar różnic i ułatwić rozwiązywanie konfliktów.

Pliki tłumaczeń znajdują się w repozytorium obok kodu. Podlegają kontroli wersji, można je sprawdzać w pull requestach i wdrażać przez ten sam pipeline co pozostałe pliki.
.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');
\""

Częste pułapki

Traktowanie lokalizacji jako etapu po programowaniu

Największym błędem jest czekanie z tłumaczeniem do końca prac. Powstają wąskie gardła, wydania się opóźniają, a tłumaczenia są traktowane jako dodatek. Tłumacz podczas programowania, nie po nim.

Brak walidacji tłumaczeń na poziomie CI

Bez automatycznych kontroli brakujące tłumaczenia, uszkodzone symbole zastępcze i nieprawidłowe formaty trafiają do produkcji. Dodaj do pipeline CI walidację kompletności i formatu.

Nadmiernie rozbudowane rozwiązanie z TMS

TMS powstał do zarządzania pracą tłumaczy. Przy tłumaczeniach AI jego narzut może być zbędny. Zacznij prosto — tłumacz w środowisku lub CI/CD — i dodaj TMS dopiero wtedy, gdy potrzebne jest zarządzanie tłumaczami.

Brak śledzenia aktualności tłumaczeń

Bez śledzenia aktualności nie wiadomo, które tłumaczenia są nieaktualne. Teksty źródłowe się zmieniają, a stare wersje pozostają. Dodaj wykrywanie rozbieżności do przepływu pracy.

Wypróbuj i18n Agent

Upuść tutaj plik tłumaczenia

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

lub kliknij, aby go wybrać

Języki docelowe

Rejestracja nie jest wymaganaNatychmiastowa wycena

Częste pytania