@vendure/ngx-translate-extract
Version:
Extract strings from projects using ngx-translate
56 lines (55 loc) • 2.02 kB
JavaScript
import { po } from 'gettext-parser';
import { TranslationCollection } from '../utils/translation.collection.js';
const GETTEXT_HEADER_ENTRY_MSGID = '';
export class PoCompiler {
extension = 'po';
domain = '';
includeSources = true;
constructor(options) {
this.includeSources = options?.poSourceLocation ?? true;
}
compile(collection) {
const translations = Object.create(null);
for (const [key, entry] of Object.entries(collection.values)) {
const translation = {
msgid: key,
msgstr: entry.value !== null ? [entry.value] : [''],
};
if (this.includeSources) {
translation.comments = { reference: entry.sourceFiles.join('\n') };
}
translations[key] = translation;
}
const data = {
charset: 'utf-8',
headers: {
'mime-version': '1.0',
'content-type': 'text/plain; charset=utf-8',
'content-transfer-encoding': '8bit',
},
translations: {
[this.domain]: translations,
},
};
return po.compile(data, {}).toString('utf8');
}
parse(contents) {
const parsedPo = po.parse(contents, { defaultCharset: 'utf8' });
const poTranslations = parsedPo.translations?.[this.domain];
if (!poTranslations) {
return new TranslationCollection();
}
const translationEntries = Object.entries(poTranslations);
const convertedTranslations = {};
for (const [msgid, message] of translationEntries) {
if (msgid === GETTEXT_HEADER_ENTRY_MSGID) {
continue;
}
convertedTranslations[msgid] = {
value: message.msgstr.at(-1) ?? '',
sourceFiles: message.comments?.reference?.split('\n') || [],
};
}
return new TranslationCollection(convertedTranslations);
}
}