简介
github-translator 是我最近做的一个小工具。它是一款将非英文的 GitHub issue 和 GitHub discussion 自动翻译成英文的 GitHub Action。https://github.com/lizheming/github-translate-action 已启用该 Action,感兴趣的同学可以直接上仓库测试一下。
使用
使用其实很简单,在你的项目仓库中新建 .github/workflows/translate.yml
文件,并添加如下内容。它实现了当有 issue 或者 discussion 创建或者修改时会自动翻译并将翻译内容追加到原始的内容后面。
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 自身定位为国际化项目,所以一直都在思考如何为非中文的用户提供更多的资料。由于我们的项目中文用户还是占绝大多数,所以我并不想改变大部分用户的习惯强制大家使用英文在 GitHub issue/discussion 交流,于是就有了自动翻译的想法。
我找了相关的一些工具之后,最终 dromara/issues-translate-action 进入了我的视野。它基本上符合我的诉求,基于 GitHub Action 当有用户发布 issue 的时候就会执行翻译脚本并将翻译内容作为新评论发布出去。
但发布新评论是有提醒的,这个和我想要不打扰用户的初衷相悖。而且发布新评论上下文看起来会不太流畅,我更期望的是基于原始内容修改。于是乎就 Fork 过来准备增加一个配置项改造下。
结果在改造的过程中发现原作者的代码写的比较乱,所有的逻辑都在一个文件里写的过程式代码。强迫症的我就将其进行重构,对代码进行简单的函数拆分。
在阅读代码的过程中发现它使用的是作者自荐的一个账号作为机器人发布评论。如果使用者想要用自己项目的账号的话就需要自己去新建个第三方账号,比较麻烦。之前我一直都知道 GitHub Action 会注入一个机器人的自动令牌来方便我们对 GitHub 进行操作,所以我尝试简化了第三方机器人令牌的操作,直接使用 GitHub Action 令牌让流程变得非常简单。
除了 GitHub issue,GitHub discussion 也会有很多用户的内容产生,GitHub Action 本身是支持 discussion 的相关事件触发的。
不过官方却默认没有提供 GitHub discussion 的 RESTful 操作接口,仅提供了 GraphQL 的操作 API。之前一直没有尝试过 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》的一个举例启发下才想着是不是这个 id 有问题,看了下数据发现有一个 node_id
才恍然大悟。后面就一马平川了,当接口调通的那一刻还是非常开心的!
将翻译内容追加到内容里的话,有一个点不好解决,当用户再次编辑内容的时候,我如何知道哪些是用户的原始内容,哪些是机翻的内容。这里我取了个巧,在内容中插入了一段固定文案的 HTML 注释。这段注释作为分隔符分隔原始内容和翻译内容,同时在注释中做好说明,让用户不要修改。这样就解决了再编辑的翻译问题。
原始内容
<!--This is a translation content dividing line, the content below is generated by machine, please do not modify the content below-->
翻译内容
于是乎「github-translator」这个项目就诞生了!
牛牛牛,这也可以啊
啊,原来是去年的文章,我还在纳闷rss怎么没有推送 😅
@Jeff: 2333 催更催的可以说是非常隐晦了 [哭笑不得] 好的我知道了,你不要再说啦~
牛牛牛
刚在GitHub上体验到了,还在好奇时没想到一会就刷到这篇文章
测试一下
测试一下
可以说是非常尴尬的问题了
别字,应该是「自建」
虽然看不懂,但是感觉好厉害。
我之前也用 waline,其实各方面体验都非常满意,但是最近还是切回 wordpress 了,因为对我这种不懂 it 的人来说,还是麻烦了些,主要是年纪大了,学习能力减退太多了。
@南北去如归: 嗯,我们这种主要是省钱了 [哭笑不得],静态博客和 Serverless 服务都是蹭的免费额度,维护和备份上也非常省力。要是懒得折腾的其实 WP 真的挺好,买个虚拟主机和数据库搭一下就行,毕竟博客重要的还是内容~
@怡红公子: 是呢,对你们这些 IT 从业者就是顺手的事。但对我来说还是比较困难。完全不懂 IT,一点小问题都要花半天时间去 google。比如我就没明白为啥这个评论区你们 ID 链接是指向自己网站的,而我是指向这篇文章,找不到在哪设置。
昨天还更新了一下博客,https://paperheap.com/follow-the-crowd/,换成 wordpress 之后还更有精力去写了。
@南北去如归:https://paperheap.com/follow-the-crowd
😂😂😂
@南北去如归: 是我的锅,我这边评论是 GitHub 登录的,直接读取的 GitHub 的网站地址设置,如果没有的话空了就会链接到当前页面了。我之后修改下,没有的话指向到 GitHub 个人页地址去。
其实主要看时间和兴趣吧,我就是平常自己比较喜欢折腾,所以比较喜欢搞这些~ 别人搭博客写文章,我是搭博客写代码然后文章数0 哈哈哈哈
@怡红公子: 哈哈,折腾也是成果,再说你折腾得挺有成绩的。
应该是第一次登陆的时候读取的,我后面又加上了,也不行。
别字,应该是「工具」
牛啤!最近看到不少项目在用了。