UNPKG

@c-sheep/i18n-extract-cli

Version:

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

107 lines (104 loc) 4.61 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.handleAfterNameRegex = exports.deleteEmptyFileAndFolder = exports.genreExcelByData = exports.genreExcelDataByArray = exports.mergeObject = exports.genreLocalExportJs = void 0; const fs_extra_1 = __importDefault(require("fs-extra")); const cloneDeep_1 = __importDefault(require("lodash/cloneDeep")); const lodash_1 = require("lodash"); const flatObjectDeep_1 = require("./flatObjectDeep"); const getAbsolutePath_1 = require("../shared/getAbsolutePath"); const excelUtil_1 = require("../shared/excelUtil"); const regex = new RegExp(`([A-Za-z-]+.xlsx)`, "g"); const genreLocalExportJs = (localePath, language) => { const template = `const data = import.meta.glob('./${language}/**/*.json', { eager: true }); const genreLanguageJson = module => { const mapData = {}; for (const i in module) { const [, key] = i.match(/\\.\\/${language}\\/(.*?)\\.json/) || []; const keysArr = key.split('/'); const resultData = module[i].default; keysArr.reduce((data, item, index) => { if (index === keysArr.length - 1) { data[item] = resultData; } else { data = data[item] = {}; } return data; }, mapData); } return mapData; }; export default genreLanguageJson(data);`; fs_extra_1.default.writeFile([localePath, `${language}.js`].join("/"), template, (e) => { }); }; exports.genreLocalExportJs = genreLocalExportJs; const mergeObject = (a, b) => { const deepA = (0, cloneDeep_1.default)(a); const deepB = (0, cloneDeep_1.default)(b); return (0, lodash_1.mergeWith)(deepA, deepB, (a, b) => { if (typeof a === "object" && typeof b === "object") { return (0, exports.mergeObject)(a, b); } return a || b; }); }; exports.mergeObject = mergeObject; const genreExcelDataByArray = (arrData, baseLanguage) => { const result = []; const headerLang = [...arrData.map((i) => i.lang)]; const defaultLangData = (0, flatObjectDeep_1.flatObjectDeep)(baseLanguage); const headers = ["字典 key", ...headerLang]; const getFindIndex = (lang) => { return headerLang .map((item, index) => (item === lang ? index + 1 : 0)) .filter((i) => i); }; // 获取默认语言的所有的key 比如说zh-cn里面所有的key const objKeys = Object.keys(defaultLangData).filter((i) => i.trim()); objKeys.forEach((item, index) => { result[index] = result[index] || []; result[index][0] = item; }); // console.log(objKeys, defaultLang, lang, "objKeys"); arrData.forEach(({ lang, data }) => { const objData = (0, flatObjectDeep_1.flatObjectDeep)(data); // const objKeys = Object.keys(objData).filter((i) => i.trim()); // console.log(objKeys, defaultLang, lang, "objKeys"); // 拿这个语言 在哪几列 const indexs = getFindIndex(lang); objKeys.forEach((langKey, index) => { // key 对应的语言的数据 “common.确认”: 确认 const langValue = objData[langKey]; // result[index] = result[index] || []; if (result[index]) { indexs.forEach((inerIndex) => { result[index][inerIndex] = langValue || ""; }); } }); }); return { headers, data: result }; }; exports.genreExcelDataByArray = genreExcelDataByArray; const genreExcelByData = ({ headers, data, excelPath, excelName, sheetName, }) => { const excelBuffer = (0, excelUtil_1.buildExcel)(headers, data, (sheetName || "").slice(0, 25)); const excelFilePath = (0, getAbsolutePath_1.getAbsolutePath)(process.cwd(), excelPath); const absPath = excelFilePath.replace(regex, "").replace(/\/$/, ""); if (!fs_extra_1.default.existsSync(absPath)) { fs_extra_1.default.mkdirSync(absPath, { recursive: true }); } fs_extra_1.default.writeFileSync(absPath + "/" + excelName, excelBuffer, "utf8"); console.log(`已生成 ${absPath + "/" + excelName}`); }; exports.genreExcelByData = genreExcelByData; const deleteEmptyFileAndFolder = (filePath) => { fs_extra_1.default.unlinkSync(filePath); }; exports.deleteEmptyFileAndFolder = deleteEmptyFileAndFolder; const handleAfterNameRegex = (str) => { const resultStr = typeof str === "string" ? str : ""; return resultStr.replace(/,/g, "|"); }; exports.handleAfterNameRegex = handleAfterNameRegex;