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

Un sélecteur de langue est disponible dans la barre de navigation. Cliquez dessus pour choisir votre langue préférée.

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

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 correction et d'entretien IA sont également traduits. Ils utilisent des dictionnaires par langue dans private.example/prompts/ :

GRADING_PROMPT_TEMPLATE = {
    'fr': """Tu es un correcteur bienveillant...""",
    'en': """You are a benevolent grader..."""
}

Cela permet : - Feedback IA dans la langue de l'utilisateur - Évaluation adaptée au contexte linguistique - Critères et instructions 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

  5. 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)