Jakeuj's Notes Help

TOML 繁中翻譯爭議紀實:事件經過與開源 AI 貢獻的教訓

想替開源專案送 AI 輔助的翻譯 PR,先照既有語系 PR 的慣例縮小範圍、只動語系檔,並主動說明工具用途與人工審校方式;被倉促關閉時先在原串或向其他維護者詢問,不要先拉到社群平台。這些做法來自 2026 年 10 月 toml-lang/toml.io 繁中翻譯提案的爭議,完整逐則紀錄整理在 TOML 繁中翻譯爭議:事件全紀錄 (GitHub repo)。

本文只摘要紀實網站已查核的公開紀錄,資料截點為 2026-10-27;發言內容屬當事人主張,不代表已證實的事實,也不是對兩版譯文品質的認證。時間以臺灣時間(UTC+8)表示。

事件時間線

時間

討論串

經過

10/23 22:11

Issue #97、PR #98

doggy8088 提案新增 tw 目錄與 zh-TW 語言標籤,24 秒後開 PR:8 個檔案、2,260 行新增,除譯文外也改了 formatter、HTML 產生器與兩個共用模板

10/23 22:15

PR #98

Copilot 自動審查指出英文備援字串可能繼承非英文的 lang 屬性,螢幕閱讀器會用錯語言發音

10/23 22:17

#97、#98

專案成員 arp242 將 issue 判定為 LLM 提示詞、要求不要用 agent 提交,同一秒以「不規劃處理」關閉 #97;23 秒後關閉 PR,未合併

10/23 22:32

#97

提案者承認以 AI 協助撰寫翻譯與 issue,表示由自己負責;詢問是否有禁止 AI 的書面規則,提議縮小到首頁與 v1.1.0

10/23 22:42

PR #98

修正 lang 的 commit 83dd824 建立並回覆已修正,但 PR head 仍是原本那筆,修正不在 PR 裡

10/24 00:02

#97

參與者 ShikiSuen 主張應區分在地化內容與程式碼貢獻

10/25 20:48

Issue #99

提案者重開較短的新 issue,詢問是否願意接受繁中翻譯;同時在 Facebook 公開說明 PR 被拒的經過

10/25 22:01

#99

arp242 貼出該 Facebook 貼文連結質問提案者並關閉 #99,十秒後討論被鎖定為限協作者發言

10/25 22:18

#99

arp242 表示不反對繁中或其他語言,但期待經仔細驗證的人工翻譯;同時用貶抑措辭批評 AI 譯文,並對後續 zh-TW 譯稿表示懷疑

10/26 01:52 至 10:07

#97

d4n1elchen、brlin-tw、pcchou 等人陸續留言,分別談人工審校投入、提交方式與拒絕方式各自的問題

截至截點,三個討論串都沒有重開,PR #98 仍關閉未合併。

雙方的爭點

  • 提案者 :AI 和編輯器、拼字檢查一樣是工具,應依成果是否正確、是否遵循慣例審查;找不到禁止 AI 的貢獻政策,PR 卻在未審內容下被關閉。

  • 維護者 :讀者需要機械翻譯可以自己用工具;正式收錄到 toml.io 的應是仔細驗證的人工翻譯。他也認為重提 #99 是在掩飾同一做法,並指控提案者在 Facebook 煽動支持者。紀實網站將這些視為個別成員的指控與評價,不等同專案正式政策。

  • 在地化社群成員 :意見分歧。有人認為以 AI 使用方式一概拒絕在地化貢獻不公平,若不接受應寫進貢獻指南;也有人認為沒有明文規範時,本來就不該預設維護者歡迎 AI 生成的 issue 或 PR,並批評把爭議帶到社群平台接近群體施壓,同時要求維護者關閉時給出可操作的回饋。

送 AI 輔助翻譯 PR 前的檢查

從這次紀錄可以整理出幾個具體做法,不論專案是否有 AI 政策都適用:

  1. 先看同類 PR 的慣例 。同專案的俄文 #86、法文 #96、葡文 #65 翻譯 PR 都沒先開規格式 issue,說明以必要資訊為主。長篇、條列驗收條件的說明在維護者眼中反而像 agent 產出。

  2. 只動語系檔 。翻譯 PR 改到共用模板,審查範圍就從「這份譯文」擴大成「所有語系的頁面結構」,Copilot 抓到的 lang 問題正是出在共用模板。介面字串在地化可以另開 PR。

  3. 修正要推進 PR 分支 。在原 PR 回覆「已修正」前,確認 commit 出現在 PR 的提交清單;只存在 fork 的其他分支,審查者看到的仍是舊版本。

  4. 主動揭露 AI 用在哪個階段 ,並附可核驗的人工審校方式,例如逐段與英文對照的方法、具名審校者。「我已審閱過」很難讓維護者相信投入足夠。

  5. 被關閉時先在原串追問 ,或禮貌詢問其他維護者;社群平台是最後手段。維護者看到外部貼文連結,容易把後續支持留言解讀成動員。

對維護者這一側,留言中較一致的建議是:若不接受 AI 輔助的貢獻,寫進 CONTRIBUTING ,關閉時說明可修改後重送的條件,避免貢獻者猜規則。

紀實網站怎麼做

紀實網站以 jakeuj 委託 Codex 協作整理與發布,目標是分開呈現可查核的紀錄、發言者主張與無法確認的問題。主要設計:

  • 資料與呈現分離 :每則 GitHub 留言、review、行內意見與狀態事件存成 JSON,包含來源 ID、作者、時戳、編輯時間、回應關係與查核註記;正文是原創繁中轉述,不保留原文全文。

  • 不靠 JavaScript 也能讀: npm run build 用 Node.js 22 以上、無外部 npm 依賴的腳本把全部正文寫進 HTML;JavaScript 只加搜尋、作者/討論串篩選、複製錨點與閱讀位置,不在訪客端呼叫 GitHub API。

  • 計數差額照實標示 :16 筆 GitHub 紀錄、三篇 Facebook 貼文共 128 則可讀留言分開記錄截點。頁面計數與可讀數不符時保留差額,不補造父留言 ID,也不推測刪除者。

  • 測試鎖住完整性: npm test 檢查來源覆蓋不遺漏、不重複,站內錨點都可到達,時間線依時間排序,分享圖為 1200 × 630 PNG。

  • GitHub Pages 部署 :推送 main 後由官方 Pages Actions 建置、測試再發布 dist/ ,沒有排程、資料庫或追蹤碼。

用 SHA-256 偵測來源變更

公開討論可能被編輯、刪除或新增留言。網站在 coverage.json 記下每個來源物件內文的 SHA-256、狀態事件 ID、PR head 與提交清單,登入 GitHub CLI 後跑唯讀檢查:

npm run audit:sources

腳本用 gh api --paginate --slurp 完整分頁讀取三個討論串的主文、留言、reviews、行內留言與 timeline 事件,逐項比對:

const hash = createHash('sha256').update(item.body || '').digest('hex'); if (!saved) failures.push(`新增、尚未整理:${item.id}`); else if (hash !== saved.bodySha256) failures.push(`來源內容已變更:${item.id}`);

檢查失敗時要重新擷取、逐則核對並修訂轉述,再更新清單與截點;不能只更新雜湊讓檢查通過。留言的最後編輯時間不是完整修訂歷史,舊快照中的段落另外標示,不混入目前的留言總數。

參考資料

10 June 2026