Internationalisation (i18n)
Internationalisation (i18n)
BrainNotFound supporte plusieurs langues grâce à Flask-Babel. Par défaut, le français est utilisé, avec l'anglais comme langue alternative.
Langues supportées
| Code | Langue | Statut |
|---|---|---|
fr |
Français | Défaut |
en |
English | Disponible |
Changer de langue
Via l'interface
Le choix de la langue se trouve dans le menu du compte (votre identifiant, en haut à droite), avec le profil, le thème et la déconnexion.
Détection automatique
Si vous n'avez pas défini de préférence, BrainNotFound détecte automatiquement la langue de votre navigateur via l'en-tête Accept-Language.
Préférence utilisateur
Votre choix de langue est sauvegardé : - Utilisateurs connectés : En base de données (persistant) - Visiteurs : En session (temporaire)
Pour les développeurs
Workflow de traduction
# 1. Extraire les nouvelles chaînes à traduire
pybabel extract -F babel.cfg -k _l -k _ -o messages.pot .
# 2. Mettre à jour les catalogues existants
pybabel update -i messages.pot -d translations
# 3. Éditer les traductions
# Fichier : translations/en/LC_MESSAGES/messages.po
# 4. Compiler (automatique au démarrage Docker)
pybabel compile -d translations
Structure des fichiers
babel.cfg # Configuration d'extraction
messages.pot # Catalogue source (généré)
translations/
├── fr/LC_MESSAGES/
│ ├── messages.po # Traductions françaises
│ └── messages.mo # Compilé (généré)
└── en/LC_MESSAGES/
├── messages.po # Traductions anglaises
└── messages.mo # Compilé (généré)
Marquer les chaînes à traduire
Les chaînes source (msgid) sont écrites en français : le catalogue anglais contient les traductions ; dans le catalogue français, les msgstr restent vides et le texte source s'affiche tel quel.
Dans les routes Python
from flask_babel import lazy_gettext as _l
# Messages flash
flash(_l('Connexion réussie'), 'success')
# Avec des variables
flash(_l('Quiz "%(title)s" créé', title=quiz.title), 'success')
Dans les templates Jinja2
<h1>{{ _('Bienvenue') }}</h1>
<button>{{ _('Se connecter') }}</button>
{# Avec des variables #}
<p>{{ _('Bonjour %(name)s', name=user.username) }}</p>
Compilation automatique
Les traductions sont compilées automatiquement au démarrage du conteneur Docker. Vous n'avez pas besoin de les compiler manuellement en production.
Prompts IA multilingues
Les prompts de l'IA (correction, générateur, entretiens, analyses) sont aussi traduits. Ce sont des dictionnaires par langue, dans private.example/prompts/. Pour les personnaliser sans toucher au dépôt, copiez ce dossier vers private/prompts/ : les fichiers de private/ sont prioritaires.
GRADING_PROMPT_TEMPLATE = {
'fr': """Tu es un correcteur bienveillant...""",
'en': """You are a benevolent grader..."""
}
Le retour de l'IA est ainsi rédigé dans la langue de l'apprenant, avec des consignes et des critères traduits.
Ajouter une nouvelle langue
-
Initialiser le catalogue :
bash pybabel init -i messages.pot -d translations -l es # Exemple : espagnol -
Traduire : Éditez
translations/es/LC_MESSAGES/messages.po -
Ajouter à la configuration : Dans
config.py:python LANGUAGES = ['fr', 'en', 'es'] -
Traduire les prompts IA : ajoutez la clé
'es'dans les fichiersprivate.example/prompts/*.py(etprivate/prompts/si vous l'utilisez) -
Ajouter la langue au menu du compte (
nav-accountdansapp/templates/base.html) -
Compiler et redémarrer :
bash pybabel compile -d translations docker compose restart web
Ordre de priorité
La langue est déterminée dans cet ordre :
- Préférence utilisateur (si connecté et définie)
- Session (si définie via le sélecteur)
- Accept-Language (détection navigateur)
- Défaut : Français (
fr)