我如何阻止我的 README.md 与 README.zh.md 漂移开来
Source: Dev.to
请提供您希望翻译的具体文本内容(文章正文),我将按照要求保留原始的 Markdown 格式、代码块和链接,仅翻译文本部分为简体中文。谢谢!
漂移问题
每个发布了翻译版 README 的项目都遵循相同的生命周期:
- 有人用英文编写
README.md。 - 有贡献者提交了
README.zh.md的 PR。很好。 - 几个月后,英文版出现了新章节,而中文版本仍停留在原来的内容。
- 第二位翻译者添加了
README.es.md。他们应该从哪个版本翻译?是当前的README.md还是已经过时的README.zh.md?
过了一段时间,你会发现有多个 README 在项目实际内容上出现不一致。很难一眼看出哪个文件是过时的,审阅者也不会同时阅读全部三个文件,翻译因此会腐烂,因为没有任何机制强制它们保持同步。
解决方案:NRG
我编写了一个小型 Java 工具——NRG(README Generator),用于让翻译后的 README 保持同步。
- 编写一个
README.src.md。 - 运行 NRG,即可得到
README.md、README.zh.md、README.ja.md,以及你列出的其他语言变体。
模板行分为三类:
| 类别 | 描述 |
|---|---|
| Shared | 出现在所有输出中(徽章、代码块、文件路径、任何与语言无关的内容)。无需标记。 |
| Language‑tagged | 仅出现在指定语言的输出中。 |
| Inline per‑language | 适用于锚点名称或按钮标签等短字符串,避免为每种语言单独写一行。 |
示例模板片段

This library is small but hard to use.
Эта библиотека маленькая, но сложная в использовании.
本库虽小,但难以使用。
${en:‘Table of contents’, ru:‘Содержание’, zh:‘目录’}
Running the generator:
```bash
nrg -f README.src.md
生成语言特定的文件,每个文件都带有标头注释,指示该文件是自动生成的。
Source: …
CI 集成
NRG 提供了一个 GitHub Action(nanolaba/nrg-action@v1),其中包含 check 模式。每次 PR 时,它会:
- 将 README 重新生成到临时目录。
- 将生成的文件与已提交的版本进行 diff 对比。
如果两者不匹配,构建会失败并显示统一 diff,例如:
--- README.md (on disk)
+++ README.md (generated)
@@ -27,7 +27,7 @@
-## Quick start
+## Getting started
因此,贡献者不能直接手动编辑 README.zh.md,除非同时更新 README.src.md 并重新生成,或者让 CI 拒绝该 PR。
同样的检查也可以在本地运行:
nrg -f README.src.md --check
这对于 pre‑commit 钩子非常方便。
小部件
任何模板语法无法直接表达的内容都称为 小部件。默认提供的集合包括:
${widget:tableOfContents(ordered='true')} # 自动生成目录
${widget:import(path='docs/intro.src.md')} # 组合模板
${widget:exec(cmd='git rev-parse --short HEAD')} # 嵌入 Shell 输出
${widget:fileTree(path='src/main/java', depth='2')} # 生成目录树
${widget:math(expr='\\pi r^2')} # 渲染 LaTeX(SVG 备选)
额外内置:alert、badge、if / endIf、date、todo。
自定义小部件通过创建实现 NRGWidget 接口的类来实现——这对于项目特定的模式(例如“功能矩阵”小部件)非常有用。
Maven 插件
对于 Java 项目,NRG 可以在 compile 阶段自动运行:
<plugin>
<groupId>com.nanolaba</groupId>
<artifactId>nrg-maven-plugin</artifactId>
<version>1.2</version>
<configuration>
<sourceFile>README.src.md</sourceFile>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>create-files</goal>
</goals>
</execution>
</executions>
</plugin>
GitHub Action(语言无关)
该 Action 会自行提供 Java,因此您无需在仓库中配置 Java 工具链:
- uses: nanolaba/nrg-action@v1
with:
file: README.src.md
mode: check
适用于 Python、JavaScript、Rust 或任何其他语言生态系统。
附加说明
- Java 8 最低要求 – 该二进制文件是可移植的。如果你不喜欢安装 JDK,GitHub Action 是零接触的选项。
- 不是翻译工具 – NRG 同步结构;实际的正文翻译仍需人工(或 LLM)完成。
- 没有 Markdown AST – 替换和小部件在原始文本上操作。这在 99 % 的情况下有效,但聪明的作者可能会生成 NRG 检测不到的损坏 Markdown。请使用单独的
validate模式进行更严格的检查。 - 早期阶段 – 当前版本为 v1.2,已被少数开源仓库使用。小部件 API 可能仍会演变。
反馈
我希望在项目仍然足够小、可以改变方向时,获得诚实的反馈。
- 您会如何在当前的设置(手动同步、自定义脚本、什么都不做)之上采用它?
- 什么情况会让您 不 使用它?
仓库、完整文档以及 GIF 演示均可在以下位置获取:
感谢阅读——欢迎在评论中提问。