![](https://p.upyun.lithub.cc/imnerd.org/assets/2023/github-translator.png)
## 简介
[github-translator](https://github.com/lizheming/github-translate-action) 是我最近做的一个小工具。它是一款将非英文的 GitHub issue 和 GitHub discussion 自动翻译成英文的 GitHub Action。 已启用该 Action,感兴趣的同学可以直接上仓库测试一下。
## 使用
使用其实很简单,在你的项目仓库中新建 `.github/workflows/translate.yml` 文件,并添加如下内容。它实现了当有 issue 或者 discussion 创建或者修改时会自动翻译并将翻译内容追加到原始的内容后面。
```yml
name: 'translator'
on:
issues:
types: [opened, edited]
issue_comment:
types: [created, edited]
discussion:
types: [created, edited]
discussion_comment:
types: [created, edited]
jobs:
translate:
permissions:
issues: write
discussions: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: lizheming/github-translate-action
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
IS_MODIFY_TITLE: true
APPEND_TRANSLATION: true
```
## 起因
我一直在维护的评论系统 [Waline](https://github.com/walinejs/waline) 自身定位为国际化项目,所以一直都在思考如何为非中文的用户提供更多的资料。由于我们的项目中文用户还是占绝大多数,所以我并不想改变大部分用户的习惯强制大家使用英文在 GitHub issue/discussion 交流,于是就有了自动翻译的想法。
我找了相关的一些工具之后,最终 [dromara/issues-translate-action](https://github.com/dromara/issues-translate-action) 进入了我的视野。它基本上符合我的诉求,基于 GitHub Action 当有用户发布 issue 的时候就会执行翻译脚本并将翻译内容作为新评论发布出去。
但发布新评论是有提醒的,这个和我想要不打扰用户的初衷相悖。而且发布新评论上下文看起来会不太流畅,我更期望的是基于原始内容修改。于是乎就 Fork 过来准备增加一个配置项改造下。
结果在改造的过程中发现原作者的代码写的比较乱,所有的逻辑都在一个文件里写的过程式代码。强迫症的我就将其进行重构,对代码进行简单的函数拆分。
在阅读代码的过程中发现它使用的是作者自荐的一个账号作为机器人发布评论。如果使用者想要用自己项目的账号的话就需要自己去新建个第三方账号,比较麻烦。之前我一直都知道 GitHub Action 会注入一个机器人的[自动令牌](https://docs.github.com/zh/enterprise-cloud@latest/actions/security-guides/automatic-token-authentication)来方便我们对 GitHub 进行操作,所以我尝试简化了第三方机器人令牌的操作,直接使用 GitHub Action 令牌让流程变得非常简单。
除了 GitHub issue,GitHub discussion 也会有很多用户的内容产生,GitHub Action 本身是支持 [discussion](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#discussion) 的相关事件触发的。
不过官方却默认没有提供 GitHub discussion 的 RESTful 操作接口,仅提供了 GraphQL 的操作 [API](https://docs.github.com/en/graphql/guides/using-the-graphql-api-for-discussions)。之前一直没有尝试过 GraphQL,而 GitHub Action 又不太支持本地调试,试错的成本比较高。好在经过一段时间的摸索后总算是搞定了。
使用 GraphQL 的过程中踩了一个坑,在修改 discussion 的接口中需要提交 discussion_id。按照之前 RESTful 接口的操作经验,我惯性的认为这个 discussion_id 就是我们 github discussion url 上的 id。结果执行给我报了个错:
```
Error: Request failed due to following response errors:
- Could not resolve to a node with the global id of '8'
```
由于根本没想到这个 id 的值有问题,一直认为是哪里的权限或者流程有问题查了半天。最后在[《Automate your process with GitHub》](https://sylhare.github.io/2021/12/16/Automate-your-process-with-github-api.html#data-issue)的一个举例启发下才想着是不是这个 id 有问题,看了下数据发现有一个 `node_id` 才恍然大悟。后面就一马平川了,当接口调通的那一刻还是非常开心的!
将翻译内容追加到内容里的话,有一个点不好解决,当用户再次编辑内容的时候,我如何知道哪些是用户的原始内容,哪些是机翻的内容。这里我取了个巧,在内容中插入了一段固定文案的 HTML 注释。这段注释作为分隔符分隔原始内容和翻译内容,同时在注释中做好说明,让用户不要修改。这样就解决了再编辑的翻译问题。
```
原始内容
翻译内容
```
于是乎「[github-translator](https://github.com/lizheming/github-translate-action)」这个项目就诞生了!