- JavaScript 42.4%
- CSS 41.1%
- HTML 15%
- Dockerfile 1.5%
| backend | ||
| frontend | ||
| docker-compose.yml | ||
| prompt.md | ||
| README.md | ||
LT Suite — Correcteur grammatical local
Correcteur orthographique, grammatical et stylistique 100 % local.
Aucun texte n'est jamais envoyé à l'extérieur de votre machine.
Table des matières
- Présentation
- Architecture
- Arborescence du projet
- Prérequis
- Installation et lancement
- Utilisation
- Ajouter ou mettre à jour les dictionnaires
- Vérifier le mode hors-ligne
- Configuration avancée
- Engagement « Zéro donnée externe »
- Dépannage
Présentation
LT Suite est une interface web locale construite autour du moteur LanguageTool (LGPL). Elle fournit :
- La correction orthographique, grammaticale et stylistique pour le français, l'anglais, l'allemand, l'espagnol et une dizaine d'autres langues.
- Un soulignement en temps réel avec suggestions en un clic.
- Un historique de textes stocké uniquement dans votre navigateur (LocalStorage), jamais sur le serveur.
- Un thème clair et sombre, un sélecteur de langue, un raccourci clavier.
Aucune connexion Internet n'est requise après l'installation.
Architecture
Navigateur
│ HTTP (port 8080)
▼
┌─────────────────────────────┐
│ Frontend — Nginx 1.27 │ Sert les fichiers statiques
│ HTML / CSS / Vanilla JS │ Proxifie /v2/* → backend
└────────────┬────────────────┘
│ HTTP interne (réseau Docker isolé)
▼
┌─────────────────────────────┐
│ Backend — LanguageTool 6.4 │ Moteur de correction JVM
│ API JSON /v2/check │ Aucun port exposé publiquement
└─────────────────────────────┘
Les deux conteneurs communiquent sur un réseau Docker privé (172.28.0.0/24).
Le backend n'est jamais joignable directement depuis l'hôte.
Arborescence du projet
languagetool-suite/
├── .dockerignore ← Fichiers exclus du contexte de build Docker
├── .env.example ← Variables d'environnement (à copier en .env)
├── .gitignore
├── README.md
├── docker-compose.yml ← Orchestration des deux services
│
├── backend/
│ └── languagetool.cfg ← Configuration LT : offline strict, logs sécurisés
│
└── frontend/
├── Dockerfile ← Image nginx:1.27-alpine
├── nginx.conf.template ← Config nginx + proxy /v2/ + CSP fermé
└── public/ ← Fichiers statiques servis au navigateur
├── index.html ← Structure HTML sémantique
├── style.css ← Design system complet (tokens, thèmes, composants)
└── app.js ← Moteur JS : API, marks, popup, historique
Prérequis
| Outil | Version minimale | Vérification |
|---|---|---|
| Docker Engine | 24.x | docker --version |
| Docker Compose | 2.x (plugin) | docker compose version |
Aucune autre dépendance. Java, Node.js et Python ne sont pas requis sur l'hôte.
Installation et lancement
1. Cloner le dépôt
git clone https://github.com/votre-org/languagetool-suite.git
cd languagetool-suite
2. Créer le fichier d'environnement
cp .env.example .env
Éditez .env si vous souhaitez changer le port d'écoute (défaut : 8080) :
FRONTEND_PORT=8080 # Port accessible depuis votre navigateur
3. Lancer la suite
docker compose up -d
C'est tout. Docker va :
- Télécharger l'image
erikvl87/languagetool:6.4(~600 Mo, une seule fois). - Télécharger l'image
nginx:1.27-alpine(~15 Mo). - Démarrer le backend LanguageTool (démarrage JVM : environ 40 secondes).
- Démarrer le frontend nginx (quelques secondes).
- Ouvrir l'interface sur http://localhost:8080.
Note : Le frontend attend que le backend soit sain avant de démarrer (healthcheck toutes les 30 s, 5 tentatives). Si l'interface s'affiche mais que les corrections ne fonctionnent pas encore, patientez 60 secondes et rechargez la page.
Arrêter la suite
docker compose down
Mettre à jour les images
docker compose pull
docker compose up -d
Utilisation
Interface principale
Ouvrez http://localhost:8080 dans votre navigateur.
| Zone | Description |
|---|---|
| Zone d'édition | Tapez ou collez votre texte. La correction se déclenche automatiquement après 1,5 s de pause. |
| Bouton « Corriger » | Force une correction immédiate (⌘↵ ou Ctrl↵). |
| Soulignements | Rouge ondulé = orthographe · Souligné double = grammaire · Pointillé = style |
| Clic sur une erreur | Affiche une bulle avec les suggestions. Cliquez sur une suggestion pour l'appliquer. |
| Sélecteur de langue | Choisissez la langue ou laissez sur « Détection auto ». |
| Historique | Icône horloge → liste vos textes précédents (navigateur uniquement). |
| Thème | Icône soleil/lune → bascule clair/sombre. |
Raccourcis clavier
| Raccourci | Action |
|---|---|
⌘↵ / Ctrl↵ |
Lancer la correction immédiatement |
Échap |
Fermer la popup de suggestion |
Comportement de la correction automatique
La correction se déclenche automatiquement 1,5 seconde après que vous
arrêtez de taper. Si vous souhaitez désactiver ce comportement, modifiez
CONFIG.debounceMs dans frontend/public/app.js :
// Désactiver l'auto-correction : mettre une valeur très grande
debounceMs: 9_999_999,
Ajouter ou mettre à jour les dictionnaires
Dictionnaires de base (inclus)
Les dictionnaires FR, EN, DE, ES, IT, NL, PT, PL sont inclus dans l'image
erikvl87/languagetool:6.4. Aucun téléchargement supplémentaire n'est requis.
Données n-gram (amélioration optionnelle)
Les données n-gram améliorent la détection des confusions de mots (ex : « a » vs « à », « on » vs « ont »). Elles sont volumineuses (1 à 8 Go par langue) et doivent être téléchargées séparément.
Étape 1 — Télécharger les n-grams
# Créer le dossier de données
mkdir -p ngrams
# Exemple pour le français (~3 Go décompressé)
wget -P ngrams/ https://languagetool.org/download/ngram-data/ngrams-fr-20150819.zip
unzip ngrams/ngrams-fr-20150819.zip -d ngrams/
# Exemple pour l'anglais (~8 Go décompressé)
wget -P ngrams/ https://languagetool.org/download/ngram-data/ngrams-en-20150817.zip
unzip ngrams/ngrams-en-20150817.zip -d ngrams/
Étape 2 — Monter le volume dans docker-compose.yml
Dans docker-compose.yml, remplacez la définition du volume lt_ngrams :
volumes:
# Avant (volume Docker nommé, vide) :
lt_ngrams:
driver: local
# Après (bind mount vers votre dossier local) :
lt_ngrams:
driver: local
driver_opts:
type: none
o: bind
device: ./ngrams
Étape 3 — Activer la ligne dans backend/languagetool.cfg
# Décommenter cette ligne :
languageModel=/ngrams
Étape 4 — Redémarrer
docker compose down && docker compose up -d
Ajouter un dictionnaire personnel (mots métier, noms propres)
Créez le fichier backend/custom.txt, un mot par ligne :
Kubernetes
GitOps
LangChain
Puis montez-le dans docker-compose.yml :
backend:
volumes:
- ./backend/languagetool.cfg:/home/user/languagetool/languagetool.cfg:ro
- ./backend/custom.txt:/home/user/languagetool/org/languagetool/resource/fr/hunspell/custom.txt:ro
Vérifier le mode hors-ligne
Trois niveaux de vérification, du plus simple au plus rigoureux.
Niveau 1 — Test réseau Docker
# Le backend ne doit pas pouvoir joindre Internet
docker exec lt_backend curl -s --max-time 5 https://languagetool.org/api/v2/check \
&& echo "ATTENTION : accès Internet détecté" \
|| echo "OK : aucun accès externe"
Niveau 2 — Inspection des logs
# Surveiller les logs du backend pendant une correction
docker logs -f lt_backend 2>&1 | grep -i "http\|connect\|premium\|cloud"
# Aucune ligne ne doit apparaître lors d'une correction normale.
Niveau 3 — Coupure réseau totale
# Arrêter la suite
docker compose down
# Couper l'accès Internet de la machine (Wi-Fi, câble)
# Relancer la suite
docker compose up -d
# Corriger un texte dans l'interface → doit fonctionner normalement
# Aucune erreur, aucune dégradation
Configuration avancée
Changer le port d'écoute
Éditez .env :
FRONTEND_PORT=9090
Puis redémarrez : docker compose up -d.
Limites de ressources JVM
Dans docker-compose.yml, section backend.environment :
Java_Xms: 256m # Mémoire initiale (ne pas descendre en dessous)
Java_Xmx: 2g # Mémoire maximale (augmenter pour de longs textes)
Longueur maximale des textes
Dans backend/languagetool.cfg :
server.maxTextLength=40000 # Caractères (augmenter si nécessaire)
Désactiver des règles spécifiques
Dans backend/languagetool.cfg :
# Exemple : désactiver la règle de ponctuation FRENCH_WHITESPACE
disabledRules=FRENCH_WHITESPACE,WHITESPACE_RULE
Consulter les logs
# Backend LanguageTool
docker logs lt_backend
# Frontend nginx (uniquement codes HTTP et temps de réponse — jamais le texte)
docker logs lt_frontend
Engagement « Zéro donnée externe »
Cette suite est conçue par construction pour garantir qu'aucun texte utilisateur ne quitte votre machine. Voici les mécanismes en place :
| Couche | Mesure |
|---|---|
| Backend LT | premium=false · pas de clé API · server.allowedIps restreint au conteneur nginx |
| Réseau Docker | Réseau interne 172.28.0.0/24 · backend sans port publié |
| Logs backend | server.logIpAddress=false · aucun texte enregistré |
| Logs nginx | Format personnalisé : code HTTP + temps de réponse uniquement |
| CSP navigateur | default-src 'self' · connect-src 'self' · zéro CDN |
| Frontend JS | Toutes les requêtes passent par /v2/ (proxy nginx local) |
| Historique | Stocké dans localStorage du navigateur, jamais transmis |
Dépannage
L'interface s'affiche mais aucune correction n'apparaît
Le backend met environ 40 à 60 secondes à démarrer (chargement JVM + dictionnaires). Attendez et rechargez la page. Vérifiez son état :
docker ps | grep lt_backend
# La colonne STATUS doit afficher "healthy"
Erreur « Cannot connect to the Docker daemon »
# Vérifier que Docker est en cours d'exécution
sudo systemctl start docker # Linux
# ou ouvrir Docker Desktop # macOS / Windows
Le backend consomme trop de mémoire
Réduisez Java_Xmx dans docker-compose.yml (minimum recommandé : 512 Mo)
et redémarrez.
Réinitialiser complètement le projet
docker compose down -v # Supprime aussi les volumes (dont lt_ngrams)
docker image rm erikvl87/languagetool:6.4 nginx:1.27-alpine
docker compose up -d
LT Suite est distribué sous licence AGPLv3 (frontend et scripts).
Le cœur LanguageTool est distribué sous licence LGPL 2.1 par ses auteurs.