const fs = require('fs'); const path = require('path'); // 配置 const projectDir = './pages'; // 你的 UniApp 项目路径 const langFilePath = './output3.json'; // 本地语言文件路径 const ignoredFiles = ['node_modules', 'locale']; // 忽略的文件夹或文件 // 加载语言文件 let langData = {}; if (fs.existsSync(langFilePath)) { const langFileContent = fs.readFileSync(langFilePath, 'utf-8'); langData = JSON.parse(langFileContent); } // 正则表达式:匹配汉字 const chineseRegex = /[\u4e00-\u9fa5\u3000-\u303f\uff01-\uff5e\u201c-\u201d\u3008-\u3011]+/g; // 处理单个文件 function processFile(filePath) { let content = fs.readFileSync(filePath, 'utf-8'); // 匹配 <template> 和 <script> 标签中的内容 const templateRegex = /<template[^>]*>([\s\S]*?)<\/template>/gi; const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; // 替换 <template> 中的内容 content = content.replace(templateRegex, (match, templateContent) => { return match.replace(chineseRegex, (text) => { // 跳过已有的 $t() if (templateContent.includes(`$t('${langData[text]}')`) || templateContent.includes(`$t("${langData[text]}")`)) { return text; // 不替换 } return replaceText(text, '{{ $t(\'$1\') }}'); }); }); // 替换 <script> 中的内容 content = content.replace(scriptRegex, (match, scriptContent) => { return match.replace(/(['"])([\u4e00-\u9fa5\u3000-\u303f\uff01-\uff5e\u201c-\u201d\u3008-\u3011]+)\1/g, (_, quote, text) => { // 跳过已有的 $t() if (scriptContent.includes(`this.$t('${langData[text]}')`) || scriptContent.includes(`this.$t("${langData[text]}")`)) { return `${quote}${text}${quote}`; // 不替换 } return replaceText(text, 'this.$t(\'$1\')'); }); }); // 写回文件 fs.writeFileSync(filePath, content, 'utf-8'); } // 替换逻辑 function replaceText(text, replacementPattern) { // 如果语言文件中不存在该汉字,则生成一个唯一的 key if (!langData[text]) { const key = `text_${Object.keys(langData).length + 1}`; langData[text] = key; } // 替换为指定的模式 const key = langData[text]; return replacementPattern.replace('$1', text); } // 遍历目录 function traverseDirectory(dir) { const files = fs.readdirSync(dir); files.forEach((file) => { const fullPath = path.join(dir, file); const stats = fs.statSync(fullPath); if (stats.isDirectory()) { // 忽略指定的文件夹 if (!ignoredFiles.includes(file)) { traverseDirectory(fullPath); } } else if (stats.isFile()) { // 只处理 .vue 和 .js 文件 if (/\.(vue|js)$/.test(file)) { processFile(fullPath); } } }); } // 主函数 function main() { console.log('开始转换汉字为国际化格式...'); // 遍历项目目录 traverseDirectory(projectDir); // 更新语言文件 fs.writeFileSync(langFilePath, JSON.stringify(langData, null, 2), 'utf-8'); console.log(`语言文件已更新:${langFilePath}`); console.log('转换完成!'); } main();