ENSO i18n
Extension VS Code / Cursor pour la gestion complete de l'internationalisation (i18n) — frontend (Vue, TypeScript, JavaScript, JSON) et backend (C#, fichiers .resx).
Detection automatique des deux scopes (frontend/backend), deux panneaux d'explorateur distincts, et toutes les fonctionnalites IntelliSense disponibles cote front comme cote back. Compatible VS Code et Cursor (avec integration AI).
Fonctionnalites
IntelliSense et detection
| # |
Fonctionnalite |
Description |
| 1 |
Hover Tooltips |
Survoler une cle → toutes les traductions avec drapeaux et statut |
| 2 |
Autocompletion des cles |
Taper $t('comm... → liste des cles existantes avec preview |
| 3 |
Suggestions par similarite |
Taper du texte → suggestions similaires avec % de match |
| 4 |
Detection texte hardcode |
Soulignement automatique du texte non traduit |
| 5 |
Quick Fixes (Ctrl+.) |
Menu contextuel avec extraction et traduction |
| 6 |
CodeLens inline |
Boutons d'action au-dessus des lignes avec du texte a traduire |
Navigation et refactoring
| # |
Fonctionnalite |
Description |
| 7 |
Deux explorateurs i18n |
Panneaux lateraux distincts : i18n Explorer (front) pour les JSON et i18n Explorer (back) pour les .resx. Chacun avec : toutes les traductions, manquantes, orphelines, par fichier |
| 8 |
Go to Definition (Cmd+Clic) |
Clic sur une cle → ouvre le JSON (front) ou le .resx (back) a la bonne ligne |
| 9 |
Rename Key (F2) |
Renomme dans tous les JSON / .resx + tout le code source (y compris TranslationKeys.X) |
| 10 |
Barre de statut |
Nb cles + couverture, clic → rapport |
| 11 |
Rapport de couverture |
Par langue + par fichier avec barres de progression |
| # |
Fonctionnalite |
Description |
| 12 |
Extraction (Cmd+Shift+E) |
Selectionner du texte → creer la cle → remplace par $t() |
| 13 |
Ajout manuel |
Formulaire interactif pour ajouter une cle |
| 14 |
Snippets C# |
i18nerr, i18nsuc, i18nt, i18nval, i18ntp |
| 15 |
Snippets Vue/TS/JS |
i18nt, i18ntt, i18na, i18nv, i18np |
Maintenance
| # |
Fonctionnalite |
Description |
| 16 |
Supprimer les cles orphelines |
Scanne le code → suppression directe des cles inutilisees |
| 16b |
Regenerer TranslationKeys (backend) |
(Re)genere la classe C# TranslationKeys depuis les cles .resx. Automatique : creation via l'extension ET toute modif .resx (Cursor AI, edition manuelle, git pull) via le file watcher ; aussi a la demande. Le corps de la classe est integralement regenere (tout ce qui est entre { et } est remplace) — idempotent. Anything hand-written doit vivre HORS de la classe (ex. partial class dans un autre fichier) |
Integration Cursor AI (Cursor uniquement)
| # |
Fonctionnalite |
Description |
| 17 |
Traduire avec Cursor AI (Cmd+Shift+T) |
Ouvre le Composer avec fichier en contexte + prompt de traduction |
| 18 |
Traduire toutes les manquantes |
Envoie toutes les cles incompletes au Composer d'un coup |
| 19 |
Traduire une cle manquante |
Traduit les langues manquantes pour une cle specifique |
| 20 |
Migrer un fichier entier |
Clic droit → migre tous les textes du fichier en i18n |
| 21 |
Ameliorer une traduction |
Envoie une cle au Composer pour correction idiomatique |
| 22 |
Audit AI |
Detecte les traductions suspectes et les envoie au Composer |
Les fonctionnalites 1 a 16 fonctionnent sur VS Code et Cursor. Les fonctionnalites 17 a 22 utilisent le Composer de Cursor.
Guide d'utilisation
Installation
Depuis le Marketplace :
Chercher "ENSO i18n" dans les extensions (Cmd+Shift+X).
Depuis le VSIX :
# VS Code
code --install-extension enso-i18n-*
# Cursor
cursor --install-extension enso-i18n-*
Premiers pas
- Ouvrir un projet — l'extension detecte automatiquement :
- Frontend : dossiers
src/i18n/locales/<lang>/*.json (Vue/TS/JS)
- Backend : fichiers
Ressources/TranslationResource[.lang].resx (C#)
- Deux panneaux apparaissent dans l'Explorer : i18n Explorer (front) et i18n Explorer (back), chacun cible son scope.
- Survoler une cle
$t('...') (front) ou _localizer[TranslationKeys.X] / .WithMessage(TranslationKeys.X) (back) → tooltip avec toutes les traductions.
- Extraire du texte → selectionner du texte,
Cmd+Shift+E, confirmer la cle (scope auto-detecte selon le langage du fichier actif).
- Traduire avec Cursor AI →
Cmd+Shift+T ou bouton CodeLens sur la ligne.
Raccourcis
| Raccourci |
Action |
Cmd+Shift+E |
Extraire vers cle i18n |
Cmd+Shift+T |
Traduire avec Cursor AI |
Cmd+Clic |
Go to Definition |
F2 |
Renommer une cle |
Ctrl+. |
Quick fixes |
Configuration
L'extension detecte automatiquement les dossiers de traductions (frontend ET backend) et toutes les langues presentes. Configuration optionnelle dans les settings :
| Setting |
Default |
Description |
armado-i18n.translationsPath |
(auto) |
Chemin vers UN dossier locales (force le scope detecte selon contenu : .json → frontend, .resx → backend). Laisser vide pour scanner les deux automatiquement |
armado-i18n.enableHover |
true |
Tooltips au survol |
armado-i18n.enableAutoComplete |
true |
Autocompletion des cles |
armado-i18n.enableDiagnostics |
true |
Detection du texte hardcode |
armado-i18n.enableCodeLens |
true |
Boutons inline |
armado-i18n.diagnosticsDelay |
500 |
Delai avant analyse (ms) |
armado-i18n.autoGenerateTranslationKeys |
true |
Backend : regenere TranslationKeys.cs apres creation d'une cle backend |
armado-i18n.translationKeysPath |
(auto) |
Backend : chemin du fichier TranslationKeys.cs (auto-detecte si vide) |
armado-i18n.translationKeysNamespace |
(Armado.Ressources) |
Backend : namespace utilise uniquement si TranslationKeys.cs est cree de zero |
L'extension est legere et optimisee :
- ~5-15 Mo de RAM pour un projet typique (500-2000 cles)
- Chargement unique au demarrage, mise a jour par file watcher (debounce 1s)
- Diagnostics debounces (500ms configurable)
- Completions limitees a 50 resultats
- Scan orphelins/manquants a la demande uniquement
- Aucun processus arriere-plan
Pour les developpeurs
Architecture
src/
├── extension.ts # Point d'entree (activation synchrone)
├── services/
│ ├── i18nService.ts # Service central (cache, watch, CRUD, analyse)
│ └── translationKeysGenerator.ts # Generation classe C# TranslationKeys (backend)
├── commands/
│ ├── extractToI18n.ts # Extraction Cmd+Shift+E
│ ├── addTranslation.ts # Ajout manuel
│ ├── cursorTranslate.ts # Integration Cursor AI (7 commandes)
│ ├── findOrphans.ts # Rapports orphelins + manquants
│ └── coverageReport.ts # Rapport de couverture
└── providers/
├── hoverProvider.ts # Tooltips
├── completionProvider.ts # Autocompletion cles
├── frenchCompletionProvider.ts # Suggestions par similarite
├── frenchSuggestionProvider.ts # Quick fixes
├── codeActionProvider.ts # Code actions
├── codeLensProvider.ts # Boutons inline
├── diagnosticProvider.ts # Detection texte hardcode
├── definitionProvider.ts # Go to Definition
├── renameProvider.ts # Rename Key
└── treeDataProvider.ts # Explorateur i18n
Detection frontend / backend
|
Backend (C#) |
Frontend (Vue/TS/JS) |
| Format des cles |
PascalCaseSansPoint (ex: AuthErrorAccountLocked) |
module.composant.element (dotted) |
| Format des fichiers |
XML .resx (TranslationResource.resx, TranslationResource.<lang>.resx) |
JSON par langue (fr/common.json, en/admin.json, ...) |
| Localisation par defaut |
Ressources/ a la racine du projet |
**/src/i18n/locales/, **/i18n/locales/, etc. |
| Code d'usage |
_localizer[TranslationKeys.Key], _localizer[TranslationKeys.Key, arg], .WithMessage(TranslationKeys.Key) |
$t('module.x'), {{ $t('module.x') }}, i18n.t('module.x') |
| View VS Code |
armadoI18nExplorerBackend ("i18n Explorer (back)") |
armadoI18nExplorerFrontend ("i18n Explorer (front)") |
Chaque TranslationEntry cree dans le service contient un champ scope: 'frontend' | 'backend'. Toutes les methodes du service (getAllTranslations, searchTranslations, createTranslation, etc.) acceptent un parametre optionnel pour filtrer par scope.
Compiler et packager
cd extension-i18n
npm install
npm run compile # compile TypeScript
npm run package # genere le .vsix
Mode debug
Appuyer sur F5 dans VS Code/Cursor pour lancer l'extension en mode debug.
Prerequis
- VS Code >= 1.74.0 ou Cursor
- Node.js >= 16
- Un projet avec des fichiers de traduction JSON (frontend) et/ou
.resx (backend)