101 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| const fs = require('fs')
 | |
| const path = require('path')
 | |
| const { glob } = require('glob')
 | |
| 
 | |
| // 读取中文语言包
 | |
| const zhCN = require('../i8n.js')
 | |
| 
 | |
| // 递归获取所有需要处理的文件
 | |
| async function getAllFiles(dir, patterns) {
 | |
|   console.log('搜索目录:', dir)
 | |
|   console.log('搜索模式:', patterns)
 | |
|   const files = await glob(patterns, {
 | |
|     cwd: dir,
 | |
|     ignore: ['node_modules/**', 'dist/**', '**/i18n/**', '**/languages/**']
 | |
|   })
 | |
|   console.log('找到的文件数量:', files.length)
 | |
|   return files
 | |
| }
 | |
| 
 | |
| // 获取嵌套对象的值
 | |
| function getNestedValue(obj, path) {
 | |
|   return path.split('.').reduce((current, key) => {
 | |
|     return current && current[key]
 | |
|   }, obj)
 | |
| }
 | |
| 
 | |
| // 替换文件内容
 | |
| function replaceContent(content) {
 | |
|   // 替换模板中的 $t('key')
 | |
|   content = content.replace(
 | |
|     /(?<!this\.|that\.)\$t\(['"`]([^'"`]+)['"`](?:,.*?)?\)/g,
 | |
|     (match, key) => {
 | |
|       const value = getNestedValue(zhCN, key)
 | |
|       return value ? `'${value}'` : match
 | |
|     }
 | |
|   )
 | |
| 
 | |
|   // 替换 JavaScript 中的 this.$t('key')
 | |
|   content = content.replace(/this\.\$t\(['"`]([^'"`]+)['"`](?:,.*?)?\)/g, (match, key) => {
 | |
|     const value = getNestedValue(zhCN, key)
 | |
|     return value ? `'${value}'` : match
 | |
|   })
 | |
| 
 | |
|   // 替换模板字符串中的 this.$t, 例如 `${this.$t('key')}`
 | |
|   content = content.replace(/`\$\{this\.\$t\(['"`]([^'"`]+)['"`](?:,.*?)?\)\}([^`]*)`/g, (match, key, suffix) => {
 | |
|     const value = getNestedValue(zhCN, key)
 | |
|     if (value) {
 | |
|       // 将最终的字符串用单引号包裹
 | |
|       return `'${value}${suffix}'`
 | |
|     }
 | |
|     return match
 | |
|   })
 | |
| 
 | |
|   return content
 | |
| }
 | |
| 
 | |
| // 主函数
 | |
| async function main() {
 | |
|   try {
 | |
|     const srcPath = path.resolve(__dirname, '../src')
 | |
|     console.log('源文件目录:', srcPath)
 | |
| 
 | |
|     // 只处理 views 和 components 目录
 | |
|     const patterns = [
 | |
|       'views/**/*.vue',
 | |
|       'views/**/*.js',
 | |
|       'views/**/*.ts',
 | |
|       'router/**/*.js',
 | |
|       'components/**/*.vue',
 | |
|       'components/**/*.js',
 | |
|       'components/**/*.ts'
 | |
|     ]
 | |
| 
 | |
|     const files = await getAllFiles(srcPath, patterns)
 | |
| 
 | |
|     if (files.length === 0) {
 | |
|       console.log('警告:没有找到匹配的文件!')
 | |
|       return
 | |
|     }
 | |
| 
 | |
|     for (const file of files) {
 | |
|       const filePath = path.resolve(srcPath, file)
 | |
|       console.log('处理文件:', filePath)
 | |
| 
 | |
|       const content = fs.readFileSync(filePath, 'utf8')
 | |
|       const newContent = replaceContent(content)
 | |
| 
 | |
|       if (newContent !== content) {
 | |
|         fs.writeFileSync(filePath, newContent, 'utf8')
 | |
|         console.log(`已处理文件: ${file}`)
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     console.log('所有文件处理完成!')
 | |
|   } catch (error) {
 | |
|     console.error('处理过程中出错:', error)
 | |
|   }
 | |
| }
 | |
| 
 | |
| main()
 |