language-translate v2.2.5
language-translate
language-translate 是一款基于 Google 翻译在线转换 ts/js/json 多语言文件并批量生成或插入指定文件的插件,支持增量更新,可使用 bash 翻译单个文件,也能集成在项目中持续批量翻译,支持单文件转单文件,单文件转多文件,多文件转多文件,多文件转单文件
效果演示
正常翻译效果:
压力测试(1分钟内生成100种语言包):
安装
npm i language-translate
使用
在您的项目根目录下创建 translate.config.(js|ts)
进行配置
js 配置示例:
// translate.config.js
import { Lang } from 'language-translate/types';
import { defineConfig } from 'language-translate/utils';
export default defineConfig({
proxy: {
host: '127.0.0.1',
port: 7890,
},
fromLang: Lang.en,
fromPath: 'translate.entry.json',
translate: [
{
label: '将结果翻译到locales文件夹下',
targetConfig: [
{
targetLang: Lang.de,
outPath: 'locales/de.json',
},
{
targetLang: Lang['zh-CN'],
outPath: 'locales/zh.json',
},
{
targetLang: Lang.ko,
outPath: 'locales/ko.json',
},
]
}
]
})
在您的项目根目录下创建 translate.entry.(js|ts|json)
文件名随意,但需要和配置中 fromPath
对应,里面填写您需要翻译的内容,内容所使用语言与配置中 fromLang
对应
例如在根目录创建 translate.entry.json
{
"hello": "Hello {{name}}, how are you today?",
"button": {
"confirm": "confirm",
"cancel": "cancel"
},
"header": {
"login": "login"
}
}
注意: 翻译后会在结果保留 i18n 中的插值表达式,例如上述 {{name}}
但仅支持 {{}}
这一种语法
在 package.json
中加入 scripts 命令
"scripts": {
"translate": "translate"
}
在终端执行命令启动翻译
npm run translate
不出意外已经可以在根目录下 locales
内看到 de.json
、ko.json
、zh.json
|-- Your Project Name
|-- locales
|-- de.json
|-- ko.json
|-- zh.json
|-- package.json
|-- translate.config.js
|-- translate.entry.json
此后有新文案需要翻译时,只需要修改 fromPath
文件内容(即示例中translate.entry.json
),再执行 npm run translate
即可实现增量更新
高级用法
配置中的 fromPath
是基于 fast-glob 的,所以支持动态解析,例如递归翻译整个文件夹下以 .en.json
结尾的文件
// translate.config.js
import { Lang } from 'language-translate/types';
import { defineConfig } from 'language-translate/utils';
export default defineConfig({
proxy: {
host: '127.0.0.1',
port: 7890,
},
fromLang: Lang.en,
fromPath: 'locales/**/*.en.json',
translate: [
{
label: '递归翻译文件夹内json文件并重写文件名',
targetConfig: [
{
targetLang: Lang.de,
outPath: 'locales',
rewrite: fileName => fileName.replace('.en.json', '.de.json'),
},
{
targetLang: Lang['zh-CN'],
outPath: 'locales',
rewrite: fileName => fileName.replace('.en.json', '.zh.json'),
},
{
targetLang: Lang.ko,
outPath: 'locales',
rewrite: fileName => fileName.replace('.en.json', '.ko.json'),
},
]
},
]
})
翻译前 locales
目录结构
locales
├─com.en.json
├─header.en.json
├─children
| ├─color.en.json
翻译后 locales
目录结构
locales
├─com.de.json
├─com.en.json
├─com.ko.json
├─com.zh.json
├─header.de.json
├─header.en.json
├─header.ko.json
├─header.zh.json
├─children
| ├─color.de.json
| ├─color.en.json
| ├─color.ko.json
| └─color.zh.json
也可以将翻译结果输出到另一个文件夹,只需要更改 outPath
即可,更多用法等你解锁哦,也可结合FAQ输出可选做出更多花样,项目 example 目录中也提供了一些简单示例
配置API
translate.config.(js|ts)
属性 | 描述 | 类型 | 默认值 | 必填 |
---|---|---|---|---|
toolsLang | 翻译工具在使用过程中终端输出的提示语言 | en | zh-CN | zh-CN | 否 |
proxy | 使用 Google 翻译,需要网络代理,如果您所在的国家能直接使用 Google 就可以不填 proxy 配置项 | Proxy | undefined | 否 |
fromLang | 待翻译文件所使用语言 | Lang | - | 是 |
fromPath | 待翻译文件路径,基于 fast-glob,支持动态解析,后缀名可以是 js|ts|json | string | translate.entry.json | 否 |
translate | 翻译输出配置,可配置多项在开始翻译时进行选择 | Translate[] | - | 是 |
incrementalMode | 增量更新模式(翻译完成后修改 fromPath 对应文件内容再次启动翻译的处理策略,详见IncrementalMode) | IncrementalMode | IncrementalMode.cover | 否 |
translateRuntimeDelay | 翻译过程中每个 key 之间的延迟,单位毫秒 | number | 0 | 否 |
translateRuntimeChunkSize | 翻译过程中每隔多少个 key 将翻译结果同步写入一下硬盘,防止意外中断导致浪费已翻译的 key | number | 5 | 否 |
translateRuntimeMergeEnabled | 在翻译运行时启用文案合并功能,减少 API 调用频率,显著提升翻译速度 | boolean | true | 否 |
mergeEnabledChunkValuesLength | 在启用文案合并功能时限制单个合并文案的最长字符数,不要超过5000,因为 Google 翻译单次翻译字符最大限制5000 | number | 5000 | 否 |
ignoreValuesAndCopyToTarget | 排除fromPath 文件中指定的文案并直接拷贝到目标文件内 | string[] | [] | 否 |
apiKeyConfig | 用于配置非 Google 翻译的密钥信息,目前只扩展了百度翻译接口 | ApiKeyConfig | undefined | 否 |
Proxy
属性 | 描述 | 类型 |
---|---|---|
host | 代理主机地址 | string |
port | 代理主机端口 | number |
Translate
属性 | 描述 | 类型 |
---|---|---|
label | 自定义名称,当 translate 配置项有多项的时候,启动翻译时会在终端提示进行选择让翻译更加工程化,具体演示: FAQ | string |
targetConfig | 翻译输出配置 | TargetConfig |
TargetConfig
属性 | 描述 | 类型 | 必填 |
---|---|---|---|
targetLang | 翻译输出的目标语言 | Lang | 是 |
outPath | 翻译后文件输出路径,后缀名可以是js|ts|json,也可以是目录,输出时如果没有目标文件则自动生成,如果有则增量更新 | string | 是 |
rewrite | 可选值,传入回调函数可在输出时重写文件名,形参会传入原始文件名,返回值是最终输出文件名 | Callback(fileName: string) => string; | 否 |
IncrementalMode
值 | 描述 |
---|---|
cover | 覆盖模式: 目标文件中已有的 key 直接覆盖,没有的 key 新增 |
fast | 快速模式: 目标文件中已有 key 并且值不为空在翻译时会排除, 否则新增 key, 如果不理解可以去项目 example 目录查看例子 |
ApiKeyConfig
用于配置非 Google 翻译的密钥信息,目前扩展了 DeepL 和百度翻译,DeepL 区分输入和输出语言代码,若使用 DeepL 请按照 DeepL 官方语言代码配置。百度翻译API免费版限制请求频率,效果很差,非要用百度建议使用付费高级版
export enum TranslateService {
baidu = 'baidu',
google = 'google',
deepl = 'deepl'
}
export interface BaiduApiKeyConfig {
appId: string
appKey: string
}
export interface DeepLApiKeyConfig {
authKey: string
}
export interface ApiKeyConfig {
type: TranslateService
[TranslateService.baidu]?: BaiduApiKeyConfig
[TranslateService.deepl]?: DeepLApiKeyConfig
}
Lang
语言 | 翻译代码 |
---|---|
中文(简体) | zh-CN |
中文(繁體) | zh-TW |
英语 | en |
南非荷兰语 | af |
阿尔巴尼亚语 | sq |
阿姆哈拉语 | am |
阿拉伯语 | ar |
亚美尼亚语 | hy |
阿塞拜疆语 | az |
巴斯克语 | eu |
白俄罗斯语 | be |
孟加拉语 | bn |
波斯尼亚语 | bs |
保加利亚语 | bg |
加泰罗尼亚语 | ca |
宿雾语 | ceb |
奇切瓦语 | ny |
科西嘉语 | co |
克罗地亚语 | hr |
捷克语 | cs |
丹麦语 | da |
荷兰语 | nl |
世界语 | eo |
爱沙尼亚语 | et |
菲律宾语 | tl |
芬兰语 | fi |
法语 | fr |
弗里斯兰语 | fy |
加利西亚语 | gl |
格鲁吉亚语 | ka |
德语 | de |
希腊语 | el |
古吉拉特语 | gu |
海地克里奥尔语 | ht |
夏威夷语 | haw |
希伯来语 | iw |
印地语 | hi |
苗语 | hmn |
匈牙利语 | hu |
冰岛语 | is |
伊博语 | ig |
印度尼西亚语 | id |
爱尔兰语 | ga |
意大利语 | it |
日语 | ja |
爪哇语 | jw |
卡纳达语 | kn |
哈萨克语 | kk |
高棉语 | km |
韩语 | ko |
库尔德语 | ku |
吉尔吉斯语 | ky |
老挝语 | lo |
拉丁语 | la |
拉脱维亚语 | lv |
立陶宛语 | lt |
卢森堡语 | lb |
马其顿语 | mk |
马达加斯加语 | mg |
马来语 | ms |
马拉雅拉姆语 | ml |
马耳他语 | mt |
毛利语 | mi |
马拉地语 | mr |
蒙古语 | mn |
缅甸语 | my |
尼泊尔语 | ne |
挪威语 | no |
普什图语 | ps |
波斯语 | fa |
波兰语 | pl |
葡萄牙语 | pt |
旁遮普语 | pa |
罗马尼亚语 | ro |
俄语 | ru |
萨摩亚语 | sm |
苏格兰盖尔语 | gd |
塞尔维亚语 | sr |
塞索托语 | st |
绍纳语 | sn |
信德语 | sd |
僧伽罗语 | si |
斯洛伐克语 | sk |
斯洛文尼亚语 | sl |
索马里语 | so |
西班牙语 | es |
巽他语 | su |
斯瓦希里语 | sw |
瑞典语 | sv |
塔吉克语 | tg |
泰米尔语 | ta |
泰卢固语 | te |
泰语 | th |
土耳其语 | tr |
乌克兰语 | uk |
乌尔都语 | ur |
乌兹别克语 | uz |
越南语 | vi |
威尔士语 | cy |
科萨语 | xh |
依地语 | yi |
约鲁巴语 | yo |
祖鲁语 | zu |
如果 Lang
配置中没有您需要的语言,您可以直接传入 Google 翻译支持的语言代码
FAQ
translate
配置项配置多项的适用场景
在开发中,locales
文件夹下可能会有专门存放错误码、业务文案的文件夹,甚至多种模块,例如:
|-- Your Project Name
|-- locales
|-- error
|-- de.json
|-- ko.json
|-- zh.json
|-- label
|-- de.json
|-- ko.json
|-- zh.json
此时在待翻译文件填入错误码文案内容,例如 translate.entry.json
{
"0": "service error",
"4": "client error",
}
现在我们只想让翻译后的结果插入 locales/error
目录下,只需在 translate
配置项添加多个选项后再启动翻译,这时终端会提示让您进行选择:
// translate.config.js
import { Lang } from 'language-translate/types';
import { defineConfig } from 'language-translate/utils';
export default defineConfig({
proxy: {
host: '127.0.0.1',
port: 7890,
},
fromLang: Lang.en,
fromPath: 'translate.entry.json',
translate: [
{
label: '将结果翻译到locales/error文件夹下',
targetConfig: [
{
targetLang: Lang.de,
outPath: 'locales/error/de.json',
},
{
targetLang: Lang['zh-CN'],
outPath: 'locales/error/zh.json',
},
{
targetLang: Lang.ko,
outPath: 'locales/error/ko.json',
},
]
},
{
label: '将结果翻译到locales/label文件夹下',
targetConfig: [
{
targetLang: Lang.de,
outPath: 'locales/label/de.json',
},
{
targetLang: Lang['zh-CN'],
outPath: 'locales/label/zh.json',
},
{
targetLang: Lang.ko,
outPath: 'locales/label/ko.json',
},
]
},
]
})
终端执行
npm run translate
此时已实现翻译输出可选功能
在 bash 中使用
language-translate 也支持在 bash 中翻译单个文件
npm i language-translate -g
直接在 bash 执行
translate -i /User/xxx/source.json -o /User/xxx/target.json -f en -t zh-CN -h 127.0.0.1 -p 7890
您也可以输入 translate --help
获取帮助
translate --help
# 终端输出
Usage: translate [options]
Translate a single js/ts/json file
Options:
-i, --input <string> source file path
-o, --output <string> target file path
-f, --fromlang <Lang> source file language
-t, --targetlang <Lang> target file language
-h, --host <string> proxy host
-p, --port <string> proxy port
--help display help for command
5 months ago
6 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago