i18n-replace 是一个可以自动替换中文并支持自动翻译的前端国际化辅助工具。前端
它具备如下功能:vue
自动翻译功能使用的是百度免费翻译 API,每秒只能调用一次,而且须要你注册百度翻译平台的帐号。react
而后将 appid 和密钥填入 i18n-replace 的配置文件 i18n.config.js
,这个配置文件须要放置在你项目根目录下。git
安装github
npm i -g i18n-replace
全局安装后,打开你的项目,创建一个 i18n.config.js
文件,配置项以下:正则表达式
module.exports = { delay: 1500, // 自动翻译延时,必须大于 1000 ms,不然调用百度翻译 API 会失败 mapFile: '', // 须要生成默认 map 的文件 appid: '', // 百度翻译 appid key: '', // 百度翻译密钥 output: 'i18n.data.js', // i18n 输出文件 indent: 4, // i18n 输出文件缩进 entry: '', // 要翻译的入口目录或文件,默认为命令行当前的 src 目录 prefix: '', // i18n 变量前缀 i18n 变量生成规则 prefix + id + suffix suffix: '', // i18n 变量后缀 id: 0, // i18n 自增变量 id translation: false, // 是否须要自动翻译中文 to: 'en', // 中文翻译的目标语言 mode: 1, // 0 翻译全部 i18n 数据,1 只翻译新数据 loader: 'loader.js', pluginPrefix: '$t', // i18n 插件前缀 例如 vue-i18n: $t, react-i18next: t include: [], // 须要翻译的目录或文件 exclude: [], // 不须要翻译的目录或文件 若是 exclude include 同时存在一样的目录或文件 则 exclude 优先级高 extra: /(\.a)|(\.b)$/, // 默认支持 .vue 和 .js 文件 若是须要支持其余类型的文件,请用正则描述 例如这个示例额外支持 .a .b 文件 }
上面是 i18n-replace 工具的配置项,具体说明请看文档。npm
这些配置项都不是必要的,若是你须要翻译功能,通常只须要填入 appid、key 而且将 translation 设为 true。json
设置完配置项后,执行 rep
(这是一个全局命令),i18n-replace 就会对你的入口目录进行递归替换、翻译。api
i18n-replace 能识别如下中文:数组
不能包含有空格,能够包含中文、中文符号,数字,- 测试123 测试-12-测试 几点了?12点。
更多测试用例,请查看项目下的 test
目录。
翻译前
<div> <input type="二" placeholder="一" value="s 四 f" /> <MyComponent> 很是好 <header slot="header">测试</header> 很是好 很是好 <footer slot="footer">再一次测试</footer> 很是好 </MyComponent> </div>
翻译后
<div> <input type={this.$t('0')} placeholder={this.$t('1')} value={`s ${this.$t('2')} f`} /> <MyComponent> {`${this.$t('3')} `}<header slot="header">{this.$t('4')}</header>{` ${this.$t('3')}`} {`${this.$t('3')} `}<footer slot="footer">{this.$t('5')}</footer>{` ${this.$t('3')}`} </MyComponent> </div>
翻译前
<template> <div> 有人<div value="二" :val="abc + '三 afb'">一</div>在国 </div> </template> <script> export default { created() { const test = '测试' } } </script>
翻译后
<template> <div> {{ $t('0') }}<div :value="$t('1')" :val="abc + $t('2') + ' afb'">{{ $t('3') }}</div>{{ $t('4') }} </div> </template> <script> export default { created() { const test = this.$t('5') } } </script>
在你的项目根目录下创建一个 i18n.config.js
文件,i18n-replace 将会根据配置项来执行不一样的操做。
注意,全部配置项均为选填。
module.exports = { delay: 1500, // 自动翻译延时,必须大于 1000 ms,不然调用百度翻译 API 会失败 mapFile: '国际化资源管理.xlsx', // 须要生成默认 map 的文件 appid: '', // 百度翻译 appid key: '', // 百度翻译密钥 output: 'i18n.data.js', // i18n 输出文件 indent: 4, // i18n 输出文件缩进 entry: 'src', // 要翻译的入口目录或文件,默认为命令行当前的 src 目录 prefix: '', // i18n 变量前缀 i18n 变量生成规则 prefix + id + suffix suffix: '', // i18n 变量后缀 id: 0, // i18n 自增变量 id translation: true, // 是否须要自动翻译中文 to: 'en', // 中文翻译的目标语言 mode: 1, // 0 翻译全部 i18n 数据,1 只翻译新数据 loader: 'loader.js', pluginPrefix: '$t', // i18n 插件前缀 例如 vue-i18n: $t, react-i18next: t include: [], // 须要翻译的目录或文件,若是为空,将不进行任何操做。 exclude: [], // 不须要翻译的目录或文件 若是 exclude include 同时存在一样的目录或文件 则 exclude 优先级高 }
appid: '', // 百度翻译 appid key: '', // 百度翻译密钥
这是百度免费翻译 API 的 appid 和密钥。
若是你须要自动翻译,这两个是必填项。
具体注册流程请看官网。
entry: 'src'
入口目录或入口文件,默认为项目根目录下的 src
目录。
替换或翻译将从这里开始。
delay: 1500
单位毫秒,默认 1500。
百度翻译 API 调用延时,因为免费的翻译 API 1 秒只能调用一次,因此该选项必须大于 1000。通过本人测试,该项设为 1500 比较稳定。
mapFile: 'data.js'
若是你提供一个默认的映射文件(中文和变量之间的映射),本工具将根据映射文件将中文替换为对应的变量。
例若有这样的映射关系:
module.exports = { zh: { 10000: '测试', }, en: {}, }
和一个源码文件:
const test = '一'
启用工具后,源码文件中的 const test = '一'
将会被替换为 const test = this.$t('10000')
。
因此若是你有默认的映射文件,请提供它的地址。
loader: 'src/loader.js'
i18n-replace 提供了一个内置的 loader,以便将下面的数据:
module.exports = { zh: { 10000: '测试', }, en: {}, }
转换成 i18n-replace 要求的映射数据格式:
{ "测试": "10000", }
因此为了能将其余文件翻译成这种格式,本工具提供了一个 loader 选项。
这个 loader 是一个本地文件地址,你提供的文件须要写一个转换函数,将其余格式的文件转换成 i18n-replace 要求的数据格式,就像下面这个函数同样:
const excelToJson = require('convert-excel-to-json') function translateExcelData(file, done) { const data = excelToJson({ sourceFile: file }) const result = {} data.Sheet1.forEach(item => { if (item.C == '中文') { result[item.B] = item.A } }) done(result) } module.exports = translateExcelData
它接收两个参数,分别是文件地址 file
和 完成函数 done()
。
支持异步操做,只要在转换完成时调用 done(result)
便可。
若是你没有提供一个默认映射文件,i18n-replace 在将中文替换成变量时,将遵循下面的公式来生成变量:
prefix + id + suffix
0
,自动递增。pluginPrefix: '$t'
翻译前缀,默认为 $t
。请根据应用场景配置。
例如 vue-i18n
国际化工具使用的是 $t
,而 react-i18next
使用的是 t
。
是否须要自动翻译,默认为 false
。
若是设为 true
,将会调用百度免费翻译 API 进行翻译。
翻译的目标语言,默认为 en
,即英语。
具体的配置项请查看百度翻译 API 文档。
翻译模式,默认为 1
。
翻译模式有两种:0
和 1
。
若是你提供了一个默认的映射文件:
{ "一": "10000", "二": "10001", }
同时在替换过程当中产生了两个新的变量,最后映射数据变成这样:
{ "一": "10000", "二": "10001", "三": "10002", "四": "10003" }
这时,翻译模式为 0
将会对全部数据进行翻译。而翻译模式为 1
只对新产生的数据进行翻译。
翻译后的文件输出名称,默认为 i18n.data.js
。
工具默认翻译入口目录下全部的文件,若是你提供了 include
选项,将只会翻译 include
指定的目录或指定的文件。
若是这个选项是一个空数组,将不会进行任何操做。
exclude
优先级比 include
高,若是有文件包含在 exclude
里面,它将不会被翻译。
生成文件的缩进,默认为 4
。
因为 i18n-replace 默认只支持 .vue 和 .js 文件。
因此提供了一个 extra 选项,以支持其余的文件格式,它的值为正则表达式。
extra: /(\.a)|(\.b)$/
例如使用上述的正则表达式,i18n-replace 将额外支持 .a
.b
文件