OpenSlides/client/src/app/core/translate/translation-parser.ts
2019-07-30 09:53:14 +02:00

70 lines
2.2 KiB
TypeScript

import { Injectable } from '@angular/core';
import { TranslateDefaultParser, TranslateStore } from '@ngx-translate/core';
import { ConfigService } from '../ui-services/config.service';
export interface CustomTranslation {
original: string;
translation: string;
}
export type CustomTranslations = CustomTranslation[];
/**
* Custom translate parser. Intercepts and use custom translations from the configservice.
*/
@Injectable()
export class OpenSlidesTranslateParser extends TranslateDefaultParser {
/**
* Saves the custom translations retrieved from the config service
*/
private customTranslations: CustomTranslations = [];
/**
* Subscribes to the config services and watches for updated custom translations.
*
* @param config
* @param translateStore
*/
public constructor(config: ConfigService, private translateStore: TranslateStore) {
super();
config.get<CustomTranslations>('translations').subscribe(ct => {
if (!ct) {
ct = [];
}
this.customTranslations = ct;
// trigger reload of all languages. This does not hurt performance,
// in fact the directives and pipes just listen to the selected language.
this.translateStore.langs.forEach(lang => {
this.translateStore.onTranslationChange.emit({
lang: lang,
translations: this.translateStore.translations[lang]
});
});
});
}
/**
* Here, we actually intercept getting translations. This method is called from the
* TranslateService trying to retrieve a translation to the key.
*
* Here, the translation is searched and then overwritten by our custom translations, if
* the value exist.
*
* @param target The translation dict
* @param key The key to find the translation
*/
public getValue(target: any, key: string): any {
const translation = super.getValue(target, key);
const customTranslation = this.customTranslations.find(c => c.original === translation);
if (customTranslation) {
return customTranslation.translation;
} else {
return translation;
}
}
}