Configuration
Champollion fonctionne sans configuration — il détecte automatiquement les fichiers de locale, le format et les langues cibles de votre projet. Pour plus de contrôle, créez champollion.config.json à la racine de votre projet, ou exécutez :
npx champollion init
Référence de configuration complète
{
"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 n'est pas encore implémenté
Le bloc de configuration typegen est reconnu et préservé par le chargeur de configuration, mais la génération de types TypeScript n'est pas encore implémentée. Ceci est un espace réservé pour une fonctionnalité prévue. La définition de ces valeurs n'a aucun effet.
:::
Champs
| Champ | Type | Défaut | Description |
|---|---|---|---|
version | number | 3 | Version du schéma de configuration. Toujours 3. |
inputLocale | string | "en" | Code de langue source (BCP 47). |
localesDir | string | "./locales" | Chemin vers les fichiers de locale. Champollion analyse ce répertoire. |
contentDir | string | null | Répertoire de contenu Hugo. Active la traduction du corps Markdown. |
translatableFields | string[] | null | Remplace les champs frontmatter traduisibles par défaut pour la traduction de contenu. null utilise les valeurs par défaut intégrées (title, description, summary). |
format | string | "auto" | Format de fichier : json, toml, yaml, ou auto (détection à partir de l'extension). |
model | string | "google/gemini-3.5-flash" | Modèle par défaut pour les méthodes LLM. Accepte les slugs OpenRouter complets (provider/model) ou les alias courts de shared/model-aliases.json (par ex., gemini-flash). Les fournisseurs directs utilisent des noms simples (par ex., gpt-4o). |
temperature | number | 0.3 | Température LLM (0,0–2,0). Plus bas = plus déterministe. |
defaultMethod | string | "llm" | Méthode de traduction par défaut : llm, llm-coached, google-translate, deepl, microsoft-translator, libretranslate, openai, anthropic, gemini, api. Remplacée par le drapeau CLI --method. |
batchSize | number | 80 | Clés par lot de traduction. Plus élevé = moins d'appels API, mais des invites plus grandes. |
coachingFile | string | null | Chemin vers un fichier d'invite de coaching en texte libre (relatif à la racine du projet). Le contenu est lu au démarrage et injecté dans l'invite système en tant que bloc Coaching guidance:. |
promptContext | string | null | Chaîne de contexte d'application injectée dans l'invite système (par ex., « Descriptions de produits de commerce électronique »). Aide le modèle à adapter les traductions à votre domaine. |
jsonConcurrency | number | 200 | Traductions de locale parallèles maximales pour la synchronisation des clés JSON. Remplacée par le drapeau CLI --json-concurrency. |
contentConcurrency | number | 48 | Appels API parallèles maximaux pour la traduction de contenu (Markdown/MDX). Remplacée par le drapeau CLI --content-concurrency. |
fallbackPrefix | string | "[EN] " | Préfixe de marqueur utilisé par audit et verify pour détecter les valeurs non traduites héritées des exécutions antérieures. Champollion n'écrit pas ce préfixe — il le lit uniquement pour la détection. |
apiKeyEnvVar | string | "OPENROUTER_API_KEY" | Nom de la variable d'environnement pour la clé API. À remplacer pour les noms de variables d'environnement personnalisés. |
baseUrl | string | "" | URL de base pour la génération d'artefacts SEO (hreflang, sitemaps, JSON-LD). |
pairs | object | {} | Remplacements de méthode, modèle et qualité par paire. Voir Configuration par paire. |
languages | object | {} | Remplacements par langue. Voir Configuration par langue. |
lint.srcDir | string | null | Répertoire source pour l'analyse lint. null = détection automatique à partir du framework. |
lint.ignore | string[] | ["node_modules", ...] | Motifs glob à exclure de l'analyse lint. |
lint.minLength | number | 2 | Longueur minimale de chaîne à signaler comme codée en dur. |
seo.urlPattern | string | "/:locale/:path" | Modèle de motif d'URL pour la génération de balises hreflang. |
seo.pages | string[] | null | Liste de pages explicite pour le SEO. null = détection automatique à partir des clés de locale. |
typegen.output | string | null | Chemin de sortie pour les types TypeScript générés. null = désactivé. |
typegen.autoGenerate | boolean | false | Régénérer automatiquement les types après chaque synchronisation. |
Configuration par paire
Chaque paire source→cible peut être configurée indépendamment :
{
"pairs": {
"en:fr": {
"method": "google-translate",
"qualityTier": "high"
},
"en:ja": {
"method": "llm",
"model": "google/gemini-2.5-pro"
},
"en:crk": {
"methodPlugin": "crk-coached-v1"
}
}
}
Champs de paire
| Champ | Type | Description |
|---|---|---|
method | string | Méthode de traduction : llm, llm-coached, google-translate, deepl, microsoft-translator, libretranslate, openai, anthropic, gemini, api |
methodPlugin | string | Nom d'un plugin installé (de .champollion/methods/) |
model | string | Remplace le modèle par défaut pour cette paire |
temperature | number | Remplace la température par défaut pour cette paire |
batchSize | number | Remplace la taille de lot par défaut pour cette paire |
register | string | Remplacement de registre/ton (clé prédéfinie ou texte libre) |
endpoint | string | URL du point de terminaison API distant. Requis quand method est api. |
coachingFile | string | Chemin vers un fichier d'invite de coaching pour cette paire |
promptContext | string | Contexte d'application pour cette paire |
qualityTier | string | Niveau d'affichage : standard, high, research, verified |
Configuration par langue
Les langues acceptent trois formats :
Tableau de codes (le plus simple)
{
"languages": ["fr", "de", "ja"]
}
Chaque langue obtient son registre par défaut à partir du tableau de registres intégré. Les langues sans défaut obtiennent "Professional register.".
Objet avec chaînes de registre
La valeur peut être une clé prédéfinie de la carte de la langue, ou du texte de registre personnalisé :
{
"languages": {
"fr": "casual-tu",
"ko": "formal-hapsyo",
"ja": "Custom: Polite Japanese for a gaming app."
}
}
Champollion vérifie si la chaîne correspond à une clé prédéfinie dans la carte de la langue. Si c'est le cas, l'invite de registre complète de la carte est utilisée. Sinon, la chaîne est utilisée telle quelle. Voir Langues prises en charge pour les prédéfinitions disponibles.
Objet avec configuration complète
{
"languages": {
"crk": {
"name": "Plains Cree",
"register": "SRO syllabics with grammatical precision.",
"model": "google/gemini-2.5-pro",
"batchSize": 5,
"maxRetries": 5,
"script": "cans"
}
}
}
Vous pouvez mélanger les objets raccourcis et complets dans le même bloc.
Champs de langue
| Champ | Type | Description |
|---|---|---|
register | string | Instructions de style/ton. Peut être une clé prédéfinie (par ex., casual-tu, formal-hapsyo) ou du texte personnalisé. Voir Cartes de langue. |
name | string | Nom de langue lisible par l'homme (pour l'affichage du statut) |
model | string | Remplace le modèle par défaut |
temperature | number | Remplace la température par défaut |
batchSize | number | Remplace la taille de lot par défaut |
coachingFile | string | Chemin vers un fichier d'invite de coaching pour cette langue |
promptContext | string | Contexte d'application pour cette langue |
maxRetries | number | Budget de tentatives maximal pour les lots échoués (défaut : 3) |
script | string | Code de script ISO 15924. Déclenche la validation de script dans la porte de qualité. |
:::info Chaîne d'héritage Les paramètres se résolvent dans cet ordre (le premier gagne) :
niveau de paire → niveau de langue → configuration globale → valeurs par défaut
Par exemple, si pairs["en:fr"] définit model, cela remplace à la fois les valeurs model au niveau de la langue et au niveau global.
:::
Source non-anglaise
Si votre langue source n'est pas l'anglais :
# CLI flag (one-time)
npx champollion sync --source fr
{
"inputLocale": "fr"
}
Fichier de verrouillage
Champollion crée .champollion.lock pour suivre les hachages SHA-256 des valeurs source traduites. Validez ce fichier afin que tous les développeurs partagent la même base de traduction.
Quand une valeur source change, le hachage ne correspond plus, et champollion retraduit cette clé lors de la prochaine synchronisation.
.champollionignore
Créez .champollionignore à la racine de votre projet pour exclure les fichiers de l'analyse lint. Utilise des motifs glob, comme .gitignore :
src/components/legacy/**
src/utils/constants.js
**/*.test.js
Répertoire .champollion/
Champollion crée un répertoire .champollion/ à la racine de votre projet pour l'état interne. Vous devriez généralement l'ajouter à .gitignore — c'est une optimisation locale, pas une source de projet :
.champollion/
| Fichier | Objectif | Valider ? |
|---|---|---|
tm.json | Cache de mémoire de traduction — stocke les traductions précédentes indexées par texte source + locale + méthode | Non (cache local) |
xliff/*.xliff | Fichiers d'export XLIFF pour examen par traducteur professionnel | Non (transitoire) |
methods/ | Manifestes de plugin de méthode installée | Oui (configuration partagée) |
backups/ | Sauvegardes pré-wrap (créées par wrap --undo) | Non (filet de sécurité) |
Voir Mémoire de traduction pour les détails sur tm.json et comment elle économise les coûts d'API.
API programmatique
Pour les scripts de construction et les intégrations personnalisées, importez directement à partir du package :
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' }
Exports disponibles
| Export | Ce qu'il fait |
|---|---|
TranslationMethod | Classe de base pour toutes les méthodes |
LLMMethod | Classe de base pour les méthodes LLM (OpenRouter) |
DirectLLMMethod | Classe de base pour les fournisseurs LLM directs (OpenAI, Anthropic, Gemini) |
OpenAIMethod, AnthropicMethod, GeminiMethod | Classes de fournisseur LLM direct |
DeepLMethod, MicrosoftTranslatorMethod, LibreTranslateMethod | Classes de traduction automatique traditionnelle |
GoogleTranslateMethod | Google Cloud Translation |
LLMCoachedMethod | LLM coaché (OpenRouter + données de coaching) |
APIMethod | Client API distant |
runSync, runContentSync | Pipeline de synchronisation complète |
resolveConfig, resolvePairs | Résolution de configuration |
validateTranslations | Porte de qualité |
loadCoachingData, findDictionaryMatches | Utilitaires de coaching |
Extension de fournisseur personnalisé
Étendez DirectLLMMethod pour ajouter un nouveau fournisseur LLM en ~40 lignes :
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.'];
}
}
Vous obtenez gratuitement la traduction, le coaching, les boucles de tentatives, la validation de modèle, les niveaux de qualité et l'aide à la configuration. Seule la forme de la requête HTTP est spécifique au fournisseur. Pour les adaptateurs non-LLM qui utilisent fetch() brut, utilisez l'assistant fetchWithRetry() partagé de lib/methods/fetch-with-retry.js au lieu d'écrire votre propre boucle de tentatives.
Voir aussi
- Référence CLI — toutes les commandes et drapeaux
- Méthodes de traduction — choisir et mélanger les méthodes
- Mémoire de traduction — mise en cache et économies de coûts
- Travailler avec des traducteurs professionnels — flux de travail XLIFF
- Spécification de plugin — format de manifeste de plugin de méthode
- Architecture — comment les pièces se connectent
- Langues prises en charge — support de langue intégré
- Comment fonctionne la synchronisation — le pipeline de traduction