Skip to main content

Localização contínua sem TMS

Seu código é implementado continuamente. As traduções também devem ser. Saiba como automatizar a localização no seu fluxo de desenvolvimento.

O que é a localização contínua?

A localização contínua consiste em traduzir automaticamente novas strings como parte do fluxo de desenvolvimento, em vez de as agrupar em versões periódicas. Quando um desenvolvedor adiciona uma funcionalidade com strings de interface, estas são traduzidas antes do lançamento.

A abordagem tradicional

A maioria das equipes agrupa as traduções: coleta novas strings, as exporta para um TMS, aguarda pelos tradutores, importa os resultados e lança. Isto cria um gargalo que atrasa os lançamentos internacionais por dias ou semanas.

1

O desenvolvedor adiciona novas strings ao arquivo de localidade de origem

2

As strings são exportadas e enviadas em uma plataforma TMS

3

Os tradutores são notificados e começam a trabalhar

4

As traduções são revisadas e aprovadas

5

Os arquivos traduzidos são baixados e reintegrados

6

A funcionalidade é lançada com traduções —dias ou semanas depois—

Days to weeks

A abordagem nativa do IDE

Com tradução nativa do IDE, o desenvolvedor traduz as strings como parte do fluxo habitual de programação. Sem exportar, enviar ou esperar: as traduções surgem na mesma sessão de desenvolvimento.

1

O desenvolvedor adiciona novas strings ao arquivo de localidade de origem

2

O desenvolvedor pede ao assistente de IA para traduzir o arquivo

3

Os arquivos traduzidos são gravados diretamente no projeto

4

A funcionalidade é lançada com as traduções no mesmo commit

Same commit

A abordagem tradicional

6 steps

Multiple tools and platforms

Days to weeks per cycle

A abordagem nativa do IDE

4 steps

Inside your editor

Same commit

3

Configurar o pipeline de tradução

As equipes que pretendam automatizar além do IDE podem adicionar uma etapa de CI/CD que traduza strings novas ou alteradas em cada envio para main. Funciona com GitHub Actions, GitLab CI ou qualquer sistema de CI/CD.

Comece com tradução nativa do IDE em equipes pequenas. Adicione automatização de CI/CD quando a equipe ultrapassar 3 a 4 desenvolvedores ou precisar de garantir traduções em cada integração com main.

Adicione a tradução como uma etapa do seu pipeline de CI/CD atual. É executada depois de a compilação terminar e antes da implementação, garantindo que todas as versões incluem traduções atualizadas.
.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

Adicionar o controle de qualidade da tradução a CI

As verificações automáticas no pipeline de CI detectam traduções em falta, marcadores danificados e formatos de mensagens ICU inválidos antes de chegarem à produção. São scripts simples que comparam o arquivo de localidade de origem com todas as localidades de destino.

Sem validação de traduções em CI, as traduções em falta chegam silenciosamente à produção. Os usuários veem chaves em bruto como «settings.title» ou strings vazias em vez de texto traduzido. Uma verificação de CI de 5 minutos evita totalmente o problema.
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

Validar traduções em CI

Adicione i18n-validate ao pipeline de CI para detectar automaticamente chaves em falta, marcadores danificados e problemas de plural. Utilize i18n-pseudo para gerar traduções simuladas em testes de regressão visual.
5

Detectar e tratar a divergência das traduções

A divergência ocorre quando as strings de origem mudam, mas as traduções não são atualizadas. O inglês diz «Save changes», mas o alemão continua mostrando o texto antigo. A detecção compara os carimbos de data/hora ou os hashes do conteúdo dos arquivos de origem e tradução.

As traduções desatualizadas são piores do que as ausentes. Uma tradução em falta está obviamente errada: os usuários veem uma chave ou o idioma de fallback. Uma tradução desatualizada transmite de forma convincente uma mensagem errada, podendo induzir os usuários em erro ou causar problemas de apoio.
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

Escolher a abordagem de tradução

Nem todo o conteúdo precisa da mesma abordagem. As strings e etiquetas da interface funcionam muito bem com IA. Os textos de marketing beneficiam de IA e revisão humana. Os textos jurídicos e de conformidade devem utilizar sempre tradutores humanos profissionais.

A tradução com IA trata mais de 80% das strings habituais de uma aplicação com qualidade de produção. Reserve os tradutores humanos para textos jurídicos, voz da marca e conteúdo culturalmente sensível, onde as sutilezas são mais importantes.
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

Fluxo Git para traduções

Traduza no ramo da funcionalidade antes de integrar, não depois. Assim, todas as integrações em main incluem traduções completas. Adicione uma verificação prévia que confirme a integridade das traduções em todas as localidades compatíveis.

Os arquivos JSON regionais grandes provocam conflitos frequentes quando vários ramos os alteram em simultâneo. Ordene as chaves alfabeticamente e utilize uma chave por linha para reduzir as diferenças e facilitar a resolução dos conflitos.

Os arquivos de tradução residem no repositório junto ao código. Ficam sob controle de versões, podem ser revisados nos pull requests e são implementados pelo mesmo pipeline que tudo o resto.
.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');
\""

Erros frequentes

Tratar a localização como uma etapa posterior ao desenvolvimento

O maior erro é esperar pelo fim do desenvolvimento para traduzir. Isto cria gargalos, atrasa lançamentos e transforma a tradução em uma reflexão tardia. Traduza durante o desenvolvimento, não depois.

Sem validação de traduções em CI

Sem verificações automáticas, as traduções em falta, os marcadores danificados e os formatos inválidos chegam à produção. Adicione validações de integridade e formato ao pipeline de CI.

Excesso de complexidade com um TMS

Um TMS foi concebido para gerenciar fluxos de tradutores humanos. Se utilizar tradução com IA, talvez não precise dos encargos de um TMS. Comece de forma simples —traduza no IDE ou em CI/CD— e só adicione um TMS se precisar de gerenciar tradutores humanos.

Não acompanhar a atualidade das traduções

Sem acompanhamento, não sabe que traduções estão desatualizadas. As strings de origem mudam, mas as traduções antigas permanecem. Integre no fluxo uma detecção de divergências para encontrar conteúdo desatualizado.

Experimente já o i18n Agent

Solte aqui seu arquivo de tradução

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

ou clique para selecionar

Idiomas de destino

Sem cadastroEstimativa imediata

Perguntas frequentes