把项目中的中英文翻译导出为excel中英文对照表格

把项目中利用i18n做的多语言翻译,导出到一个excel表格中

import zh from './zh.js'; // 中文翻译文件
import en from './en.js'; // 英文翻译文件
import XLSX from "xlsx";

// 递归收集所有键值对(保留所有键名,不合并嵌套键)
function collectAllKeyValues(obj, path = [], result = []) {
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      const currentPath = [...path, key];
      const value = obj[key];

      if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
        // 递归处理嵌套对象
        collectAllKeyValues(value, currentPath, result);
      } else {
        // 添加键值对(保留完整路径但不合并)
        result.push({
          key: key,
          value: value === null ? 'null' : String(value),
          originalPath: [...currentPath]
        });
      }
    }
  }
  return result;
}

// 收集中文和英文的所有键值对
const zhKeyValues = collectAllKeyValues(zh);
const enKeyValues = collectAllKeyValues(en);

// 合并中英文翻译
const mergedData = [];
for (const zhItem of zhKeyValues) {
  // 找到对应的英文翻译
  const enItem = enKeyValues.find(
    en => en.originalPath.join('.') === zhItem.originalPath.join('.')
  );

  // 构造最终的数据行
  mergedData.push([
    // zhItem.originalPath.join('.'), // 路径
    zhItem.originalPath[0], // 路径
    zhItem.key, // 键值
    enItem ? enItem.value : '', // 英文
    zhItem.value // 中文
  ]);
}

// 准备 Excel 数据
const excelData = [
  ['路径', '键值', '英文', '中文'], // 表头
  ...mergedData // 数据行
];

// 创建工作簿和工作表
const wb = XLSX.utils.book_new();
const ws = XLSX.utils.aoa_to_sheet(excelData);

// 调整列宽
ws['!cols'] = [
  { wch: 30 }, // 路径列
  { wch: 20 }, // 键值列
  { wch: 50 }, // 英文列
  { wch: 50 } // 中文列
];

// 添加工作表并写入文件
XLSX.utils.book_append_sheet(wb, ws, '翻译数据');
XLSX.writeFile(wb, 'translations.xlsx');

console.log('Excel文件已生成: translations.xlsx');
posted @ 2025-04-09 17:42  cola-tian  阅读(85)  评论(0)    收藏  举报