likes
comments
collection
share

自动化i18n的初始

作者站长头像
站长
· 阅读数 16

项目需要中英文。但是前期缺少必要的基建,没有i18n自动化生成的工具。都是开发在遇到的时候自己去谷歌翻译。精不精准不保证,但是保证能够实现中英切换的功能。

直到有一天,产品拿着一份xlsx的表格告诉我,这是整个团队专业的翻译,需要我把全局的英文都给替换了。

自动化i18n的初始

经过三年的开发,现在的中英文词条已经有3000多条了。而且xlsx表格什么的词条不仅仅包含我们的项目,也就意味着,我还需要一个个对照。从中找到我们项目的词条。如下图这样的表格。

自动化i18n的初始

手动来修改是不可能的。只能分析一下我们如何使用node实现将xlsx表格自动转化出对象,并写入js的更功能。

问题很明确。

我们需要:

  1. 解析exel表格
  2. 将解析的结果转化成我们认识的数据格式,然后和现有的i18n文件进行对比
  3. 将对比之后的结果写入js文件当中

解析xlsx文件我们需要使用到node-xlse包。 它解析出来文件如下图,是一个数组。

自动化i18n的初始

其中的name是当前表格的名字,这个是我们不需要的。我们仅仅需要的是第一个对象中的data数组。

所以当前就有如下代码:

const xlsx = require('node-xlsx').default
const content = xlsx.parse('./xlsxToJs.xlsx')


const targetContent = new Map()

try {
  content[0].data.forEach(item => {
    targetContent.set(item[0], item[1])
  })
} catch(e) {
  console.log(e)
}

拿到了解析的数据,我们就可以将其写入到JS中了。当我们想要对读入的文件做任何的比较时候,该循环中进行比较就可以。

写入文件,我们需要使用到fs库,它接受一个字符串。就有了如下代码:

const fs = require('fs')
const data = 'let data = ' + JSON.stringify(Object.fromEntries(targetContent.entries()))
fs.writeFile('xlsx.js', data, (err) => {
  if (err) {
    throw err
  }

  console.log("JSON data is saved.")
})

输出的xlsx.js内容如下:

let data = {
  "键名": "键值",
  "登陆":"loginIn",
  "退出": "exit",
  "安全": "safe",
  "你们什么意思": "what is nam"
}

这个就是我们要使用到的对象。代码很简单,我也没有对node的重点fs做过多的解释,这是下一篇的内容。这是我们临时解决i18n的办法。但是想要彻底的解决这个问题,让开发人员不再需要手动的进行翻译,这个是一个引子。我会在之后的文章持续输出。

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 13 天,点击查看活动详情