Passer au contenu principal

Guide pratique : Traduire 30 langues

Faites évoluer un projet de quelques paramètres régionaux vers une couverture mondiale. Ce guide pratique détaille le choix des méthodes, l'optimisation des coûts et l'intégration CI pour un déploiement multilingue en conditions réelles.

Scénario : Vous disposez d'une application SaaS avec en, fr, es. Vous devez ajouter 27 langues supplémentaires réparties sur trois niveaux d'exigences de qualité.


Étape 1 : Catégoriser vos langues

Les 30 langues ne nécessitent pas toutes la même approche. Regroupez-les selon la qualité de la méthode disponible :

NiveauLanguesMéthodeRaison
Niveau 1 — Premiumja, ko, zh, de, ptllm (GPT-4o)Marchés à forte valeur, grammaire nuancée
Niveau 2 — Standardit, nl, pl, sv, da, fi, no, cs, ro, hu, el, tr, id, ms, th, vi, uk, bggoogle-translateVolume élevé, bien pris en charge par Google
Niveau 3 — Supervisécrk, oj, mi, hawllm-coached + pluginsFaibles ressources, nécessitent l'application d'une terminologie

Étape 2 : Configurer par paire

i18n-rosetta.config.json
{
"version": 3,
"inputLocale": "en",
"localesDir": "./locales",
"defaultMethod": "google-translate",
"model": "google/gemini-3.5-flash",
"languages": {
"ja": { "name": "Japanese", "register": "Polite/formal" },
"ko": { "name": "Korean", "register": "Formal" },
"zh": { "name": "Simplified Chinese", "register": "Neutral" },
"de": { "name": "German", "register": "Formal (Sie)" },
"pt": { "name": "Brazilian Portuguese", "register": "Informal" },
"crk": { "name": "Plains Cree (SRO)", "register": "Neutral" }
},
"pairs": {
"en:ja": { "method": "llm", "model": "openai/gpt-4o" },
"en:ko": { "method": "llm", "model": "openai/gpt-4o" },
"en:zh": { "method": "llm", "model": "openai/gpt-4o" },
"en:de": { "method": "llm", "model": "openai/gpt-4o" },
"en:pt": { "method": "llm", "model": "openai/gpt-4o" },
"en:crk": { "methodPlugin": "crk-coached-v1" }
}
}

Remarque : Les langues non répertoriées dans pairs héritent de defaultMethod: "google-translate". Il n'est pas nécessaire d'énumérer les 30 langues.

Info

La prise en charge de crk est en cours de développement — consultez Prendre en charge une langue à faibles ressources pour connaître l'état d'avancement et les directives de contribution.

Étape 3 : Configurer les clés d'API

Vous aurez besoin des deux clés d'API pour cette configuration :

export OPENROUTER_API_KEY="sk-or-v1-..."
export GOOGLE_TRANSLATE_API_KEY="AIza..."

Étape 4 : Effectuer d'abord un essai à blanc

Prévisualisez toujours avant de traduire 30 langues :

npx i18n-rosetta sync --dry

Examinez le résultat. Il indiquera :

  • Quelles paires utilisent quelle méthode
  • Combien de clés sont nouvelles ou modifiées par paramètre régional
  • Les appels d'API estimés par niveau

Étape 5 : Exécuter la synchronisation

npx i18n-rosetta sync

Rosetta traite chaque paire de manière indépendante. Les paires de niveau 2 utilisant Google Translate seront rapides. Les paires LLM de niveau 1 seront plus lentes mais de meilleure qualité. Les paires supervisées de niveau 3 utilisent les données de supervision du plugin.

Mises à jour incrémentielles

Après la synchronisation initiale, les exécutions ultérieures ne traduisent que les clés modifiées ou nouvelles :

# Only keys that changed since last sync
npx i18n-rosetta sync

Le fichier de verrouillage (.i18n-rosetta.lock) assure le suivi de ce qui a été traduit, afin que vous ne retraduisiez jamais un contenu stable.

Étape 6 : Auditer la qualité

Vérifiez l'état de toutes les paires de langues :

npx i18n-rosetta status

Cela génère un tableau affichant la méthode, le modèle, le niveau de qualité de chaque paire, et indiquant si des données de supervision ou des scores de référence sont disponibles.

Étape 7 : Intégration CI

Ajoutez ceci à votre flux de travail GitHub Actions afin que les traductions restent à jour à chaque push :

.github/workflows/i18n-sync.yml
name: Sync Translations
on:
push:
paths:
- 'locales/en/**'

jobs:
translate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20

- run: npm ci

- name: Sync translations
run: npx i18n-rosetta sync
env:
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
GOOGLE_TRANSLATE_API_KEY: ${{ secrets.GOOGLE_TRANSLATE_API_KEY }}

- name: Commit updated translations
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add locales/
git diff --staged --quiet || git commit -m "chore(i18n): sync translations"
git push

Estimation des coûts

Pour un projet comportant 500 clés sources réparties sur 30 langues :

NiveauLanguesMéthodeCoût approximatif
Niveau 1 (5 langues)ja, ko, zh, de, ptGPT-4o~2,50 $/sync. complète
Niveau 2 (18 langues)it, nl, pl, etc.Google Translate~0,90 $/sync. complète
Niveau 3 (4 langues)crk, oj, mi, hawGPT-4o-mini supervisé~0,40 $/sync. complète
Total30 languesMixte~3,80 $/sync. complète

Les synchronisations incrémentielles (5 à 20 clés modifiées) ne coûtent qu'une fraction d'une synchronisation complète.

Voir aussi