@c-sheep/i18n-extract-cli
Version:
这是一款能够自动将代码里的中文转成i18n国际化标记的命令行工具。当然,你也可以用它实现将中文语言包自动翻译成其他语言。适用于vue2、vue3和react
147 lines (146 loc) • 6.25 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.translateLaguage = exports.setLanguageModuleSave = exports.getBaseLanguageMap = exports.getPathFullFile = void 0;
const glob_1 = __importDefault(require("glob"));
const comblie_1 = require("../shared/comblie");
const getAbsolutePath_1 = require("../shared/getAbsolutePath");
const getLang_1 = __importStar(require("../shared/getLang"));
const translateAction_1 = require("./translateAction");
const util_1 = require("../shared/util");
const cli_progress_1 = require("cli-progress");
const getPathFullFile = (filePath) => {
// 兼容window
filePath = filePath.replace(/\\/g, "/");
const result = glob_1.default.sync(`${filePath}/**/*.{cjs,mjs,js,ts,tsx,jsx,vue,json}`, {
ignore: []
});
return result;
};
exports.getPathFullFile = getPathFullFile;
const getBaseLanguageMap = (localePath, language, regexp) => {
regexp = regexp || /./;
const baseFullPath = (0, getAbsolutePath_1.getAbsolutePath)(localePath, language);
const regex = new RegExp(`.*?\\/${language}\\/(.*?)\\..*?`);
const sourceFilePaths = (0, exports.getPathFullFile)(baseFullPath); // [localePath, language].join("/"));
const fullMap = {};
sourceFilePaths.forEach((sourceFilePath) => {
var _a;
if (regexp.test(sourceFilePath)) {
const sourceObj = (0, getLang_1.default)(sourceFilePath);
const lang = (_a = sourceFilePath.match(regex)) === null || _a === void 0 ? void 0 : _a[1];
const langKey = lang.replace(/\//, ".");
// Object.keys(sourceObj).forEach((key) => {
// const fullKey = [langKey, key].join(".");
fullMap[langKey] = sourceObj;
}
// });
});
// console.log(fullMap, 'fullMap')
return fullMap;
};
exports.getBaseLanguageMap = getBaseLanguageMap;
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;
};
const setLanguageModuleSave = (languageMapData, langPath, emptyRemove = false) => {
const filesPath = Object.keys(languageMapData);
filesPath.forEach((filePath) => {
const fileLangPath = [langPath, filePath + ".json"].join("/");
const langData = languageMapData[filePath] || {};
(0, getLang_1.saveLocale)(fileLangPath, langData);
if (emptyRemove && !Object.keys(langData).length) {
(0, comblie_1.deleteFolderRecursive)(fileLangPath);
}
});
};
exports.setLanguageModuleSave = setLanguageModuleSave;
const compareNotTranslateLanguage = (source, baseZh) => {
const result = {};
for (const i in baseZh) {
const val = baseZh[i];
const sourceVal = source[i];
if (typeof val !== "object") {
if (!source[i]) {
result[i] = baseZh[i];
}
}
else {
const s = (typeof sourceVal !== "object" ? {} : source[i]);
result[i] = compareNotTranslateLanguage(s, val);
}
}
return result;
};
const translateLaguage = (options) => {
const i18nConfig = (0, comblie_1.getI18nConfig)(options);
const { localePath, locales, secretKey, secretId, defaultKey } = i18nConfig;
const baseLanguageMap = (0, exports.getBaseLanguageMap)(localePath, defaultKey || "zh-cn");
// console.log(secretKey, secretId, "secretKey, secretId");
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 bar = multiBar.create(Object.keys(baseLanguageMap).length, 0, {
filename: item
});
const langPath = (0, getAbsolutePath_1.getAbsolutePath)(localePath, item);
const compareData = (0, exports.getBaseLanguageMap)(localePath, item);
// const translateMap = compareNotTranslateLanguage(compareData, baseLanguageMap)
const languageMapData = await translateLanguageByObj(translate, baseLanguageMap, item, bar);
const mergeMapData = (0, util_1.mergeObject)(compareData, languageMapData);
(0, exports.setLanguageModuleSave)(mergeMapData, langPath);
(0, util_1.genreLocalExportJs)(localePath, item);
bar.stop();
count++;
if (count >= locales.length) {
multiBar.stop();
}
});
};
exports.translateLaguage = translateLaguage;