Skip to content
Snippets Groups Projects
internationalisation.service.ts 4.42 KiB
Newer Older
import { Injectable } from '@angular/core';
import { Response } from '@angular/http';
import { Message, MessageCode } from "jalhyd";
import { HttpService } from "../http/http.service";
import { Observable } from "../observer";
import { StringMap } from "../../stringmap";
/*
  language tag : fr-FR
  primary subcode : fr
  optional subcode : FR
 */

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;
    }
}

export class InternationalisationService extends Observable {
    private _languages: Language[];

    public constructor(private httpService: HttpService) {
        super();
        this._languages = [];
        this._languages.push(new Language(LanguageCode.FRENCH, "fr", "Français"));
        this._languages.push(new Language(LanguageCode.ENGLISH, "en", "English"));
    public get languages() {
        return this._languages;
    }
    public get currentLanguage() {
        return this._currLang;
    }
    private getLanguageFromCode(lc: LanguageCode) {
        for (let l of this._languages) {
            if (l.code == lc)
                return l;
        }
        throw new Message(MessageCode.ERROR_LANG_UNSUPPORTED);
    private getLanguageFromTag(tag: string) {
        for (let l of this._languages) {
            if (l.tag === tag)
                return l;
        }
        let e = new Message(MessageCode.ERROR_LANG_UNSUPPORTED);
    public setLocale(lng: string | LanguageCode) {
        if (this._currLang != undefined)
            var oldLang: LanguageCode = this._currLang.code;
        if (typeof lng === "string") {
            let t: string = lng.substr(0, 2).toLowerCase();
            this._currLang = this.getLanguageFromTag(t);
        }
        else {
            this._currLang = this.getLanguageFromCode(lng);
        let prom = this.httpGetMessages();
        prom.then((res) => {
            this.notifyObservers(undefined);
        })
    private httpGetMessages(): Promise<Response> {
        let is: InternationalisationService = this;
        let processData = function (s: string) {
            // fermeture nécessaire pour capturer la valeur de this (undefined sinon)
        switch (this._currLang.code) {
            case LanguageCode.FRENCH:
                l = "fr";
                break;

            default:
                l = "en";
        }

        let f: string = "error_messages." + l + ".json"
        return this.httpService.httpGetRequest(undefined, undefined, undefined, "locale/" + f, processData);
    private getMessageFromCode(c: MessageCode): string {
        let sCode: string = MessageCode[c];
        return this._Messages[MessageCode[c]];
    }

    private replaceAll(str: string, find: string, replace: string) {
        return str.replace(new RegExp(find, 'g'), replace);
    }

    /**
     * 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);
            let v: any = r.extraVar[k];
            if (typeof v === "number")
                var s = v.toFixed(nDigits);
            else
                s = v;
            m = this.replaceAll(m, "%" + k + "%", s);

    /**
     * Traduit un texte défini dans les fichiers error_message.xx.json
     * Les ids dans ces fichiers sont soit un enum de JalHyd, soit une chaine libre correspondant au code passé àlocalizeText()
     * @param code id du texte
     */
    public localizeText(code: string) {
        if (this._Messages == undefined)
            return "<messages not loaded>";
        return this._Messages[code];
    }