我如何阻止我的 README.md 与 README.zh.md 漂移开来

发布: (2026年5月4日 GMT+8 06:18)
6 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的具体文本内容(文章正文),我将按照要求保留原始的 Markdown 格式、代码块和链接,仅翻译文本部分为简体中文。谢谢!

漂移问题

每个发布了翻译版 README 的项目都遵循相同的生命周期:

  1. 有人用英文编写 README.md
  2. 有贡献者提交了 README.zh.md 的 PR。很好。
  3. 几个月后,英文版出现了新章节,而中文版本仍停留在原来的内容。
  4. 第二位翻译者添加了 README.es.md。他们应该从哪个版本翻译?是当前的 README.md 还是已经过时的 README.zh.md

过了一段时间,你会发现有多个 README 在项目实际内容上出现不一致。很难一眼看出哪个文件是过时的,审阅者也不会同时阅读全部三个文件,翻译因此会腐烂,因为没有任何机制强制它们保持同步。

解决方案:NRG

我编写了一个小型 Java 工具——NRG(README Generator),用于让翻译后的 README 保持同步。

  • 编写一个 README.src.md
  • 运行 NRG,即可得到 README.mdREADME.zh.mdREADME.ja.md,以及你列出的其他语言变体。

模板行分为三类:

类别描述
Shared出现在所有输出中(徽章、代码块、文件路径、任何与语言无关的内容)。无需标记。
Language‑tagged仅出现在指定语言的输出中。
Inline per‑language适用于锚点名称或按钮标签等短字符串,避免为每种语言单独写一行。

示例模板片段

![CI](https://img.shields.io/github/actions/workflow/status/owner/repo/ci.yml)

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 时,它会:

  1. 将 README 重新生成到临时目录。
  2. 将生成的文件与已提交的版本进行 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 备选)

额外内置:alertbadgeif / endIfdatetodo

自定义小部件通过创建实现 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 演示均可在以下位置获取:

感谢阅读——欢迎在评论中提问。

0 浏览
Back to Blog

相关文章

阅读更多 »

自己制作框架,有什么建议吗?

《Making my own framework》的封面图片。有什么建议吗?https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fde...