/* * Copyright (C) 2018-2020 StApps * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ import { CommonModule, LocationStrategy, PathLocationStrategy, registerLocaleData, } from '@angular/common'; import {HttpClient} from '@angular/common/http'; import localeDe from '@angular/common/locales/de'; import {APP_INITIALIZER, NgModule, Provider} from '@angular/core'; import {BrowserModule} from '@angular/platform-browser'; import {RouteReuseStrategy} from '@angular/router'; import {Diagnostic} from '@ionic-native/diagnostic/ngx'; import {SplashScreen} from '@ionic-native/splash-screen/ngx'; import {StatusBar} from '@ionic-native/status-bar/ngx'; import {IonicModule, IonicRouteStrategy} from '@ionic/angular'; import { TranslateLoader, TranslateModule, TranslateService, } from '@ngx-translate/core'; import {TranslateHttpLoader} from '@ngx-translate/http-loader'; import moment from 'moment'; import 'moment/min/locales'; import {LoggerModule, NGXLogger, NgxLoggerLevel} from 'ngx-logger'; import {environment} from '../environments/environment'; import {AppRoutingModule} from './app-routing.module'; import {AppComponent} from './app.component'; import {ConfigModule} from './modules/config/config.module'; import {ConfigProvider} from './modules/config/config.provider'; import {DataModule} from './modules/data/data.module'; import {MapModule} from './modules/map/map.module'; import {MenuModule} from './modules/menu/menu.module'; import {NewsModule} from './modules/news/news.module'; import {ScheduleModule} from './modules/schedule/schedule.module'; import {SettingsModule} from './modules/settings/settings.module'; import {SettingsProvider} from './modules/settings/settings.provider'; import {StorageModule} from './modules/storage/storage.module'; import {ThingTranslateModule} from './translation/thing-translate.module'; import {fakeBackendProvider} from './_helpers/fake-backend.interceptor'; import {UtilModule} from './util/util.module'; import {initLogger} from './_helpers/ts-logger'; import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; import {FavoritesModule} from './modules/favorites/favorites.module'; registerLocaleData(localeDe); /** * Initializes settings from Config before other components * * @param logger TODO * @param settingsProvider provider of settings (e.g. language that has been set) * @param configProvider TODO * @param translateService TODO */ export function initSettingsFactory( logger: NGXLogger, settingsProvider: SettingsProvider, configProvider: ConfigProvider, translateService: TranslateService, ) { return async () => { initLogger(logger); await settingsProvider.init(); try { // set language from settings if (configProvider.firstSession) { await settingsProvider.setSettingValue( 'profile', 'language', translateService.getBrowserLang(), ); } const languageCode = (await settingsProvider.getValue( 'profile', 'language', )) as string; // this language will be used as a fallback when a translation isn't found in the current language translateService.setDefaultLang('en'); translateService.use(languageCode); moment.locale(languageCode); } catch (error) { logger.warn(error); } }; } /** * TODO * * @param http TODO */ export function createTranslateLoader(http: HttpClient) { return new TranslateHttpLoader(http, './assets/i18n/', '.json'); } const providers: Provider[] = [ StatusBar, SplashScreen, Diagnostic, { provide: RouteReuseStrategy, useClass: IonicRouteStrategy, }, { provide: LocationStrategy, useClass: PathLocationStrategy, }, { provide: APP_INITIALIZER, multi: true, deps: [NGXLogger, SettingsProvider, ConfigProvider, TranslateService], useFactory: initSettingsFactory, }, ]; /** * TODO */ @NgModule({ bootstrap: [AppComponent], declarations: [AppComponent], imports: [ AppRoutingModule, BrowserModule, BrowserAnimationsModule, CommonModule, ConfigModule, DataModule, IonicModule.forRoot(), FavoritesModule, MapModule, MenuModule, NewsModule, ScheduleModule, SettingsModule, StorageModule, ThingTranslateModule.forRoot(), TranslateModule.forRoot({ loader: { deps: [HttpClient], provide: TranslateLoader, useFactory: createTranslateLoader, }, }), UtilModule, // use maximal logging level when not in production, minimal (log only fatal errors) in production LoggerModule.forRoot({ level: environment.production ? NgxLoggerLevel.FATAL : NgxLoggerLevel.TRACE, }), ], providers: environment.use_fake_backend ? [providers, fakeBackendProvider] : providers, }) export class AppModule {}