From a0d9528a40419ab8b44fc1bd14ed6460d1f9f954 Mon Sep 17 00:00:00 2001
From: "francois.grand" <francois.grand@irstea.fr>
Date: Tue, 1 Aug 2017 11:18:39 +0200
Subject: [PATCH] =?UTF-8?q?d=C3=A9placement=20de=20l'internationalisation?=
 =?UTF-8?q?=20des=20messages=20d'erreur=20depuis=20JalHyd=20dans=20NgHyd?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/app/app.component.ts                     |   4 +-
 src/app/app.module.ts                        |   3 +-
 src/app/http.service.ts                      |  44 +++
 src/app/internationalisation.service.ts      | 362 +++++++++++++++++++
 src/app/param-input/param-input.component.ts |  15 +-
 src/index.html                               |   4 +-
 src/locale/error_messages.en.json            |  20 +
 src/locale/error_messages.fr.json            |  20 +
 8 files changed, 461 insertions(+), 11 deletions(-)
 create mode 100644 src/app/http.service.ts
 create mode 100644 src/app/internationalisation.service.ts
 create mode 100644 src/locale/error_messages.en.json
 create mode 100644 src/locale/error_messages.fr.json

diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 8e8a97224..94617f6db 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -1,6 +1,8 @@
 import { Component } from '@angular/core';
 
 import { ParamService } from './param-service/param.service';
+import { HttpService } from './http.service';
+import { InternationalisationService } from './internationalisation.service';
 
 @Component({
   selector: 'nghyd-app',
@@ -12,7 +14,7 @@ import { ParamService } from './param-service/param.service';
   <!--
   -->
   `,
-  providers: [ParamService]
+  providers: [ParamService, InternationalisationService, HttpService]
 })
 export class AppComponent {
   title = "Calculette hydro";
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 76d21ee16..087257e7d 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -1,6 +1,7 @@
 import { BrowserModule } from '@angular/platform-browser';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { NgModule } from '@angular/core';
+import { HttpModule } from '@angular/http';
 import { FormsModule } from '@angular/forms'; // <-- NgModel lives here
 import { MdInputModule } from '@angular/material';
 
@@ -12,7 +13,7 @@ import { ParamInputComponent } from './param-input/param-input.component';
     BrowserModule,
     BrowserAnimationsModule,
     FormsModule, // <-- import the FormsModule before binding with [(ngModel)]
-    MdInputModule
+    MdInputModule, HttpModule
   ],
   declarations: [
     AppComponent,
diff --git a/src/app/http.service.ts b/src/app/http.service.ts
new file mode 100644
index 000000000..f90a5b6ff
--- /dev/null
+++ b/src/app/http.service.ts
@@ -0,0 +1,44 @@
+import { Injectable } from '@angular/core';
+import { Http, RequestOptions, RequestOptionsArgs, Headers } from '@angular/http';
+
+@Injectable()
+export class HttpService {
+    constructor(private http: Http) { }
+
+    private concat(s1: string, s2: string): string {
+        if (s1 == undefined)
+            return s2;
+
+        if (s2 == undefined)
+            return s1;
+
+        return s1 + s2;
+    }
+
+    public httpGetRequest(protocol: string, host: string, port: number, path: string, processDataCallback: (s: string) => void) {
+        let url: string;
+        if (protocol != undefined)
+            url = protocol + "://" + host;
+        else if (host != undefined)
+            url = host;
+
+        if (port != undefined)
+            url = this.concat(url, ":" + String(port));
+
+        let p = path === "/" ? "" : path;
+        url = this.concat(url, "/" + p);
+
+        //console.log(url);
+        let enc = encodeURI(url);
+
+        let opts = new RequestOptions();
+
+        this.http.get(enc, opts)
+            .map(res => res.text())
+            .subscribe(
+            data => processDataCallback(data),
+            //            err => this.logError(err),
+            //            () => console.log('Random Quote Complete')
+        );
+    }
+}
diff --git a/src/app/internationalisation.service.ts b/src/app/internationalisation.service.ts
new file mode 100644
index 000000000..f38bc2c52
--- /dev/null
+++ b/src/app/internationalisation.service.ts
@@ -0,0 +1,362 @@
+import { Injectable } from '@angular/core';
+
+import { ErrorMessage, ErrorCode } from "jalhyd";
+
+import { HttpService } from "./http.service";
+
+export enum Language {
+    FRENCH,
+
+    ENGLISH,
+}
+
+@Injectable()
+export class InternationalisationService {
+    private _lang: Language;
+    private _sLang: string;
+    private _errorMessages: { [key: string]: string };
+
+    public constructor(private httpService: HttpService) { }
+
+    public get lang() {
+        return this._lang;
+    }
+
+    // public set lang(l: Language) {
+    //     this._lang = l;
+    //     this._sLang = Language[l];
+    // }
+
+    public setLocale(loc: string) {
+        let l: string = loc.substr(0, 2).toLowerCase();
+        if (l === "en")
+            this._lang = Language.ENGLISH;
+        else if (l === "fr")
+            this._lang = Language.FRENCH;
+        else {
+            let e = new ErrorMessage(ErrorCode.ERROR_LANG_UNSUPPORTED);
+            e.extraVar["locale"] = loc;
+            throw e;
+        }
+
+        // this.loadErrorMessages();
+        this.httpGetErrorMessages();
+    }
+
+    // private loadErrorMessages() {
+    //     let l;
+    //     switch (this.lang) {
+    //         case Language.FRENCH:
+    //             l = "fr";
+    //             break;
+
+    //         default:
+    //             l = "en";
+    //     }
+
+    //     let s: string = fs.readFileSync("src/error_messages." + l + ".json", "utf8");
+    //     this._errorMessages = JSON.parse(s);
+    // }
+
+
+    private httpGetErrorMessages() {
+        let is: InternationalisationService = this;
+        let processData = function (s: string) {
+            // fermeture nécessaire pour capturer la valeur de this (undefined sinon)
+            is._errorMessages = JSON.parse(s);
+        }
+
+        let l;
+        switch (this.lang) {
+            case Language.FRENCH:
+                l = "fr";
+                break;
+
+            default:
+                l = "en";
+        }
+
+        let f: string = "error_messages." + l + ".json"
+        this.httpService.httpGetRequest(undefined, undefined, undefined, "locale/" + f, processData);
+    }
+
+    private getErrorMessageFromCode(c: ErrorCode): string {
+        let sCode: string = ErrorCode[c];
+        return this._errorMessages[ErrorCode[c]];
+    }
+
+    private replaceAll(str: string, find: string, replace: string) {
+        return str.replace(new RegExp(find, 'g'), replace);
+    }
+
+    public localizeErrorMessage(r: ErrorMessage): string {
+        let sCode: string = ErrorCode[r.code];
+        let m: string = this.getErrorMessageFromCode(r.code);
+
+        for (let k in r.extraVar) {
+            m = this.replaceAll(m, "%" + k + "%", r.extraVar[k]);
+        }
+
+        return m;
+    }
+
+    /*
+    public localizeErrorMessage(r: ErrorMessage): string {
+        let m: string;
+        let sCode: string = ErrorCode[r.code];
+
+        switch (this.lang) {
+            case Language.ENGLISH:
+                switch (r.code) {
+                    case ErrorCode.ERROR_DICHO_INIT_DOMAIN:
+                        m = "Dichotomy : target " + r.extraVar["targetSymbol"];
+                        m += "=" + r.extraVar["targetValue"];
+                        m += " does not exist for variable " + r.extraVar["variableSymbol"];
+                        m += " valued in interval " + r.extraVar["variableInterval"];
+                        break;
+
+                    case ErrorCode.ERROR_DICHO_INITVALUE_HIGH:
+                    case ErrorCode.ERROR_DICHO_INITVALUE_LOW:
+                        m = "Dichotomy : initial value " + r.extraVar["variableSymbol"];
+                        m += "=" + r.extraVar["variableInitValue"];
+                        if (r.code == ErrorCode.ERROR_DICHO_INITVALUE_HIGH)
+                            m += " is too high";
+                        else if (r.code == ErrorCode.ERROR_DICHO_INITVALUE_LOW)
+                            m += " is too low";
+
+                        m += " (target is " + r.extraVar["targetSymbol"];
+                        m += "=" + r.extraVar["targetValue"];
+                        m += ", " + r.extraVar["targetSymbol"];
+                        m += "(" + r.extraVar["variableSymbol"];
+                        m += "=" + r.extraVar["variableInitValue"]
+                        m += ")=" + r.extraVar["initTarget"] + ")";
+                        break;
+
+
+                    case ErrorCode.ERROR_DICHO_NULL_STEP:
+                        m = "Dichotomy (initial interval search) : invalid null step";
+                        break;
+
+                    case ErrorCode.ERROR_DICHO_INVALID_STEP_GROWTH:
+                        m = "Dichotomy (initial interval search) : invalid null step growth";
+                        break;
+
+                    case ErrorCode.ERROR_DICHO_FUNCTION_VARIATION:
+                        m = "unable to determinate function direction of variation";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDOMAIN_INTERVAL_BOUNDS:
+                        m = "invalid ";
+                        m += String(r.extraVar["minValue"]);
+                        m += "/";
+                        m += String(r.extraVar["maxValue"]);
+                        m += " min/max boundaries for 'interval' parameter definition domain";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDEF_CALC_UNDEFINED:
+                        m = "calculability of '";
+                        m += r.extraVar["symbol"];
+                        m += "' parameter is undefined";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDEF_VALUE_UNDEFINED:
+                        m = "value of '";
+                        m += r.extraVar["symbol"];
+                        m += "' parameter is undefined";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDEF_VALUE_FIXED:
+                        m = "value of '";
+                        m += r.extraVar["symbol"];
+                        m += "' parameter cannot be changed";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDEF_VALUE_POS:
+                        m = "value ";
+                        m += String(r.extraVar["value"]);
+                        m += " of '";
+                        m += r.extraVar["symbol"];
+                        m += "' parameter is invalid ";
+                        m += " (cannot be <=0)";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDEF_VALUE_POSNULL:
+                        m = "value ";
+                        m += String(r.extraVar["value"]);
+                        m += " of '";
+                        m += r.extraVar["symbol"];
+                        m += "' parameter is invalid ";
+                        m += " (cannot be <0)";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDEF_VALUE_NULL:
+                        m = "value of '";
+                        m += r.extraVar["symbol"];
+                        m += "' parameter cannot be 0";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDEF_VALUE_INTERVAL:
+                        m = "parameter '";
+                        m += r.extraVar["symbol"];
+                        m += "' : value ";
+                        m += r.extraVar["value"];
+                        m += " is out of [";
+                        m += r.extraVar["minValue"];
+                        m += ", ";
+                        m += r.extraVar["maxValue"];
+                        m += "] interval";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDOMAIN_INVALID:
+                        m = "parameter '";
+                        m += r.extraVar["symbol"];
+                        m += "' : non supported '";
+                        m += r.extraVar["domain"];
+                        m += "' definition domain";
+                        break;
+
+                    case ErrorCode.ERROR_INTERVAL_UNDEF:
+                        m = "Interval : invalid 'undefined' value";
+                        break;
+
+                    case ErrorCode.ERROR_INTERVAL_OUTSIDE:
+                        m = "Interval : value ";
+                        m += r.extraVar["value"];
+                        m += " is outside of ";
+                        m += r.extraVar["interval"];
+                        break;
+
+                    default:
+                        throw "unprocessed ResultCode value " + sCode + " for language " + this._sLang;
+                }
+                break;
+
+            case Language.FRENCH:
+                switch (r.code) {
+                    case ErrorCode.ERROR_DICHO_INIT_DOMAIN:
+                        m = "Dichotomie : la valeur cible " + r.extraVar["targetSymbol"];
+                        m += "=" + r.extraVar["targetValue"];
+                        m += " n'existe pas pour la variable " + r.extraVar["variableSymbol"] + " prise dans l'intervalle " + r.extraVar["variableInterval"];
+                        break;
+
+                    case ErrorCode.ERROR_DICHO_INITVALUE_HIGH:
+                    case ErrorCode.ERROR_DICHO_INITVALUE_LOW:
+                        m = "Dichotomie : la valeur initiale " + r.extraVar["variableSymbol"];
+                        m += "=" + r.extraVar["variableInitValue"];
+                        if (r.code == ErrorCode.ERROR_DICHO_INITVALUE_HIGH)
+                            m += " est trop grande";
+                        else if (r.code == ErrorCode.ERROR_DICHO_INITVALUE_LOW)
+                            m += " est trop petite";
+
+                        m += " (la valeur cible est " + r.extraVar["targetSymbol"];
+                        m += "=" + r.extraVar["targetValue"];
+                        m += ", " + r.extraVar["targetSymbol"];
+                        m += "(" + r.extraVar["variableSymbol"];
+                        m += "=" + r.extraVar["variableInitValue"]
+                        m += ")=" + r.extraVar["initTarget"] + ")";
+                        break;
+
+                    case ErrorCode.ERROR_DICHO_NULL_STEP:
+                        m = "Dichotomie : le pas pour la recherche de l'intervalle de départ ne devrait pas être nul";
+                        break;
+
+                    case ErrorCode.ERROR_DICHO_INVALID_STEP_GROWTH:
+                        m = "Dichotomie : l'augmentation du pas pour la recherche de l'intervalle de départ est incorrecte (=0)";
+                        break;
+
+                    case ErrorCode.ERROR_DICHO_FUNCTION_VARIATION:
+                        m = "Dichotomie : impossible de determiner le sens de  variation de la fonction";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDOMAIN_INTERVAL_BOUNDS:
+                        m = "Les bornes (";
+                        m += String(r.extraVar["minValue"]);
+                        m += "/";
+                        m += String(r.extraVar["maxValue"]);
+                        m += ") de l'intervalle sont incorrectes";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDEF_CALC_UNDEFINED:
+                        m = "La calculabilité du paramètre ";
+                        m += r.extraVar["symbol"];
+                        m += " n'est pas définie";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDEF_VALUE_UNDEFINED:
+                        m = "La valeur du paramètre ";
+                        m += r.extraVar["symbol"];
+                        m += " n'est pas définie";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDEF_VALUE_FIXED:
+                        m = "La valeur du paramètre ";
+                        m += r.extraVar["symbol"];
+                        m += " ne peut pas être changée";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDEF_VALUE_POS:
+                        m = "La valeur ";
+                        m += String(r.extraVar["value"]);
+                        m += " du paramètre '";
+                        m += r.extraVar["symbol"];
+                        m += "' est incorrecte (<=0)";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDEF_VALUE_POSNULL:
+                        m = "La valeur ";
+                        m += String(r.extraVar["value"]);
+                        m += " du paramètre '";
+                        m += r.extraVar["symbol"];
+                        m += "' est incorrecte (<0)";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDEF_VALUE_NULL:
+                        m = "La valeur du paramètre '";
+                        m += r.extraVar["symbol"];
+                        m += "' ne peut pas être nulle";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDEF_VALUE_INTERVAL:
+                        m = "Paramètre '";
+                        m += r.extraVar["symbol"];
+                        m += "' : la valeur ";
+                        m += r.extraVar["value"];
+                        m += " est en dehors de l'intervalle [";
+                        m += r.extraVar["minValue"];
+                        m += ", ";
+                        m += r.extraVar["maxValue"];
+                        m += "]";
+                        break;
+
+                    case ErrorCode.ERROR_PARAMDOMAIN_INVALID:
+                        m = "Paramètre '";
+                        m += r.extraVar["symbol"];
+                        m += "' : le domaine de définition '";
+                        m += r.extraVar["domain"];
+                        m += "' est incorrect";
+                        break;
+
+                    case ErrorCode.ERROR_INTERVAL_UNDEF:
+                        m = "Interval : valeur 'undefined' incorrecte";
+                        break;
+
+                    case ErrorCode.ERROR_INTERVAL_OUTSIDE:
+                        m = "Interval : la valeur ";
+                        m += r.extraVar["value"];
+                        m += " est hors de l'intervalle ";
+                        m += r.extraVar["interval"];
+                        break;
+
+                    default:
+                        throw "unprocessed ResultCode value " + sCode + " for language " + this._sLang;
+                }
+                break;
+
+            default:
+                throw "unprocessed Language value " + this._sLang;
+        }
+
+        return m;
+    }
+    */
+}
diff --git a/src/app/param-input/param-input.component.ts b/src/app/param-input/param-input.component.ts
index 447b8a6ea..c649a6dc1 100644
--- a/src/app/param-input/param-input.component.ts
+++ b/src/app/param-input/param-input.component.ts
@@ -3,9 +3,10 @@
 import { Component, Input, forwardRef, OnInit, DoCheck, ChangeDetectorRef } from '@angular/core';
 import { ControlValueAccessor, NG_VALUE_ACCESSOR, NG_VALIDATORS, FormControl } from '@angular/forms';
 
-import { ParamDefinition, NumericalString, Internationalisation, Language, ErrorMessage } from 'jalhyd';
+import { ParamDefinition, NumericalString, ErrorMessage } from 'jalhyd';
 
 import { ParamService } from '../param-service/param.service';
+import { InternationalisationService, Language } from '../internationalisation.service';
 
 @Component({
     selector: 'param-input[symbol]',
@@ -57,7 +58,7 @@ export class ParamInputComponent implements ControlValueAccessor, OnInit, DoChec
      */
     private _uiValue: NumericalString;
 
-    constructor(private paramService: ParamService, private changeDetector: ChangeDetectorRef) {
+    constructor(private paramService: ParamService, private changeDetector: ChangeDetectorRef, private intlService: InternationalisationService) {
         this._id = ParamInputComponent._idGen++;
         if (ParamInputComponent._startTime == undefined)
             ParamInputComponent._startTime = new Date().getTime();
@@ -94,8 +95,8 @@ export class ParamInputComponent implements ControlValueAccessor, OnInit, DoChec
         this._paramDef = this.paramService.getParameter(this._paramSymbol);
 
         let docLocale: string = document['locale'] as string;
-        Internationalisation.getInstance().setLocale(docLocale);
-        console.log("doc locale " + docLocale);
+        this.intlService.setLocale(docLocale);
+        //        console.log("doc locale " + docLocale);
     }
 
     // private getValue() {
@@ -150,13 +151,13 @@ export class ParamInputComponent implements ControlValueAccessor, OnInit, DoChec
             }
             catch (e) {
                 if (e instanceof ErrorMessage)
-                    this._message = Internationalisation.getInstance().localizeErrorMessage(e);
+                    this._message = this.intlService.localizeErrorMessage(e);
                 else
                     this._message = "invalid value";
             }
         }
         else {
-            switch (Internationalisation.getInstance().lang) {
+            switch (this.intlService.lang) {
                 case Language.FRENCH:
                     this._message = "Veuillez entrer une valeur numérique";
                     break;
@@ -205,7 +206,7 @@ export class ParamInputComponent implements ControlValueAccessor, OnInit, DoChec
     }
 
     private log(m: string) {
-        let t: number = new Date().getTime() - ParamInputComponent._startTime;
+        // let t: number = new Date().getTime() - ParamInputComponent._startTime;
         //   console.log("ParamInputComponent(" + this._id + ") " + t + " : " + m);
     }
 
diff --git a/src/index.html b/src/index.html
index 132635677..2387cacdd 100644
--- a/src/index.html
+++ b/src/index.html
@@ -17,8 +17,8 @@
   <script src="systemjs.config.js"></script>
   <script>
     // Get the locale id somehow
-    document.locale = 'fr-FR';
-    // document.locale = 'en';
+    // document.locale = 'fr-FR';
+    document.locale = 'en';
 
     // Map to the text plugin
     System.config({
diff --git a/src/locale/error_messages.en.json b/src/locale/error_messages.en.json
new file mode 100644
index 000000000..aa3bdda4a
--- /dev/null
+++ b/src/locale/error_messages.en.json
@@ -0,0 +1,20 @@
+{
+    "ERROR_DICHO_INIT_DOMAIN": "Dichotomy : target %targetSymbol%=%targetValue% does not exist for variable %variableSymbol% valued in interval %variableInterval%",
+    "ERROR_DICHO_INITVALUE_LOW": "Dichotomy : initial value %variableSymbol%=%variableInitValue% is too low (target is %targetSymbol%=%targetValue%, %targetSymbol%(%variableSymbol%=%variableInitValue%)=%initTarget%)",
+    "ERROR_DICHO_INITVALUE_HIGH": "Dichotomy : initial value %variableSymbol%=%variableInitValue% is too high (target is %targetSymbol%=%targetValue%, %targetSymbol%(%variableSymbol%=%variableInitValue%)=%initTarget%)",
+    "ERROR_DICHO_NULL_STEP": "Dichotomy (initial interval search) : invalid null step",
+    "ERROR_DICHO_INVALID_STEP_GROWTH": "Dichotomy (initial interval search) : invalid null step growth",
+    "ERROR_DICHO_FUNCTION_VARIATION": "unable to determinate function direction of variation",
+    "ERROR_PARAMDOMAIN_INTERVAL_BOUNDS": "invalid %minValue%/%maxValue% min/max boundaries for 'interval' parameter definition domain",
+    "ERROR_PARAMDEF_CALC_UNDEFINED": "calculability of '%symbol%' parameter is undefined",
+    "ERROR_PARAMDEF_VALUE_UNDEFINED": "value of '%symbol%' parameter is undefined",
+    "ERROR_PARAMDEF_VALUE_FIXED": "value of '%symbol%' parameter cannot be changed",
+    "ERROR_PARAMDEF_VALUE_POS": "value %value% of '%symbol%' parameter is invalid (cannot be <=0)",
+    "ERROR_PARAMDEF_VALUE_POSNULL": "value %value% of '%symbol%' parameter is invalid (cannot be <0)",
+    "ERROR_PARAMDEF_VALUE_NULL": "value of '%symbol%' parameter cannot be 0",
+    "ERROR_PARAMDEF_VALUE_INTERVAL": "parameter '%symbol%' : value %value% is out of [%minValue%, %maxValue%] interval",
+    "ERROR_PARAMDOMAIN_INVALID": "parameter '%symbol%' : non supported '%domain%' definition domain",
+    "ERROR_INTERVAL_UNDEF": "Interval : invalid 'undefined' value",
+    "ERROR_INTERVAL_OUTSIDE": "Interval : value %value% is outside of %interval",
+    "ERROR_LANG_UNSUPPORTED": "internationalisation : unsupported '%locale%' locale"
+}
\ No newline at end of file
diff --git a/src/locale/error_messages.fr.json b/src/locale/error_messages.fr.json
new file mode 100644
index 000000000..406d9f437
--- /dev/null
+++ b/src/locale/error_messages.fr.json
@@ -0,0 +1,20 @@
+{
+    "ERROR_DICHO_INIT_DOMAIN": "Dichotomie : la valeur cible %targetSymbol%=%targetValue% n'existe pas pour la variable %variableSymbol% prise dans l'intervalle %variableInterval%",
+    "ERROR_DICHO_INITVALUE_LOW": "Dichotomie : la valeur initiale %variableSymbol%=%variableInitValue% est trop petite (la valeur cible est %targetSymbol%=%targetValue%, %targetSymbol%(%variableSymbol%=%variableInitValue%)=%initTarget%)",
+    "ERROR_DICHO_INITVALUE_HIGH": "Dichotomie : la valeur initiale %variableSymbol%=%variableInitValue% est trop grande (la valeur cible est %targetSymbol%=%targetValue%, %targetSymbol%(%variableSymbol%=%variableInitValue%)=%initTarget%)",
+    "ERROR_DICHO_NULL_STEP": "Dichotomie : le pas pour la recherche de l'intervalle de départ ne devrait pas être nul",
+    "ERROR_DICHO_INVALID_STEP_GROWTH": "Dichotomie : l'augmentation du pas pour la recherche de l'intervalle de départ est incorrecte (=0)",
+    "ERROR_DICHO_FUNCTION_VARIATION": "Dichotomie : impossible de determiner le sens de  variation de la fonction",
+    "ERROR_PARAMDOMAIN_INTERVAL_BOUNDS": "Les bornes (%minValue%/%maxValue%) de l'intervalle sont incorrectes",
+    "ERROR_PARAMDEF_CALC_UNDEFINED": "La calculabilité du paramètre %symbol% n'est pas définie",
+    "ERROR_PARAMDEF_VALUE_UNDEFINED": "La valeur du paramètre %symbol% n'est pas définie",
+    "ERROR_PARAMDEF_VALUE_FIXED": "La valeur du paramètre %symbol% ne peut pas être changée",
+    "ERROR_PARAMDEF_VALUE_POS": "La valeur %value% du paramètre '%symbol%' est incorrecte (<=0)",
+    "ERROR_PARAMDEF_VALUE_POSNULL": "La valeur %value% du paramètre '%symbol%' est incorrecte (<0)",
+    "ERROR_PARAMDEF_VALUE_NULL": "La valeur du paramètre '%symbol%' ne peut pas être nulle",
+    "ERROR_PARAMDEF_VALUE_INTERVAL": "Paramètre '%symbol%' : la valeur %value% est en dehors de l'intervalle [%minValue%, %maxValue%]",
+    "ERROR_PARAMDOMAIN_INVALID": "Paramètre '%symbol%' : le domaine de définition '%domain%' est incorrect",
+    "ERROR_INTERVAL_UNDEF": "Interval : valeur 'undefined' incorrecte",
+    "ERROR_INTERVAL_OUTSIDE": "Interval : la valeur %value% est hors de l'intervalle %interval",
+    "ERROR_LANG_UNSUPPORTED": "internationalisation : locale '%locale%' non prise en charge"
+}
\ No newline at end of file
-- 
GitLab