Configuração
Champollion funciona sem configuração — ele detecta automaticamente arquivos de locale, formato e idiomas de destino do seu projeto. Para mais controle, crie champollion.config.json na raiz do seu projeto, ou execute:
npx champollion init
Referência Completa de Configuração
{
"version": 3,
"inputLocale": "en",
"localesDir": "./locales",
"contentDir": null,
"translatableFields": null,
"format": "auto",
"model": "google/gemini-3.5-flash",
"temperature": 0.3,
"defaultMethod": "llm",
"batchSize": 80,
"coachingFile": null,
"promptContext": null,
"jsonConcurrency": 200,
"contentConcurrency": 48,
"fallbackPrefix": "[EN] ",
"apiKeyEnvVar": "OPENROUTER_API_KEY",
"baseUrl": "",
"pairs": {},
"languages": {},
"lint": {
"srcDir": null,
"ignore": ["node_modules", ".next", "dist"],
"minLength": 2
},
"seo": {
"urlPattern": "/:locale/:path",
"pages": null
},
"typegen": {
"output": null,
"autoGenerate": false
}
}
:::note typegen ainda não foi implementado
O bloco de configuração typegen é reconhecido e preservado pelo carregador de configuração, mas a geração de tipos TypeScript ainda não foi implementada. Este é um espaço reservado para um recurso planejado. Definir esses valores não tem efeito.
:::
Campos
| Campo | Tipo | Padrão | Descrição |
|---|---|---|---|
version | number | 3 | Versão do schema de configuração. Sempre 3. |
inputLocale | string | "en" | Código do idioma de origem (BCP 47). |
localesDir | string | "./locales" | Caminho para arquivos de locale. Champollion escaneia este diretório. |
contentDir | string | null | Diretório de conteúdo Hugo. Habilita tradução de corpo Markdown. |
translatableFields | string[] | null | Sobrescreve campos de frontmatter traduzíveis padrão para tradução de conteúdo. null usa padrões integrados (title, description, summary). |
format | string | "auto" | Formato de arquivo: json, toml, yaml, ou auto (detectar pela extensão). |
model | string | "google/gemini-3.5-flash" | Modelo padrão para métodos LLM. Aceita slugs completos do OpenRouter (provider/model) ou aliases curtos de shared/model-aliases.json (ex: gemini-flash). Provedores diretos usam nomes simples (ex: gpt-4o). |
temperature | number | 0.3 | Temperatura do LLM (0.0–2.0). Menor = mais determinístico. |
defaultMethod | string | "llm" | Método de tradução padrão: llm, llm-coached, google-translate, deepl, microsoft-translator, libretranslate, openai, anthropic, gemini, api. Sobrescrito pela flag CLI --method. |
batchSize | number | 80 | Chaves por lote de tradução. Maior = menos chamadas de API, mas prompts maiores. |
coachingFile | string | null | Caminho para arquivo de prompt de coaching em texto livre (relativo à raiz do projeto). O conteúdo é lido na inicialização e injetado no prompt do sistema como um bloco Coaching guidance:. |
promptContext | string | null | String de contexto da aplicação injetada no prompt do sistema (ex: "Descrições de produtos de e-commerce"). Ajuda o modelo a adaptar traduções ao seu domínio. |
jsonConcurrency | number | 200 | Máximo de traduções de locale paralelas para sincronização de chaves JSON. Sobrescrito pela flag CLI --json-concurrency. |
contentConcurrency | number | 48 | Máximo de chamadas de API paralelas para tradução de conteúdo (Markdown/MDX). Sobrescrito pela flag CLI --content-concurrency. |
fallbackPrefix | string | "[EN] " | Prefixo de marcador usado por audit e verify para detectar valores não traduzidos legados de execuções anteriores. Champollion não escreve este prefixo — apenas o lê para detecção. |
apiKeyEnvVar | string | "OPENROUTER_API_KEY" | Nome da variável de ambiente para a chave de API. Sobrescreva para nomes de variáveis de ambiente personalizadas. |
baseUrl | string | "" | URL base para geração de artefatos SEO (hreflang, sitemaps, JSON-LD). |
pairs | object | {} | Sobrescritas de método, modelo e qualidade por par. Veja Configuração de Par. |
languages | object | {} | Sobrescritas por idioma. Veja Configuração de Idioma. |
lint.srcDir | string | null | Diretório de origem para escaneamento de lint. null = detectar automaticamente do framework. |
lint.ignore | string[] | ["node_modules", ...] | Padrões glob para excluir do lint. |
lint.minLength | number | 2 | Comprimento mínimo de string para sinalizar como hardcoded. |
seo.urlPattern | string | "/:locale/:path" | Padrão de template de URL para geração de tag hreflang. |
seo.pages | string[] | null | Lista explícita de páginas para SEO. null = detectar automaticamente das chaves de locale. |
typegen.output | string | null | Caminho de saída para tipos TypeScript gerados. null = desabilitado. |
typegen.autoGenerate | boolean | false | Regenerar tipos automaticamente após cada sincronização. |
Configuração de Par
Cada par origem→destino pode ser configurado independentemente:
{
"pairs": {
"en:fr": {
"method": "google-translate",
"qualityTier": "high"
},
"en:ja": {
"method": "llm",
"model": "google/gemini-2.5-pro"
},
"en:crk": {
"methodPlugin": "crk-coached-v1"
}
}
}
Campos de Par
| Campo | Tipo | Descrição |
|---|---|---|
method | string | Método de tradução: llm, llm-coached, google-translate, deepl, microsoft-translator, libretranslate, openai, anthropic, gemini, api |
methodPlugin | string | Nome de um plugin instalado (de .champollion/methods/) |
model | string | Sobrescreva o modelo padrão para este par |
temperature | number | Sobrescreva a temperatura padrão para este par |
batchSize | number | Sobrescreva o tamanho de lote padrão para este par |
register | string | Sobrescrita de registro/tom (chave de preset ou texto livre) |
endpoint | string | URL de endpoint de API remota. Obrigatório quando method é api. |
coachingFile | string | Caminho para arquivo de prompt de coaching para este par |
promptContext | string | Contexto da aplicação para este par |
qualityTier | string | Tier de exibição: standard, high, research, verified |
Configuração de Idioma
Idiomas aceitam três formatos:
Array de códigos (mais simples)
{
"languages": ["fr", "de", "ja"]
}
Cada idioma obtém seu registro padrão da tabela de registro integrada. Idiomas sem um padrão recebem "Professional register.".
Objeto com strings de registro
O valor pode ser uma chave de preset do cartão do idioma, ou texto de registro personalizado:
{
"languages": {
"fr": "casual-tu",
"ko": "formal-hapsyo",
"ja": "Custom: Polite Japanese for a gaming app."
}
}
Champollion verifica se a string corresponde a uma chave de preset no cartão do idioma. Se corresponder, o prompt de registro completo do cartão é usado. Se não, a string é usada como está. Veja Idiomas Suportados para presets disponíveis.
Objeto com configuração completa
{
"languages": {
"crk": {
"name": "Plains Cree",
"register": "SRO syllabics with grammatical precision.",
"model": "google/gemini-2.5-pro",
"batchSize": 5,
"maxRetries": 5,
"script": "cans"
}
}
}
Você pode misturar objetos abreviados e completos no mesmo bloco.
Campos de Idioma
| Campo | Tipo | Descrição |
|---|---|---|
register | string | Instruções de estilo/tom. Pode ser uma chave de preset (ex: casual-tu, formal-hapsyo) ou texto personalizado. Veja Cartões de Idioma. |
name | string | Nome de idioma legível por humanos (para exibição de status) |
model | string | Sobrescreva o modelo padrão |
temperature | number | Sobrescreva a temperatura padrão |
batchSize | number | Sobrescreva o tamanho de lote padrão |
coachingFile | string | Caminho para arquivo de prompt de coaching para este idioma |
promptContext | string | Contexto da aplicação para este idioma |
maxRetries | number | Orçamento máximo de tentativas para lotes falhados (padrão: 3) |
script | string | Código de script ISO 15924. Dispara validação de script no portão de qualidade. |
:::info Cadeia de herança As configurações são resolvidas nesta ordem (primeira vence):
nível de par → nível de idioma → configuração global → padrões
Por exemplo, se pairs["en:fr"] define model, ele sobrescreve os valores model de nível de idioma e global.
:::
Origem Não-Inglesa
Se seu idioma de origem não for inglês:
# CLI flag (one-time)
npx champollion sync --source fr
{
"inputLocale": "fr"
}
Arquivo de Lock
Champollion cria .champollion.lock para rastrear hashes SHA-256 de valores de origem traduzidos. Faça commit deste arquivo para que todos os desenvolvedores compartilhem a mesma linha de base de tradução.
Quando um valor de origem muda, o hash não corresponde mais, e champollion retraduz essa chave na próxima sincronização.
.champollionignore
Crie .champollionignore na raiz do seu projeto para excluir arquivos do escaneamento lint. Usa padrões glob, como .gitignore:
src/components/legacy/**
src/utils/constants.js
**/*.test.js
Diretório .champollion/
Champollion cria um diretório .champollion/ na raiz do seu projeto para estado interno. Você geralmente deve adicionar isto a .gitignore — é otimização local, não fonte do projeto:
.champollion/
| Arquivo | Propósito | Fazer Commit? |
|---|---|---|
tm.json | Cache de Memória de Tradução — armazena traduções anteriores indexadas por texto de origem + locale + método | Não (cache local) |
xliff/*.xliff | Arquivos de exportação XLIFF para revisão de tradutor profissional | Não (transitório) |
methods/ | Manifestos de plugin de método instalado | Sim (configuração compartilhada) |
backups/ | Backups pré-wrap (criados por wrap --undo) | Não (rede de segurança) |
Veja Memória de Tradução para detalhes sobre tm.json e como economiza custos de API.
API Programática
Para scripts de build e integrações personalizadas, importe diretamente do pacote:
import { GeminiMethod, runSync, resolveConfig } from 'champollion';
// Use a method class directly
const gemini = new GeminiMethod();
const result = await gemini.translate(
['greeting', 'farewell'],
{ greeting: 'Hello', farewell: 'Goodbye' },
{ target: 'fr', name: 'French', register: 'formal', model: 'gemini-2.5-flash' },
{ cwd: process.cwd() }
);
// result = { greeting: 'Bonjour', farewell: 'Au revoir' }
Exportações Disponíveis
| Exportação | O Que Faz |
|---|---|
TranslationMethod | Classe base para todos os métodos |
LLMMethod | Classe base para métodos LLM (OpenRouter) |
DirectLLMMethod | Classe base para provedores LLM diretos (OpenAI, Anthropic, Gemini) |
OpenAIMethod, AnthropicMethod, GeminiMethod | Classes de provedor LLM direto |
DeepLMethod, MicrosoftTranslatorMethod, LibreTranslateMethod | Classes de MT tradicional |
GoogleTranslateMethod | Google Cloud Translation |
LLMCoachedMethod | LLM com Coaching (OpenRouter + dados de coaching) |
APIMethod | Cliente de API remota |
runSync, runContentSync | Pipeline de sincronização completo |
resolveConfig, resolvePairs | Resolução de configuração |
validateTranslations | Portão de qualidade |
loadCoachingData, findDictionaryMatches | Utilitários de coaching |
Extensão de Provedor Personalizado
Estenda DirectLLMMethod para adicionar um novo provedor LLM em ~40 linhas:
import { DirectLLMMethod } from 'champollion';
class MistralMethod extends DirectLLMMethod {
constructor(options) {
super(options);
this.name = 'mistral';
}
_getApiKeyEnvVar() { return 'MISTRAL_API_KEY'; }
_getApiKeyOptionsKey() { return 'mistralApiKey'; }
_getDefaultModel() { return 'mistral-large-latest'; }
_getProviderLabel() { return 'Mistral'; }
_buildApiRequest({ prompt, systemMessage, apiKey, model, temperature }) {
return {
url: 'https://api.mistral.ai/v1/chat/completions',
headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
body: {
model,
messages: [
...(systemMessage ? [{ role: 'system', content: systemMessage }] : []),
{ role: 'user', content: prompt },
],
temperature,
},
};
}
_extractResponseText(json) {
return json.choices?.[0]?.message?.content;
}
// Optional but recommended: provider-specific setup help when translation fails
getSetupHelp() {
if (!process.env.MISTRAL_API_KEY) {
return [
'',
' ┌─ Missing API Key ─────────────────────────────────────────────┐',
' │ Mistral requires an API key from https://console.mistral.ai │',
' │ Run: export MISTRAL_API_KEY=... │',
' └────────────────────────────────────────────────────────────────┘',
];
}
return [' API key is set but translation failed. Check your Mistral dashboard.'];
}
}
Você obtém tradução, coaching, loops de tentativa, validação de modelo, tiers de qualidade e ajuda de configuração gratuitamente. Apenas a forma da solicitação HTTP é específica do provedor. Para adaptadores não-LLM que usam fetch() bruto, use o helper fetchWithRetry() compartilhado de lib/methods/fetch-with-retry.js em vez de escrever seu próprio loop de tentativa.
Veja Também
- Referência CLI — todos os comandos e flags
- Métodos de Tradução — escolhendo e misturando métodos
- Memória de Tradução — caching e economia de custos
- Trabalhando com Tradutores Profissionais — fluxo de trabalho XLIFF
- Especificação de Plugin — formato de manifesto de plugin de método
- Arquitetura — como as peças se conectam
- Idiomas Suportados — suporte de idioma integrado
- Como Sync Funciona — o pipeline de tradução