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

  1. Initialiser le catalogue : bash pybabel init -i messages.pot -d translations -l es # Exemple : espagnol

  2. Traduire : Éditez translations/es/LC_MESSAGES/messages.po

  3. Ajouter à la configuration : Dans config.py : python LANGUAGES = ['fr', 'en', 'es']

  4. Traduire les prompts IA : ajoutez la clé 'es' dans les fichiers private.example/prompts/*.py (et private/prompts/ si vous l'utilisez)

  5. Ajouter la langue au menu du compte (nav-account dans app/templates/base.html)

  6. 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 :

  1. Préférence utilisateur (si connecté et définie)
  2. Session (si définie via le sélecteur)
  3. Accept-Language (détection navigateur)
  4. Défaut : Français (fr)