flutter多语言l10n之表格数据自动转换arb文件格式

393 阅读1分钟

前提

  • 要将翻译好的数据,一个个手动cv成"key":"value",当数据量大的时候,手动就十分鸡肋了。

方法

用js写了个自动转换的脚本,输出txt,手动一键copy到arb即可,具体如下:

const fs = require('fs');
const XLSX = require('xlsx');

//读取xls数据
function extractExcelData(file_path,dataRow) {
  const workbook = XLSX.readFile(file_path);
  
  ///默认取第一个sheet表
  const worksheet = workbook.Sheets[workbook.SheetNames[0]];

  const data = {};
  
 //worksheet['!ref']` 是一个特殊的键,用于访问工作表的数据范围。
 //数据范围表示工作表中包含数据的单元格范围。
 //XLSX.utils.decode_range 方法将数据范围解码为包含起始行号、起始列号、结束行号和结束列号的对象。
//该范围对象可以帮助我们遍历工作表的特定范围。
//在代码中,我们将解码后的范围对象存储在 `range` 变量中,以便后续使用。
//`range.s` 表示起始单元格,`range.e` 表示结束单元格。
//我们可以使用它们的行号和列号来遍历工作表的每个单元格。

//通过解码范围,我们可以确定需要遍历的工作表数据的范围,从而提取出每行的键值对。

  const range = XLSX.utils.decode_range(worksheet['!ref']);

  for (let row = range.s.r; row <= range.e.r; row++) {
    const cellKey = worksheet[XLSX.utils.encode_cell({ r: row, c: 0 })];
    const cellValue = worksheet[XLSX.utils.encode_cell({ r: row, c: dataRow })];

    if (cellKey && cellValue) {
      const key = cellKey.v.toString().trim();
      const value = cellValue.v.toString().trim();
      data[key] = value;
    }
  }

  return data;
}

//转换格式输出txt
function writeKeyValuePairsToFile(file_path, data) {
  let content = '';
  for (const [key, value] of Object.entries(data)) {
    content += `"${key}":"${value}",\n`;
  }

  fs.writeFileSync(file_path, content);
  console.log(`Key-value pairs are written to ${file_path}`);
}

///表格数据路径
const file_path = './1.xls';
const hk_table_data = extractExcelData(file_path,1);

writeKeyValuePairsToFile('./generate/hk.txt', hk_table_data);