GitHub Actions 是 GitHub 推出的 CI\CD 服务,正式版推出后也没有尝试过,最近搞了几个确实真香。
在 GitHub Actions 中有一些自己的术语:
- workflow (工作流程):持续集成一次运行的过程,就是一个 workflow;
- job(任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务;
- step(步骤):每个 job 由多个 step 构成,一步步完成;
- action(动作):每个 step 可以依次执行一个或多个命令(action);
这篇文章说一下自动翻译简体中文文档到繁体中文问题的 action,基于 opencc 实现的简繁体转换。
首先需要安装 opencc ,我们使用的是 ubuntu-latest 的环境,所以直接使用 apt-get 安装
apt-get install libopencc-dev -y
使用 PHP 的 opencc4php 扩展来调用,需要安装一下扩展
git clone [email protected]:NauxLiu/opencc4php.git --depth 1
cd opencc4php
phpize
./configure
make && sudo make install
使用 symfony/finder
组件来遍历目录和文件
{
"require-dev": {
"symfony/finder": "^5.1"
}
}
之后在PHP代码中来调用 opencc4php 的API进行简繁体转换
define('ROOT_DIR', dirname(__DIR__));
require ROOT_DIR . '/tools/vendor/autoload.php';
use Symfony\Component\Finder\Finder;
$config = [
'zh-tw' => [
'targetDir' => ROOT_DIR . '/docs/zh-tw/',
'rule' => 's2twp.json',
],
'zh-hk' => [
'targetDir' => ROOT_DIR . '/docs/zh-hk/',
'rule' => 's2hk.json',
],
];
$finder = new Finder();
$finder->files()->in(ROOT_DIR . '/docs/zh-cn');
foreach ($config as $key => $item) {
$od = opencc_open($item['rule']);
foreach ($finder as $fileInfo) {
$targetDir = $item['targetDir'];
$targetPath = $targetDir . $fileInfo->getRelativePath();
$isCreateDir = false;
if (!is_dir($targetPath)) {
mkdir($targetPath, 0777, true);
chmod($targetPath, 0777);
$isCreateDir = true;
}
if (!is_writable($targetPath)) {
echo sprintf('Target path %s is not writable.' . PHP_EOL, $targetPath);
}
if ($fileInfo->getExtension() === 'md') {
$translated = opencc_convert($fileInfo->getContents(), $od);
$translated = str_replace('](zh-cn/', '](' . $key . '/', $translated);
$translated = str_replace('](./zh-cn/', '](./' . $key . '/', $translated);
$targetTranslatedPath = $targetDir . $fileInfo->getRelativePathname();
@file_put_contents($targetTranslatedPath, $translated);
} else {
$targetTranslatedPath = $targetDir . $fileInfo->getRelativePathname();
@copy($fileInfo->getRealPath(), $targetTranslatedPath);
}
}
opencc_close($od);
}
在tools
目录中创建为对应的composer.json
和translate.php
文件
最后,整合到一块就是一个 action 了,创建.github/workflows
目录,新建一个translate.yml
文件
name: Translate docs
on: [push, pull_request]
jobs:
translate:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
ref: ${{ github.head_ref }}
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 7.4
tools: phpize
ini-values: extension=opencc
- name: Install OpenCC
run: |
sudo apt-get install libopencc-dev -y
- name: Build opencc4php
run: |
git clone https://github.com/nauxliu/opencc4php.git --depth 1
cd opencc4php
phpize
./configure
make
sudo make install
php --ri opencc
cd ..
rm -rf opencc4php
- name: Start Translate
run: |
cd tools
composer install
php translate.php
- name: Commit Updated
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Update docs and translate
提交到 GitHub 之后,修改文档直接 push 或者 contributor 提交 PR 的时候,都会生成一个 commit message 为Update docs and translate
的提交
至此就实现了自动简繁体转换的功能,示例可以看swow/wiki
发表评论
沙发空缺中,还不快抢~