{"id":18720944,"url":"https://github.com/wakeadmin/bbt-tools","last_synced_at":"2025-04-12T14:25:25.105Z","repository":{"id":175185345,"uuid":"653468651","full_name":"wakeadmin/bbt-tools","owner":"wakeadmin","description":"语言包自动翻译工作流","archived":false,"fork":false,"pushed_at":"2024-11-15T07:26:02.000Z","size":343,"stargazers_count":31,"open_issues_count":2,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-26T09:01:47.414Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wakeadmin.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-06-14T05:48:03.000Z","updated_at":"2024-11-25T08:46:15.000Z","dependencies_parsed_at":"2024-11-15T08:34:30.141Z","dependency_job_id":null,"html_url":"https://github.com/wakeadmin/bbt-tools","commit_stats":null,"previous_names":["wakeadmin/bbt-tools"],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wakeadmin%2Fbbt-tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wakeadmin%2Fbbt-tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wakeadmin%2Fbbt-tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wakeadmin%2Fbbt-tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wakeadmin","download_url":"https://codeload.github.com/wakeadmin/bbt-tools/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248579351,"owners_count":21127802,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-07T13:33:04.976Z","updated_at":"2025-04-12T14:25:25.074Z","avatar_url":"https://github.com/wakeadmin.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# bbt\n\n一个自动化的语言包管理和翻译工具，受启发于《圣经》中的巴别塔故事，旨在解决多语言之间的沟通障碍。\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./logo.png\" alt=\"bbt\" /\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://github.com/wakeadmin/bbt-tools\" target=\"__blank\"\u003e\u003cimg src=\"https://img.shields.io/github/last-commit/wakeadmin/bbt-tools?color=c977be\" alt=\"GitHub last commit\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/wakeadmin/bbt-tools/issues\" target=\"__blank\"\u003e\u003cimg src=\"https://img.shields.io/github/issues/wakeadmin/bbt-tools?color=a38eed\" alt=\"GitHub issues\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/wakeadmin/bbt-tools\" target=\"__blank\"\u003e\u003cimg alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/wakeadmin/bbt-tools?style=social\"\u003e\u003c/a\u003e\n\u003ca href=\"https://www.npmjs.com/package/@wakeadmin/bbt\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@wakeadmin/bbt.svg?sanitize=true\" alt=\"Version\"\u003e\u003c/a\u003e\n\u003ca href=\"https://www.npmjs.com/package/@wakeadmin/bbt\"\u003e\u003cimg src=\"https://img.shields.io/npm/dy/@wakeadmin/bbt\" alt=\"NPM Download\"\u003e\u003c/a\u003e\n\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n\u003cbr\u003e\n\n## 背景\n\n`bbt` 是 `Tower of Babel` 即巴别塔的拼音首字母，巴别塔是出自《圣经》的一则故事，其中人们为显示自己的力量而建塔，最终由于语言的障碍而失败。我们的`bbt`工具旨在解决类似的多语言沟通问题。\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n## 工作流程和初衷\n\n作为中文开发者，我们更习惯在中文环境下编程，并且也少有程序员能够掌握多门语言，尤其是比如日语、泰语、法语这类小语种。\n\n因此，我们的程序主要以中文为第一公民。但是，如果我们的程序需要支持多语言，那么我们就需要将中文的内容翻译成其他语言，这就是`bbt`的初衷。\n\n\u003cbr\u003e\n\n`bbt`的工作流程如下：\n\n1. 收集所有的翻译内容 - (`npx bbt collect`)\n2. 将翻译内容导出到 Excel(excel 文件或者 CSV) 表格中\n3. 将 excel 表格发送给翻译人员, 或者程序员通过翻译工具翻译 - (`npx bbt translate`)\n4. 翻译人员翻译或校准完成之后，将 excel 表格发送给开发人员\n5. 开发人员将 excel 表格导入到项目中\n6. 开发人员将 excel 表格回写到语言包中 - (`npx bbt write`)\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n## 安装\n\n```shell\n$ npm install @wakeadmin/bbt  // or\n$ yarn add @wakeadmin/bbt  // or\n$ pnpm add @wakeadmin/bbt\n\n$ npx bbt [command] \u003coptions\u003e\n```\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n## 命令\n\n### bbt init\n\n初始化，将生成配置文件\n\n```shell\n$ npx bbt init\n```\n\n执行 init 命令之后, 会生成 `bbt.config.js` 配置文件。默认配置如下：\n\n```js\nmodule.exports = {\n  langs: ['zh', 'en'],\n  test: '.*\\\\.tr$',\n  exclude: ['node_modules'],\n};\n```\n\n\u003cbr\u003e\n\n`langs` 是我们需要支持的语言，这是一个字符串数组，其中数组的第一项为`基准语言`，也就是我们会通过基准语言来：\n\n- 作为基准翻译到其他语言\n- 已基准语言的语言包为基础，对比和推断需要翻译的其他语言包\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n[查看更多配置项](./docs/config.md)\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n### bbt collect\n\n收集所有的符合要求的语言包，并将信息提取到 `bbt.csv` 中，方便翻译人员进行翻译和校准。当然你也可以使用 `bbt translate` 自动翻译\n\n| name     | shortName | type      | description                  | default           | required |\n| -------- | --------- | --------- | ---------------------------- | ----------------- | -------- |\n| --config | -c        | `string`  | 配置文件地址                 | `./bbt.config.js` | `false`  |\n| --strict |           | `boolean` | 是否使用`strict`模式进行对比 | `false`           | `false`  |\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n```shell\n$ npx bbt collect\n```\n\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n### bbt translate\n\n```shell\n$ npx bbt translate\n```\n\n使用翻译 API 对`excel`(bbt.csv)文件进行翻译\n\n| name         | shortName | type                               | description                                                                     | default           | required |\n| ------------ | --------- | ---------------------------------- | ------------------------------------------------------------------------------- | ----------------- | -------- |\n| --translator | -t        | `'google' \\| 'deepl' \\| 'chatgpt'` | 使用哪个翻译 API, 如果 bbt.config.js 自定义了 translator，则以配置为准          | `'google'`        | `false`  |\n| --proxy      | -p        | `string`                           | 正向代理地址 , 如果为空的话，会通过[环境变量进行获取](#环境变量)                | `-`               | `false`  |\n| --force      | -f        | `boolean`                          | 是否强制进行翻译, 默认情况下只会翻按需翻译(即无翻译内容时翻译)， **请谨慎开启** | `false`           | `false`  |\n| --model      |           | `'gpt-4' \\| 'gpt-3.5-turbo' `      | 使用`chatgpt`进行翻译时所使用的模型                                             | `'gpt-3.5-turbo'` | `false`  |\n| --api-key    | -k        | `string`                           | 翻译服务的`API Key `, 如果为空的话，会通过[环境变量进行获取](#环境变量)         | `-`               | `false`  |\n| --base-url   |           | `string`                           | 反向代理地址, 如果为空的话，会通过[环境变量进行获取](#环境变量)                 | `-`               | `false`  |\n\nbbt 支持通过 Google、DeepL、ChatGPT 等方案进行初步的机器翻译。如果你想使用其他的翻译服务，可以通过自定义插件的方式进行扩展.\n\n### Google 翻译\n\n默认使用的就是 Google 翻译\n\n```\nnpx bbt translate -t google --api-key GOOGLE_TRANSLATION_API_KEY\n```\n\n可以通过 --api-key 选项或者 BBT_GOOGLE_API_KEY 环境变量来配置 Google 翻译的 API KEY。\n\n我们也建议你将环境变量配置在用户目录下的 .profile 或者 .bashrc 这类文件中，这样可以避免每次都需要输入 API KEY。\n\nGoogle 翻译需要依赖科学上网，需要自行解决。有两种代理配置方式：\n\n- 通过 --proxy 选项或者 BBT_PROXY 环境变量来配置正向代理地址，bbt 会自动将请求转发到代理地址上\n- 通过终端代理的方式进行配置，例如：`export http_proxy=YOU_PROXY_ADDRESS`\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n### DeepL 翻译\n\n和 Google 翻译类似，需要通过 --api-key 选项或者 BBT_DEEPL_API_KEY 环境变量来配置 DeepL 翻译的 API KEY。\n\n\u003cbr\u003e\n\n### ChatGPT 翻译(实验性)\n\n- `--model` 确定使用的 ChatGPT 模型版本。默认为 `gpt-3.5-turbo`\n- `--base-url` 或 `BBT_OPEN_AI_BASE_URL` 环境变量。如果你自己搭建了 ChatGPT 的代理服务，可以通过这个选项来配置\n- `--api-key` 或 `BBT_OPEN_AI_API_KEY` 配置 OPEN AI 的 API KEY\n\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n### bbt write\n\n```shell\n$ npx bbt write\n```\n\n将 `bbt.csv` 的翻译结果回填到对应的语言包中，如果对应的语言包不存在，则会自动创建\n\n| name     | shortName | type     | description  | default           | required |\n| -------- | --------- | -------- | ------------ | ----------------- | -------- |\n| --config | -c        | `string` | 配置文件地址 | `./bbt.config.js` | `false`  |\n\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n## 高级\n\n### 支持的环境变量\n\n`bbt` 依赖于以下环境变量\n\n| name                 | description                              |\n| -------------------- | ---------------------------------------- |\n| BBT_OPEN_AI_API_KEY  | `chatGPT`(`openAI`)服务所依赖的`API Key` |\n| BBT_OPEN_AI_BASE_URL | `chatGPT`(`openAI`)服务的反向代理地址    |\n| BBT_DEEPL_API_KEY    | `DeepL`服务所依赖的`API Key`             |\n| BBT_DEEPL_BASE_URL   | `DeepL`服务的反向代理地址                |\n| BBT_GOOGLE_API_KEY   | `Google`服务所依赖的`API Key`            |\n| BBT_GOOGLE_BASE_URL  | `Google`服务的反向代理地址               |\n| BBT_PROXY            | 使用`translate`命令时的正向代理地址      |\n\n### 自定义解析文件\n\n有时候国际化资源并不是使用`JSON`格式， 因此可以通过`plugins.parser`来自定义文件的解析方式\n\n#### 方法签名\n\n```typescript\nexport interface FileParser\u003cT = any\u003e {\n  parse(str: string): Record\u003cstring, T\u003e;\n  stringify(record: Record\u003cstring, T\u003e): string;\n}\n```\n\n#### example\n\n`zh.tr`\n\n```text\nhello 你好\nworld 世界\n```\n\n`bbt.config.js`\n\n```js\nmodule.exports = {\n  // ...other\n  plugins: {\n    parser: {\n      parse(content) {\n        return Object.fromEntries(content.split(/\\n/).map(str =\u003e str.split(/\\s/)));\n      },\n      stringify(record) {\n        return Object.entries(record)\n          .map(arr =\u003e arr.join(' '))\n          .join('\\n');\n      },\n    },\n  },\n};\n```\n\n### 自定义翻译 API\n\n#### 函数签名\n\n```typescript\n/**\n *\n * @param record - 需要翻译的数据源\n * @param target - 翻译的目标语言\n * @param sourceLanguage - 数据源原本的语言\n * @returns Observable\u003cTranslatedList\u003cstring\u003e\u003e | Promise\u003cTranslatedList\u003cstring\u003e\u003e;\n */\ntranslator: (record: Record\u003cstring, string\u003e, target: string, sourceLanguage: string) =\u003e\n  Observable\u003cTranslatedList\u003cstring\u003e\u003e | Promise\u003cTranslatedList\u003cstring\u003e\u003e;\n```\n\n#### example\n\n```js\n// bbt.config.js\n\nmodule.exports = {\n  // other\n  plugins: {\n    translator: (textMap, target, sourceLanguage) =\u003e {\n      return Promise.resolve(\n        Object.entries(textMap).map(([key, value]) =\u003e ({\n          target,\n          key,\n          translatedText: `${value} - ${target}`,\n        }))\n      );\n    },\n  },\n};\n```\n\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n## FAQ\n\n[faq](./docs/faq.md)\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n## License\n\n[MIT](./LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwakeadmin%2Fbbt-tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwakeadmin%2Fbbt-tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwakeadmin%2Fbbt-tools/lists"}