Verifique traduções em GitHub Actions
Uma tradução que remove {name} ou pula uma chave quebra o app em tempo de execução, e a revisão raramente percebe. Este workflow roda kaeris check em cada pull request e deixa o job vermelho. É offline e gratuito: sem chave API, sem conta.
KAERIS traduziu esta página e verificou cada linha traduzindo-a de volta. Um falante nativo ainda não revisou. Original em inglês
A receita
O workflow
Salve como .github/workflows/i18n-check.yml. Altere source para seu arquivo base de idioma e languages para os locais que você distribui.
name: i18n check
on: pull_request
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: kaeris-io/kaeris-action@v1
with:
mode: check
source: locales/en.json
languages: de,fr
Sem Python: npx
O pacote npm kaeris executa a mesma verificação com Node 18 ou mais recente; o npx baixa o pacote sozinho, sem etapa de instalação. Ele tem só check: para traduzir é preciso o pacote Python.
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npx kaeris check --source locales/en.json --langs de,fr
O mesmo sem o Action
Passos simples com Python e pip. O log então mostra cada achado linha a linha em vez da tabela que o Action imprime.
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install kaeris
- run: kaeris check --source locales/en.json --langs de,fr --ci
Achados na linha exata do pull request (opcional)
O Action também pode gerar um relatório SARIF; enviá-lo transforma cada achado em uma anotação no diff. Uploads de análise de código são gratuitos em repositórios públicos; privados precisam do GitHub Advanced Security.
name: i18n check
on: pull_request
permissions:
contents: read
security-events: write
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: kaeris-io/kaeris-action@v1
with:
mode: check
source: locales/en.json
languages: de,fr
sarif-file: kaeris.sarif
- uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: kaeris.sarif
O que ele imprime, em execuções reais
Saída do kaeris 0.2.35, capturada em 27 de outubro de 2026. A última linha de cada caixa é o código de saída que o job CI vê.
O que o job imprime
O Action imprime uma tabela resumo por idioma e termina com a linha de erro quando algo está errado. À esquerda: arquivos que estão corretos. À direita: de.json com {nam} em vez de {name} e a chave checkout faltando.
## KAERIS i18n — CI check Placeholder-loss: **0** (should be 0). | Language | Status | Missing | Placeholder issues | Translated | |---|---|---|---|---| | de | ✓ complete | 0 | 0 | – | | fr | ✓ complete | 0 | 0 | – | _Generated from `kaeris check --json` — no fabricated numbers._ step exit=0 --- GITHUB_OUTPUT (without summary body): missing=0 placeholder-issues=0 changed=false check-exit-code=0 translate-exit-code=0
## KAERIS i18n — CI check Placeholder-loss: **1** (should be 0). Missing keys remaining: **1**. | Language | Status | Missing | Placeholder issues | Translated | |---|---|---|---|---| | de | ⚠ 1 missing, 1 placeholder issue | 1 | 1 | – | | fr | ✓ complete | 0 | 0 | – | _Generated from `kaeris check --json` — no fabricated numbers._ ::error::kaeris check found incomplete/broken translations — see the job summary for the language matrix step exit=1 --- GITHUB_OUTPUT (without summary body): missing=1 placeholder-issues=1 changed=false check-exit-code=1 translate-exit-code=0
O que a etapa com npx imprime
O mesmo projeto verificado com npx: kaeris 0.2.37 do npm, cache do npm vazio e CI=true, como em um runner novo. A primeira linha é o npm instalando o pacote.
$ npx kaeris check --source locales/en.json --langs de,fr npm warn exec The following package was not found and will be installed: [email protected] ✓ de: complete & placeholder-safe ✓ fr: complete & placeholder-safe ✓ all locales complete & placeholder-safe exit code: 0
$ npx kaeris check --source locales/en.json --langs de,fr npm warn exec The following package was not found and will be installed: [email protected] ✗ de: 1 missing key(s): checkout ✗ de: 1 placeholder mismatch(es): greeting: missing ['{name}'], added ['{nam}'] ✗ de: 2 translation fault(s): greeting: lost placeholder {name} greeting: invented placeholder {nam} (not in source) ✓ fr: complete & placeholder-safe ✗ 1 missing key, 1 placeholder mismatch, 2 translation faults exit code: 1
Configure em três passos
Salve o workflow
Crie
.github/workflows/i18n-check.ymlcom o workflow acima, usando seu própriosourceelanguages.Abra um pull request
Envie um branch que altere um arquivo de localidade. O job roda em todo pull request e fica vermelho se faltar um placeholder ou uma chave.
Torne a verificação obrigatória
Nas configurações do repositório, adicione o job como uma verificação de status obrigatória na proteção do branch. Um job vermelho bloqueia o merge.
Como verificamos isso
Todos os comandos desta página foram executados antes de serem escritos aqui. O que não foi executado também está listado.
O que foi executado
O script do passo do
kaeris-io/kaeris-actionna tagv1, copiado do GitHub em 27 de outubro de 2026 e rodado em bash num projeto de teste, com o CLI instalado do PyPI (kaeris 0.2.35). Arquivos limpos: código de saída 0. Ode.jsoncom erro: código de saída 1 e a linha de erro mostrada acima.npx
npx kaeris checkdo pacote npm kaeris 0.2.37 foi executado em 28 de outubro de 2026 no mesmo projeto de teste, com cache do npm vazio,CI=truee sem--yes. Arquivos corretos: código de saída 0. Ode.jsonquebrado: código de saída 1.SARIF
A flag
--sariffoi usada no projeto com erro e gerou um relatório com 4 resultados; em arquivos limpos gerou relatório com 0. O upload para o GitHub não foi tentado.O que não foi executado
O arquivo do workflow em si não foi executado em um runner do GitHub, nem
actions/checkout,actions/setup-python,actions/setup-nodeeupload-sarif. A sintaxe dos workflows acima não foi verificada pelo GitHub.Qual CLI o Action instala
O Action roda
pip install "kaeris>=0.2.12", então o job pega a versão mais nova naquele momento. Se precisar de uma versão fixa, use a variante plain-steps e fixe:pip install kaeris==0.2.35.
Opções que vale a pena conhecer
Falhar também em chaves obsoletas
Defina
strict: trueno Action (ou--strictna variante plain).Traduções em outra pasta
Defina
out: path/to/translationsno Action; por padrão usa a pasta do arquivo fonte.Mantenha nomes de marcas como estão
--glossary 'KAERIS,GitHub'falha se um termo for removido no destino. A mesma lista pode ficar emkeepnokaeris.json.Layout de arquivo diferente
--outé a pasta com as traduções e--pattern '{lang}/common.json'seus nomes de arquivo. Padrão: o layout quekaeris translategera.
Perguntas
Precisa de chave API ou conta?
Não. kaeris check é descrito em sua ajuda como estático, local e sem API, então o job não precisa de segredo. Traduzir é um comando separado que precisa de chave.
Quais formatos de arquivo ele lê?
A ajuda do kaeris check lista JSON, ARB, YAML, .strings, .xcstrings, .po, XML Android, CSV, XLIFF, .properties, .resx, Fluent e Markdown como formatos fonte (kaeris 0.2.35 e superiores). Guias por formato
O que faz o job falhar?
O código de saída do kaeris check: 0 limpo, 1 problema encontrado, 2 uso incorreto ou arquivo ilegível. Um problema que o check chama de vermelho falha o job; strict faz chaves obsoletas falharem também. Referência do GitHub Action
Continue
Outras receitas: GitLab CI · pre-commit · Make e scripts npm
Referência CLI · Referência Check · Referência GitHub Action · Check gratuito no navegador · Traduzir no navegador