@c-sheep/i18n-extract-cli
Version:
这是一款能够自动将代码里的中文转成i18n国际化标记的命令行工具。当然,你也可以用它实现将中文语言包自动翻译成其他语言。适用于vue2、vue3和react
107 lines (104 loc) • 4.61 kB
JavaScript
;
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;