Newer
Older
francois.grand
committed
import { Injectable } from '@angular/core';
import { Response } from '@angular/http';
francois.grand
committed
import { Message, MessageCode } from "jalhyd";
francois.grand
committed
import { HttpService } from "../http/http.service";
import { Observable } from "../observer";
import { StringMap } from "../../stringmap";
francois.grand
committed
/*
language tag : fr-FR
primary subcode : fr
optional subcode : FR
*/
francois.grand
committed
export enum LanguageCode {
francois.grand
committed
FRENCH,
ENGLISH,
}
francois.grand
committed
export class Language {
private _code: LanguageCode;
private _tag: string;
private _label: string;
constructor(c: LanguageCode, t: string, l: string) {
this._code = c;
this._tag = t;
this._label = l;
}
get code(): LanguageCode {
return this._code;
}
get tag(): string {
return this._tag;
}
get label(): string {
return this._label;
}
}
francois.grand
committed
@Injectable()
export class InternationalisationService extends Observable {
francois.grand
committed
private _currLang: Language;
francois.grand
committed
private _sLang: string;
private _Messages: StringMap;
francois.grand
committed
francois.grand
committed
private _languages: Language[];
public constructor(private httpService: HttpService) {
francois.grand
committed
this._languages = [];
this._languages.push(new Language(LanguageCode.FRENCH, "fr", "Français"));
this._languages.push(new Language(LanguageCode.ENGLISH, "en", "English"));
francois.grand
committed
}
francois.grand
committed
public get languages() {
return this._languages;
}
francois.grand
committed
francois.grand
committed
public get currentLanguage() {
return this._currLang;
}
francois.grand
committed
francois.grand
committed
private getLanguageFromCode(lc: LanguageCode) {
for (let l of this._languages) {
if (l.code == lc)
return l;
}
throw new Message(MessageCode.ERROR_LANG_UNSUPPORTED);
francois.grand
committed
}
francois.grand
committed
private getLanguageFromTag(tag: string) {
for (let l of this._languages) {
if (l.tag === tag)
return l;
}
let e = new Message(MessageCode.ERROR_LANG_UNSUPPORTED);
francois.grand
committed
e.extraVar["locale"] = tag;
throw e;
}
francois.grand
committed
public setLocale(lng: string | LanguageCode) {
if (this._currLang != undefined)
var oldLang: LanguageCode = this._currLang.code;
francois.grand
committed
if (typeof lng === "string") {
let t: string = lng.substr(0, 2).toLowerCase();
this._currLang = this.getLanguageFromTag(t);
}
else {
this._currLang = this.getLanguageFromCode(lng);
francois.grand
committed
let prom = this.httpGetMessages();
prom.then((res) => {
this.notifyObservers(undefined);
})
private httpGetMessages(): Promise<Response> {
francois.grand
committed
let is: InternationalisationService = this;
let processData = function (s: string) {
// fermeture nécessaire pour capturer la valeur de this (undefined sinon)
is._Messages = JSON.parse(s);
francois.grand
committed
}
let l;
francois.grand
committed
switch (this._currLang.code) {
case LanguageCode.FRENCH:
francois.grand
committed
l = "fr";
break;
default:
l = "en";
}
let f: string = "error_messages." + l + ".json"
return this.httpService.httpGetRequest(undefined, undefined, undefined, "locale/" + f, processData);
francois.grand
committed
}
private getMessageFromCode(c: MessageCode): string {
let sCode: string = MessageCode[c];
return this._Messages[MessageCode[c]];
francois.grand
committed
}
private replaceAll(str: string, find: string, replace: string) {
return str.replace(new RegExp(find, 'g'), replace);
}
francois.grand
committed
/**
* traduit un message
* @param r message
* @param nDigits nombre de chiffres à utiliser pour l'arrondi dans le cas de données numériques
*/
public localizeMessage(r: Message, nDigits: number = 3): string {
let sCode: string = MessageCode[r.code];
let m: string = this.getMessageFromCode(r.code);
francois.grand
committed
for (let k in r.extraVar) {
francois.grand
committed
let v: any = r.extraVar[k];
if (typeof v === "number")
var s = v.toFixed(nDigits);
else
s = v;
m = this.replaceAll(m, "%" + k + "%", s);
francois.grand
committed
}
return m;
}
}