angular-t9n
Version:
A translation tool for Angular i18n
53 lines (47 loc) • 1.81 kB
text/typescript
import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs';
import { map, switchMap } from 'rxjs/operators';
import { TranslationTargetUnitResponse } from '../../../models';
import { TranslationTargetService } from './translation-target.service';
()
export class ExportService {
constructor(private _translationTargetService: TranslationTargetService) {}
export(config: { state: string }): Observable<void> {
return this._translationTargetService.target.pipe(
switchMap((t) =>
this._fetchUnits().pipe(
map((entries) =>
entries.map(({ id, description, meaning, source, target }) => ({
Id: id,
Description: description,
Meaning: meaning,
Source: source,
Target: target,
})),
),
switchMap(async (entries) => {
const { utils, writeFile } = await import('xlsx');
const header = ['Id', 'Description', 'Meaning', 'Source', 'Target'];
const sheet = utils.json_to_sheet(entries, { header });
const workbook = utils.book_new();
utils.book_append_sheet(workbook, sheet, t.language);
writeFile(workbook, `t9n-${t.language}-${config.state || 'all'}.xlsx`);
}),
),
),
);
}
private _fetchUnits(page = 0): Observable<TranslationTargetUnitResponse[]> {
return this._translationTargetService
.units({ page, entriesPerPage: 250 })
.pipe(
switchMap((pageResponse) =>
pageResponse._links!.next
? this._fetchUnits(++page).pipe(
map((entries) => pageResponse._embedded.entries.concat(entries)),
)
: of(pageResponse._embedded.entries),
),
);
}
}