Uniapp项目简体中文转台湾繁体中文方法

准备工作

  1. 安装必要工具

    • 确保已安装 Node.js(包含 npm)

    • 在终端输入以下命令验证安装:

      node -v  # 应显示版本号如 v18.x
      npm -v   # 应显示版本号如 9.x
  2. 备份项目


具体操作步骤

1. 安装 OpenCC

  • 打开终端

  • 进入项目根目录

  • 安装 OpenCC(局部安装到项目):

  • npm install opencc-js --save-dev

  操作后验证 

# 检查是否安装成功
 npm list opencc-js

# 运行测试转换
node -e "console.log(require('opencc-js').Converter({from:'cn',to:'tw'})('测试')"
# 应输出:測試

2. 创建配置文件

  • 在项目根目录 新建 s2tw.json 文件

    • 右键项目文件夹 → 新建文件 → 命名 s2tw.json

  • 编辑内容(示例):

    {
      "type": "s2tw",
      "dict": {
        "鼠标": "滑鼠",
        "博客": "部落格",
        "视频": "影片",
        "软件": "軟體"  // OpenCC 默认已转换,此处仅为示例
      }
    }

    3. 创建转换脚本

    • 在项目根目录 新建 convert-chinese.js

    • 粘贴以下代码(注意修改 inputDir 参数):

      const fs = require('fs');
      const path = require('path');
      const OpenCC = require('opencc-js');
      
      // ▶▶▶ 重点修改这里:指定你的源码目录 ◀◀◀
      const CONFIG = {
        inputDir: './src',               // 需要转换的目录(如Uniapp的src文件夹)
        fileTypes: ['.vue', '.js', '.json'],  // 目标文件类型
        openccConfig: path.resolve(__dirname, 's2tw.json') // 配置文件路径
      };
      
      const converter = OpenCC.Converter({ from: 'cn', to: 'tw' }); // 简→台繁
      
      function processFile(filePath) {
        const content = fs.readFileSync(filePath, 'utf8');
        const converted = converter(content);
        
        fs.writeFileSync(filePath, converted, 'utf8');
        console.log(`Converted: ${filePath}`);
      }
      
      function traverseDir(dir) {
        fs.readdirSync(dir).forEach(entry => {
          const entryPath = path.join(dir, entry);
          if (fs.statSync(entryPath).isDirectory()) {
            traverseDir(entryPath);
          } else if (CONFIG.fileTypes.includes(path.extname(entryPath).toLowerCase())) {
            processFile(entryPath);
          }
        });
      }
      
      console.log('⚠️ 开始转换,请确保已备份代码!');
      traverseDir(CONFIG.inputDir);
      console.log('✅ 转换完成!立即通过 git diff 检查变更');

    4. 执行转换

    • 在终端运行脚本(仍在项目根目录):

      node convert-chinese.js
    • 观察输出

      Converted: src/pages/index/index.vue
      Converted: src/App.vue
      ...
      ✅ 转换完成!立即通过 git diff 检查变更

    关键位置示意图

    你的项目根目录/
    ├── src/                 ← 代码目录(由 CONFIG.inputDir 指定)
    ├── node_modules/        ← 自动生成(安装OpenCC后出现)
    ├── s2tw.json            ← 自定义词典
    ├── convert-chinese.js   ← 转换脚本
    └── package.json         ← Node.js项目配置
    

      

    修改转换脚本配置调整转换脚本的 扫描范围 和 文件过滤规则。以下是具体修改方法:

    const fs = require('fs');
    const path = require('path');
    const OpenCC = require('opencc-js');
    
    // ▶▶▶ 重點修改這裡:指定你的源碼目錄 ◀◀◀
    const CONFIG = {
      inputDir: './',               // 需要轉換的目錄(如Uniapp的src文件夾)
      fileTypes: ['.vue', '.js', '.json', '.wxml', '.wxss'],  // 目標文件類型
      excludeDirs: ['node_modules', 'unpackage', 'dist', 'static'], // 排除不需要的目錄
      openccConfig: path.resolve(__dirname, 's2tw.json') // 配置文件路徑
    };
    
    const converter = OpenCC.Converter({ from: 'cn', to: 'tw' }); // 簡→臺繁
    
    
    // 處理特殊文件(如 pages.json)
    // 針對 JSON 文件可能出現的中文鍵名問題,添加 鍵值雙轉換邏輯
    function processFile(filePath) {
      const content = fs.readFileSync(filePath, 'utf8');
      let converted = converter(content);
    
      // 特別處理 JSON 鍵名(如 "navigationBarTitleText": "首頁")
      if (path.extname(filePath) === '.json') {
        try {
          const jsonObj = JSON.parse(converted);
          const convertedObj = deepConvertKeys(jsonObj); // 遞歸轉換鍵名
          converted = JSON.stringify(convertedObj, null, 2);
        } catch (e) {
          console.error(`JSON 解析失敗: ${filePath}`, e);
        }
      }
    
      fs.writeFileSync(filePath, converted, 'utf8');
    }
    
    // 遞歸轉換對象鍵名
    function deepConvertKeys(obj) {
      if (typeof obj !== 'object' || obj === null) return obj;
      
      return Object.keys(obj).reduce((acc, key) => {
        const newKey = converter(key); // 轉換鍵名
        acc[newKey] = deepConvertKeys(obj[key]); // 遞歸處理值
        return acc;
      }, Array.isArray(obj) ? [] : {});
    }
    
    // 增強目錄遍歷邏輯
    // 更新 traverseDir 函數,添加目錄排除邏輯
    function traverseDir(dir) {
      fs.readdirSync(dir).forEach(entry => {
        const entryPath = path.join(dir, entry);
        const isDir = fs.statSync(entryPath).isDirectory();
        
        // 跳過排除目錄
        if (isDir && CONFIG.excludeDirs.includes(entry)) {
          console.log(`跳過目錄: ${entryPath}`);
          return;
        }
    
        if (isDir) {
          traverseDir(entryPath);
        } else {
          const ext = path.extname(entryPath).toLowerCase();
          if (CONFIG.fileTypes.includes(ext)) {
            processFile(entryPath);
          }
        }
      });
    }
    
    console.log('⚠️ 開始轉換,請確保已備份代碼!');
    traverseDir(CONFIG.inputDir);
    console.log('✅ 轉換完成!立即通過 git diff 檢查變更');
    

      

     
posted @ 2025-04-18 10:01  空杯_Annora  阅读(139)  评论(0)    收藏  举报