refactor: i18n for settings module

This commit is contained in:
Rainer Killinger
2021-02-09 10:38:28 +01:00
parent abf7595c03
commit 350185b0d3
8 changed files with 23 additions and 61 deletions

View File

@@ -23,6 +23,8 @@ import {StatusBar} from '@ionic-native/status-bar/ngx';
import {IonicModule, IonicRouteStrategy} from '@ionic/angular'; import {IonicModule, IonicRouteStrategy} from '@ionic/angular';
import {TranslateLoader, TranslateModule} from '@ngx-translate/core'; import {TranslateLoader, TranslateModule} from '@ngx-translate/core';
import {TranslateHttpLoader} from '@ngx-translate/http-loader'; import {TranslateHttpLoader} from '@ngx-translate/http-loader';
import moment from 'moment';
import 'moment/min/locales';
import {LoggerModule, NgxLoggerLevel} from 'ngx-logger'; import {LoggerModule, NgxLoggerLevel} from 'ngx-logger';
import {environment} from '../environments/environment'; import {environment} from '../environments/environment';
import {AppRoutingModule} from './app-routing.module'; import {AppRoutingModule} from './app-routing.module';
@@ -36,6 +38,7 @@ import {StorageModule} from './modules/storage/storage.module';
import {ThingTranslateModule} from './translation/thing-translate.module'; import {ThingTranslateModule} from './translation/thing-translate.module';
import {fakeBackendProvider} from './_helpers/fake-backend.interceptor'; import {fakeBackendProvider} from './_helpers/fake-backend.interceptor';
moment.locale('de');
registerLocaleData(localeDe); registerLocaleData(localeDe);
/** /**

View File

@@ -12,17 +12,14 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Component, Input, OnInit} from '@angular/core'; import {Component, Input} from '@angular/core';
import {AlertController} from '@ionic/angular'; import {AlertController} from '@ionic/angular';
import {LangChangeEvent, TranslateService} from '@ngx-translate/core'; import {LangChangeEvent, TranslateService} from '@ngx-translate/core';
import { import {
SCLanguage,
SCLanguageCode, SCLanguageCode,
SCSetting, SCSetting,
SCSettingValue, SCSettingValue,
SCSettingValues, SCSettingValues,
SCThingTranslator,
SCTranslations,
} from '@openstapps/core'; } from '@openstapps/core';
import {SettingsProvider} from '../settings.provider'; import {SettingsProvider} from '../settings.provider';
@@ -33,7 +30,7 @@ import {SettingsProvider} from '../settings.provider';
selector: 'stapps-settings-item', selector: 'stapps-settings-item',
templateUrl: 'settings-item.html', templateUrl: 'settings-item.html',
}) })
export class SettingsItemComponent implements OnInit { export class SettingsItemComponent {
/** /**
* If set the setting will be shown as compact view * If set the setting will be shown as compact view
@@ -44,26 +41,11 @@ export class SettingsItemComponent implements OnInit {
* Flag for workaround for selected 'select option' not updating translation * Flag for workaround for selected 'select option' not updating translation
*/ */
isVisible = true; isVisible = true;
/**
* current language
*/
language: keyof SCTranslations<SCLanguage>;
/** /**
* The setting to handle * The setting to handle
*/ */
@Input() setting: SCSetting; @Input() setting: SCSetting;
/**
* Translated setting from SCThingTranslator
*/
// tslint:disable-next-line:no-any
translatedSetting: any;
/**
* Core translator
*/
translator: SCThingTranslator;
/** /**
* *
* @param alertCtrl AlertController * @param alertCtrl AlertController
@@ -73,13 +55,8 @@ export class SettingsItemComponent implements OnInit {
constructor(private readonly alertCtrl: AlertController, constructor(private readonly alertCtrl: AlertController,
private readonly translateService: TranslateService, private readonly translateService: TranslateService,
private readonly settingsProvider: SettingsProvider) { private readonly settingsProvider: SettingsProvider) {
this.language = translateService.currentLang as keyof SCTranslations<SCLanguage>; translateService.onLangChange.subscribe((_event: LangChangeEvent) => {
this.translator = new SCThingTranslator(this.language);
translateService.onLangChange.subscribe((event: LangChangeEvent) => {
this.isVisible = false; this.isVisible = false;
this.language = event.lang as keyof SCTranslations<SCLanguage>;
this.translator.language = this.language;
// TODO: Issue #53 check workaround for selected 'select option' not updating translation // TODO: Issue #53 check workaround for selected 'select option' not updating translation
setTimeout(() => this.isVisible = true); setTimeout(() => this.isVisible = true);
}); });
@@ -109,13 +86,6 @@ export class SettingsItemComponent implements OnInit {
await this.presentAlert(title, message); await this.presentAlert(title, message);
} }
/**
* NgInit
*/
ngOnInit(): void {
this.translatedSetting = this.translator.translate(this.setting);
}
/** /**
* Shows alert with given title and message and a 'ok' button * Shows alert with given title and message and a 'ok' button
* *

View File

@@ -1,12 +1,12 @@
<ion-card *ngIf="setting"> <ion-card *ngIf="setting">
<ion-card-header> <ion-card-header *ngIf="{ name: ('name' | thingTranslate: setting | titlecase), desc: ('description' | thingTranslate: setting | titlecase) } let vals">
<span> <ion-card-subtitle>
{{ translatedSetting.name | titlecase }} {{ vals.name }}
<ion-icon *ngIf="compactView" name="information-circle-outline" (click)="presentAlert(translator.translate(setting).name, translator.translate(setting).description)"></ion-icon> <ion-icon *ngIf="compactView" name="information-circle-outline" (click)="presentAlert( vals.name , vals.desc )"></ion-icon>
</span> </ion-card-subtitle>
</ion-card-header> </ion-card-header>
<ion-card-content> <ion-card-content>
<ion-note *ngIf="!compactView">{{ translatedSetting.description }}</ion-note> <ion-note *ngIf="!compactView">{{ 'description' | thingTranslate: setting | titlecase }}</ion-note>
<div [ngSwitch]="setting.inputType" *ngIf="isVisible" > <div [ngSwitch]="setting.inputType" *ngIf="isVisible" >
<ion-item *ngSwitchCase="'number'"> <ion-item *ngSwitchCase="'number'">
@@ -31,7 +31,7 @@
<!-- else show select input --> <!-- else show select input -->
<ion-select *ngIf="typeOf(setting.defaultValue) !== 'boolean'" interface="popover" [(ngModel)]="setting.value" (ionChange)="settingChanged()"> <ion-select *ngIf="typeOf(setting.defaultValue) !== 'boolean'" interface="popover" [(ngModel)]="setting.value" (ionChange)="settingChanged()">
<ion-select-option *ngFor="let val of setting.values, index as i" [value]="val"> <ion-select-option *ngFor="let val of setting.values, index as i" [value]="val">
<div *ngIf="typeOf(val) !== 'number'">{{ translatedSetting.values[i] | titlecase }}</div> <div *ngIf="typeOf(val) !== 'number'">{{ ('values' | thingTranslate: setting)[i] | titlecase }}</div>
<div *ngIf="typeOf(val) === 'number'">{{ val }}</div> <div *ngIf="typeOf(val) === 'number'">{{ val }}</div>
</ion-select-option> </ion-select-option>
</ion-select> </ion-select>
@@ -41,7 +41,7 @@
<ion-label></ion-label> <ion-label></ion-label>
<ion-select [(ngModel)]="setting.value" multiple="true" (ionChange)="settingChanged()"> <ion-select [(ngModel)]="setting.value" multiple="true" (ionChange)="settingChanged()">
<ion-select-option *ngFor="let val of setting.values, index as i" [value]="val"> <ion-select-option *ngFor="let val of setting.values, index as i" [value]="val">
<div *ngIf="typeOf(val) !== 'number'">{{ translatedSetting.values[i] }}</div> <div *ngIf="typeOf(val) !== 'number'">{{ ('values' | thingTranslate: setting)[i] | titlecase }}</div>
<div *ngIf="typeOf(val) === 'number'">{{ val }}</div> <div *ngIf="typeOf(val) === 'number'">{{ val }}</div>
</ion-select-option> </ion-select-option>
</ion-select> </ion-select>

View File

@@ -14,8 +14,8 @@
*/ */
import {ChangeDetectorRef, Component} from '@angular/core'; import {ChangeDetectorRef, Component} from '@angular/core';
import {AlertController, ToastController} from '@ionic/angular'; import {AlertController, ToastController} from '@ionic/angular';
import {LangChangeEvent, TranslateService} from '@ngx-translate/core'; import {TranslateService} from '@ngx-translate/core';
import {SCLanguage, SCSettingMeta, SCThingTranslator, SCTranslations} from '@openstapps/core'; import {SCSettingMeta} from '@openstapps/core';
import {SettingsCache, SettingsProvider} from '../settings.provider'; import {SettingsCache, SettingsProvider} from '../settings.provider';
/** /**
* Settings page component * Settings page component
@@ -29,12 +29,6 @@ export class SettingsPageComponent {
* Order of the categories * Order of the categories
*/ */
categoriesOrder: string[]; categoriesOrder: string[];
/**
* Possible languages to be used for translation
*
* limit to languages that are available in StApps Core
*/
language: keyof SCTranslations<SCLanguage>;
/** /**
* Meta information about settings * Meta information about settings
*/ */
@@ -47,10 +41,6 @@ export class SettingsPageComponent {
* Container to cache settings from provider * Container to cache settings from provider
*/ */
settingsCache: SettingsCache; settingsCache: SettingsCache;
/**
* Core translator
*/
translator: SCThingTranslator;
/** /**
* *
@@ -65,13 +55,6 @@ export class SettingsPageComponent {
private readonly toastController: ToastController, private readonly toastController: ToastController,
private readonly translateService: TranslateService, private readonly translateService: TranslateService,
private readonly changeDetectorRef: ChangeDetectorRef) { private readonly changeDetectorRef: ChangeDetectorRef) {
this.language = translateService.currentLang as keyof SCTranslations<SCLanguage>;
this.translator = new SCThingTranslator(this.language);
translateService.onLangChange.subscribe((event: LangChangeEvent) => {
this.language = event.lang as keyof SCTranslations<SCLanguage>;
this.translator = new SCThingTranslator(this.language);
});
this.settingsCache = {}; this.settingsCache = {};
} }

View File

@@ -12,7 +12,7 @@
<ion-list *ngFor="let categoryKey of categoriesOrder "> <ion-list *ngFor="let categoryKey of categoriesOrder ">
<div *ngIf="objectKeys(settingsCache).includes(categoryKey)"> <div *ngIf="objectKeys(settingsCache).includes(categoryKey)">
<ion-item-divider> <ion-item-divider>
<h5>{{ translator.translate(settingsCache[categoryKey]?.settings[objectKeys(settingsCache[categoryKey]?.settings)[0]]).categories[0] | titlecase}}</h5> <h5>{{ 'categories[0]' | thingTranslate: settingsCache[categoryKey]?.settings[objectKeys(settingsCache[categoryKey]?.settings)[0]] | titlecase }} </h5>
</ion-item-divider> </ion-item-divider>
<stapps-settings-item *ngFor="let settingKeys of objectKeys(settingsCache[categoryKey].settings)" [setting]="settingsCache[categoryKey].settings[settingKeys]"></stapps-settings-item> <stapps-settings-item *ngFor="let settingKeys of objectKeys(settingsCache[categoryKey].settings)" [setting]="settingsCache[categoryKey].settings[settingKeys]"></stapps-settings-item>
</div> </div>

View File

@@ -20,6 +20,7 @@ import {Geolocation} from '@ionic-native/geolocation/ngx';
import {IonicModule} from '@ionic/angular'; import {IonicModule} from '@ionic/angular';
import {TranslateModule} from '@ngx-translate/core'; import {TranslateModule} from '@ngx-translate/core';
import {ThingTranslateModule} from '../../translation/thing-translate.module';
import {ConfigProvider} from '../config/config.provider'; import {ConfigProvider} from '../config/config.provider';
import {SettingsItemComponent} from './item/settings-item.component'; import {SettingsItemComponent} from './item/settings-item.component';
import {SettingsPageComponent} from './page/settings-page.component'; import {SettingsPageComponent} from './page/settings-page.component';
@@ -45,6 +46,7 @@ const settingsRoutes: Routes = [
FormsModule, FormsModule,
IonicModule.forRoot(), IonicModule.forRoot(),
TranslateModule.forChild(), TranslateModule.forChild(),
ThingTranslateModule.forChild(),
RouterModule.forChild(settingsRoutes), RouterModule.forChild(settingsRoutes),
], ],
providers: [ providers: [

View File

@@ -20,6 +20,7 @@ import {ThingPropertyNameTranslatePipe, ThingTranslatePipe} from './thing-transl
import {ThingTranslateService} from './thing-translate.service'; import {ThingTranslateService} from './thing-translate.service';
// tslint:disable: completed-docs
export interface ThingTranslateModuleConfig { export interface ThingTranslateModuleConfig {
parser?: Provider; parser?: Provider;
} }

View File

@@ -16,6 +16,7 @@
import {Injectable, OnDestroy} from '@angular/core'; import {Injectable, OnDestroy} from '@angular/core';
import {LangChangeEvent, TranslateService} from '@ngx-translate/core'; import {LangChangeEvent, TranslateService} from '@ngx-translate/core';
import {SCLanguage, SCThings, SCThingTranslator, SCThingType, SCTranslations} from '@openstapps/core'; import {SCLanguage, SCThings, SCThingTranslator, SCThingType, SCTranslations} from '@openstapps/core';
import moment from 'moment';
import {Subscription} from 'rxjs'; import {Subscription} from 'rxjs';
import {isDefined, ThingTranslateParser} from './thing-translate.parser'; import {isDefined, ThingTranslateParser} from './thing-translate.parser';
@@ -41,10 +42,12 @@ export class ThingTranslateService implements OnDestroy {
public parser: ThingTranslateParser){ public parser: ThingTranslateParser){
this.translator = new SCThingTranslator('de' ?? this.translateService.currentLang as keyof SCTranslations<SCLanguage>); this.translator = new SCThingTranslator('de' ?? this.translateService.currentLang as keyof SCTranslations<SCLanguage>);
moment.updateLocale(this.translator.language);
/** set the default language from configuration */ /** set the default language from configuration */
this.onLangChange = this.translateService.onLangChange.subscribe((event: LangChangeEvent) => { this.onLangChange = this.translateService.onLangChange.subscribe((event: LangChangeEvent) => {
this.translator.language = event.lang as keyof SCTranslations<SCLanguage>; this.translator.language = event.lang as keyof SCTranslations<SCLanguage>;
moment.updateLocale(event.lang);
}); });
} }