UNPKG

@vendure/ngx-translate-extract

Version:

Extract strings from projects using ngx-translate

56 lines (55 loc) 2.02 kB
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); } }