UNPKG

@c-sheep/i18n-extract-cli

Version:

这是一款能够自动将代码里的中文转成i18n国际化标记的命令行工具。当然,你也可以用它实现将中文语言包自动翻译成其他语言。适用于vue2、vue3和react

147 lines (146 loc) 6.25 kB
"use strict"; 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;