UNPKG

@awesome-fe/translate

Version:
91 lines 3.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.JsonTranslator = void 0; const abstract_translator_1 = require("./abstract-translator"); const common_1 = require("../dom/common"); const markdown_translator_1 = require("./markdown-translator"); class JsonTranslator extends abstract_translator_1.AbstractTranslator { markdownTranslator = new markdown_translator_1.MarkdownTranslator(this.engine); parse(text) { return JSON.parse(text); } serialize(doc) { removeUntranslatedCnProperties(doc); return JSON.stringify(doc, null, 2); } translateDoc(doc, options) { const result = createTranslationWithOrderedProperties(doc); for (let key in doc) { if (!key.endsWith('Cn') && doc.hasOwnProperty(key)) { const original = doc[key]; const currentTranslation = doc[`${key}Cn`]; if (currentTranslation) { // 以前版本的翻译中只有单行的才是对照格式,多行的无法复用,需要重新翻译 if (!currentTranslation.includes('\n\n')) { this.engine.translate(original, currentTranslation, 'plain').then(); } else { this.markdownTranslator.translateContentAndFlush(currentTranslation, options).then(); } continue; } if (Array.isArray(original)) { result[key] = original.map(it => { if (Array.isArray(it) || it instanceof Object) { return this.translateDoc(it, options); } else { return it; } }); } else if (original instanceof Object) { result[key] = this.translateDoc(original, options); } else { result[key] = original; if (options.jsonProperties?.includes(key) && typeof original === 'string' && !(0, common_1.containsChinese)(original)) { this.markdownTranslator.translateContentAndFlush(original, options) .then((it) => it.trim()) .then((translation) => { if (translation && original !== translation && (0, common_1.containsChinese)(translation)) { result[`${key}Cn`] = translation; } }); } } } } return result; } } exports.JsonTranslator = JsonTranslator; function createTranslationWithOrderedProperties(original) { const translation = {}; const descriptors = Object.getOwnPropertyDescriptors(original); const resultDescriptors = {}; Object.entries(descriptors).forEach(([key, descriptor]) => { if (typeof original[key] === 'string' && !key.endsWith('Cn') && !descriptors[`${key}Cn`]) { resultDescriptors[`${key}Cn`] = descriptor; } resultDescriptors[key] = descriptor; }); Object.defineProperties(translation, resultDescriptors); return translation; } function removeUntranslatedCnProperties(doc) { if (Array.isArray(doc)) { doc.forEach((it) => removeUntranslatedCnProperties(it)); } else if (doc instanceof Object) { Object.keys(doc).forEach((key) => { if (!key.endsWith('Cn') && doc[key] === doc[`${key}Cn`]) { delete doc[`${key}Cn`]; } if (doc[key] instanceof Object) { removeUntranslatedCnProperties(doc[key]); } }); } } //# sourceMappingURL=json-translator.js.map