angular-t9n
Version:
A translation tool for Angular i18n
76 lines (62 loc) • 2.18 kB
text/typescript
import { Injectable } from '@nestjs/common';
import { debounceTime } from 'rxjs/operators';
import { TranslationSource, TranslationTarget, TranslationTargetUnit } from '../models';
import { PersistenceStrategy } from './persistence-strategy';
()
export class TranslationTargetRegistry {
private readonly _targets: Map<string, TranslationTarget> = new Map();
constructor(
private readonly _source: TranslationSource,
private readonly _persistenceStrategy: PersistenceStrategy,
) {}
register(language: string, units: Map<string, TranslationTargetUnit>, baseHref?: string) {
const target = new TranslationTarget(this._source, language, units);
if (baseHref) {
target.baseHref = baseHref;
}
target.changed
.pipe(debounceTime(300))
.subscribe(() => this._persistenceStrategy.update(target));
this._synchronizeSources(target);
this._targets.set(language, target);
return target;
}
async create(language: string, baseHref?: string) {
const target = this.register(language, new Map<string, TranslationTargetUnit>(), baseHref);
await this._persistenceStrategy.create(target);
return target;
}
get(key: string): TranslationTarget | undefined {
return this._targets.get(key);
}
has(key: string): boolean {
return this._targets.has(key);
}
keys(): string[] {
return Array.from(this._targets.keys());
}
values(): TranslationTarget[] {
return Array.from(this._targets.values());
}
private _synchronizeSources(target: TranslationTarget) {
let changeRequired = false;
for (const unit of target.units) {
const sourceUnit = target.source.unitMap.get(unit.id)!;
if (unit.source !== sourceUnit.source) {
if (
this._normalizeWhitespace(unit.source) !== this._normalizeWhitespace(sourceUnit.source)
) {
unit.state = 'initial';
}
unit.source = sourceUnit.source;
changeRequired = true;
}
}
if (changeRequired) {
this._persistenceStrategy.update(target);
}
}
private _normalizeWhitespace(value: string) {
return value.replace(/\s+/g, ' ').trim();
}
}