An open API service indexing awesome lists of open source software.

https://github.com/aras-ax/ax-lang-cli

对代码中的多语言词条进行提取,翻译替换等,提取词条输出excel文件,通过翻译后的excel文件进行词条的导入和替换。同时支持ExcelToJson, JsonToExcel
https://github.com/aras-ax/ax-lang-cli

ast excel-json html i18n jsdom json language nodejs vue

Last synced: about 1 year ago
JSON representation

对代码中的多语言词条进行提取,翻译替换等,提取词条输出excel文件,通过翻译后的excel文件进行词条的导入和替换。同时支持ExcelToJson, JsonToExcel

Awesome Lists containing this project

README

          

# 翻译工具,Excel/Json 处理工具

**该工具同时包含以下几个功能:**

- [提取代码中的中英文词条](#词条提取)
- [通过 Excel 将代码中的词条替换成目标语言的词条](#翻译文件)
- [检查代码中词条翻译替换的正确性](#翻译检查)
- [将 Excel 文件转成 JSON 文件](#Excel转JSON数组或者对象)
- [将 JSON 文件转成 Excel 文件](#JSON转EXCEL文件)
- [深度合并 JSON 文件](#合并JSON文件)
- [原厂代码添加翻译函数](#原厂代码添加翻译函数)
- [提取全部词条](#提取全部词条)
- [语言包检查](#语言包检查)
- [文件转码](#文件转码)

## 安装

```
npm install b28-cli -g
```

### 指令

```
# 运行工具
cd xxx
b28-cli

# 初始化配置文件b28.config.js
b28-cli init

# 查看版本号
b28-cli -v

# 查看帮助
b28-cli -h
```

## 文件词条提取说明

### JS 提取替换方法:

通过[`babylon`](https://www.npmjs.com/package/babylon)将`js`代码转成`AST`(抽象语法树),通过遍历`AST`得到需要提取的内容,并对`AST`进行修改,最后通过[`babel-generator`](https://www.npmjs.com/package/babel-generator)将`AST`转成代码文件输出。
一开始选择[`Esprima`](https://www.npmjs.com/package/esprima)进行代码转`AST`,但[`Esprima`](https://www.npmjs.com/package/esprima)对注释的处理有点问题,通过[`Escodegen`](https://www.npmjs.com/package/escodegen)将`AST`转代码时,注释丢失或者位置不对,没找到解决方案,故换成[`babylon`](https://www.npmjs.com/package/babylon).

### HTML 提取替换方法:

通过[`jsdom`](jsdom)将`html`代码转成`DOM`树,然后对`DOM`进行遍历。

### Vue 文件提取替换方法:

将`template`和`script`模块分开进行处理。`script`代码还是按照 JS 的逻辑进行处理。`template`的解析处理参考`vue`的`compiler`模块进行解析。首先遍历 html 节点提取翻译相关的属性和文本信息,包括词条的`start`和`end`位置索引,然后解析提取的信息,提取需要翻译的词条,同时将翻译后的词条对原`template`进行原地替换,最后输出替换后的 vue 文件。

**对于含有翻译函数`_()`的表达式会直接提取,不包含翻译函数的表达式只有包含中文的情况下才会进行提取和翻译替换。纯英文词条默认不提取,以为无法区分是表达式还是词条。**

默认的处理如下:

- 对于指令只对`v-bind`的指令做处理,其它指令不会涉及多语言相关内容。如果指令中包含`_('')`翻译函数,则只处理翻译函数内的词条,其它内容不做处理。如果不包含翻译函数,且含有中文,则进行提取和替换
- 对于非`v-bind`属性`title`、`alt`、`placeholder`如果内容是中文,则会进行提取,翻译的时候会将该内容替换为对应`v-bind`格式
- 对于文本内容会将`{{}}`模板语法内的表达式提取为参数,然后将整个词条重新组装为`{{_('xxxx %s xxx', [ars])}}`格式,并且将原文本进行替换

示例如下:

```vue


{{ "这是测试1" + test }}

{{ _("这是测试2") + check }}

我就是一段纯文本而已!

这是内容:{{ coneten + mess }}

```

进行工具翻译替换后:

```vue



{{ _("this is test one %s", [test]) }}

{{ _("this is test two") + check }}


{{ _("Just a pure text message.") }}

{{
_("this is content: %s%s", [content, mess])
}}

```

![处理结果](./img/vue.jpg)

## 使用方式

1. 通过[WinForm](B28.exe)界面程序直接操作(只支持 windows 环境)

![b28](https://raw.githubusercontent.com/moshang-xc/b28-cli/master/img/b28.jpg?1)

2) 通过[b28.config.js](#b28.config.js)进行配置,在目标路径下面添加`b28.config.js`配置文件,见[参数配置说明](#配置参数说明)
> 如果有读取到配置参数,则直接按配置参数运行工具。若读取的配置错误则会通过下面的使用方式重新输入配置项修正数据。
> 直接通过命令行交互的形式,如下图

```
# 切换到目标路径
cd xxx

# 运行指令
b28-cli
```

![交互](https://raw.githubusercontent.com/moshang-xc/b28-cli/master/img/cmd.jpg?1)

参数配置见见[参数配置说明](#配置参数说明)

## 配置参数说明

示例`b28.config.js`

```js
// 翻译文件配置
module.exports = {
commandType: 1,
/**
* 待翻译文件根目录
*/
baseTranslatePath: "./test/TestFile/test/allTest",
/**
* 翻译后文件输出根目录
*/
baseTransOutPath: "./test/TestFile/output/allTest",
/**
* 语言包文件地址
*/
languagePath: "./test/TestFile/testData/allTest/translate.xlsx",
/**
* 宏文件地址
*/
hongPath: "./test/TestFile/config/index.js",
/**
* key对应列
*/
keyName: "EN",
/**
* value对应列
*/
valueName: "CN",
/**
* Excel对应的sheet名称
*/
sheetName: ""
};
```

### 公共参数

`commandType`: 操作类型,枚举值

- 0: 提取词条
- 1: 翻译文件
- 2: 翻译检查
- 3: Excel 转 JSON
- 4: JSON 转 Excel
- 5: JSON 合并
- 6: 原厂代码添加翻译函数
- 7: 提取全部词条
- 8: 语言包检查
- 9: 文件转码

> 下面的所有地址参数既可以是绝对路径也可以是相对路径。相对路径为当前执行命令地址的相对路径。
> 所有输出的目录可以为当前还不存在的文件夹,但其最初始目录必须存在

### 词条提取

提取`html`和`JS`中所有的文本词条,以供其它地方使用或替换。

| 属性 | 值类型 | 默认值 | 说明 |
| ------------ | ------- | -------------- | ------------------------- |
| onlyZH | Boolean | false | 只提取中文词条 |
| baseReadPath | String | `必填` | 待提取文件根目录 |
| baseOutPath | String | `baseReadPath` | 提取的 Excel 文件输出目录 |
| hongPath | String | 空 | 功能宏文件地址 |

> `baseReadPath`: 既可以是文件夹也可以是具体的文件
> `baseOutPath`: 当`baseReadPath`为具体的文件时,该默认值为文件所在的文件夹地址

### 翻译文件

对代码文件进行翻译,对应需要翻译的文件,进行翻译输出,不需要翻译的文件进行拷贝输出,替换代码中所有需要替换的词条。当提供的语言包为`Excel`时,会同时生成对应的语言 JSON 文件,已保证翻译后的文件与语言文件是能够一一对应的。

| 属性 | 值类型 | 默认值 | 说明 |
| ----------------- | ------ | ------------------- | -------------------------------- |
| baseTranslatePath | String | `必填` | 待翻译文件根目录 |
| baseTransOutPath | String | `baseTranslatePath` | 翻译后文件输出根目录 |
| languagePath | String | `必填` | 语言包文件地址,`JSON`或`Excel` |
| hongPath | String | 空 | 功能宏文件地址 |
| sheetName | String | 第一个 Sheet | Excel 中对应的 Sheet 名称 |
| keyName | String | EN | Excel 中需要替换到代码中的列值 |
| valueName | String | CN | Excel 中对应现有代码中的字段值列 |

> `languagePath`: 值为 Excel 时才需要提供字段`sheetName`、`keyName`、`valueName`
>
> 将 Excel 中的第一行作为标题行,`keyName`和`valueName`对应标题行每列的值

### 翻译检查

检查当前的代码中是否有漏翻译的对象,与现有的语言包匹配,找出漏掉或错改的词条。

| 属性 | 值类型 | 默认值 | 说明 |
| ------------- | ------ | --------------- | -------------------- |
| baseCheckPath | String | `必填` | 待检查文件根目录 |
| langJsonPath | String | `必填` | 语言包 json 文件地址 |
| hongPath | String | 空 | 功能宏文件地址 |
| logPath | String | `baseCheckPath` | 检查信息输出路径 |

> `langJsonPath`: 为保证检查结果的准确性,必须为`JSON`文件

### Excel 转 JSON 数组或者对象

将 Excel 转成 JSON 文件,并返回对应的对象。提供一列数据,转成对应的数组,提供多列,则分别与 key 列形成多个对象,输出到制定 JSON 文件.

| 属性 | 值类型 | 默认值 | 说明 |
| ----------- | ------ | ------------ | ------------------------------------------ |
| excelPath | String | `必填` | Excel 文件地址 |
| keyName | String | EN | 作为对象 key 值的列 |
| valueName | String | 空 | 作为对象 value 值的列,多个列用英文逗号隔开 |
| sheetName | String | 第一个 Sheet | Excel 中对应的 sheet 名称 |
| outJsonPath | String | `excelPath` | 输出 json 文件地址 |

### JSON 转 EXCEL 文件

将数值或者对象,转成一列或者两列的 Excel 文件

| 属性 | 值类型 | 默认值 | 说明 |
| ------------ | ------ | -------- | ------------------------------------------------ |
| jsonPath | String | `必填` | json 文件地址,多个 json 文件合并时输入文件夹地址 |
| outExcelPath | String | jsonPath | 输出 Excel 文件地址 |

> `outExcelPath`: 可以是具体的文件名,也可以是输出文件所在的目录。为具体文件,则按给定的名称输出到给定的位置。给定的为目录,则在该目录下输出`json2Excel.xlsx`文件。

### 合并 JSON 文件

深度合并两个或多个 JSON 文件,可以是数组也可以是对象,但所有待合并的文件必须同为数组或者同为对象。

| 属性 | 值类型 | 默认值 | 说明 |
| ---------------- | ------ | ------------------------ | ---------------------------------------- |
| mainJsonPath | String | `必填` | 主 json 文件地址 |
| mergeJsonPath | String | `必填` | 次 json 文件地址,多个文件用英文逗号隔开 |
| outMergeJsonPath | String | `mainJsonPath`所在文件夹 | 合并后输出的地址 |

> 主 json 文件地址文件的优先级最高,如果存在值相同的,保留主 json 文件的内容,多个次 JSON 文件时,排在后面的文件优先级高于前面的文件。

### 原厂代码添加翻译函数

在原厂代码中添加翻译函数`_()`,实现多语言产品需求

| 属性 | 值类型 | 默认值 | 说明 |
| -------------- | --------------------------- | -------------------- | --------------------------------------------------- |
| baseProPath | String | `必填` | 原厂代码地址 |
| baseProOutPath | String | `baseProPath` | 添加翻译函数后文件输出地址 |
| ignoreCode | `String`/`Regexp` | `//g` | 需要注释的代码正则 |
| templateExp | `String`/`Regexp` | `/<%([^\n]*?)%>/g` | JS 文件中后台用于插入替换的模板表达式对应的正则 |
| customRules | `Array`/`Function`/`Regexp` | `[]` | 自定义不提词条规则列表,可以是正则也可以是 function |

> `ignoreCode`: 原厂代码中需要注释的代码对应的`正则`,不注释对应的 js 代码会有语法错误,例如部分原厂代码中在代码开头会包含`