@c-sheep/i18n-extract-cli
Version:
这是一款能够自动将代码里的中文转成i18n国际化标记的命令行工具。当然,你也可以用它实现将中文语言包自动翻译成其他语言。适用于vue2、vue3和react
85 lines (84 loc) • 3.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.translateJson = void 0;
const cli_progress_1 = require("cli-progress");
const translateAction_1 = require("../translate/translateAction");
const getAbsolutePath_1 = require("../shared/getAbsolutePath");
const util_1 = require("../shared/util");
const translateMoreLanguage_1 = require("../translate/translateMoreLanguage");
const file_1 = require("../shared/file");
const translateLanguageByObj = async (translate, obj, lang, bar) => {
const newObj = {};
for (const i in obj) {
const module = obj[i];
newObj[i] = (newObj[i] || {});
const strArr = Object.values(module);
const keyArr = Object.keys(module);
const result = await translate.translateWithTencent(strArr, lang);
keyArr.forEach((item, index) => {
newObj[i][item] = result[strArr[index]];
});
bar === null || bar === void 0 ? void 0 : bar.increment();
}
//
return newObj;
};
/**
* @description 对比别的语言已经有翻译的 不用走机翻
* @TODU有个优化点_当已经机翻的不用走了_这个后面优化
*/
function getEmptyJsonData(localePath, item, baseLanguageMap) {
var _a;
const compareData = (0, translateMoreLanguage_1.getBaseLanguageMap)(localePath, item);
const emptyData = {};
for (const i in baseLanguageMap) {
// // if (!compareData[i]) {
const compareModuleData = (compareData[i] ||
{});
const moduleData = (baseLanguageMap[i] || {});
emptyData[i] = {};
for (const j in moduleData) {
if (!compareModuleData[j]) {
emptyData[i][j] =
((_a = baseLanguageMap[i]) === null || _a === void 0 ? void 0 : _a[j]) || "";
}
}
if (!Object.keys(emptyData[i]).length) {
delete emptyData[i];
}
}
return emptyData;
}
function translateJson(i18nConfig) {
const { localePath, locales, secretKey, translateJsonPath, secretId, defaultKey, formatModuleName } = i18nConfig;
const moduleNameRegex = formatModuleName ? new RegExp(formatModuleName) : /./;
const baseLanguageMap = (0, translateMoreLanguage_1.getBaseLanguageMap)(localePath, defaultKey || "zh-cn", moduleNameRegex);
const multiBar = new cli_progress_1.MultiBar({
clearOnComplete: false,
hideCursor: true,
format: "{filename} | {bar} | {percentage}% {eta}s"
}, cli_progress_1.Presets.shades_grey);
const translate = new translateAction_1.TranslateAction("tenxun", {
secretKey,
secretId
});
let count = 0;
locales.forEach(async (item) => {
const langPath = (0, getAbsolutePath_1.getAbsolutePath)(translateJsonPath, item);
(0, file_1.createFlooder)(langPath);
const emptyData = getEmptyJsonData(localePath, item, baseLanguageMap);
const bar = multiBar.create(Object.keys(emptyData).length, 0, {
filename: item
});
const mergeMapData = await translateLanguageByObj(translate, emptyData, item, bar);
// const mergeMapData = mergeObject(compareData, languageMapData);
(0, translateMoreLanguage_1.setLanguageModuleSave)(mergeMapData, langPath);
(0, util_1.genreLocalExportJs)(translateJsonPath, item);
bar.stop();
count++;
if (count >= locales.length) {
multiBar.stop();
}
});
}
exports.translateJson = translateJson;