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