No description
  • JavaScript 42.4%
  • CSS 41.1%
  • HTML 15%
  • Dockerfile 1.5%
Find a file
2026-04-30 15:25:12 +02:00
backend first commit 2026-04-30 15:25:12 +02:00
frontend first commit 2026-04-30 15:25:12 +02:00
docker-compose.yml first commit 2026-04-30 15:25:12 +02:00
prompt.md first commit 2026-04-30 15:25:12 +02:00
README.md first commit 2026-04-30 15:25:12 +02:00

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

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 :

  1. Télécharger l'image erikvl87/languagetool:6.4 (~600 Mo, une seule fois).
  2. Télécharger l'image nginx:1.27-alpine (~15 Mo).
  3. Démarrer le backend LanguageTool (démarrage JVM : environ 40 secondes).
  4. Démarrer le frontend nginx (quelques secondes).
  5. 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.