RSS Git Download  Clone
Raw Blame History
import {
    Injectable,

    Inject
} from '@angular/core';

//import * as moment from 'moment';

import {CookieService,} from '../services/cookie';
import {SettingsService} from '../services/settings';
import {IpInfoService,} from '../modules/ip-info';

import {log as logDefault} from '../util/log'

const log = logDefault.factory('locale');

let currentLanguage = 'en';

const totalTranslations = {};

import {BehaviorSubject} from 'rxjs';

const subject = new BehaviorSubject(<LocaleSubject>{
    action: 'empty'
});

export interface LocaleSubject {
    action: string
    locale: LocaleService,
}

let cookieEmpty = true;

const IsBot = require("../util/is-bot.js");

@Injectable()
export class LocaleService {

    constructor(
        private ipInfo: IpInfoService,
        private settings: SettingsService,
        private cookie: CookieService,
    ) {

    }

    public async boot() {

        const fromCookie = this.cookie.get(this.settings.data.core.cookie.language);
        if (fromCookie !== undefined) {
            log(`using cookie language: ${fromCookie}`)
            this.setTranslation(fromCookie);
        } else if (!IsBot()) {

            let ipLanguage;
            try {
                const response: any = await this.ipInfo.get;
                if (!response.hasOwnProperty('country')) {
                    this.setTranslation(currentLanguage);
                    return;
                }
                ipLanguage = response.country.toLowerCase()
                if (Object.keys(this.settings.data.core.translations.language).indexOf(ipLanguage) > -1) {
                    log(`using locale from IPINFO ${ipLanguage}`)
                    this.setTranslation(ipLanguage);
                }
            } catch (e) {
                window.corifeus.core.http.error.push(e);
                console.error(e)
            }
            if (ipLanguage === undefined) {
                log(`using default language: ${ipLanguage}`)
                this.setTranslation(currentLanguage);
            }
        } else {
            this.setTranslation(currentLanguage);
        }
    }

    public register(module: string, translations: any) {
        log(`[ ${module.toUpperCase()} ]`)
        Object.keys(translations).forEach((lang: string) => {
            totalTranslations[lang] = totalTranslations[lang] || {};

           // if (totalTranslations[lang][module] !== undefined) {
           //     throw new Error(`Already registered locale langauge module (${module})`);
           // }
            totalTranslations[lang][module] = translations[lang];

        })
        subject.next({
            action: 'set-translation',
            locale: this
        })
    }

    public setTranslation(setTranslation: string) {
        log(`setTranslation '${setTranslation}'`)
        if (this.settings.data.core.translations.language.hasOwnProperty(setTranslation)) {
            currentLanguage = setTranslation;
            this.cookie.set(this.settings.data.core.cookie.language, currentLanguage);

            subject.next({
                action: 'set-translation',
                locale: this
            })
            //moment.locale(currentLanguage);
            cookieEmpty = false;
            return true;
        }
        throw new Error(`setTranslation '${setTranslation}' failed`);
    }

    public subscribe(subscriber: any) {
        return subject.subscribe({
            next: subscriber
        });
    }

    public get current() {
        return currentLanguage;
    }

    public get data() {
        return totalTranslations[currentLanguage];
    }

}