diff --git a/src/app/services/internationalisation.service.ts b/src/app/services/internationalisation.service.ts
index deee494fecb63836be93eeb253b8253ed708742f..95895d47d0c753bf1a78f0712245e313813c334e 100644
--- a/src/app/services/internationalisation.service.ts
+++ b/src/app/services/internationalisation.service.ts
@@ -1,6 +1,6 @@
 import { Injectable, isDevMode } from "@angular/core";
 
-import { Message, MessageCode, Observable, Observer, Nub, CalculatorType, PreBarrage, PbCloison, PbBassin } from "jalhyd";
+import { Message, MessageCode, Observable, Observer, Nub, CalculatorType, PreBarrage, PbCloison, PbBassin, enumValueFromString } from "jalhyd";
 
 import { StringMap } from "../stringmap";
 import { ApplicationSetupService } from "./app-setup.service";
@@ -165,6 +165,21 @@ export class I18nService extends Observable implements Observer {
         if (! this._Messages) {
             return `*** messages not loaded: ${this._currentLanguage} ***`;
         }
+
+        // key is an enum ?
+        if (textKey.indexOf("INFO_ENUM_") !== -1) {
+            // key ends with a number ?
+            const re = /^((INFO_ENUM)_(.+)_)([0-9]+)$/;
+            const res = textKey.match(re);
+            if (res !== null) {
+                // convert end number to enum symbolic value
+                const enumClass = res[3];
+                const value = res[4];
+                const val = enumValueFromString(enumClass, value);
+                textKey = res[1] + val;
+            }
+        }
+
         if (this._Messages[textKey] !== undefined) {
             return this.translateMessage(this._Messages[textKey], vars);
         } else {
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index de71e8bbbce84461d413a6540659e57d45673ed2..98aaefe3e3206b6f19174e7ab29bf84a1b422365 100755
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -156,9 +156,9 @@
     "INFO_DIALOG_SAVE_SESSION_TITLE": "Save calculator modules",
     "INFO_EMPTY_SESSION_DIALOGUE_TEXT": "Warning ! All open calculators will be lost. Continue ?",
     "INFO_EMPTY_SESSION_DIALOGUE_TITRE": "New session",
-    "INFO_ENUM_MACRORUGOFLOWTYPE_0": "Emergent",
-    "INFO_ENUM_MACRORUGOFLOWTYPE_1": "Quasi-emergent",
-    "INFO_ENUM_MACRORUGOFLOWTYPE_2": "Submerged",
+    "INFO_ENUM_MACRORUGOFLOWTYPE_EMERGENT": "Emergent",
+    "INFO_ENUM_MACRORUGOFLOWTYPE_QUASI_EMERGENT": "Quasi-emergent",
+    "INFO_ENUM_MACRORUGOFLOWTYPE_SUBMERGED": "Submerged",
     "INFO_ENUM_OUVRAGE_Q_MODE_0": "Weir",
     "INFO_ENUM_OUVRAGE_Q_MODE_1": "Orifice",
     "INFO_ENUM_OUVRAGE_Q_MODE_2": "Zero flow",
@@ -166,8 +166,8 @@
     "INFO_ENUM_OUVRAGE_Q_REGIME_1": "Partially submerged",
     "INFO_ENUM_OUVRAGE_Q_REGIME_2": "Submerged",
     "INFO_ENUM_OUVRAGE_Q_REGIME_3": "Zero flow",
-    "INFO_ENUM_PARFLOWREGIME_0": "Free",
-    "INFO_ENUM_PARFLOWREGIME_1": "Submerged",
+    "INFO_ENUM_PARFLOWREGIME_FREE": "Free",
+    "INFO_ENUM_PARFLOWREGIME_SUBMERGED": "Submerged",
     "INFO_ENUM_SPECIES_1": "Salmon, trout [50-100] (1)",
     "INFO_ENUM_SPECIES_2": "Mule (2)",
     "INFO_ENUM_SPECIES_3a": "Great shad (3a)",
@@ -188,16 +188,16 @@
     "INFO_ENUM_SPECIES_10": "Sunbleak, bitterling, stickleback, minnow (10)",
     "INFO_ENUM_SPECIES_11a": "European eel [yellow] (11a)",
     "INFO_ENUM_SPECIES_11b": "European Eel [glass eel] (11b)",
-    "INFO_ENUM_STRUCTUREFLOWMODE_0": "Weir",
-    "INFO_ENUM_STRUCTUREFLOWMODE_1": "Orifice",
-    "INFO_ENUM_STRUCTUREFLOWMODE_2": "Zero flow",
-    "INFO_ENUM_STRUCTUREFLOWREGIME_0": "Free flow",
-    "INFO_ENUM_STRUCTUREFLOWREGIME_1": "Partially submerged",
-    "INFO_ENUM_STRUCTUREFLOWREGIME_2": "Submerged",
-    "INFO_ENUM_STRUCTUREFLOWREGIME_3": "Zero flow",
-    "INFO_ENUM_STRUCTUREJETTYPE_0": "diving",
-    "INFO_ENUM_STRUCTUREJETTYPE_1": "surface",
-    "INFO_ENUM_STRUCTUREJETTYPE_2": "not applicable",
+    "INFO_ENUM_STRUCTUREFLOWMODE_WEIR": "Weir",
+    "INFO_ENUM_STRUCTUREFLOWMODE_ORIFICE": "Orifice",
+    "INFO_ENUM_STRUCTUREFLOWMODE_NULL": "Zero flow",
+    "INFO_ENUM_STRUCTUREFLOWREGIME_FREE": "Free flow",
+    "INFO_ENUM_STRUCTUREFLOWREGIME_PARTIAL": "Partially submerged",
+    "INFO_ENUM_STRUCTUREFLOWREGIME_SUBMERGED": "Submerged",
+    "INFO_ENUM_STRUCTUREFLOWREGIME_NULL": "Zero flow",
+    "INFO_ENUM_STRUCTUREJETTYPE_PLONGEANT": "diving",
+    "INFO_ENUM_STRUCTUREJETTYPE_SURFACE": "surface",
+    "INFO_ENUM_STRUCTUREJETTYPE_SO": "not applicable",
     "INFO_CHART_BUTTON_TITLE_RESET_ZOOM": "Restore default zoom",
     "INFO_CHART_BUTTON_TITLE_EXPORT_IMAGE": "Save picture",
     "INFO_CHART_BUTTON_TITLE_ENTER_FS": "Display fullscreen",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index fa314521578af872f57c717ca91fafdc2379e03f..07fee95020ffcf48bddbe7fc528541156573e4e4 100755
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -156,9 +156,9 @@
     "INFO_DIALOG_SAVE_SESSION_TITLE": "Enregistrer les modules de calcul",
     "INFO_EMPTY_SESSION_DIALOGUE_TEXT": "Attention ! Tous les modules de calcul ouverts seront perdus.",
     "INFO_EMPTY_SESSION_DIALOGUE_TITRE": "Démarrer une nouvelle session",
-    "INFO_ENUM_MACRORUGOFLOWTYPE_0": "Émergent",
-    "INFO_ENUM_MACRORUGOFLOWTYPE_1": "Quasi-émergent",
-    "INFO_ENUM_MACRORUGOFLOWTYPE_2": "Immergé",
+    "INFO_ENUM_MACRORUGOFLOWTYPE_EMERGENT": "Émergent",
+    "INFO_ENUM_MACRORUGOFLOWTYPE_QUASI_EMERGENT": "Quasi-émergent",
+    "INFO_ENUM_MACRORUGOFLOWTYPE_SUBMERGED": "Immergé",
     "INFO_ENUM_OUVRAGE_Q_MODE_0": "Surface libre",
     "INFO_ENUM_OUVRAGE_Q_MODE_1": "En charge",
     "INFO_ENUM_OUVRAGE_Q_MODE_2": "Débit nul",
@@ -166,8 +166,8 @@
     "INFO_ENUM_OUVRAGE_Q_REGIME_1": "Partiellement noyé",
     "INFO_ENUM_OUVRAGE_Q_REGIME_2": "Noyé",
     "INFO_ENUM_OUVRAGE_Q_REGIME_3": "Débit nul",
-    "INFO_ENUM_PARFLOWREGIME_0": "Dénoyé",
-    "INFO_ENUM_PARFLOWREGIME_1": "Noyé",
+    "INFO_ENUM_PARFLOWREGIME_FREE": "Dénoyé",
+    "INFO_ENUM_PARFLOWREGIME_SUBMERGED": "Noyé",
     "INFO_ENUM_SPECIES_1": "Saumon, truite [50-100] (1)",
     "INFO_ENUM_SPECIES_2": "Mulets (2)",
     "INFO_ENUM_SPECIES_3a": "Grande Alose (3a)",
@@ -188,16 +188,16 @@
     "INFO_ENUM_SPECIES_10": "Able, bouvière, épinoche(tte), vairons (10)",
     "INFO_ENUM_SPECIES_11a": "Anguille européenne [jaune] (11a)",
     "INFO_ENUM_SPECIES_11b": "Anguille européenne [civelle] (11b)",
-    "INFO_ENUM_STRUCTUREFLOWMODE_0": "Surface libre",
-    "INFO_ENUM_STRUCTUREFLOWMODE_1": "En charge",
-    "INFO_ENUM_STRUCTUREFLOWMODE_2": "Débit nul",
-    "INFO_ENUM_STRUCTUREFLOWREGIME_0": "Dénoyé",
-    "INFO_ENUM_STRUCTUREFLOWREGIME_1": "Partiellement noyé",
-    "INFO_ENUM_STRUCTUREFLOWREGIME_2": "Noyé",
-    "INFO_ENUM_STRUCTUREFLOWREGIME_3": "Débit nul",
-    "INFO_ENUM_STRUCTUREJETTYPE_0": "plongeant",
-    "INFO_ENUM_STRUCTUREJETTYPE_1": "de surface",
-    "INFO_ENUM_STRUCTUREJETTYPE_2": "sans objet",
+    "INFO_ENUM_STRUCTUREFLOWMODE_WEIR": "Surface libre",
+    "INFO_ENUM_STRUCTUREFLOWMODE_ORIFICE": "En charge",
+    "INFO_ENUM_STRUCTUREFLOWMODE_NULL": "Débit nul",
+    "INFO_ENUM_STRUCTUREFLOWREGIME_FREE": "Dénoyé",
+    "INFO_ENUM_STRUCTUREFLOWREGIME_PARTIAL": "Partiellement noyé",
+    "INFO_ENUM_STRUCTUREFLOWREGIME_SUBMERGED": "Noyé",
+    "INFO_ENUM_STRUCTUREFLOWREGIME_NULL": "Débit nul",
+    "INFO_ENUM_STRUCTUREJETTYPE_PLONGEANT": "plongeant",
+    "INFO_ENUM_STRUCTUREJETTYPE_SURFACE": "de surface",
+    "INFO_ENUM_STRUCTUREJETTYPE_SO": "sans objet",
     "INFO_CHART_BUTTON_TITLE_RESET_ZOOM": "Réinitialiser le zoom",
     "INFO_CHART_BUTTON_TITLE_EXPORT_IMAGE": "Enregistrer l'image",
     "INFO_CHART_BUTTON_TITLE_ENTER_FS": "Afficher en plein écran",