language.service.ts 1.81 KB
import {Injectable, Inject} from "ng-forward";

@Injectable()
@Inject("$translate", "tmhDynamicLocale", "amMoment", "angularLoad", "$rootScope")
export class LanguageService {

    availableLanguages: any;

    constructor(private $translate: angular.translate.ITranslateService,
        private tmhDynamicLocale: angular.dynamicLocale.tmhDynamicLocaleService,
        private amMoment: any,
        private angularLoad: any,
        private $rootScope: any) {

        this.configAvailableLanguages();
        this.$rootScope.$on("$localeChangeSuccess", () => {
            this.changeLanguage(tmhDynamicLocale.get() || $translate.use());
        });
    }

    currentLanguage() {
        return this.$translate.use();
    }

    changeLanguage(language: string) {
        if (!language) {
            console.log("WARN: language undefined");
            return;
        }
        this.changeMomentLocale(language);
        this.tmhDynamicLocale.set(language);
        this.angularLoad.loadScript(`/bower_components/messageformat/locale/${language}.js`).then(() => {
            return this.$translate.use(language);
        }).then(() => {
            this.configAvailableLanguages();
        });
    }

    translate(text: string) {
        return this.$translate.instant(text);
    }

    private configAvailableLanguages() {
        this.availableLanguages = {
            "en": this.$translate.instant("language.en"),
            "pt": this.$translate.instant("language.pt")
        };
    }

    private changeMomentLocale(language: string) {
        let localePromise = Promise.resolve();
        if (language != "en") {
            localePromise = this.angularLoad.loadScript(`/bower_components/moment/locale/${language}.js`);
        }
        localePromise.then(() => {
            this.amMoment.changeLocale(language);
        });
    }
}