最後活躍 1 month ago

翻译文档为中文文档

修訂 ba3f76c907f745dca935504dd714f69a80c23a73

.gitignore 原始檔案
1# Python
2.venv/
3
4build/
5docsite/
6translated/
7tmp/
8
9**.log
10**.txt
11
12aitr.toml
13config.toml
14
README.md 原始檔案

XX 中文文档

本文档使用 AI 翻译

项目流程

首次使用

  1. 创建空分支
git switch --orphan docs
  1. 首次提交
git add README.md
git commit -am init
git push origin docs
  1. 拉取上游源码
mkdir -p docsite
pushd docsite
if [[ -d .git ]]; then
    git remote set-url upstream https://github.com/xxx/docs.git
else
    git init
    git remote add upstream https://github.com/xxx/docs.git
fi
git reset --hard
git fetch upstream main
git merge upstream/main
popd
  1. 复制源文档
rm -rf docs
cp -r docsite/content .
mv content docs
  1. 全量翻译
aitr
  1. 本地测试与构建
git clone https://github.com/xxx/docs.git docsite
cp -r docs_zh/* ./docsite/content
cd docsite
  1. 启动或构建
# NodeJS
npm install
npm run dev

# Hugo
hugo server

...

2. AI 翻译

  • 安装 CLI 工具 (增量更新直接使用 AI CLI 工具直接对比)
curl -L https://fx4.cn/aitr | bash
  1. 设置环境变量 config.toml
...
[[providers]]
enabled = true
name = "grok"
api_key = "xxx"
base_url = "https://api.x.ai/v1"
model = "grok-3"
concurrency = 1 # 线程数
rate_delay = 3.0 # 每个请求后等待 1.0 秒(可根据限流调整)
  1. AI 翻译
aitr
config.example.toml 原始檔案
1# 根目录 - 包含需要翻译的 Markdown 文件
2root_dir = "./docs"
3
4# 输出目录 - 翻译后的文件保存位置
5output_dir = "./docs_zh"
6
7# 输出模式: "overwrite" (覆盖原文件) 或 "new_folder" (保存到新文件夹)
8output_mode = "new_folder"
9
10# 排除的目录 (逗号分隔)
11exclude_dir = "node_modules,.git,_build"
12
13# 最大 token 数
14max_tokens = 99999
15
16# 系统提示词(支持多行,使用 """ 包裹)
17system_prompt = """
18你是一个专业的技术文档翻译专家。请将以下英文 Markdown 文档翻译成流畅、自然的简体中文。
19
20严格要求:
211. 保留完整的 Markdown 格式,包括标题、列表、表格、代码块、链接、图片等一切结构完全不变。
222. 代码块、命令行、文件名、路径、API 名称、配置文件内容、技术术语等保持原样(不要翻译)。
233. 专有名词(如产品名、框架名、软件名,例如 Traefik、Docker、Kubernetes)保持英文原名。
244. Hugo 短代码和模板语法(如 {{< xxx >}}、{{ xxx }}、{{</ xxx >}} 等所有以 {{ 或 {{< 开头的标签)必须完整保留原样,不翻译、不修改其内部任何内容。
255. 对于 YAML frontmatter(文档开头的 --- 之间的内容):
26 - 只翻译实际需要本地化的字符串值内容(如 title、description、linkTitle 等字段的值)。
27 - tags 字段的值(通常为字符串或字符串列表)必须完全保持原英文不变,不进行任何翻译或修改。
28 - 其他字段(如 keywords 等)按正常规则处理:如果为字符串值则翻译(如 description),如果为列表则视情况保留英文(专有名词不翻译)。
29 - 严格保留原文档中的所有字段、键名、结构、格式、缩进和所有机制(包括已有的 YAML 锚点 &xxx 和别名 *xxx)。
30 - 如果原文档中已有锚点定义,则在翻译该锚点对应的字符串值时保留锚点标记(如 &desc);别名引用(如 *desc)保持原样不变。
31 - 如果原文档中没有锚点或别名,则翻译后绝对不得新增任何锚点、别名、params 块或其他额外字段。
32 - 绝对不得添加、删除或修改任何原有字段、锚点、别名或 params 等结构,仅对需要本地化的字符串值进行翻译。
33 - aliases、keywords、tags 等列表字段的值,按原文档格式保留(保持原有引号使用情况,不统一添加或移除引号)。
34 - 必须输出且仅输出一次完整的 YAML Front Matter(以 --- 开头,以 --- 结尾)。
35 - 结尾的 --- 必须独占一行,且在其后必须紧跟一个空行。
36 - 绝对不要在翻译后的 Front Matter 之前或之后保留原始的英文 Front Matter。
376. 翻译要准确、专业、易懂,技术术语使用业界通用中文表达。
387. 绝对禁止在文档开头或 YAML frontmatter 前后添加任何 Markdown 代码块标记(如 ```markdown 或 ```),保持文档结构的纯净。
398. 绝对禁止自作主张地添加任何原文档中不存在的内容,包括但不限于:完整的语言指南、示例代码、学习资源、最佳实践等。只翻译原文档中已有的内容,不多不少。
409. 只输出翻译后的完整 Markdown 内容,不要添加任何说明、注释或多余文本。
4110. Markdown 链接 `[text](url)` 中的 `url` 必须完全保持原样,绝对不要修改、翻译或移除路径中的任何部分。即使是相对路径或绝对路径,也都必须保持原样。
42"""
43
44[[providers]]
45name = "grok"
46api_key = "xxx"
47base_url = "https://api.x.ai/v1"
48model = "grok-3"
49concurrency = 4 # 线程数
50rate_delay = 3.0 # 每个请求后等待 1.0 秒(可根据限流调整)
deploy.sh 原始檔案
1#!/usr/bin/env bash
2
3#============================================================
4# File: deploy.sh
5# Description: 部署
6# URL:
7# Author: Jetsung Chan <[email protected]>
8# Version: 0.2.0
9# CreatedAt: 2025-12-16
10# UpdatedAt: 2026-01-08
11#============================================================
12
13
14if [[ -n "${DEBUG:-}" ]]; then
15 set -eux
16else
17 set -euo pipefail
18fi
19
20DEFAULT_BRANCH="main"
21HUGO_VERSION=${HUGO:-0.154.2}
22
23DELETE_FILE="deleted_docs.txt"
24ADD_FILE="new_docs.txt"
25MODIFIED_FILE="modified_docs.txt"
26TRANSLATE_LIST="translate_list.txt"
27
28install_hugo() {
29 curl -L https://fx4.cn/hugo | bash -s -- -v "$HUGO_VERSION" -w
30}
31
32merge_config() {
33 if [[ -f config.example.toml ]]; then
34 sed '/providers/,$d' ./config.example.toml | tee config.toml > /dev/null
35 fi
36
37 if [[ -f aitr.toml ]]; then
38 sed -n '/logging/,$p' aitr.toml | tee -a config.toml > /dev/null
39 fi
40}
41
42merge_source() {
43 [[ -d docsite ]] || mkdir docsite
44
45 pushd docsite
46 if [[ -d .git ]]; then
47 git remote set-url upstream https://github.com/xxx/docs.git
48 else
49 git init
50 git remote add upstream https://github.com/xxx/docs.git
51 fi
52 git reset --hard
53 git fetch upstream main
54 git merge upstream/main
55 popd
56
57 rm -rf docs
58 cp -r docsite/docs .
59}
60
61# 增量更新
62incremental_update() {
63 merge_source
64
65 # 记录删除的文件
66 git ls-files --deleted docs/ | tee "$DELETE_FILE"
67 export ROOT_DIR=$(grep root_dir config.toml | cut -d'"' -f 2 | sed 's|^\./||')
68 export OUTPUT_DIR=$(grep output_dir config.toml | cut -d'"' -f 2 | sed 's|^\./||')
69 # sed -i "s|^$ROOT_DIR/|$OUTPUT_DIR/|g" "$DELETE_FILE"
70 # 删除对应的输出文件
71 while read -r file; do
72 new_file="${file/$ROOT_DIR/$OUTPUT_DIR}"
73 echo "$new_file"
74 rm -rf "$new_file" || true
75 done < "$DELETE_FILE"
76
77 # 更新 git 索引
78 git add .
79 # 记录新增和修改的文件
80 git diff --cached --name-only --diff-filter=A docs/ | tee "$ADD_FILE"
81 git diff --cached --name-only --diff-filter=M docs/ | tee "$MODIFIED_FILE"
82
83 cat "$ADD_FILE" "$MODIFIED_FILE" | tee "$TRANSLATE_LIST"
84
85 # 移除以 .png .jpg .jpeg .gif .svg 结尾的文件
86 sed -i '/\.\(png\|jpg\|jpeg\|gif\|svg\)$/d' "$TRANSLATE_LIST"
87
88 # 合并 config.toml
89 merge_config
90
91 # # 翻译增量文件
92 # if ! command -v aitr &> /dev/null; then
93 # echo "正在安装 aitr ..."
94 # curl -L https://fx4.cn/aitr | bash
95 # fi
96
97 # 调用 aitr 进行翻译
98 if command -v aitr &> /dev/null; then
99 aitr --input "$TRANSLATE_LIST" --list --output translated
100 cp -r "translated/${ROOT_DIR}/"* "${OUTPUT_DIR}"/
101 else
102 echo "aitr 未安装,跳过构建步骤。"
103 fi
104}
105
106# 复制 docs_zh 至 content
107copy_docs_zh() {
108 if [[ ! -d docsite ]]; then
109 git clone https://github.com/xxx/docs.git docsite
110 fi
111 if [[ -d "translated/docs" ]]; then
112 echo "使用 translated/docs 的文档覆盖 docs_zh"
113 cp -r translated/docs/* docs_zh/
114 fi
115 cp -r docs_zh/* docsite/docs/
116}
117
118# 调用翻译脚本
119translate() {
120 aitr
121}
122
123usage() {
124 cat << EOF
125用法: $0 [选项]
126
127选项:
128 -c --copy 复制 docs_zh
129 -g --config 合并 config.toml
130 -s --source 合并文档
131 -i --incremental 增量更新
132 -t --translate 调用翻译脚本
133 -h --help 显示此帮助信息
134
135示例:
136 $0 --translate
137EOF
138}
139
140main() {
141 if [[ $# -eq 0 ]]; then
142 usage
143 exit 1
144 fi
145
146 while [[ $# -gt 0 ]]; do
147 case $1 in
148 -c|--copy)
149 copy_docs_zh
150 shift
151 ;;
152 -g|--config)
153 merge_config
154 shift
155 ;;
156 -s|--source)
157 merge_source
158 shift
159 ;;
160 -i|--incremental)
161 incremental_update
162 shift
163 ;;
164 -t|--translate)
165 translate
166 shift
167 ;;
168 --help|-h)
169 usage
170 exit 0
171 ;;
172 *)
173 echo "未知参数: $1" >&2
174 usage
175 exit 1
176 ;;
177 esac
178 done
179}
180
181main "$@"
docs.yml 原始檔案
1name: Documentation
2
3on:
4 push:
5 branches:
6 - docs
7 paths:
8 - 'docs_zh/**'
9 - '.github/workflows/docs.yml'
10 workflow_dispatch:
11
12permissions:
13 contents: write
14 pages: write
15 id-token: write
16
17concurrency:
18 group: pages
19 cancel-in-progress: false
20defaults:
21 run:
22 shell: bash
23
24jobs:
25 build:
26 env:
27 HUGO_VERSION: 0.154.2
28 TZ: Asia/Shanghai
29 runs-on: ubuntu-latest
30 steps:
31 - uses: actions/checkout@v6
32 - name: Install Hugo
33 run: |
34 curl -L https://fx4.cn/hugo | bash -s -- -v "$HUGO_VERSION" -w
35 - name: Verify installations
36 run: |
37 echo "Hugo: $(hugo version)"
38 echo "Node.js: $(node --version)"
39 - name: Fetch Source
40 run: |
41 git clone https://github.com/docker/docs.git docsite
42 - name: Fix
43 run: |
44 # sed -i 's/refLinksErrorLevel: WARNING/refLinksErrorLevel: ERROR/' docsite/hugo.yaml
45 sed -i '/baseURL/d' docsite/hugo.yaml
46 - name: Build Docs
47 run: |
48 cp -r docs_zh/* ./docsite/content
49 cd docsite/
50 npm install
51 hugo build
52 - name: Copy CNAME
53 run: cp CNAME docsite/public/
54 - name: Upload build artifacts
55 uses: actions/upload-artifact@v6
56 with:
57 name: docs-site
58 path: docsite/public
59 retention-days: 1
60
61 deploy-github-pages:
62 environment:
63 name: github-pages
64 url: ${{ steps.deployment.outputs.page_url }}
65 needs: build
66 runs-on: ubuntu-latest
67 steps:
68 # - uses: actions/configure-pages@v5
69 - name: Download build artifacts
70 uses: actions/download-artifact@v6
71 with:
72 name: docs-site
73 path: ./public
74 - name: Deploy to Branch
75 uses: peaceiris/actions-gh-pages@v4
76 with:
77 github_token: ${{ secrets.GITHUB_TOKEN }}
78 publish_dir: ./public
79 # - uses: actions/upload-pages-artifact@v4
80 # with:
81 # path: docsite/public
82 # - uses: actions/deploy-pages@v4
83 # id: deployment
84
85 deploy-ssh-server:
86 needs: build
87 runs-on: ubuntu-latest
88 steps:
89 - name: Download build artifacts
90 uses: actions/download-artifact@v6
91 with:
92 name: docs-site
93 path: ./public
94 - name: Compress to tar.xz
95 run: |
96 tar -cJf docs-site.tar.xz public/
97 - name: Set up SSH
98 uses: LuisEnMarroquin/[email protected]
99 with:
100 ORIGIN: ${{ secrets.SSH_HOSTNAME }}
101 SSHKEY: ${{ secrets.SSH_KEY }}
102 NAME: webserver
103 PORT: ${{ secrets.SSH_PORT }}
104 USER: ${{ secrets.SSH_USERNAME }}
105 - run: echo "" >> ~/.ssh/access # fix
106 - name: Deploy the website
107 env:
108 WEBROOT: /data/wwwroot/docker
109 run: |
110 ssh webserver "rm -rf $WEBROOT && mkdir -p $WEBROOT"
111 scp docs-site.tar.xz webserver:${WEBROOT}/
112 ssh webserver "cd $WEBROOT && tar -xJf docs-site.tar.xz --strip-components=1 && rm -f docs-site.tar.xz"
init.sh 原始檔案
1#!/usr/bin/env bash
2
3if [[ -n "${DEBUG:-}" ]]; then
4 set -eux
5else
6 set -euo pipefail
7fi
8
9BASE_URL="https://gist.asfd.cn/jetsung/gendocs/raw/HEAD"
10
11download_files() {
12 curl -fsSL -O "${BASE_URL}/deploy.sh"
13 chmod +x deploy.sh
14
15 curl -fsSL -O "${BASE_URL}/README.md"
16
17 curl -fsSL -O "${BASE_URL}/config.example.toml"
18
19 curl -fsSL -O "${BASE_URL}/config.example.toml"
20
21 curl -fsSL -O "${BASE_URL}/.gitignore"
22
23 curl -fsSL --create-dirs -o ".github/workflows/docs.yml" "${BASE_URL}/docs.yml"
24}
25
26main() {
27 download_files
28}
29
30main "$@"
31